F.52. sepgsql — SELinux-, метка-основанный модуль безопасности с обязательным контролем доступа (MAC)#
F.52. sepgsql — SELinux-, метка-основанный модуль безопасности с обязательным контролем доступа (MAC) #
sepgsql
- это загружаемый модуль, который поддерживает контроль доступа на основе меток (MAC) на основе политики безопасности SELinux.
Предупреждение
Существующая реализация имеет значительные ограничения и не обеспечивает обязательный контроль доступа для всех действий. См. Раздел F.52.7.
F.52.1. Обзор #
Этот модуль интегрируется с SELinux, чтобы обеспечить дополнительный уровень проверки безопасности, превышающий обычные возможности Tantor BE. С точки зрения SELinux, этот модуль позволяет Tantor BE функционировать как менеджер объектов в пользовательском пространстве. Каждый доступ к таблице или функции, инициированный запросом DML, будет проверяться в соответствии с политикой безопасности системы. Эта проверка выполняется дополнительно к обычной проверке разрешений SQL, выполняемой Tantor BE.
SELinux решения по контролю доступа осуществляются с использованием меток безопасности, которые представлены строками, такими как system_u:object_r:sepgsql_table_t:s0
. Каждое решение по контролю доступа включает две метки: метку субъекта, пытающегося выполнить действие, и метку объекта, на котором должна быть выполнена операция. Поскольку эти метки могут быть применены к любому типу объекта, решения по контролю доступа для объектов, хранящихся в базе данных, могут быть (и, с помощью этого модуля, являются) подвержены тем же общим критериям, что и объекты любого другого типа, такие как файлы. Этот дизайн предназначен для обеспечения централизованной политики безопасности для защиты информационных активов, независимо от особенностей их хранения.
Следующий оператор SECURITY LABEL
позволяет назначить метку безопасности объекту базы данных.
F.52.2. Установка #
sepgsql
может использоваться только на Linux
версии 2.6.28 или выше с включенным SELinux.
Он не доступен на других платформах. Вам также понадобится
libselinux версии 2.1.10 или выше и
selinux-policy версии 3.9.13 или выше (хотя некоторые
дистрибутивы могут включить необходимые правила в более старые версии политики).
Команда sestatus
позволяет проверить статус SELinux. Обычный вывод выглядит так:
$ sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted
Если SELinux отключен или не установлен, необходимо настроить этот продукт перед установкой данного модуля.
Для построения этого модуля включите опцию --with-selinux
в команде configure
вашего PostgreSQL. Убедитесь, что пакет libselinux-devel
RPM установлен во время сборки.
Для использования этого модуля необходимо включить sepgsql
в параметре shared_preload_libraries в файле postgresql.conf
. Модуль не будет работать правильно, если он будет загружен иным способом. После загрузки модуля необходимо выполнить sepgsql.sql
в каждой базе данных. Это установит необходимые функции для управления метками безопасности и назначит начальные метки безопасности.
Вот пример, показывающий, как инициализировать новый кластер базы данных с установленными функциями и метками безопасности sepgsql
. Подстройте пути, показанные в соответствии с вашей установкой:
$ export PGDATA=/path/to/data/directory $ initdb $ vi $PGDATA/postgresql.conf change #shared_preload_libraries = '' # (change requires restart) to shared_preload_libraries = 'sepgsql' # (change requires restart) $ for DBNAME in template0 template1 postgres; do postgres --single -F -c exit_on_error=true $DBNAME \ </usr/local/pgsql/share/contrib/sepgsql.sql >/dev/null done
Обратите внимание, что вы можете увидеть одно или все следующие уведомления в зависимости от конкретных версий libselinux и selinux-policy:
/etc/selinux/targeted/contexts/sepgsql_contexts: line 33 has invalid object type db_blobs /etc/selinux/targeted/contexts/sepgsql_contexts: line 36 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 37 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 38 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 39 has invalid object type db_language /etc/selinux/targeted/contexts/sepgsql_contexts: line 40 has invalid object type db_language
Эти сообщения безвредны и их следует игнорировать.
Если процесс установки завершается без ошибок, вы можете запустить сервер в обычном режиме.
F.52.3. Тесты регрессии #
Из-за особенностей SELinux для запуска
регрессионных тестов для sepgsql
требуется несколько
дополнительных шагов конфигурации, некоторые из которых должны быть выполнены от имени root.
Регрессионные тесты не будут запущены обычной командой
make check
или make installcheck
; вы должны
настроить конфигурацию и затем вручную вызвать скрипт тестирования.
Тесты должны быть запущены в каталоге contrib/sepgsql
настроенного дерева сборки PostgreSQL. Хотя для их выполнения требуется дерево сборки,
тесты предназначены для выполнения против установленного сервера,
то есть они сравнимы с make installcheck
, а не
make check
.
Сначала настройте sepgsql
в рабочей базе данных
в соответствии с инструкциями в Раздел F.52.2.
Обратите внимание, что текущий пользователь операционной системы должен иметь возможность подключиться к
базе данных в качестве суперпользователя без аутентификации по паролю.
Соберите и установите пакет политики для регрессионного тестирования.
Политика sepgsql-regtest
- это специальный пакет политики,
который предоставляет набор правил, разрешенных во время регрессионных тестов.
Он должен быть собран из исходного файла политики
sepgsql-regtest.te
, что делается с помощью
make
с использованием Makefile, предоставленного SELinux.
Вам нужно найти соответствующий
Makefile на вашей системе; путь, указанный ниже, является только примером.
(Этот Makefile обычно предоставляется пакетами
selinux-policy-devel
или
selinux-policy
RPM).
После сборки установите этот пакет политики с помощью команды
semodule
, которая загружает предоставленные пакеты политики
в ядро. Если пакет правильно установлен,
должен показывать semodule
-lsepgsql-regtest
как
доступный пакет политики.
$ cd .../contrib/sepgsql $ make -f /usr/share/selinux/devel/Makefile $ sudo semodule -u sepgsql-regtest.pp $ sudo semodule -l | grep sepgsql sepgsql-regtest 1.07
Во-первых, включите sepgsql_regression_test_mode
.
По соображениям безопасности правила в файле sepgsql-regtest
по умолчанию не включены;
параметр sepgsql_regression_test_mode
включает
правила, необходимые для запуска регрессионных тестов.
Его можно включить с помощью команды setsebool
:
$ sudo setsebool sepgsql_regression_test_mode on $ getsebool sepgsql_regression_test_mode sepgsql_regression_test_mode --> on
Убедитесь, что ваша оболочка работает в домене unconfined_t
:
$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
См. Раздел F.52.8 для получения подробной информации о настройке вашей рабочей области, если это необходимо.
Запустите скрипт регрессионного тестирования.
$ ./test_sepgsql
Этот скрипт попытается проверить, что вы выполнили все настройки правильно, а затем запустит регрессионные тесты для модуля sepgsql
.
После завершения тестов рекомендуется отключить параметр sepgsql_regression_test_mode
.
$ sudo setsebool sepgsql_regression_test_mode off
Вы можете предпочесть полностью удалить политику sepgsql-regtest
:
$ sudo semodule -r sepgsql-regtest
F.52.4. Параметры GUC #
-
sepgsql.permissive
(boolean
) # Этот параметр позволяет
sepgsql
работать в режиме сниженной безопасности, независимо от настроек системы. По умолчанию он отключен. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.Когда этот параметр включен, функции
sepgsql
работают в режиме снисходительности, даже если SELinux в целом работает в режиме принудительного выполнения. Этот параметр в основном полезен для тестирования.-
sepgsql.debug_audit
(boolean
) # Этот параметр позволяет печатать аудиторские сообщения независимо от настроек системной политики. По умолчанию он отключен, что означает, что сообщения будут печататься в соответствии с настройками системы.
Система безопасности SELinux также имеет правила для контроля того, будут ли определенные доступы регистрироваться. По умолчанию, нарушения доступа регистрируются, но разрешенные доступы - нет.
Этот параметр принуждает включить все возможные журналирования, независимо от системной политики.
F.52.5. Особенности #
F.52.5.1. Классы контролируемых объектов #
Модель безопасности SELinux описывает все правила контроля доступа как отношения между субъектным сущностями (обычно клиентом базы данных) и объектными сущностями (такими как объект базы данных), каждая из которых идентифицируется меткой безопасности. Если производится попытка доступа к объекту без метки, объект рассматривается так, как если бы ему была назначена метка unlabeled_t
.
В настоящее время sepgsql
позволяет назначать метки безопасности схемам, таблицам, столбцам, последовательностям, представлениям и функциям. Когда sepgsql
используется, метки безопасности автоматически назначаются поддерживаемым объектам базы данных при их создании. Эта метка называется меткой безопасности по умолчанию и определяется в соответствии с политикой безопасности системы, которая принимает в качестве входных данных метку создателя, метку, назначенную родительскому объекту нового объекта, и, при необходимости, имя созданного объекта.
Новый объект базы данных в основном наследует метку безопасности родительского объекта, за исключением случаев, когда для политики безопасности установлены специальные правила, известные как правила типового перехода, в таком случае может быть применена другая метка. Для схем родительским объектом является текущая база данных; для таблиц, последовательностей, представлений и функций - это содержащая схема; для столбцов - это содержащая таблица.
F.52.5.2. Разрешения DML #
Для таблиц, db_table:select
, db_table:insert
,
db_table:update
или db_table:delete
проверяются
для всех целевых целевых таблиц в зависимости от типа
оператора; кроме того, db_table:select
также проверяется
для всех таблиц, содержащих столбцы, на которые ссылаются в предложении
WHERE
или RETURNING
, как источник данных
для UPDATE
и т. д.
Права на уровне столбцов также будут проверяться для каждого целевого столбца.
db_column:select
проверяется не только для столбцов, которые
считываются с помощью SELECT
, но и для тех, которые используются в других операторах DML;
db_column:update
или db_column:insert
также будут проверяться для столбцов, изменяемых с помощью UPDATE
или
INSERT
.
Например, рассмотрим:
UPDATE t1 SET x = 2, y = func1(y) WHERE z = 100;
Здесь будет проверяться db_column:update
для t1.x
, так как он обновляется, будет проверяться db_column:{select update}
для t1.y
, так как он обновляется и ссылается на него, и будет проверяться db_column:select
для t1.z
, так как он только ссылается на него. db_table:{select update}
также будет проверяться на уровне таблицы.
Для последовательностей, db_sequence:get_value
проверяется, когда мы
ссылаемся на объект последовательности с помощью SELECT
; однако, обратите внимание, что
в настоящее время мы не проверяем разрешения на выполнение соответствующих функций,
таких как lastval()
.
Для представлений будет проверяться db_view:expand
, а затем любые другие необходимые разрешения будут проверяться на объектах, расширяемых из представления, индивидуально.
Для функций, при выполнении функции в рамках запроса или с использованием быстрого вызова, будет проверяться db_procedure:{execute}
. Если эта функция является доверенной процедурой, также будет проверяться разрешение db_procedure:{entrypoint}
для определения возможности использования в качестве точки входа доверенной процедуры.
Для доступа к любому объекту схемы требуется разрешение db_schema:search
на содержащую схему. Если объект ссылается без указания схемы, то схемы, на которых отсутствует это разрешение, не будут искаться (как если бы у пользователя не было привилегии USAGE
на схему). Если явно указано квалификация схемы, то возникнет ошибка, если у пользователя нет необходимого разрешения на указанную схему.
Клиенту должно быть разрешено получить доступ ко всем целевым таблицам и столбцам, даже если они происходят из представлений, которые затем были развернуты, чтобы мы могли применять последовательные правила контроля доступа, независимо от способа ссылки на содержимое таблицы.
Система привилегий базы данных по умолчанию позволяет суперпользователям базы данных изменять системные каталоги с помощью команд DML и ссылаться или изменять таблицы toast. Эти операции запрещены, когда включен sepgsql
.
F.52.5.3. DDL Разрешения #
SELinux определяет несколько разрешений для управления общими операциями для каждого типа объекта, такими как создание, изменение, удаление и изменение метки безопасности. Кроме того, у нескольких типов объектов есть специальные разрешения для управления их характерными операциями, такими как добавление или удаление записей имен в определенной схеме.
Создание нового объекта базы данных требует разрешения create
.
SELinux будет предоставлять или отклонять это разрешение на основе метки безопасности клиента и предлагаемой метки безопасности для нового объекта. В некоторых случаях требуются дополнительные привилегии:
CREATE DATABASE
также требует разрешенияgetattr
для исходной или шаблонной базы данных.Создание объекта схемы также требует наличия разрешения
add_name
на родительскую схему.Создание таблицы также требует разрешения на создание каждого отдельного столбца таблицы, как если бы каждый столбец таблицы был отдельным объектом верхнего уровня.
Создание функции, помеченной как
LEAKPROOF
, также требует наличия разрешенияinstall
. (Это разрешение также проверяется, когдаLEAKPROOF
устанавливается для существующей функции).
Когда выполняется команда DROP
, будет проверено наличие drop
на удаляемом объекте. Также будут проверены разрешения для объектов, удаляемых косвенно с помощью CASCADE
. Удаление объектов, содержащихся в определенной схеме (таблицы, представления, последовательности и процедуры), также требует наличия remove_name
на схеме.
Когда выполняется команда ALTER
, для каждого типа объекта, кроме дополнительных объектов, таких как индексы или триггеры таблицы, разрешение setattr
будет проверяться на изменяемом объекте, в то время как разрешения проверяются на родительском объекте. В некоторых случаях требуются дополнительные разрешения.
Перемещение объекта в новую схему также требует наличия разрешения
remove_name
на старой схеме и разрешенияadd_name
на новой.Установка атрибута
LEAKPROOF
для функции требует наличия разрешенияinstall
.Использование
SECURITY LABEL
на объекте также требует наличия разрешенияrelabelfrom
для объекта в сочетании со старой меткой безопасности и разрешенияrelabelto
для объекта в сочетании с его новой меткой безопасности. (В случаях, когда установлено несколько поставщиков меток и пользователь пытается установить метку безопасности, но она не управляется SELinux, здесь должна быть проверена толькоsetattr
. В настоящее время это не выполняется из-за ограничений реализации).
F.52.5.4. Доверенные процедуры #
Доверенные процедуры похожи на функции с определенными правами безопасности или команды setuid. SELinux предоставляет возможность запускать доверенный код с использованием метки безопасности, отличной от метки клиента, обычно с целью обеспечения высококонтролируемого доступа к конфиденциальным данным (например, строки могут быть не указаны или точность хранящихся значений может быть снижена). Вопрос о том, является ли функция доверенной процедурой, контролируется ее меткой безопасности и политикой безопасности операционной системы. Например:
postgres=# CREATE TABLE customer ( cid int primary key, cname text, credit text ); CREATE TABLE postgres=# SECURITY LABEL ON COLUMN customer.credit IS 'system_u:object_r:sepgsql_secret_table_t:s0'; SECURITY LABEL postgres=# CREATE FUNCTION show_credit(int) RETURNS text AS 'SELECT regexp_replace(credit, ''-[0-9]+$'', ''-xxxx'', ''g'') FROM customer WHERE cid = $1' LANGUAGE sql; CREATE FUNCTION postgres=# SECURITY LABEL ON FUNCTION show_credit(int) IS 'system_u:object_r:sepgsql_trusted_proc_exec_t:s0'; SECURITY LABEL
Все вышеуказанные операции должен выполнять административный пользователь.
postgres=# SELECT * FROM customer; ERROR: SELinux: security policy violation postgres=# SELECT cid, cname, show_credit(cid) FROM customer; cid | cname | show_credit -----+--------+--------------------- 1 | taro | 1111-2222-3333-xxxx 2 | hanako | 5555-6666-7777-xxxx (2 rows)
В этом случае обычный пользователь не может ссылаться напрямую на customer.credit
, но доверенная процедура show_credit
позволяет пользователю печатать номера кредитных карт клиентов с некоторыми скрытыми цифрами.
F.52.5.5. Динамические переходы доменов #
Возможно использовать функцию динамического перехода между доменами SELinux для изменения метки безопасности процесса клиента, домена клиента, на новый контекст, если это разрешено политикой безопасности. Для этого домен клиента должен иметь разрешение setcurrent
и также dyntransition
от старого к новому домену.
Следует тщательно продумать все динамические переходы между доменами, поскольку они позволяют пользователям переключаться между метками и, следовательно, привилегиями по своему усмотрению, а не (как в случае с доверенной процедурой) по требованию системы.
Таким образом, разрешение dyntransition
считается безопасным только при использовании для перехода к домену с меньшим набором привилегий, чем у исходного. Например:
regression=# select sepgsql_getcon(); sepgsql_getcon ------------------------------------------------------- unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 (1 row) regression=# SELECT sepgsql_setcon('unconfined_u:unconfined_r:unconfined_t:s0-s0:c1.c4'); sepgsql_setcon ---------------- t (1 row) regression=# SELECT sepgsql_setcon('unconfined_u:unconfined_r:unconfined_t:s0-s0:c1.c1023'); ERROR: SELinux: security policy violation
В этом примере нам было разрешено переключиться с более широкого диапазона MCS c1.c1023
на более узкий диапазон c1.c4
, но обратное переключение было запрещено.
Сочетание динамического перехода домена и доверенной процедуры позволяет интересное использование, которое соответствует типичному жизненному циклу программного обеспечения для пула подключений. Даже если ваше программное обеспечение для пула подключений не может выполнять большинство SQL-команд, вы можете разрешить ему переключать метку безопасности клиента с помощью функции sepgsql_setcon()
изнутри доверенной процедуры; для этого должны быть предоставлены некоторые учетные данные для авторизации запроса на переключение метки клиента. После этого сессия будет иметь привилегии целевого пользователя, а не пула подключений. Пул подключений позже может отменить изменение метки безопасности, снова используя sepgsql_setcon()
с аргументом NULL
, снова вызванной изнутри доверенной процедуры с соответствующей проверкой разрешений. Суть в том, что только доверенная процедура имеет разрешение на изменение эффективной метки безопасности и делает это только при наличии правильных учетных данных. Конечно, для безопасной работы хранилище учетных данных (таблица, определение процедуры или что-либо еще) должно быть защищено от несанкционированного доступа.
F.52.6. Функции Sepgsql #
Таблица F.32 показывает доступные функции.
Таблица F.32. Функции Sepgsql
Функция Описание |
---|
Возвращает домен клиента, текущую метку безопасности клиента. |
Переключает клиентский домен текущей сессии на новый домен, если это разрешено политикой безопасности. Он также принимает входные данные |
Преобразует заданный квалифицированный диапазон MLS/MCS в сырой формат, если демон mcstrans работает. |
Переводит заданный диапазон MLS/MCS в квалифицированный формат, если демон mcstrans работает. |
Устанавливает начальные метки безопасности для всех объектов в текущей базе данных. Аргументом может быть |
F.52.7. Ограничения #
- Data Definition Language (DDL) Permissions
Из-за ограничений реализации некоторые операции DDL не проверяют разрешения.
- Data Control Language (DCL) Permissions
Из-за ограничений реализации операции DCL не проверяют разрешения.
- Row-level access control
Tantor BE поддерживает уровень доступа на уровне строк, но
sepgsql
этого не делает.- Covert channels
sepgsql
не пытается скрыть существование определенного объекта, даже если пользователю запрещено на него ссылаться. Например, можно заключить наличие невидимого объекта в результате конфликтов первичных ключей, нарушений внешних ключей и так далее, даже если мы не можем получить содержимое объекта. Существование секретной таблицы не может быть скрыто; мы только надеемся скрыть ее содержимое.
F.52.8. Внешние ресурсы #
- SE-PostgreSQL Introduction
Эта вики-страница предоставляет краткий обзор, дизайн безопасности, архитектуру, администрирование и предстоящие функции.
- SELinux User's and Administrator's Guide
Этот документ предоставляет широкий спектр знаний для администрирования SELinux на ваших системах. Он в основном сосредоточен на операционных системах Red Hat, но не ограничивается ими.
- Fedora SELinux FAQ
Этот документ отвечает на часто задаваемые вопросы о SELinux. Он в основном сосредоточен на Fedora, но не ограничивается только ею.
F.52.9. Автор #
KaiGai Kohei <kaigai@ak.jp.nec.com>