Вопрос или проблема
Мне удалось настроить NFS/Keberos, но возникают проблемы с разрешениями, когда пользователь, аутентифицированный с помощью Kerberos, пытается выполнить запись и получает следующее сообщение:
philip@client $: touch /mnt/philip/testfile.txt
touch: невозможно выполнить touch для '/mnt/philip/test': Отказано в доступе
Ниже представлена моя полная установка и конфигурации:
mydomain.net
является заполнителем
Настройка NFS-сервера
server #: apt-get -y update
server #: apt-get -y install nfs-kernel-server nfs-common
server #: mkdir -p /srv/nfs/philip
server #: cat <<EOF >>/etc/exports
/srv/nfs/philip 192.168.10.0/24(rw,nohide,insecure,no_subtree_check,sync,no_root_squash)
EOF
server #: service nfs-kernel-server restart
Настройка клиента
client #: apt-get -y update
client #: apt-get -y install nfs-common
client #: mkdir -p /mnt/philip
client #: cat <<EOF >>/etc/fstab
nfs.mydomain.net:/srv/nfs/nfs-001 /mnt/philip nfs defaults 0 0
EOF
client #: mount -a
Тест
Теперь NFS-доля должна быть смонтирована в /mnt/philip
. ЭТО РАБОТАЕТ!
Настройка Kerberos
Сервер
Обновите /etc/exports
для нового Kerberos-ресурса:
/srv/nfs/philip 192.168.10.0/24(sec=krb5p,rw,nohide,insecure,no_subtree_check,sync)
Примечание: я удалил no_root_squash
здесь.
и экспортируйте:
server #: exportfs -ra
server #: showmount -e
Теперь настройте Kerberos-сервер:
server #: apt install krb5-kdc krb5-admin-server #введите область в полном верхнем регистре, введите fqdn для имен хостов
server #: cat /etc/krb5.conf
[libdefaults]
default_realm = MYDOMAIN.NET
# Следующие переменные krb5.conf относятся только к MIT Kerberos.
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
rdns = false
# Следующие параметры libdefaults относятся только к Heimdal Kerberos.
fcc-mit-ticketflags = true
[realms]
MYDOMAIN.NET = {
kdc = nfs.mydomain.net
admin_server = nfs.mydomain.net
}
[domain_realm]
продолжите настройку…
server #: krb5_newrealm
server #: vi /etc/krb5kdc/kadm5.acl # раскомментируйте /*admin *
server #: systemctl restart krb5-kdc krb5-admin-server
server #: kadmin.local -q "addprinc admin/[email protected]"
# создайте главную запись для NFS-сервиса на NFS-сервере
server #: kadmin.local -q "addprinc -randkey nfs/[email protected]"
server #: kadmin.local -q "ktadd -k /etc/krb5.keytab nfs/[email protected]"
Настройка клиента
Находясь все еще на сервере:
server #: kadmin.local -q "addprinc -randkey nfs/[email protected]"
server #: kadmin.local -q "ktadd -k /etc/krb5.client.keytab nfs/[email protected]"
server #: scp /etc/krb5.client.keytab client:/etc/krb5.keytab
Затем на клиенте:
client #: apt update
client #: apt install krb5-user
client #: kinit -k -t /etc/krb5.keytab nfs/[email protected]
client #: klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: nfs/[email protected]
Valid starting Expires Service principal
11/27/2023 14:49:54 11/28/2023 00:49:54 krbtgt/[email protected]
renew until 11/28/2023 14:49:44
Теперь я могу смонтировать NFS с помощью аутентификации Kerberos:
mount -a
Заметьте, у меня в /etc/fstab
есть nfs.mydomain.net:/srv/nfs/philip /mnt/philip nfs sec=krb5p 0 0
.
Если это не удается, возможно, вам нужно:
systemctl restart rpc-gssd
Статус
NFS сейчас смонтирован на клиентской машине через Kerberos
Настройка доступа philip к NFS/Keberos ресурсу
# настройка главной записи для Philip
server #: kadmin.local -q "addprinc -randkey philip/[email protected]"
server #: kadmin.local -q "ktadd -k /etc/krb5.philip.keytab philip/[email protected]"
server #: scp /etc/krb5.philip.keytab client:
затем аутентифицируйтесь:
philip@client $: kinit -k -t krb5.philip.keytab philip/[email protected]
philip@client $: ls -ls /mnt/philip
total 12
drwxr-xr-x 2 philip philip 4096 Dec 26 07:30 .
drwxr-xr-x 7 root root 4096 Dec 26 09:34 ..
philip@client $: touch /mnt/philip/test
touch: невозможно выполнить touch для '/mnt/philip/test': Отказано в доступе
вот разрешения:
server #: ls -la /srv/nfs/
total 16
drwxr-xr-x 4 root root 4096 Dec 26 06:35 .
drwxr-xr-x 3 root root 4096 Dec 22 14:35 ..
drwxr-xr-x 2 philip philip 4096 Dec 26 07:30 philip
даже root не может записывать в этот каталог.
Если я выполню chmod 777 /srv/nfs/philip
, то смогу записывать, что указывает на то, что я являюсь пользователем other
.
что делать дальше?
Я буду признателен за любую помощь в решении этой проблемы.
addprinc -randkey philip/[email protected]
Стандартное отображение Kerberos-принципалов на учетные записи Unix знает только о принципалах с одним компонентом; т.е. сервер может сопоставить [email protected]
с вашей учетной записью Unix philip
, но он не имеет встроенной поддержки1 для принципалов, использующих экземпляры – поэтому принципал сопоставляется с nobody
.
В общем случае, не используйте принципалы с экземплярами для пользовательских учетных записей, если вы не знаете, что делаете. В большинстве случаев вам нужно было создать принципал [email protected]
для учетной записи пользователя (и, как правило, использовать обычный пароль вместо ключевой таблицы). Но если вы действительно нуждаетесь в пользовательских принципалах с именем экземпляра, вам потребуется определить для них правила отображения.
(И в отличие от сервисных принципалов, в использовании FQDN для экземпляра пользовательской учетной записи нет особого смысла, за исключением некоторых пользовательских конфигураций. Более часто экземпляр для пользовательского принципала будет что-то вроде philip/admin
или /cron
– произвольная строка, а не имя хоста.)
Аутентификация в NFS происходит на уровне SunRPC, поэтому преобразование принципала→имя пользователя выполняется отдельно от ‘idmapd’ (который предназначен только для преобразования имени пользователя⇆UID и используется только для “полезной нагрузки” NFS, такой как UID/GID, отображаемые в ls -l
); вместо этого преобразование выполняется в ‘gssproxy’ (или в более старой ‘rpc.svcgssd’) согласно стандартным правилам отображения libkrb5, определенным в /etc/krb5.conf
.
Итак, если вам необходимо использовать пользовательские принципалы с экземплярами, это будет выглядеть так для MIT Kerberos:
[realms]
MYDOMAIN.NET = {
# Например, правило для экземпляра "/admin" -> пользователь "root"
auth_to_local = RULE:[2:$1;$2@$0](.*;admin@MYDOMAIN\.NET$)s/.*/root/
# Пример правила для любого экземпляра -> 1-й компонент
auth_to_local = RULE:[2:$1;$2@$0](.*@MYDOMAIN\.NET$)s/;.*@.*$//
auth_to_local = DEFAULT
}
(…в значении “если принципал имеет 2
компонента, то соедините их в ‘$1;$2@$0
‘ и сопоставьте с регулярным выражением /.*@MYDOMAIN\.NET$
/; в случае совпадения выполните замену регулярного выражения /@.*$
/’ на ‘‘ и результат — это имя пользователя”.)
Вы можете использовать пример инструмента k5userok.c для тестирования правил.
Это покроет не только NFS, но также SSH и большинство других служб на базе Kerberos (все, что использует функции gss_localname()
или krb5_aname_to_localname()
).
Проблема с использованием экземпляров, основанных на имени хоста, состоит в том, что вам потребуется общее правило, которое неизбежно также будет применяться к сервисным принципалам, например, каждый ‘host/foo.example.com’ теперь будет сопоставляться с пользователем ‘host’.
1 (Это может быть связано с тем, что Kerberos не может легко различить пользовательские принципалы с экземпляром от сервисных принципалов, использующих точно такой же синтаксис – или потому что использование пользовательских принципалов с экземплярами почти всегда идет в паре с каким-либо не-стандартным отображением.)
.
Ответ или решение
Вопрос о настройке системы Debian, использующей NFS с Kerberos (MIT вариант), связан с проблемами прав доступа, которые возникают при попытке записать файл на NFS-долю с помощью аутентифицированного пользователя Kerberos. Ниже представлено подробное обсуждение проблемы и способы её решения.
Теория
Основная проблема заключается в том, что Kerberos-принципалы, используемые для аутентификации, неправильно сопоставляются с локальными учетными записями пользователей на сервере NFS. В результате неправильного сопоставления, пользователи, имеющие необходимые Kerberos-учетные данные, оказываются неспособны выполнять операции записи на NFS-долю, так как их права доступа соответствуют не идентифицированным пользователям (обычно "nobody").
Kerberos использует ключевые распределители (Key Distribution Centers, KDC), чтобы обеспечить безопасную аутентификацию пользователей через принципалы. Принципалы представляют собой уникальные идентификаторы пользователей или сервисов в сети. Корректная установка и конфигурация KDC и клиента Kerberos являются критическими для успешной аутентификации.
Пример
В предоставленной конфигурации, принципалы для пользователей создаются с использованием экземпляров, указывающихся в формате user/instance@REALM
. Однако стандартная реализация Kerberos не понимает такие называния, так как они в основном используются для сервисных учетных записей. В текущей конфигурации переменная экземпляра вмешивается в процесс сопоставления, из-за чего пользователи не сопоставляются с существующими учетными записями, и вместо этого им присваиваются права "nobody".
Решение
Для исправления данной проблемы рекомендуется использовать один из следующих подходов:
-
Изменение Принципалов Пользователей: Избегайте использования экземпляров в принципалах для пользователей. Создайте принципал без экземпляров, например, просто
philip@MYDOMAIN.NET
, а неphilip/instance@MYDOMAIN.NET
. Это позволит стандартному механизму Kerberos корректно сопоставить принципал с локальной учетной записью пользователя. -
Настройка Правил Сопоставления (Mapping Rules): В случае, если использование экземпляров необходимо, настройте специальные правила в конфигурации Kerberos для преобразования нестандартных принципалов в локальные имена пользователей. Примерные правила были представлены в первой части:
[realms] MYDOMAIN.NET = { auth_to_local = RULE:[2:$1;$2@$0](.*;admin@MYDOMAIN\.NET$)s/.*/root/ auth_to_local = RULE:[2:$1;$2@$0](.*@MYDOMAIN\.NET$)s/;.*@.*$// auth_to_local = DEFAULT }
Эти правила позволяют сопоставлять принципалы с экземплярами в стандартные имена пользователей, удаляя избыточные части.
-
Проверка и Тестирование: После настройки правил необходимо тщательно протестировать конфигурацию, используя инструмент
k5userok
, чтобы убедиться, что сопоставление работает должным образом. Это включает проверку, что принципы пользовательских учетных записей отображаются в правильные учетные записи UNIX.
Применение
Посредством корректной конфигурации Kerberos, вы сможете обеспечить безопасность и надежность процессов аутентификации при доступе к NFS с использованием Kerberos. Это включает в себя как оптимизацию принципалов пользователей, так и внедрение необходимых правил конфигурации для поддержки вашей конкретной инфраструктуры.
Важно уделять внимание безопасности и тестированию настроек перед разворачиванием в продакшне, чтобы избежать проблем с доступом или безопасностью. Также полезно поддерживать документацию по конфигурации для последующего обслуживания и возможной модификации системы.