Данная статья применима к:
- ОС ОН Орёл 2.12
- ОС СН Смоленск 1.6
- ОС СН Ленинград 1.6
При настройках по умолчанию авторизация Kerberos в файловой системе NFS осуществляется от имени компьютера. Таким образом, монтирование может быть выполнено любым пользователем, авторизованным на этом компьютере. С одной стороны, это позволяет монтировать общие разделяемые ресурсы, но, с другой стороны, может стать причиной утечки или повреждения данных при некорректно настроенных правах доступа.
При некорректно настроенных параметрах авторизации NFS может выполнять монтирование с произвольным понижением уровня протокола (NFSv3 вместо NFSv4) и/или изменением типа авторизации (авторизация SYS вместо Kerberos), что также является источником потенциальных уязвимостей.
Описание стенда
- контроллер домена FreeIPA:
- имя сервера ipa0.ipadomain0.ru;
- имя администратора admin;
- IP-адрес контролера домена не используется, так как подразумевается наличие настроенной службы DNS;
- клиент домена
- имя клиента host0.ipadomain0.ru;
Настройка сервера
Установить пакет nfs-kernel-server:
sudo apt install nfs-kernel-serverИсправить порядок запуска служб после перезагрузки, добавив в файл /etc/systemd/system/multi-user.target.wants/nfs-server.service в секцию [Unit] строки:
[Unit]Команды:
After=rpcbind.service
Requires=rpcbind.servicesudo sed -i "s/\[Unit\]/[Unit]\nAfter=rpcbind.service/" /etc/systemd/system/multi-user.target.wants/nfs-server.service
sudo sed -i "s/\[Unit\]/[Unit]\nRequires=rpcbind.service/" /etc/systemd/system/multi-user.target.wants/nfs-server.serviceУстранить ошибки создания БД nfs/nfsdcltrack. Команды (первый запуск команды sudo nfsdcltrack -d init при этом завершится ошибкой):
sudo mkdir -p /var/lib/nfs/nfsdcltrack
sudo chmod 755 /var/lib/nfs/nfsdcltrack
sudo nfsdcltrack -d init
sudo chmod 660 /var/lib/nfs/nfsdcltrack/main.sqlite
sudo chown statd /var/lib/nfs/nfsdcltrack/main.sqlite
sudo nfsdcltrack -d initВключить запуск всех служб, необходимых для авторизации Kerberos:
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
sudo sed -i 's/^[[:space:]]*NEED_SVCGSSD[[:space:]]*=.*/NEED_SVCGSSD="yes"/' /etc/default/nfs-kernel-server
sudo sed -i 's/^[[:space:]]*RPCSVCGSSDOPTS[[:space:]]*=.*/RPCCSVSGSSDOPTS="-vvvv"/' /etc/default/nfs-kernel-serverЗарегистрировать службу nfs/ipa0.ipadomain0.ru@IPADOMAIN0.RU в домене и получить соответствующую запись в таблицу ключей:
kinit admin
ipa service-add nfs/ipa0.ipadomain0.ru@IPADOMAIN0.RU
sudo kinit admin
sudo ipa-getkeytab -s ipa0.ipadomain0.ru -p nfs/ipa0.ipadomain0.ru@IPADOMAIN0.RU -k /etc/krb5.keytab- Опционально:
- Разрешить слабые защитные алгоритмы для старых клиентов, добавив запись allow_weak_crypto = true в секцию [libdefaults] файла /etc/krb5.conf;
Добавить защитные алгоритмы в каталог домена (12345678 - пароль администратора каталога):
ldapmodify -x -D "cn=directory manager" -w 12345678 -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 12345678 -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 12345678 -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;
Перезапустить службы:
sudo systemctl daemon-reload
sudo systemctl restart nfs-kernel-serverСоздать разделяемый ресурс. Для примера используем специально созданный каталог /export:
sudo mkdir /export
Разделяемые ресурсы определяются в конфигурационном файле /etc/exports. Подробно про возможные параметры разделяемых ресурсов см. man exports.В NFSv4 все сетевые ресурсы предоставлены единым деревом каталогов. Соответственно, в списке разделяемых ресурсов один из них должен быть обозначен как корневой. Для этого используется параметр fsid=0. Отсутсвие или некорректное определение корневого ресурса ведёт к неработоспособности смонтированных ресурсов, и, в случае монтирования домашних каталогов, к невозможности входа пользователей.Пример файла с ресурсами (экспортируется домашний каталог пользователей /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-авторизации.Экспортировать ресурс:
sudo exportfs -raПроверить, что ресурсы экспортированы успешно:
sudo showmount -e `hostname`
Export list for ipa0.ipadomain0.ru:
/home gss/krb5i
/export *
/ *
Настройка клиента
См. также Настройка карт автомонтирования в домене FreeIPA
Установить пакет nfs-common:
sudo apt install nfs-commonПроверить доступность сетевых ресурсов:
sudo showmount -e ipa0.idadomain0.ruВыполнить тестовое монтирование с Kerberos-авторизацией:
Для монтирования использовать только протокол NFSv4Пример команды:
sudo mount.nfs4 ipa0.ipadomain0.ru:/home/ /export -o sec=krb5iДополнительно при монтировании можно использовать опцию -v для включения отладочной печати.После того, как команда монтирования выполнилась без ошибок, убедиться, что:
Ресурсы примонтированы по запрошенному протоколу (vers=4.2) и с запрошенной авторизацией (sec=krb5i). Сделать это можно командой:
mount -t nfs4Если вывод команды пустой - то, скорее всего, монтирование было выполнено с понижением версии протокола (команда mount без параметров покажет все примонтированные ресурсы).
ipa0.ipadomain0.ru:/export on /export 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)Примонтированные ресурсы отображаются корректно, и в них корректно выполняются операции чтения записи. Пример отображения некорректно примонтированного ресурса при неправильно заданном корневом ресурсе NFSv4:
ls -l /
ls: невозможно получить доступ к '/export': Отказано в доступе
итого 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\"
Перезапустить сервис:
sudo systemctl restart nfs-utils