Статья не для публикации.
Парсек написан для работы на локальной машине, и он работает от имени суперпользователя игнорируя все мандатные ограничения. В том числе - выполяет монтирование мандатных домашних каталогов находясь на нулевом уровне конфиденциальности. При подключении через сеть ему приходится работать от имени пользвателя, и вступают в силу мандатные ограничения, не позволяющие работать с конфиденциальной информацией. В результате Парсек просто не видит разделяемых каталогов с ненулевой конфиденциальностью.
Для того, чтобы изложенное в статье работало - нужен патч Парсека, чтобы монтирование каталога выполнялось на мандатном уровне сессии. Так как в конце выпонения этапа session модуль pam_parsec_mac в любом случае выставляет мандатную метку пользователя, этк метку можно выставить в два этапа: сначала поднать уровень конфиденциальности, оставив высокий уровень целостности, а проверив/создав каталоги пользователя - полностью присвоить мандатную метку пользователя. Патч:
Pam_mount после pam_parsec_mac работает на нужном мандатном уровне потому, что pam_parsec_mac после завершения этапа session присваивает сессии мандатную метку пользователя.
Как работает ALD:
- ald-parsec проверяет параметры пользователя, и, если у него задан удалённый домашний каталог, выставляет переменную окружение PDP_HOME
- pam_parsec_mac, обнаружив переменную окружения PDP_HOME выполняет проверку доступа к указанному в этой переменной каталогу, при которой вызывается backdoor в sаmba, от имени рута создающий эти каталоги
- pam_parsec_mас монтирует локальные каталоги обычным образом, ничего не зная про монтирование сетевых каталогов
- pam_parsec_mac оставляет после себя мандатную метку на процессе
- вызываемый после pam_parsec_mac модуль pam_ald наследует мандатную метку, и перемонтирует каталоги на сетевые
ToDo:
Подключение работает только с устаревшей версией протокола (vers=1) (см. BT-8434). При этом возможно использование только протокола без подписи пакетов (sec=krb5), более защищённый вариант с подписью пакетов (sec=krb5i) несовместим с vers=1.
Не работает размонтирование при выходе из сессии. Возможная причина - опять недостаточный мандатный уровень. Нужно разбираться.
Описание стенда
- Сервер FreeIPA + Samba. Порядок установки и настройки см. Samba + FreeIPA аутентификация пользователей Samba в Kerberos.
В промышленной эксплуатации службу samba рекомендуется размещать на отдельном сервере. Порядок настройки отдельной службы на отдельном сервере см. также в статье Samba + FreeIPA аутентификация пользователей Samba в Kerberos. - Параметры сервера FreeIPA + Samba, используемые далее:
- имя сервера ipa0.ipadomain/ru;
- администратор домена admin;
- пользователь домена с возможностью входа с ненулевой меткой конфиденциальности - ipauser;
- Компьютер - клиент FreeIPA. Инструкцию по вводу компьютера в домен см. с статье FreeIPA.
Настройка сервера
Только для ОС СН
При работе с конфиденциальными данными в обязательном порядке следует настроить ограничения на файловом сервере: установить в конфигурации samba в секции [global] параметры:
client max protocol = NT1 use socket MAC label = YES
В используемой в данной статье конфигурации (когда конфигурация samba хранится в реестре samba) это можно сделать из командной строки (сервис при этом перезапускать не обязательно, изменения применятся автоматически). Команды:
sudo net conf setparm global "use socket MAC label" "Yes"
Создать конфигурации разделяемых ресурсов импортировать их в конфигурацию samba. Создаваемые ресурсы:
- Ресурс для монтирования домашних каталогов при работе с нулевой меткой конфиденциальности - ресурс homes (стандарный ресурс samba);
- Ресурс для монтирования домашний каталогов при работе с ненулевой меткой конфиденциальности. Имя ресурса может быть произвольным, в примере используется имя pdp_homes. Данный ресурс требуется только для ОС СН.
Конфигурации ресурсов сохраняются в файлах, далее импортируются в конфигурацию samba. Команды:
cat << EOT > homes.txt
[homes]
comment = Home Directories
create mask = 0600
directory mask = 0700
read only = No
valid users = %S
browseable = No
EOT
cat << EOT > pdp_homes.txt
[pdp_homes]
comment = pdp homes share
create mask = 0600
directory mask = 0700
path = /home/.pdp/%U
read only = No
browseable = No
valid users = %U
EOT
sudo net conf import homes.txt homes
sudo net conf import pdp_homes.txt pdp_homes
Эти же действия можно выполнить командами не используя файлы для сохранения данных, например:
sudo net conf setparm "homes" "browseable" "No"
sudo net conf setparm "homes" "valid users" "%U"
и т.д.
Специальные настройки для ОС СН
Ресурс pdp_homes будет предоставлять для монтирования путь /home/.pdp/<имя_пользователя"> (параметр path = /home/.pdp/%U в конфигурации). Если такого каталога нет, то с помощью подключения через samba (т.е. действиями со стороны клиентской машины) создать его невозможно, поэтому на момент подключения пользователя пользовательский подкаталог должен быть уже создан. При этом:
- каталог должен принадлежать пользователю;
- только в ОС СН:
- это должен быть каталог с низким уровнем целостности, иначе запись в него из сетевого подключения будет невозможна.
- каталог должен иметь метку конфиденциальности не ниже максимально допустимой для пользователя;
Для пользователя ipauser:
sudo mkdir /home/.pdp/ipauser
sudo chown ipauser:ipauser /home/.pdp/ipauser
sudo pdpl-file 3:0:-1:CCNRA /home/.pdp/ipauser
Далее возможны два варианта:
Заранее создать в каталоге пользователя все возможные для него варианты домашних каталогов для всех допустимых сочетаний атрибутов конфиденциальности (неудобно, но безопасно). При этом, так как при входе в любую сессию независимо от её метки конфиденциальности Парсек проверяет и создаёт пользовательский каталог с нулевой меткой конфиденциальности, этот каталог также в обязательном порядке должен быть создан заранее:
sudo mkdir /home/.pdp/ipauser/l0i0c0x0t0x0
sudo chown ipauser:ipauser /home/.pdp/ipauser/l0i0c0x0t0x0
sudo pdpl-file 0:0:0 /home/.pdp/ipauser/l0i0c0x0t0x0- Изменить настройки ОС, принятые по умолчанию, и использовать параметр ядра parsec.ccnr_relax, что позволит Парсеку, действуя от имени пользователя, самостоятельно создавать каталоги с нужными метками конфиденциальности (не превышающими метку конфиденциальности каталога пользователя) при сетевом подключении. Это более удобно, но несколько снижает защищённость системы.
Настройка клиента
Клиент должен быть введён в домен FreeIPA. Инструкцию по вводу компьютера в домен см. с статье FreeIPA.
Установка пакетов
Набор пакетов, необходимых для монтирования домашних каталогов можно командой:
Настройка модуля pam_mount
В конфигурации модуля pam_mount (файл /etc/security/pam_mount.conf.xml) задать параметры подключаемых сетевых ресурсов. Примеры конфигурации (только часть, непосредственно относящаяся к ресурсам):
<volume fstype="cifs" server="ipa0.ipadomain.ru" path="%(USER)" mountpoint="/home/%(USER)" options="user=%(USER),cruid=%(USER),nosharesock,sec=krb5,vers=1.0" />
<volume fstype="cifs" server="ipa0.ipadomain.ru" path="pdp_homes" mountpoint="/home/.pdp/%(USER)" options="user=%(USER),cruid=%(USER),uid=%(USERUID),gid=%(USERGID),nosharesock,sec=krb5,vers=1.0" />
Дополнительно разрешить использование применяемых параметров, например:
<mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,uid,gid,nosharesock,vers" />
Настройка pam-стека
Удалить (закомментировать) вызов модуля pam_mount из файла /etc/pam.d/common-session:
session required pam_parsec_mac.so unshare_root_only
session optional pam_mount.so
session required pam_parsec_mac.so