SSO(OpenLDAP + Kerberos)를 사용하여 인증할 때 NFSv4 공유 디렉터리에 대한 권한이 거부되었습니다.

SSO(OpenLDAP + Kerberos)를 사용하여 인증할 때 NFSv4 공유 디렉터리에 대한 권한이 거부되었습니다.

Kerberos 및 LDAP를 사용하여 SSO(Single Sign-On)를 설정하려고 하는데 Kerberos 인증 및 암호화(krb5p) 서비스와 함께 NFSv4를 사용하는 데 문제가 있습니다.

내 환경:

  • LDAP 및 Kerberos를 갖춘 서버(네임 서버) 1개(IP: 192.168.1.1)
  • SSH 및 NFSv4(IP: 192.168.1.100)와 같은 서비스를 제공하는 서버 1개(host2로 명명)
  • 클라이언트 1개(host1로 명명)(IP: 192.168.1.2)

세 대의 시스템이 Ubuntu 18.04를 실행하고 있습니다.

내 /etc/hosts는 아래 표시된 대로 세 시스템에서 동일합니다.

SSO는 GSSAPI의 SSH 서비스와 잘 작동하며 클라이언트에 좋은 Kerberos 티켓이 있습니다. 이제 NFSv4 서비스를 설정하려고 합니다. 먼저 공유 파일(nfs-kernel-server 및 nfs-common)을 구성했습니다.

로깅(sssd 사용)을 위해 클라이언트 컴퓨터에서 LDAP 사용자를 사용하고 공유 디렉터리를 마운트하면 모든 것이 괜찮은 것 같습니다.

sudo mount -vvv -t nfs4 -o proto=tcp,port=2049,sec=krb5p host2.stagenfs.fr:/ /mnt

LDAP 사용자 계정을 사용하여 NFS 디렉터리를 마운트하려면 /etc/sudoers에서 LDAP 사용자에게 권한을 추가해야 했습니다.

/etc/sudoers

<LDAP user> ALL=(ALL:ALL) NOPASSWD: /bin/mount,/bin/umount,/sbin/mount.nfs,/sbin/mount.nfs4

하지만 Kerberos는 나에게 루트(600개 권한)에 속한 티켓을 주었습니다. 따라서 LDAP 클라이언트 계정을 사용하여 로그인하면 /mnt 디렉토리에 들어갈 수 없습니다. 그래서 루트 사용자만이 /mnt에 접근할 수 있다는 것을 알게 되었습니다. NFS 공유 디렉터리에 대한 권한은 클라이언트(마운트 지점 디렉터리)와 서버 모두에서 777입니다.

LDAP 사용자 티켓은 sssd.conf 파일에 지정된 디렉터리에 있지만 NFS 서비스에 대한 티켓은 /tmp/ 디렉터리에 있습니다.

시도해 보았는데 chown <LDAP user>:<LDAP user group> /tmp/krb5ccmachine_STAGENFS내 LDAP 사용자가 /mnt에 액세스할 수 있었습니다.

/etc/idmapd.conf나는 이것이 idmapd 서비스에서 오는 것이라고 생각하지만 일이 작동하도록 설정하는 방법을 이해하지 못합니다 . 온라인에서 찾은 일부 구성을 시도했지만 성공하지 못했습니다.

이것은 내 conf 파일입니다.

/etc/hosts (모든 머신에서 동일)

127.0.0.1   localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.1.1     server.stagenfs.fr      server
192.168.1.1     stagenfs.fr

192.168.1.2     host1.stagenfs.fr       host1

192.168.1.100   host2.stagenfs.fr       host2

/etc/nsswitch.conf (모든 시스템에서 동일)

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat systemd sss
group:          compat systemd sss
shadow:         compat sss
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname
networks:       files

protocols:      db files
services:       db files sss
ethers:         db files
rpc:            db files

netgroup:       nis sss
sudoers:        files sss

/etc/idmapd.conf(클라이언트 및 NFS 서버에서 동일)

[General]

Verbosity = 5
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if it differs from FQDN minus hostname
Domain = stagenfs.fr
Local-Realms = STAGENFS.FR

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

[Translation]
#Method = nsswitch
Method = static
GSS-Methods = static
#Method = umich_ldap,nsswitch
#GSS-Methods = umich_ldap
#Method = sss

[Static]
#nfs/[email protected] = alice
#nfs/[email protected] = alice
#nfs/[email protected] = alice
[email protected] = alice

#[UMICH_SCHEMA]

#LDAP_server = server.stagenfs.fr
#LDAP_base = ou=tl
#LDAP_use_ssl = true
#LDAP_ca_cert = /etc/ssl/certs/cacert.pem
#NFSV4_person_objectclass = posixaccount
#NFSV4_name_attr = uid

/etc/default/nfs-common(클라이언트 컴퓨터)

STATDOPTS=

# Do you want to start the gssd daemon? It is required for Kerberos mounts.
NEED_GSSD="yes"

NEED_IDMAPD="yes"

/etc/default/nfs-kernel-server(NFS 서버 시스템)

# Number of servers to start up
RPCNFSDCOUNT=8

# Runtime priority of server (see nice(1))
RPCNFSDPRIORITY=0

RPCMOUNTDOPTS="--manage-gids"

# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD="yes"

# Options for rpc.svcgssd.
RPCSVCGSSDOPTS=""

/etc/sssd/sssd.conf (클라이언트 및 NFS 서버에서 동일)

[sssd]
debug_level = 0xFFF0
config_file_version = 2
services = nss,pam
domains = STAGENFS.FR

[nss]
debug_level = 0xFFF0
filter_users = root
filter_groups = root

[pam]
debug_level = 10
offline_credentials_expiration = 1

[domain/STAGENFS.FR]
debug_level = 0xFFF0
ldap_schema = rfc2307
ldap_search_base = ou=tl

id_provider = ldap
auth_provider = krb5
chpass_provider = krb5
access_provider = ldap

ldap_sasl_mech = GSSAPI
ldap_krb5_keytab = /etc/krb5.keytab

ldap_access_order = filter
ldap_access_filter = &(objectClass=posixAccount) (uidNumber=*)

ldap_uri = ldaps://server.stagenfs.fr
ldap_referrals = False
ldap_id_use_start_tls = False
cache_credentials = False
account_cache_expiration = 1
enumerate = True
ldap_default_bind_dn = cn=proxyuser,ou=private,ou=tl
ldap_default_authtok_type = password
ldap_default_authtok = ProxyUser123#
ldap_tls_cacert = /etc/ssl/certs/cacert.pem

krb5_realm = STAGENFS.FR
krb5_canonicalize = False
krb5_server = server.stagenfs.fr
krb5_kpasswd = server.stagenfs.fr
krb5_ccachedir = /home/tl/%u

/var/log/syslog (최소 구성) (NFS 서버에서)

Aug  2 10:05:57 host2 rpc.idmapd[470]: nfsdcb: authbuf=gss/krb5p authtype=user
Aug  2 10:05:57 host2 rpc.idmapd[470]: nfs4_uid_to_name: calling nsswitch->uid_to_name
Aug  2 10:05:57 host2 rpc.idmapd[470]: nfs4_uid_to_name: nsswitch->uid_to_name returned 0
Aug  2 10:05:57 host2 rpc.idmapd[470]: nfs4_uid_to_name: final return value is 0
Aug  2 10:05:57 host2 rpc.idmapd[470]: Server : (user) id "0" -> name "[email protected]"
Aug  2 10:05:57 host2 rpc.idmapd[470]: nfsdcb: authbuf=gss/krb5p authtype=group
Aug  2 10:05:57 host2 rpc.idmapd[470]: nfs4_gid_to_name: calling nsswitch->gid_to_name
Aug  2 10:05:57 host2 rpc.idmapd[470]: nfs4_gid_to_name: nsswitch->gid_to_name returned 0
Aug  2 10:05:57 host2 rpc.idmapd[470]: nfs4_gid_to_name: final return value is 0
Aug  2 10:05:57 host2 rpc.idmapd[470]: Server : (group) id "0" -> name "[email protected]"

클라이언트(host1)의 명령줄 출력 Alice는 Kerberos를 사용하여 인증된 LDAP 사용자입니다.

alice@host1:~$ sudo mount -vvv -t nfs4 -o proto=tcp,port=2049,sec=krb5p host2:/users /mnt
mount.nfs4: timeout set for Thu Aug  2 10:07:58 2018
mount.nfs4: trying text-based options 'proto=tcp,port=2049,sec=krb5p,vers=4.2,addr=192.168.1.100,clientaddr=192.168.1.2'

alice@host1:~$ ldapwhoami 
SASL/GSSAPI authentication started
SASL username: [email protected]
SASL SSF: 56
SASL data security layer installed.
dn:uid=alice,ou=people,ou=tl

alice@host1:~$ klist 
Ticket cache: FILE:/home/tl/alice/krb5_25002
Default principal: [email protected]

Valid starting       Expires              Service principal
02/08/2018 10:57:40  02/08/2018 20:57:40  krbtgt/[email protected]
    renew until 03/08/2018 10:57:40
02/08/2018 10:57:56  02/08/2018 20:57:40  ldap/[email protected]
    renew until 03/08/2018 10:57:40

alice@host1:~$ klist -c /tmp/krb5ccmachine_STAGENFS.FR 
klist: Credentials cache permissions incorrect (filename: /tmp/krb5ccmachine_STAGENFS.FR)
alice@host1:~$ 

root@host1:~# klist -c /tmp/krb5ccmachine_STAGENFS.FR 
Ticket cache: FILE:/tmp/krb5ccmachine_STAGENFS.FR
Default principal: host/[email protected]

Valid starting       Expires              Service principal
02/08/2018 10:01:07  02/08/2018 20:01:07  krbtgt/[email protected]
    renew until 03/08/2018 10:01:07
02/08/2018 10:01:07  02/08/2018 20:01:07  nfs/[email protected]
    renew until 03/08/2018 10:01:07

root@host1:~# klist -k /etc/krb5.keytab 
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 ldap/[email protected]
   2 ldap/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 host/[email protected]
   2 nfs/[email protected]
   2 nfs/[email protected]

보시다시피 idmapd.conf를 사용하여 여러 가지 방법을 시도했지만 성공하지 못했습니다. 이런 사이트를 몇개 발견했어요협회그러나 이것은 도움이 되지 않습니다. idmapd 구성이나 다른 곳에서 뭔가 빠진 것 같습니다. 생각이나 질문이 있으시면 주저하지 말고 문의해 주세요.

관련 정보