Информация | ||
---|---|---|
| ||
|
Предупреждение |
---|
"В случае необходимости использования мандатного управления доступом на сетевых дисках, их монтирование в файловую систему ОС должно осуществляться только с использованием файловой системы CIFS, поддерживающей расширенные (в т.ч. мандатные) атрибуты пользователей;" "Руководство по КСЗ. Часть 1 РУСБ.10015-01 97 01-1" п. 17.3. "Условия применения" |
Предупреждение | ||
---|---|---|
При настройках по умолчанию аутентификация через Kerberos в файловой системе NFS осуществляется:
Таким образом, монтирование сетевого ресурса NFS может быть выполнено любым пользователем или процессом. С одной стороны, это позволяет автоматически монтировать общие разделяемые ресурсы до входа первого пользователя, но, с другой стороны, может стать причиной утечки или повреждения данных при некорректно настроенных правах доступа.
При некорректно настроенных параметрах подключения NFS может выполнять монтирование с произвольным понижением уровня протокола (NFSv3 вместо NFSv4) и/или изменением типа аутентификации (аутентификация SYS вместо Kerberos), что также является источником потенциальных уязвимостей. |
Описание стенда
- контроллер домена FreeIPA:
- имя сервера ipa0.ipadomain0.ru;
- имя администратора admin;
- IP-адрес контроллера домена не используется, так как подразумевается наличие настроенной службы DNS;
- клиент домена
- имя клиента host0.ipadomain0.ru;
Настройка сервера
Информация |
---|
См. также статью Сетевая файловая система NFS |
Установить пакет nfs-kernel-server:
Command sudo apt install nfs-kernel-server Включить запуск всех служб, необходимых для аутентификации Kerberos:
Command sudo sed -i 's/^[[:space:]]*NEED_SVCGSSD[[:space:]]*=.*/NEED_SVCGSSD="yes"/' /etc/default/nfs-kernel-server
sudo sed -i 's/^[[:space:]]*NEED_GSSD[[:space:]]*=.*/NEED_GSSD=yes/' /etc/default/nfs-common
sudo sed -i 's/^[[:space:]]*NEED_IDMAPD[[:space:]]*=.*/NEED_IDMAPD=yes/' /etc/default/nfs-commonЗарегистрировать службу nfs/<имя_сервера> в домене и получить соответствующую запись в таблицу ключей, для чего:
Получить билет Kerberos администратора домена:
Command kinit admin Зарегистрировать службу:
Command ipa service-add nfs/`hostname` Получить билет Kerberos администратора домена для суперпользователя:
Command sudo kinit admin Информация Если билет Kerberos был получен до регистрации службы, то после регистрации службы он должен быть обновлен (получен повторно). Действуя от имени суперпользователя получить и сохранить таблицу ключей службы:
Command sudo ipa-getkeytab -s ipa0.ipadomain0.ru -p nfs/`hostname` -k /etc/krb5.keytab
- Опционально:
- Разрешить слабые защитные алгоритмы для старых клиентов, добавив запись allow_weak_crypto = true в секцию [libdefaults] файла /etc/krb5.conf;
Добавить защитные алгоритмы в каталог домена (будет запрошен пароль администратора каталога):
Command ldapmodify -x -D "cn=directory manager" -W -h ipa0.ipadomain0.ru << EOT
dn: cn=IPADOMAIN0.RU,cn=kerberos,dc=ipadomain0,dc=ru
changetype: modify
add: krbSupportedEncSaltTypes
krbSupportedEncSaltTypes: des-cbc-crc:normal
EOT
ldapmodify -x -D "cn=directory manager" -W -h ipa0.ipadomain0.ru << EOT
dn: cn=IPADOMAIN0.RU,cn=kerberos,dc=ipadomain0,dc=ru
add: krbSupportedEncSaltTypes
krbSupportedEncSaltTypes: des-cbc-crc:special
EOT
ldapmodify -x -D "cn=directory manager" -W -h ipa0.ipadomain0.ru << EOT
dn: cn=IPADOMAIN0.RU,cn=kerberos,dc=ipadomain0,dc=ru
add: krbDefaultEncSaltTypes
krbDefaultEncSaltTypes: des-cbc-crc:special
EOT
- Разрешить слабые защитные алгоритмы для старых клиентов, добавив запись allow_weak_crypto = true в секцию [libdefaults] файла /etc/krb5.conf;
Перезапустить службы:
Command sudo systemctl daemon-reload
sudo systemctl restart nfs-kernel-serverСоздать разделяемый ресурс (каталог) и разрешить запись в него. Для примера используем специально созданный каталог /export:
Command sudo mkdir /export
sudo chmod 777 /export
Разделяемые ресурсы определяются в конфигурационном файле /etc/exports. Подробно про возможные параметры разделяемых ресурсов см. man exports.Предупреждение В NFSv4 все сетевые ресурсы предоставлены единым деревом каталогов. Соответственно, в списке разделяемых ресурсов один из них должен быть обозначен как корневой. Для этого используется параметр fsid=0. Отсутствие или некорректное определение корневого ресурса ведёт к неработоспособности примонтированных ресурсов, и, в случае монтирования домашних каталогов, к невозможности входа пользователей. Пример файла с ресурсами (экспортируется домашний ката/etлог пользователей /home и созданный каталог /export):
Блок кода / *(rw,fsid=0,no_subtree_check,sec=krb5:krb5i:krb5p) /home gss/krb5i(rw,sync,no_subtree_check) /export *(rw,sync,no_subtree_check,no_root_squash,sec=krb5:krb5i:krb5p)
В приведенном примере первый ресурс - корневой, и использованы два альтернативных синтаксиса для "подчинённых" ресурсов NFSv4 с аутентификацией Kerberos.
В целях обеспечения безопасности в разделяемых ресурсах используется технология подмены идентификатора суперпользователя (root_squash). При этом операции, инициированные суперпользователем, выполняются от имени nobody:nogroup или от имени Kerberos-пользователя (См. ниже Настройка клиентской аутентификации Kerberos). Об этом ограничении следует помнить планируя настройку прав доступа в разделяемых ресурсах.Предупреждение Для того, чтобы в "подчиненные" ресурсы была разрешена запись, запись должна быть разрешена в корневой ресурс.
Для того, чтобы при доступе к "подчиненным" ресурсам корректно работала аутентификация Kerberos, корневой ресурс должен использовать такой же тип аутентификации.
Параметр no_root_squash неработоспособен, то есть подмена идентификатора суперпользователя выполняется всегда. См. ниже Настройка клиентской аутентификации Kerberos.Экспортировать ресурс:
Command sudo exportfs -ra Проверить, что ресурсы экспортированы успешно:
Command Title sudo showmount -e `hostname` Export list for ipa0.ipadomain0.ru:
/home gss/krb5i
/export *
/ *
Якорь | ||||
---|---|---|---|---|
|
См. также Настройка карт автомонтирования в домене FreeIPA
Создать на клиенте каталог для монтирования, например:
Command sudo mkdir /mnt/nfs_mount Установить пакет nfs-common:
Command sudo apt install nfs-common Проверить доступность сетевых ресурсов:
Command sudo showmount -e ipa0.ipadomain0.ru Включить запуск всех служб, необходимых для аутентификации Kerberos:
Command sudo sed -i 's/^[[:space:]]*NEED_GSSD[[:space:]]*=.*/NEED_SVCGSSD="yes"/' /etc/default/nfs-common
sudo sed -i 's/^[[:space:]]*NEED_IDMAPD[[:space:]]*=.*/NEED_IDMAPD="yes"/' /etc/default/nfs-common- Перезагрузить компьютер;
- Зарегистрировать NFS-службу клиента и получить ключ этой службы:
Выполнить на СЕРВЕРЕ команды для регистрации NFS-службы КЛИЕНТА:
Command kinit admin
ipa service-add nfs/`hostname`Выполнить на КЛИЕНТЕ команды для получения ключей NFS-службы КЛИЕНТА:
Command sudo kinit admin
sudo ipa-getkeytab -s ipa0.ipadomain0.ru -p nfs/`hostname` -k /etc/krb5.keytab
Выполнить тестовое монтирование с аутентификацией Kerberos:
Предупреждение Для монтирования использовать только протокол NFSv4 Пример команды:
Command sudo mount.nfs4 ipa0.ipadomain0.ru:/home/ /mnt/nfs_mount -o sec=krb5i Дополнительно при монтировании можно использовать опцию -v для включения отладочной печати.
Предупреждение После того, как команда монтирования выполнилась без ошибок:
Убедиться, что ресурсы примонтированы именно по запрошенному протоколу (vers=4.2), а не по какому-то другому, и с запрошенным типом аутентификации (sec=krb5i). Сделать это можно командой:
Command Title mount -t nfs4 ipa0.ipadomain0.ru:/export on /mnt/nfs_mount type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5i,clientaddr=10.0.2.5,local_lock=none,addr=10.0.2.100,user=admin) Если вывод команды пустой - то, монтирование либо не было выполнено, либо, что вероятнее, было выполнено с понижением версии протокола (команда mount без параметров покажет все примонтированные ресурсы).
Примонтированные ресурсы отображаются корректно, и в них корректно выполняются операции чтения записи. При монтировании по протоколу NFSv4 для успешного доступа к примонтированному ресурсу требуется наличие действующего пользовательского билета Kerberos. Следует помнить также, что таблицы ключей компьютера (используются для монтирования) обновляются автоматически, а клиентские билеты (используются для доступа к примонтированным ресурсам) автоматически не обновляются.
Информация Если при попытке доступа к ресурсу от имени простого пользователя возникает ошибка вида
Блок кода невозможно открыть каталог '/mnt': Устаревший дескриптор файла
это, вероятно, говорит о том, что клиентский билет отсутствует. При этом по умолчанию доступ от имени суперпользователя предоставляется без билета Kerberos, но от имени пользователя nobody:nogroup (или с билетом Kerberos от другого имени - см. ниже "Настройка аутентификации Kerberos при подмене идентификатора суперпользователя").
Пример отображения некорректно примонтированного ресурса при неправильно заданном корневом ресурсе NFSv4:Command Title ls -l / ls: невозможно получить доступ к '/mnt/nfs_mount': Отказано в доступе
итого 96
drwxr-xr-x 2 root root 4096 авг 11 11:54 bin
drwxr-xr-x 3 root root 4096 авг 4 15:42 boot
drwxr-xr-x 18 root root 3940 сен 1 14:35 dev
drwxr-xr-x 127 root root 12288 сен 1 14:35 etc
d????????? ? ? ? ? ? export
...
- Порядок включения автомонтирования см. в статье Настройка карт автомонтирования в домене FreeIPA.
Настройка аутентификации Kerberos при замене идентификатора суперпользователя
Предупреждение |
---|
Это не аутентификация Kerberos в полном смысле, это замена идентификатора суперпользователя идентификатором принципала суперпользователя (как правило, при администрировании доменных компьютеров, это принципал администратора домена). |
В файл /etc/default/nfs-common на компьютере-клиенте добавить строчку:
Блок кода GSSDARGS="-n"
В файл /usr/lib/systemd/scripts/nfs-utils_env.sh на компьютере-клиенте добавить строчку:
Блок кода echo GSSDARGS=\"$GSSDARGS\"
Перезапустить сервис:
Command sudo systemctl restart nfs-utils
Для проверки работы замены идентификатора создать на примонтированном разделяемом ресурсе файл действуя от имени суперпользователя (sudo), и убедиться, что владелец и группа созданного файла - nobody:nogroup.
...