개인용으로 Kerberized NFSv4를 설정하고 있습니다.
- NFS 및 KDC 수동 구성
- 네임서버 없음(
/etc/hosts
재정의 사용), LDAP 없음 - 모든 컴퓨터에서 동일한 사용자(ID가 반드시 동일할 필요는 없음) 및 모든 보안 모드에 ID 매핑 사용(
nfs4_disable_idmapping
"N"으로 설정)
Ubuntu 20.04 LTS를 실행하는 두 대의 컴퓨터가 있습니다.
arhiv.pecar
(로컬 주소192.168.56.200
)에는 NFS 서버와 KDC가 있습니다.client.pecar
(로컬 주소192.158.56.100
)는 클라이언트입니다.
모든 파이프가 작동하는 것 같고 공유를 잘 마운트할 수 있지만
공유가 다음과 같이 내보내지면
sec=sys
서버
exportfs -v
출력/srv/export <world>(rw,async,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
클라이언트
mount
출력arhiv.pecar:/srv/export on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5,clientaddr=192.168.56.100,local_lock=none,addr=192.168.56.200)
- 루트에는 전체 읽기/쓰기 액세스 권한이 있습니다.
- 충분한 권한이 설정되면 다른 사용자가 파일을 읽고 쓸 수 있습니다.
nfsidmap
활성, 클라이언트의 파일을 나열합니다.올바른 번역사용자 이름/그룹chown
클라이언트로부터는가능한, 사용자 이름/그룹을 올바르게 번역합니다.
파일은 uid/gid 아래에 생성됩니다.고객, 이는 그들이잘못된서버의 uid/gid
서버에 동일한 uid를 가진 사용자가 있으면 잘못된 소유자로 매핑됩니다. 그렇지 않으면 소유자는
nobody:4294967294
유효 사용자는 클라이언트 uid에 지정된 사용자인 것 같습니다.
내 생각에 이것은알려진 단점그것을 사용할 때
sec=sys
공유가 다음과 같이 내보내지면
sec=krb5
서버
exportfs -v
출력/srv/export <world>(rw,async,wdelay,no_root_squash,no_subtree_check,sec=krb5p:krb5,rw,secure,no_root_squash,no_all_squash)
클라이언트
mount
출력arhiv.pecar:/srv/export on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.56.100,local_lock=none,addr=192.168.56.200)
- 모든 사용자에게는 읽기 권한이 있지만 어떤 사용자(루트 포함)도 자신이 소유한 파일/폴더에 대한 쓰기 권한이 없습니다.
- 폴더에 파일을 생성하면
o+w
익명 사용자(nobody:nogroup
또는anonuid:anongid
내보내기 항목에 지정된 경우) 아래에 파일이 생성됩니다. nfsidmap
활성, 클라이언트의 파일을 나열합니다.올바른 번역사용자 이름/그룹chown
고객으로부터실패하다그리고Operation not permitted.
유효한 사용자는 익명 사용자인 것 같습니다.
여기서 무엇이 잘못될 수 있는지 전혀 알 수 없으므로 커뮤니티에서 통찰력을 얻을 수 있기를 바랍니다.
/etc/hosts
요청 시 관련 구성 파일(서비스 목록, 커널 모듈) 을 제공할 수 있습니다 ./etc/krb5.conf
/etc/idmapd.conf
/etc/default/nfs-common
답변1
글쎄, 나는 그것이 이해할만한 가치가 있다고 생각합니다.어떻게NFS와 Kerberos는 사용자를 다루고 여기서 주체 이름이 어떻게 작용하는지를 다룹니다. 이는 대부분의 가이드에서 종종 무시되는 주제입니다.
Kerberos 기반 NFS에서는 다음 간의 차이점을 이해해야 합니다.
파일 작업을 수행하는 유효 사용자
파일 작업에 대한 유효(서버 로컬) 사용자는 Kerberos에 의해 결정됩니다.로컬 인증 인터페이스,지금 바로
auth_to_local
태그를 통한 구성, 지정되지 않은 경우 기본값은 이고auth_to_local = DEFAULT
해당 작업은 다음과 같이 정의됩니다.주체 이름은 로컬 사용자 이름으로 사용됩니다. 주체에 여러 구성 요소가 있거나 기본 영역에 없는 경우 이 규칙이 적용되지 않으며 변환이 실패합니다.
변환이 실패하면 익명 사용자(
nobody:nogroup
또는anonuid:anongid
내보내기 항목에 지정된 경우) 로 간주됩니다.이 파일 작업의 매개변수/결과
NFS 서버가 파일 작업을 수행하는 경우
- 매개변수는 클라이언트 제공 사용자에서 서버 로컬 사용자로 매핑되어야 합니다(
chown
명령). - 결과는 클라이언트 로컬 사용자에게 다시 매핑되어야 합니다(
ls
명령)
이는 또는 (보통)
id_resolver
에 지정된 upcaller에 의해 처리 됩니다./etc/request-key.conf
/etc/request-key.d/*
nfsidmap
사용자 이름은 호스트 간에 문자열로 전송되고
user@dns_domain
양쪽의 로컬 uids/gid에 매핑됩니다.- 매개변수는 클라이언트 제공 사용자에서 서버 로컬 사용자로 매핑되어야 합니다(
파일 작업을 수행하는 유효한 사용자는 티켓에서 비롯됩니다(따라서 우리가 인증하는 주체가 중요함).아니요파일 작업을 요청하는 로컬 실행 프로세스의 uid입니다(순진하게 예상할 수 있음).
따라서 유효한 사용자 매핑이 작동하려면 username
(효과적으로 username@REALM
) 주체를 생성해야 하며, 더 복잡한 주체 이름을 사용하는 경우 여기에 설명된 대로 auth_to_local
적절한 매핑을 제공해야 합니다./etc/krb5.conf
- https://access.redhat.com/articles/4040141
- https://blog.samoylenko.me/2015/04/15/hadoop-security-auth_to_local-examples/
- https://community.cloudera.com/t5/Community-Articles/Auth-to-local-Rules-Syntax/ta-p/245316
사용자당자체적으로 있어야합니다user/client-fqdn
서버 로컬 사용자에 매핑하는 데 사용되는 기본 주체( )입니다.
서비스 주체는 서비스 자체에 의해 사용 및 승인됩니다. 아마도 사용자는 이에 액세스할 필요가 없을 것입니다(사용자 keytab에는 유지되어야 /etc/krb5.keytab
하지만 사용자 keytab에는 유지되어서는 안 됩니다).
사용자 키탭 위치는 배포판에 따라 다릅니다. 이를 사용하여 krb5-config
빌드에서 기대하는 바를 결정하세요.
USER_KEYTAB=$(euid=$EUID; eval echo $(krb5-config --defcktname | tr % $ | sed 's/FILE://'))
다음은 Kerberized NFS를 통해 사용자에 대한 매핑을 올바르게 구성하는 방법에 대한 간단한 데모입니다.
다음 구성은 이 가이드로 구성된 CentOS 시스템에서 테스트되었습니다(가이드는 Centos 7용이며 약간의 추가 사항이 있는 Centos 8에서 테스트되었습니다).
https://www.linuxhelp.com/how-to-set-up-nfs-server-with-kerberos-based-authentication
# Start kadmin on client machine (I assume that you have the root/admin principal already set up)
#
[root@nfsclient ~]# kadmin -p root/admin
Authenticating as principal root/admin with password.
Password for root/[email protected]:
kadmin: addprinc -randkey -clearpolicy host/nfsclient
Principal "host/[email protected]" created.
kadmin: addprinc -randkey -clearpolicy nfs/nfsclient
Principal "nfs/[email protected]" created.
kadmin: ktadd -k /tmp/krb5.keytab host/nfsclient
Entry for principal host/nfsclient with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/krb5.keytab.
...
kadmin: ktadd -k /tmp/krb5.keytab nfs/nfsclient
Entry for principal nfs/nfsclient with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/krb5.keytab.
...
kadmin: addprinc -randkey -clearpolicy testuser
Principal "[email protected]" created.
kadmin: ktadd -k /tmp/client.keytab testuser
Entry for principal testuser with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/client.keytab.
...
kadmin: quit
# Set up the default keytab (service principals)
[root@nfsclient ~]# mv /tmp/krb5.keytab /etc/krb5.keytab
[root@nfsclient ~]# chown root:root /etc/krb5.keytab
# Set up user keytab
[root@nfsclient ~]# mv /tmp/client.keytab /var/kerberos/krb5/user/$(id -u testuser)/client.keytab
[root@nfsclient ~]# chown testuser:testuser /var/kerberos/krb5/user/$(id -u testuser)/client.keytab
# Mount the filesystem
mount nfsserver.kdc.com:/kerberos /mnt
# Test the user
[root@nfsclient ~]# sudo -i -u testuser
# Check that the users client.keytab, is being picked up
# (can access nfs share)
#
# and that the correct effective user is now used for file operation
# (derived from default principal and mapped to server-local user)
# - the server should also have a `testuser` user
#
[testuser@nfsclient ~]$ touch /mnt/testfile
[testuser@nfsclient ~]$ ls -la /mnt/testfile
-rw-rw-r--. 1 testuser testuser 0 Jun 23 16:31 /mnt/testfile
# After accesses one can check the keys that have been retrieved on
[testuser@nfsclient ~]$ klist
Ticket cache: KCM:1051:17737
Default principal: [email protected]
Valid starting Expires Service principal
06/23/2021 16:06:12 06/24/2021 16:06:12 krbtgt/[email protected]
renew until 06/23/2021 16:06:12
06/23/2021 16:06:12 06/24/2021 16:06:12 nfs/[email protected]
renew until 06/23/2021 16:06:12
답변2
그 이유 중 하나는 다음과 같습니다.윙바인더는 삼바(smb.conf) 구성입니다 winbind use default domain = no
.
이 기본 구성을 사용하면 인증 시 사용자 이름 앞에 접두사가 붙을 것으로 예상됩니다 DOMAIN\
(예 DOMAIN\alice
: : ).
바라보다:https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html#winbindusedefaultdomain
로 로그인하는 대신 으로 yes
간단히 로그인할 수 있도록 이 매개변수(클라이언트와 서버 모두에서)를 구성해야 합니다 .su - alice
su - DOMAIN\\alice
NFS 서버가 Kerberos 티켓과 비교할 이름은 더 짧습니다. 기본 더 긴 버전에서는 gss가 사용자를 찾을 수 없으므로 "nobody"로 압축합니다.
대답에 관해서는@tpecarkinit
:저도 사용자의 간단한 호출로 클라이언트 키탭을 올바르게 생성했습니다. 다른 것은 필요하지 않습니다.