Slpsql: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
Строка 8: Строка 8:
* Методы над каждым объектом(классом):
* Методы над каждым объектом(классом):
http://wiki.postgresql.org/wiki/SEPostgreSQL_References
http://wiki.postgresql.org/wiki/SEPostgreSQL_References
* Страница руководства
# man sepgsql_contexts


== Введение ==
== Введение ==
Строка 13: Строка 16:
Данный документ предполагает что администратор имеет необходимые знания для администрировании СУБД PostgreSQL.
Данный документ предполагает что администратор имеет необходимые знания для администрировании СУБД PostgreSQL.


Политика SeLinux была написана для PostgreSQL 9.3
 
 
Основное отличие от RefPolicy:
Основное отличие от RefPolicy:
* убрано разделение объектов СУБД по различным доменам SeLinux для пользователей и администраторов.
* убрано разделение объектов СУБД по различным доменам SeLinux для пользователей и администраторов.
* логически SeLinux менеджер различает 2 домена SeLinux подключаемых пользователей: обычные пользователи, офицер безопасности.
* логически, pgsql различает два домена подключаемых пользователей: обычные пользователи, офицер безопасности
 
Стандартная система разграничения доступа PostgresSQL на основе назначений ролей и прав сохраняется.
 
Мандатная система доступа, накладываемая SeLinux, является дополнительной, и работает в согласовании с глобальными метками пользователей в ОС.
Ключевые моменты:
Таким образом, даже при авторизации в СУБД от имени владельца database в кластере PostgreSQL, будет сохранен его системный мандатный уровень доступа,
# Политика SeLinux написана для PostgreSQL 9.3
который будет принимать участие в решении вопросов доступа. Т.е. возможен такой сценарий:
# Стандартная система разграничения прав доступа PostgresSQL на основе ролей и прав сохраняется.
* В ОС ALTLinux авторизуется пользователь test.
# Мандатная система доступа, накладываемая SeLinux, является дополнительной, и работает в согласовании с глобальными мандатными метками SeLinux пользователей ОС.
* ОС назначает мандатные права пользователю test в рамках открытой сессии.
# Предполагается что клиент и сервер находятся в рамках одного узла.
* Пользователь сменяет свой системный идентификатор пользователя на root: su -
# При необходимости, можно расширить для работы в сети, где клиент и сервер находятся на различных узлах в ОС ALTLinux. Данная схема не тестировалась.
* Манданые права пользователя остаются прежние.
# Для поддержки SeLinux сервер PostgreSQL должен быть изъят из chroot, или в chroot необходимо будет пробрасывать файловую систему в chroot.
* Авторизуется в СУБД как владелец некой БД.
 
В итоге получается, что даже при таком раскладе он ограничен в своих действиях, так как первоначальный мандатный уровень назначенный пользователю test при открытии сессии сохранился.


Предполагается что клиент и сервер находятся в рамках одного узла.
Концепция работы:
При необходимости, можно расширить для работы в сети, где клиент и сервер находятся на различных узлах в ОС ALTLinux.
# Контекст безопасности клиента проверяется при соединении с сокетом сервера PostgreSQL.
Но данная схема не была протестирована. Контекст безопасности клиента проверяется при соединении с сокетом сервера PostgreSQL.
# Ограничение действий в СУБД осуществляет сам сервер PostgreSQL согласно политике SeLinux.
# Ключевой момент состоит в том, что не ядро ОС пресекает запрещенные действия а сервер СУБД.
# В СУБД PostgreSQL встроен менеджер. Данный менеджер работает в пространстве пользователя ОС.
# Менеджер обращается к ядру с использованием libselinux для проверки действий.
# Аналогичным образом работает система Xorg: http://taiga.selinuxproject.org/~rhaines/diagrams/26-x-windows.png


Замечание: для поддержки SeLinux сервер PostgreSQL должен быть изъят из chroot, или в chroot необходимо будет пробрасывать файловую систему в chroot.


Ограничение действий в СУБД осуществляет сам сервер PostgreSQL согласно политике SeLinux.
Ключевой момент состоит в том, что не ядро ОС пресекает запрещенные действия а сервер СУБД.
В СУБД PostgreSQL встроен менеджер. Данный менеджер работает в пространстве пользователя ОС.
Менеджер обращается к ядру с использованием libselinux для проверки действий.
Аналогичным образом работает система Xorg: http://taiga.selinuxproject.org/~rhaines/diagrams/26-x-windows.png


Дополнительную информацию можно получить из следующих источников:
При авторизации в СУБД от имени владельца database в кластере PostgreSQL, будет сохранен его системный мандатный уровень доступа, который будет принимать участие в решении вопросов доступа.
# man sepgsql_contexts
Т.е. возможен такой сценарий:
# В ОС авторизуется пользователь test.
# ОС назначает мандатные права пользователю test в рамках открытой сессии.
# Пользователь меняет свой системный идентификатор пользователя на root: su -
# Манданые права пользователя остаются прежние.
# Авторизуется в СУБД как владелец некой БД.
В итоге получается: даже при таком раскладе он ограничен в своих действиях, так как первоначальный мандатный уровень назначенный пользователю test при открытии сессии сохранился.
 




Строка 49: Строка 57:
* Авторизоваться в ОС от имени root.
* Авторизоваться в ОС от имени root.


* Убедится что ОС назначила root права офицера безопасности:
# runcon
officer_u:officer_r:officer_t:s0-s15:c0.c31


* Убедитесь что политика SeLinux содержит модуль psql, в котором присутствуют необходимые правила.
* Убедится что ОС назначила root мандатные права офицера безопасности:
# semodule -l | grep sql
# runcon
psql 1.0.4
officer_u:officer_r:officer_t:s0-s15:c0.c31
 


* Проверить что установлен сервер СУБД PostgreSQL версии 9.3
* Убедитесь что политика SeLinux содержит модуль psql, в котором присутствует необходимый набор правил:
# rpm -q postgresql9.3-server
# semodule -l | grep sql
postgresql9.3-server-9.3.4-alt2
psql 1.0.4
а также установлен пакет postgresql9.3-contrib




* Если сервер postgresql запущен его необходимо временно выключить.
* Проверить что установлен сервер СУБД PostgreSQL версии 9.3, а также установлен пакет postgresql9.3-contrib
# service postgresql status
# rpm -q postgresql9.3-server postgresql9.3-contrib
postgres is running
postgresql9.3-server-9.3.4-alt0.M70P.1
# service postgresql stop
postgresql9.3-contrib-9.3.4-alt0.M70P.1
postgres is running


* В случае если кластер СУБД не инициализирован его необходимо инициализировать:
# service postgresql initdb
Кластер будет создан по адресу: /var/lib/pgsql/data


* Далее в конфигурационный файл кластера необходимо внести дерективу, которая будет указывать использовать SeLinux менеджер.
* Если сервер postgresql запущен, тогда его необходимо временно выключить:
Для этого отредактируйте файл /var/lib/pgsql/data/postgresql.conf, и установите:
# service postgresql status
shared_preload_libraries = 'sepgsql'
postgres is running
sepgsql.permissive = off
# service postgresql stop
sepgsql.debug_audit = on
postgres is running


Внимание: категорически не рекомендуется отключать опцию: sepgsql.permissive = off, так как срабатывание denied происходит только один раз.
Для последующих запросов всегда будет срабатывать «allow». Таким образом эта опция становится бесполезной для отладки.


Опция sepgsql.debug_audit = on указывает протоколировать результат проверки на разрешенность для каждого действия.
* В случае если кластер СУБД не инициализирован его необходимо инициализировать:
Если не указано другое, логи сохраняются в /var/lib/pgsql/pgstartup.log
# service postgresql initdb
В случае возникновения непонятных ситуаций, анализ данного фала позволяет установить причину запрета доступа.
Кластер будет создан по адресу: '''/var/lib/pgsql/data'''


* Следующим шагом будет установка 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);


* В конфигурационный файл кластера необходимо внести директиву, которая будет указывать использовать 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'''.
В случае возникновения непонятных ситуаций, анализ данного фала позволяет установить причину запрета доступа.


О назначение каждой из функций расказано на официальном сайте:


http://www.postgresql.org/docs/9.3/static/sepgsql.html
* Следующим шагом будет установка 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 предполагает наличие трех баз данных:
Архитектура PostgreSQL предполагает наличие трех баз данных:
* postgres - начальная БД, создается при initdb, в случае необходимости можно смело удалить.
# postgres - начальная БД, создается при initdb, в случае необходимости можно смело удалить.
* template1 - БД-образец, которая будет взята за основу для вновь создаваемых БД. Сюда администратор ОС может внести нужны изменения, которые будут применимы для всех вновь создаваемых БД.
# template1 - БД-образец, которая будет взята за основу для вновь создаваемых БД. Сюда администратор ОС может внести нужны изменения, которые будут применимы для всех вновь создаваемых БД.
* template0 - БД-образец, которая является образцом БД без каких либо модификаций со стороны администратора.
# template0 - БД-образец, которая является образцом БД без каких либо модификаций со стороны администратора.
 


Установку функций необходимо осуществлять когда сервер СУБД выключен, в режиме --single
Установку функций необходимо осуществлять когда сервер СУБД выключен, в режиме '''--single'''
В системе серевер PostgreSQL выполняется от имени пользователя postgres
В системе серевер PostgreSQL выполняется от имени пользователя '''postgres'''. Поэтому переключимся на него:
Поэтому переключимся на него:
# su -l postgres -s /bin/bash
# su -l postgres -s /bin/bash
Укажим где находится кластер:
Укажим где находится кластер:
$ export PGDATA=/var/lib/pgsql/data
$ 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 --single -F -c exit_on_error=true template0 < /usr/share/pgsql/contrib/sepgsql.sql
Завершим сеанс пользователя '''postgres'''.
$ 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"


Также можно выполнять команду в другой вариации:
su -l postgres -s /bin/sh -c "/usr/bin/pg_ctl -D /var/lib/pgsql/data stop -mf"


* Убедитесь что сервер будет запускаться автоматически при старте системы:
* Убедитесь что сервер будет запускаться автоматически при старте системы:
# chkconfig postgresql on
или
# systemctl enable postgresql


# chkconfig postgresql on
или
# systemctl enable postgresql


* Запустите севис СУБД:
* Запустите севис СУБД:


# service postgresql start
# service postgresql start
или
или
# systemctl start postgresql
# systemctl start postgresql
 


* Убедитесь что сервер СУБД работает с учетом мандатных прав доступа:
* Убедитесь что сервер СУБД работает с учетом мандатных прав доступа:
 
# psql -U postgres postgres
# psql -U postgres postgres
postgres=# SELECT sepgsql_getcon();
 
postgres=# SELECT sepgsql_getcon();
               sepgsql_getcon                 
               sepgsql_getcon                 
---------------------------------------------
---------------------------------------------
officer_u:officer_r:officer_t:s0-s15:c0.c31
  officer_u:officer_r:officer_t:s0-s15:c0.c31
(1 строка)
(1 строка)




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


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




Убедится что менеджер политики в СУБД находится в активном состоянии:
* Убедится что менеджер политики в СУБД находится в активном состоянии:
 
postgres=# SHOW sepgsql.permissive;
postgres=# SHOW sepgsql.permissive;
  sepgsql.permissive  
sepgsql.permissive  
--------------------
--------------------
  off
  off
(1 строка)
(1 строка)
 
из командной строки:


$ psql -U postgres -t -c 'SHOW sepgsql.permissive'
или из командной строки:


show all; — показать все настройки СУБД;
$ psql -U postgres -t -c 'SHOW sepgsql.permissive'
show all; — показать все настройки СУБД;


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


# ps aZx | grep postgres
* Следует убедится что сам сервер получит необходимые права SeLinux. Т.е. он правильно запущен:
officer_u:officer_r:postgresql_t:s0-s5:c0.c15 23438 pts/0 S  0:00 /usr/bin/postgres -D /var/lib/pgsql/data
# 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





Версия от 12:20, 12 мая 2014

СУБД PostgresSQL в ALTLinux с мандатным уровнем доступа

Дополнительная информация

  • Быстрая справка по SQL:

http://www.tutorialspoint.com/postgresql/postgresql_update_query.htm

  • Методы над каждым объектом(классом):

http://wiki.postgresql.org/wiki/SEPostgreSQL_References

  • Страница руководства
  1. man sepgsql_contexts

Введение

Данный документ предполагает что администратор имеет необходимые знания для администрировании СУБД PostgreSQL.


Основное отличие от RefPolicy:

  • убрано разделение объектов СУБД по различным доменам SeLinux для пользователей и администраторов.
  • логически, pgsql различает два домена подключаемых пользователей: обычные пользователи, офицер безопасности


Ключевые моменты:

  1. Политика SeLinux написана для PostgreSQL 9.3
  2. Стандартная система разграничения прав доступа PostgresSQL на основе ролей и прав сохраняется.
  3. Мандатная система доступа, накладываемая SeLinux, является дополнительной, и работает в согласовании с глобальными мандатными метками SeLinux пользователей ОС.
  4. Предполагается что клиент и сервер находятся в рамках одного узла.
  5. При необходимости, можно расширить для работы в сети, где клиент и сервер находятся на различных узлах в ОС ALTLinux. Данная схема не тестировалась.
  6. Для поддержки SeLinux сервер PostgreSQL должен быть изъят из chroot, или в chroot необходимо будет пробрасывать файловую систему в chroot.


Концепция работы:

  1. Контекст безопасности клиента проверяется при соединении с сокетом сервера PostgreSQL.
  2. Ограничение действий в СУБД осуществляет сам сервер PostgreSQL согласно политике SeLinux.
  3. Ключевой момент состоит в том, что не ядро ОС пресекает запрещенные действия а сервер СУБД.
  4. В СУБД PostgreSQL встроен менеджер. Данный менеджер работает в пространстве пользователя ОС.
  5. Менеджер обращается к ядру с использованием libselinux для проверки действий.
  6. Аналогичным образом работает система Xorg: http://taiga.selinuxproject.org/~rhaines/diagrams/26-x-windows.png


При авторизации в СУБД от имени владельца database в кластере PostgreSQL, будет сохранен его системный мандатный уровень доступа, который будет принимать участие в решении вопросов доступа. Т.е. возможен такой сценарий:

  1. В ОС авторизуется пользователь test.
  2. ОС назначает мандатные права пользователю test в рамках открытой сессии.
  3. Пользователь меняет свой системный идентификатор пользователя на root: su -
  4. Манданые права пользователя остаются прежние.
  5. Авторизуется в СУБД как владелец некой БД.

В итоге получается: даже при таком раскладе он ограничен в своих действиях, так как первоначальный мандатный уровень назначенный пользователю test при открытии сессии сохранился.


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

  • Авторизоваться в ОС от имени root.


  • Убедится что ОС назначила root мандатные права офицера безопасности:
# runcon 
officer_u:officer_r:officer_t:s0-s15:c0.c31


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


  • Проверить что установлен сервер СУБД PostgreSQL версии 9.3, а также установлен пакет postgresql9.3-contrib
# rpm -q postgresql9.3-server postgresql9.3-contrib
postgresql9.3-server-9.3.4-alt0.M70P.1
postgresql9.3-contrib-9.3.4-alt0.M70P.1


  • Если сервер 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 предполагает наличие трех баз данных:

  1. postgres - начальная БД, создается при initdb, в случае необходимости можно смело удалить.
  2. template1 - БД-образец, которая будет взята за основу для вновь создаваемых БД. Сюда администратор ОС может внести нужны изменения, которые будут применимы для всех вновь создаваемых БД.
  3. 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

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. Т.е. он правильно запущен:
# 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 идет только как