sec=krb5p에 의해 NFS 권한이 거부되었습니다.

sec=krb5p에 의해 NFS 권한이 거부되었습니다.

sec=krb5pDebian 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:rootned

허가가 거부되었습니다

서버와 클라이언트를 다시 시작한 후:

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분 후에 그렇게 하려고 하면 폴더 속성에 대한 물음표가 표시됩니다 . 이런 일이 발생하면 다음을 수행할 수 있습니다.cdnedls -lPermission deniedned

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설정 에 사용되는 모든 플래그nfsnfsdnlmrpc
  • 관련 정보에 대한 systemd 로그를 검색하십시오(재부팅하고 공유에 액세스하려고 시도한 후).

나는 systemctl status다음 단원이 올바른지 확인하고 확인했으며 active, 각 단원에 대해 나열된 가장 최근의 일지 항목을 읽었으며 명백한 오류 징후를 발견하지 못했습니다.

  • 섬기는 사람:
    • krb5-관리 서버
    • krb5-kdc
    • nfs 커널 서버
    • nfs-idmapd
    • nfs 마운트
    • nfs 서버
    • rpc-svcgssd
    • rpc-gssd
  • 고객:
    • rpc-gssd
    • 수입.마운트

내가 아는 한 Kerberos는 올바르게 인증합니다.

찾을 수 있는 모든 관련 매뉴얼 페이지와 온라인 매뉴얼, 그리고 StackExchange에서 관련된 것으로 보이는 모든 질문을 읽었지만 문제를 해결할 수 없거나 클라이언트나 서버에서 권한이 거부된 이유를 알려주는 오류 메시지를 생성하도록 할 수 없습니다.

host/test-debian-desktopKerberos 주체 와 키를 추가하도록 편집하세요 .host/test-debian-serverUnix 응용 프로그램 서버 - MIT Kerberos 문서

내가 놓친 게 무엇입니까

선택한 답변은 내 구성이 작동하지 않는 이유를 잘 설명합니다. 누구든지 동일한 상황이 발생하는 경우 제가 놓친 세부정보는 다음과 같습니다. 이유를 이해하려면 아래 답변을 읽어보세요.

Kerberos는 개별 사용자를 인증합니다(어떤 이유로든 인증하지 않는 것 같습니다). 따라서 ned연결하려면 Kerberos에 주체가 있어야 하며 클라이언트 PC의 Linux 사용자는 ned@TEST해당 주체에 대한 TGT(티켓 부여 티켓)를 얻어야 합니다. 그러면 모든 일이 순조롭게 진행될 것입니다. 이를 어느 정도 자동화하기 위해 다음을 수행했습니다.nedkinit

/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누군가가 특정 시점(예: 루트 액세스 권한이 있는 경우)에서 키탭을 훔쳐 사용자인 척하고 다른 서비스를 제공할 수 있으므로 보안이 덜 안전합니다. 하지만 그것은 당신의 고려 사항입니다.

또한 키탭 방식을 사용하는 경우 계정 비밀번호를 변경할 때마다 키탭도 업데이트해야 한다는 점을 잊지 마세요.

관련 정보