Slpsql
СУБД PostgresSQL в ALTLinux с мандатным уровнем доступа
Дополнительная информация
- Быстрая справка по SQL:
http://www.tutorialspoint.com/postgresql/postgresql_update_query.htm
- Методы над каждым объектом(классом):
http://wiki.postgresql.org/wiki/SEPostgreSQL_References
Введение
Данный документ предполагает что администратор имеет необходимые знания для администрировании СУБД PostgreSQL.
Политика SeLinux была написана для PostgreSQL 9.3 Основное отличие от RefPolicy:
- убрано разделение объектов СУБД по различным доменам SeLinux для пользователей и администраторов.
- логически SeLinux менеджер различает 2 домена SeLinux подключаемых пользователей: обычные пользователи, офицер безопасности.
Стандартная система разграничения доступа PostgresSQL на основе назначений ролей и прав сохраняется. Мандатная система доступа, накладываемая SeLinux, является дополнительной, и работает в согласовании с глобальными метками пользователей в ОС. Таким образом, даже при авторизации в СУБД от имени владельца database в кластере PostgreSQL, будет сохранен его системный мандатный уровень доступа, который будет принимать участие в решении вопросов доступа. Т.е. возможен такой сценарий:
- В ОС ALTLinux авторизуется пользователь test.
- ОС назначает мандатные права пользователю test в рамках открытой сессии.
- Пользователь сменяет свой системный идентификатор пользователя на root: su -
- Манданые права пользователя остаются прежние.
- Авторизуется в СУБД как владелец некой БД.
В итоге получается, что даже при таком раскладе он ограничен в своих действиях, так как первоначальный мандатный уровень назначенный пользователю test при открытии сессии сохранился.
Предполагается что клиент и сервер находятся в рамках одного узла. При необходимости, можно расширить для работы в сети, где клиент и сервер находятся на различных узлах в ОС ALTLinux. Но данная схема не была протестирована. Контекст безопасности клиента проверяется при соединении с сокетом сервера PostgreSQL.
Замечание: для поддержки SeLinux сервер PostgreSQL должен быть изъят из chroot, или в chroot необходимо будет пробрасывать файловую систему в chroot.
Ограничение действий в СУБД осуществляет сам сервер PostgreSQL согласно политике SeLinux. Ключевой момент состоит в том, что не ядро ОС пресекает запрещенные действия а сервер СУБД. В СУБД PostgreSQL встроен менеджер. Данный менеджер работает в пространстве пользователя ОС. Менеджер обращается к ядру с использованием libselinux для проверки действий. Аналогичным образом работает система Xorg: http://taiga.selinuxproject.org/~rhaines/diagrams/26-x-windows.png
Дополнительную информацию можно получить из следующих источников:
- man sepgsql_contexts
Установка и настройка кластера
- Авторизоваться в ОС от имени root.
- Убедится что ОС назначила root права офицера безопасности:
- runcon
officer_u:officer_r:officer_t:s0-s15:c0.c31
- Проверить что установлен сервер СУБД PostgreSQL версии 9.3
- rpm -q postgresql9.3-server
postgresql9.3-server-9.3.4-alt2 а также установлен пакет postgresql9.3-contrib
- Проверить что сервер собран с поддержкой SeLinux.
- pg_config —configure
- Если сервер postgresql запущен его необходимо временно выключить.
- service postgresql status
postgres is running
- service postgresql stop
postgres is running
- В случае если кластер СУБД не инициализирован его необходимо инициализировать:
- service postgresql initdb
Кластер будет создан по адресу: /var/lib/pgsql/data
- Далее в конфигурационный файл кластера необходимо внести дерективу, которая будет указывать использовать SeLinux менеджер.
Для этого отредактируйте файл /var/lib/pgsql/data/postgresql.conf, и установите: shared_preload_libraries = 'sepgsql' sepgsql.permissive = off sepgsql.debug_audit = on
Внимание: категорически не рекомендуется отключать опцию: sepgsql.permissive = off, так как срабатывание denied происходит только один раз. Для последующих запросов всегда будет срабатывать «allow». Таким образом эта опция становится бесполезной для отладки.
Опция sepgsql.debug_audit = on указывает протоколировать результат проверки на разрешенность для каждого действия. Если не указано другое, логи сохраняются в /var/lib/pgsql/pgstartup.log В случае возникновения непонятных ситуаций, анализ данного фала позволяет установить причину запрета доступа.
- Следующим шагом будет установка SQL-функций которые неоходимы для работы с мандатными метками.
Данные функции описаны в файле:
- cat /usr/share/pgsql/contrib/sepgsql.sql
… LOAD '$libdir/sepgsql'; CREATE OR REPLACE FUNCTION pg_catalog.sepgsql_getcon() RETURNS text AS '$libdir/sepgsql', 'sepgsql_getcon' LANGUAGE C; CREATE OR REPLACE FUNCTION pg_catalog.sepgsql_setcon(text) RETURNS bool AS '$libdir/sepgsql', 'sepgsql_setcon' LANGUAGE C; CREATE OR REPLACE FUNCTION pg_catalog.sepgsql_mcstrans_in(text) RETURNS text AS '$libdir/sepgsql', 'sepgsql_mcstrans_in' LANGUAGE C STRICT; CREATE OR REPLACE FUNCTION pg_catalog.sepgsql_mcstrans_out(text) RETURNS text AS '$libdir/sepgsql', 'sepgsql_mcstrans_out' LANGUAGE C STRICT; CREATE OR REPLACE FUNCTION pg_catalog.sepgsql_restorecon(text) RETURNS bool AS '$libdir/sepgsql', 'sepgsql_restorecon' LANGUAGE C; SELECT sepgsql_restorecon(NULL);
О назначение каждой из функций расказано на официальном сайте:
http://www.postgresql.org/docs/9.3/static/sepgsql.html
Архитектура PostgreSQL предполагает наличие трех баз данных:
- postgres - начальная БД, создается при initdb, в случае необходимости можно смело удалить.
- template1 - БД-образец, которая будет взята за основу для вновь создаваемых БД. Сюда администратор ОС может внести нужны изменения, которые будут применимы для всех вновь создаваемых БД.
- template0 - БД-образец, которая является образцом БД без каких либо модификаций со стороны администратора.
Установку функций необходимо осуществлять когда сервер СУБД выключен, в режиме --single
В системе серевер PostgreSQL выполняется от имени пользователя postgres
Поэтому переключимся на него:
- su -l postgres -s /bin/bash
Укажим где находится кластер: $ export PGDATA=/var/lib/pgsql/data
Для каждой из выше-перечисленных БД установим необходмые функции:
$ postgres --single -F -c exit_on_error=true template0 < /usr/share/pgsql/contrib/sepgsql.sql $ postgres --single -F -c exit_on_error=true template1 < /usr/share/pgsql/contrib/sepgsql.sql $ postgres --single -F -c exit_on_error=true postgres < /usr/share/pgsql/contrib/sepgsql.sql
Завершим сеанс пользователя postgres.
Также можно выполнять команду в другой вариации: su -l postgres -s /bin/sh -c "/usr/bin/pg_ctl -D /var/lib/pgsql/data stop -mf"
- Убедитесь что сервер будет запускаться автоматически при старте системы:
- chkconfig postgresql on
или
- systemctl enable postgresql
- Запустите севис СУБД:
- service postgresql start
или
- systemctl start postgresql
- Убедитесь что сервер СУБД работает с учетом мандатных прав доступа:
- psql -U postgres postgres
postgres=# SELECT sepgsql_getcon();
sepgsql_getcon
officer_u:officer_r:officer_t:s0-s15:c0.c31
(1 строка)
- Далее производите настройку кластера с учетом ваших требований. Например задайте пароль для владельца БД postgres:
- ALTER USER postgres with password '123’;
- /var/lib/pgsql/data/pg_hba.conf trust -> md5
Внутренности
Объект в схеме создается сам по себе. Запись в схему не происходит. create идет только как