sec=krb5p
Debian 11(Bullseye)을 실행하는 두 개의 Hyper-V VM에서 MIT Kerberos()를 사용하여 NFSv4.2를 설정하고 있습니다. 기계 기반 인증( )을 사용하면 sec=sys
모든 것이 잘 작동합니다. Kerberos( sec=krb5p
)를 사용하여 클라이언트에 공유를 마운트할 수 있지만 Permission denied
공유에 액세스하려고 하면 표시됩니다. 마음속에 떠오르는 관련 구성 정보를 포함하여 이 모든 내용을 아래에 자세히 문서화했습니다. 나는 조금 깊이가 없었습니다. 내가 무엇을 놓쳤거나 잘못했나요?
NFS 대sec=sys
서버의 /etc/exports:
/exports/ned 192.168.1.0/24(sec=sys,rw,no_subtree_check)
클라이언트의 /etc/fstab:
test-debian-server:/exports/ned /imports/ned nfs sec=sys 0 0
테스트 공유:
ned@test-debian-desktop:/imports$ su - -c "nfsstat -m"
Password:
/imports/ned from test-debian-server:/exports/ned
Flags: rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.63,local_lock=none,addr=192.168.1.62
ned@test-debian-desktop:/imports$ id
uid=2001(ned) gid=2001(ned) groups=2001(ned)
ned@test-debian-desktop:/imports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 17:57 ned
ned@test-debian-desktop:/imports$ cd ned
ned@test-debian-desktop:/imports/ned$ ls
ned@test-debian-desktop:/imports/ned$ touch test.txt
ned@test-debian-desktop:/imports/ned$ ls
test.txt
서버에서 test.txt를 확인합니다.
ned@test-debian-server:/exports$ id
uid=2001(ned) gid=2001(ned) groups=2001(ned)
ned@test-debian-server:/exports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-server:/exports$ ls -l ned
total 0
-rw-r--r-- 1 ned ned 0 Jan 26 19:11 test.txt
허가가 거부되었습니다sec=krb5p
서버 구성
/etc/호스트:
127.0.0.1 localhost
127.0.1.1 test-debian-server.test test-debian-server
192.168.1.63 test-debian-desktop
192.168.1.62 test-debian-server
/etc/default/nfs-커널-서버:
RPCNFSDCOUNT=8
RPCNFSDPRIORITY=0
RPCMOUNTDOPTS="--manage-gids"
NEED_SVCGSSD=""
RPCSVCGSSDOPTS=""
/etc/default/nfs-공통:
NEED_STATD=
STATDOPTS=
NEED_IDMAPD=
NEED_GSSD=
/etc/export:
/exports/ned 192.168.1.0/24(sec=krb5p,rw,no_subtree_check)
/etc/krb5.conf(대부분 요약됨):
[libdefaults]
default_realm = TEST
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
[realms]
TEST = {
kdc = test-debian-server
admin_server = test-debian-server
}
Kerberos 원칙:
root@test-debian-server:~# kadmin.local listprincs
K/M@TEST
host/test-debian-desktop@TEST
host/test-debian-server@TEST
kadmin/admin@TEST
kadmin/changepw@TEST
kadmin/test-debian-server@TEST
kiprop/test-debian-server@TEST
krbtgt/TEST@TEST
nfs/test-debian-desktop@TEST
nfs/test-debian-server@TEST
Kerberos 키탭:
root@test-debian-server:~# klist -ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
2 nfs/test-debian-server@TEST (aes256-cts-hmac-sha1-96)
2 nfs/test-debian-server@TEST (aes128-cts-hmac-sha1-96)
2 host/test-debian-server@TEST (aes256-cts-hmac-sha1-96)
2 host/test-debian-server@TEST (aes128-cts-hmac-sha1-96)
NFS 유효한 도메인:
root@test-debian-server:~# nfsidmap -d
test
내보내기 권한:
root@test-debian-server:~# ls -ld /exports /exports/*
drwxr-xr-x 3 root root 4096 Jan 26 17:58 /exports
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 /exports/ned
클라이언트 구성
/etc/호스트:
127.0.0.1 localhost
127.0.1.1 test-debian-desktop.test test-debian-desktop
192.168.1.63 test-debian-desktop
192.168.1.62 test-debian-server
/etc/default/nfs-common: 서버와 동일합니다.
/etc/fstab:
test-debian-server:/exports/ned /imports/ned nfs sec=krb5p 0 0
/etc/krb5.conf: 서버와 동일합니다.
Kerberos 키탭:
root@test-debian-desktop:~# klist -ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
3 nfs/test-debian-desktop@TEST (aes256-cts-hmac-sha1-96)
3 nfs/test-debian-desktop@TEST (aes128-cts-hmac-sha1-96)
2 host/test-debian-desktop@TEST (aes256-cts-hmac-sha1-96)
2 host/test-debian-desktop@TEST (aes128-cts-hmac-sha1-96)
NFS 유효한 도메인:
root@test-debian-desktop:~# nfsidmap -d
test
권한 가져오기(공유 제거 후):
root@test-debian-desktop:~# umount /imports/ned
root@test-debian-desktop:~# ls -ld /imports /imports/*
drwxr-xr-x 3 root root 4096 Jan 26 19:08 /imports
drwxr-xr-x 2 root root 4096 Jan 26 17:02 /imports/ned
(참고: I에서도 동일한 결과가 나타납니다. 마운트가 실패할 때 실수로 로컬 디스크에 쓰는 것을 방지하기 위해 올바른 것이라고 chown ned:ned /imports/ned
가정하는 것은 무엇입니까 ?)root:root
ned
허가가 거부되었습니다
서버와 클라이언트를 다시 시작한 후:
ned@test-debian-desktop:/imports$ su -c "nfsstat -m"
Password:
/imports/ned from test-debian-server:/exports/ned
Flags: rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5p,clientaddr=192.168.1.63,local_lock=none,addr=192.168.1.62
ned@test-debian-desktop:/imports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-desktop:/imports$ cd ned
bash: cd: ned: Permission denied
ned@test-debian-desktop:/imports$
때로는 위 세션에서 볼 수 있듯이 ned
초기 공유가 나열될 수 있지만 입력 ls -l
할 수 없는 경우가 있습니다 . 1분 후에 그렇게 하려고 하면 폴더 속성에 대한 물음표가 표시됩니다 . 이런 일이 발생하면 다음을 수행할 수 있습니다.cd
ned
ls -l
Permission denied
ned
ned@test-debian-desktop:/imports$ ls -l
ls: cannot access 'ned': Permission denied
total 0
d????????? ? ? ? ? ? ned
ned@test-debian-desktop:/imports$ su -c "ls -l /imports"
Password:
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-desktop:/imports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-desktop:/imports$
이는 만료된 속성 캐시 때문인 것 같습니다. noac
클라이언트의 /etc/fstab에서 속성 캐싱을 비활성화 ned
하고 Permission denied
.ls -l
내가 시도한 것
클라이언트와 서버 모두에 다음이 있습니다.
- 설정
Verbosity = 4
하다/etc/idmapd.conf
- , 및
rpcdebug
설정 에 사용되는 모든 플래그nfs
nfsd
nlm
rpc
- 관련 정보에 대한 systemd 로그를 검색하십시오(재부팅하고 공유에 액세스하려고 시도한 후).
나는 systemctl status
다음 단원이 올바른지 확인하고 확인했으며 active
, 각 단원에 대해 나열된 가장 최근의 일지 항목을 읽었으며 명백한 오류 징후를 발견하지 못했습니다.
- 섬기는 사람:
- krb5-관리 서버
- krb5-kdc
- nfs 커널 서버
- nfs-idmapd
- nfs 마운트
- nfs 서버
- rpc-svcgssd
- rpc-gssd
- 고객:
- rpc-gssd
- 수입.마운트
내가 아는 한 Kerberos는 올바르게 인증합니다.
찾을 수 있는 모든 관련 매뉴얼 페이지와 온라인 매뉴얼, 그리고 StackExchange에서 관련된 것으로 보이는 모든 질문을 읽었지만 문제를 해결할 수 없거나 클라이언트나 서버에서 권한이 거부된 이유를 알려주는 오류 메시지를 생성하도록 할 수 없습니다.
host/test-debian-desktop
Kerberos 주체 와 키를 추가하도록 편집하세요 .host/test-debian-server
Unix 응용 프로그램 서버 - MIT Kerberos 문서
내가 놓친 게 무엇입니까
선택한 답변은 내 구성이 작동하지 않는 이유를 잘 설명합니다. 누구든지 동일한 상황이 발생하는 경우 제가 놓친 세부정보는 다음과 같습니다. 이유를 이해하려면 아래 답변을 읽어보세요.
Kerberos는 개별 사용자를 인증합니다(어떤 이유로든 인증하지 않는 것 같습니다). 따라서 ned
연결하려면 Kerberos에 주체가 있어야 하며 클라이언트 PC의 Linux 사용자는 ned@TEST
해당 주체에 대한 TGT(티켓 부여 티켓)를 얻어야 합니다. 그러면 모든 일이 순조롭게 진행될 것입니다. 이를 어느 정도 자동화하기 위해 다음을 수행했습니다.ned
kinit
/etc/krb5/user/<uid>/client.keytab: ned
및에 대한 키를 보유합니다.ned만 읽을 수 있습니다!나는 0600
소유자와 그룹 모두 권한을 사용했습니다 ned
.
kinit -ki
이 키탭을 사용하면 비밀번호를 입력하지 않고도 간단히 로그인을 호출할 수 있습니다 . 이것을 자동화하는 빠르고 더러운 방법은 ~/.gnomerc, ~/.bashrc 및 ~/.zshrc에 추가하는 것입니다(저는 Gnome, Bash 및 Zsh를 사용하기 때문입니다).
kinit
또한 Ansible을 통해 이러한 구성을 배포하고 일부 공유점 파일이 있지만 NFS 액세스가 필요하지 않은 시스템이 있기 때문에 클라이언트 키탭이 있는 경우에만 실행되는 Bash 및 Zsh에 더 관심이 있습니다 .
~/.bashrc:
# Grab or renew a Kerberos ticket.
if type -t kinit >/dev/null && [[ -r /etc/krb/user/$(id -u)/client.keytab ]]
then
kinit -ki
fi
~/.zshrc:
# Grab or renew a Kerberos ticket.
if type kinit >/dev/null && [[ -r /etc/krb/user/$(id -u)/client.keytab ]]
then
kinit -ki
fi
답변1
"권한 거부" 메시지가 나타나는 이유는 에서 했던 것처럼 자격 증명 캐시에 Kerberos TGT(티켓 부여 티켓)가 없기 때문입니다 . 계정을 실행하고 비밀번호를 입력 klist
해야 합니다 . kinit
인증을 받고 TGT 티켓이 캐시되면 이 티켓을 사용하여 NFS 서버에 인증할 수 있습니다.
Kerberos 인증의 전체적인 개념은 NFS 서버(또는 기타 관련 서비스)에 대해 귀하의 신원을 "증명"해야 한다는 것입니다. 명령에 비밀번호(본인만 알고 있음)를 입력하여 생성한 캐시된 TGT를 제공하여 이를 "증명"할 수 있습니다 kinit
. 따라서 일반적으로 이것이 작동하는 방식입니다. 만료되기 전에 티켓이 더 오래 지속되도록 krb5
//에서 만료 및 갱신 시간을 변경할 수 있지만 sssd
결국 어느 시점에서는 어떤 방식으로든 재인증해야 합니다.
물론 언제든지 계정에 대한 키탭을 생성할 수 있습니다. 클라이언트의 키탭에 추가하지 마세요! 클라이언트 키탭은 다음 용도로 사용됩니다.고객홀로. 새 파일에 새 키탭을 생성해야 합니다당신의계정을 생성하고 최소한의 권한으로 이 파일을 안전하게 비공개로 유지하고 이 키탭을 사용하여 대화형으로 비밀번호를 입력할 필요 없이 자격 증명 캐시에 TGT를 생성할 수 있습니다. 이론적으로는 정기적으로 이 작업을 수행하는 키탭을 생성할 수도 있지만 crontab
누군가가 특정 시점(예: 루트 액세스 권한이 있는 경우)에서 키탭을 훔쳐 사용자인 척하고 다른 서비스를 제공할 수 있으므로 보안이 덜 안전합니다. 하지만 그것은 당신의 고려 사항입니다.
또한 키탭 방식을 사용하는 경우 계정 비밀번호를 변경할 때마다 키탭도 업데이트해야 한다는 점을 잊지 마세요.