Slpsql

Материал из ALT Linux Wiki

СУБД 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

Дополнительную информацию можно получить из следующих источников:

  1. man sepgsql_contexts


Установка и настройка кластера

  • Авторизоваться в ОС от имени root.
  • Убедится что ОС назначила root права офицера безопасности:
  1. runcon

officer_u:officer_r:officer_t:s0-s15:c0.c31

  • Убедитесь что политика SeLinux содержит модуль psql, в котором присутствуют необходимые правила.
  1. semodule -l | grep sql

psql 1.0.4

  • Проверить что установлен сервер СУБД PostgreSQL версии 9.3
  1. rpm -q postgresql9.3-server

postgresql9.3-server-9.3.4-alt2 а также установлен пакет postgresql9.3-contrib


  • Если сервер postgresql запущен его необходимо временно выключить.
  1. service postgresql status

postgres is running

  1. service postgresql stop

postgres is running

  • В случае если кластер СУБД не инициализирован его необходимо инициализировать:
  1. 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-функций которые неоходимы для работы с мандатными метками.

Данные функции описаны в файле:

  1. 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 Поэтому переключимся на него:

  1. 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"

  • Убедитесь что сервер будет запускаться автоматически при старте системы:
  1. chkconfig postgresql on

или

  1. systemctl enable postgresql
  • Запустите севис СУБД:
  1. service postgresql start

или

  1. systemctl start postgresql
  • Убедитесь что сервер СУБД работает с учетом мандатных прав доступа:
  1. psql -U postgres postgres

postgres=# SELECT sepgsql_getcon();

              sepgsql_getcon                

officer_u:officer_r:officer_t:s0-s15:c0.c31

(1 строка)


  • Далее производите настройку кластера с учетом ваших требований. Например задайте пароль для владельца БД postgres:
  1. ALTER USER postgres with password '123’;
  2. /var/lib/pgsql/data/pg_hba.conf trust -> md5


http://scratching.psybermonkey.net/2009/06/postgresql-how-to-reset-user-name.html


Убедится что менеджер политики в СУБД находится в активном состоянии:

postgres=# SHOW sepgsql.permissive;

sepgsql.permissive 

off

(1 строка)

из командной строки:

$ psql -U postgres -t -c 'SHOW sepgsql.permissive'

show all; — показать все настройки СУБД;

Следует убедится что сам сервер получит необходимые права SeLinux. Т.е. он правильно запущен:

  1. ps aZx | grep postgres

officer_u:officer_r:postgresql_t:s0-s5:c0.c15 23438 pts/0 S 0:00 /usr/bin/postgres -D /var/lib/pgsql/data


Количество объектов в БД о которых знает SeLinux:

  1. SELECT count(*) FROM pg_catalog.pg_seclabels;
count 

 3582

(1 строка)


В схеме pg_catalog присутствует две дополнительные таблицы: select * from pg_catalog.pg_seclabel; - связывает ID объекта в БД с его меткой select * from pg_catalog.pg_seclabels; - имя объекта, его тип, метка

Объекту в БД можно назначить новую метку, отличную от той, которую он получает согласно политике в момент создания.


Типы объектов в БД которые поддерживаются политикой:

database, schemas, tables, columns, sequences, views, functions

или можно это узнать командой:

postgres=# SELECT distinct objtype from pg_catalog.pg_seclabels;

 objtype  

table
column
schema
database
aggregate
function
view

(7 строк)


http://www.postgresql.org/docs/9.3/static/sepgsql.html


http://en.wikipedia.org/wiki/Data_manipulation_language


Офицер безопасности имеет специальный атрибут (sepgsql_unconfined_type) который позоволяет производить ему любые операции.

  1. seinfo -tofficer_t -x | grep sql
     sepgsql_unconfined_type
  1. seinfo -ttrusted_t -x | grep sql
     sepgsql_unconfined_type
  1. seinfo -asepgsql_unconfined_type -x
  sepgsql_unconfined_type
     sepgsql_trusted_proc_t
     officer_t
     trusted_t

Атрибует sepgsql_client_type маркирует обычного пользователя.

  1. seinfo -tgeneric_t -x | grep sql
     sepgsql_client_type
  1. seinfo -asepgsql_client_type -x
  sepgsql_client_type
     generic_t

В качестве модуля (расширения) можно подгружать любые файлы имеющие следующий тип:

  1. seinfo -tdef_t -x | grep sql
     sepgsql_module_type


Далее следуют типы (домены) SeLinux которые получают объекты БД:

  1. seinfo -asepgsql_database_type -x
  sepgsql_database_type
     sepgsql_db_t
  1. seinfo -asepgsql_schema_type -x
  sepgsql_schema_type
     sepgsql_schema_t
  1. seinfo -asepgsql_table_type -x
  sepgsql_table_type
     sepgsql_sysobj_t
     sepgsql_table_t
     sepgsql_temp_object_t
  1. seinfo -asepgsql_sysobj_table_type -x
  sepgsql_sysobj_table_type
     sepgsql_sysobj_t
  1. seinfo -asepgsql_sequence_type -x
  sepgsql_sequence_type
     sepgsql_seq_t
     sepgsql_temp_object_t
  1. seinfo -asepgsql_view_type -x
  sepgsql_view_type
     sepgsql_view_t
     sepgsql_temp_object_t
  1. seinfo -asepgsql_procedure_type -x
  sepgsql_procedure_type
     sepgsql_proc_exec_t
     sepgsql_trusted_proc_exec_t
     sepgsql_temp_object_t
  1. seinfo -asepgsql_trusted_procedure_type -x
  sepgsql_trusted_procedure_type
     sepgsql_trusted_proc_exec_t


Функции которым «все разрешено» это особый вид субъекта

  1. seinfo -tsepgsql_trusted_proc_t -x
  sepgsql_trusted_proc_t
     sepgsql_unconfined_type
     unconfineddomain
     mlstrustedsubject
     domain



Пользователь имеющий роль generic_r может «очутиться» в следующий доменах:

  1. seinfo -rgeneric_r -x
  generic_r
     Dominated Roles:
        generic_r
     Types:
        sepgsql_trusted_proc_t
        init
        generic_t
        kernel_t
        dbusd_t
        login_t
        postgresql_t
        dolphin_t
        officer_t
        systemd_t
        trusted_t

Пользователь имеющий роль officer_r может «очутиться» в следующий доменах:

  1. seinfo -rofficer_r -x
  officer_r
     Dominated Roles:
        officer_r
     Types:
        sepgsql_trusted_proc_t
        init
        generic_t
        kernel_t
        dbusd_t
        login_t
        postgresql_t
        dolphin_t
        officer_t
        systemd_t
        trusted_t


СУБД выполняется в процессе, который имеет следующие характеристики:

  1. seinfo -tpostgresql_t -x
  postgresql_t
     unconfineddomain
     mlstrustedsubject
     domain


SELECT 'system_u:object_r:sepgsql_table_t:s0:c' || id AS security_label, * INTO t FROM drink WHERE id in (2,4,6);


Находясь в командной строке psql, полезны следующие команды: \? - список сокращенных команд \l - список баз данных в кластере \dn - список схем в текущей БД SELECT * from pg_catalog.pg_namespace; - также список схем



Внутренности

Объект в схеме создается сам по себе. Запись в схему не происходит. create идет только как