Kerberos를 통한 완전 비밀번호 없는 nfs

Kerberos를 통한 완전 비밀번호 없는 nfs

NAS를 포함하는 소규모 네트워크가 있습니다. 나는 약간의 노력을 기울여 Kerberos 서버를 프로비저닝했습니다. Kerberos 서버를 사용하면 네트워크의 Linux 호스트가 보안 NFS 마운트를 생성할 수 있습니다. KDC에서 생성된 서비스 키는 적절한 호스트에 배포되고 마운트는 Kerberos 보안으로 구성됩니다. 안전하지 않은 마운트는 NAS에 구성된 정책에 의해 차단됩니다.

불편하게도 사용자는 KDC의 호스트에 활성 티켓이 있는 경우에만 마운트에 있는 파일에 액세스할 수 있습니다. 이 요구 사항은 불편함으로 인해 제한적이며 일반 사용자 권한으로 실행되는 자동화된 작업으로 마운트에 대한 액세스를 제한함으로써 더욱 그렇습니다.

NFS 초기에는 원격 볼륨의 파일이 부팅 시 시작하여 전체 시스템 세션 동안 계속 로컬로 표시되었습니다. 보안 및 ID 관리는 NFS에서 Kerberos의 중요한 이점이지만 사용자에게 티켓을 부여하도록 요구하는 것은 종종 불필요한 경우가 있습니다. 키 배포와 호스트에 대한 제어된 액세스가 NFS 마운트에 대한 원치 않는 액세스를 방지하므로 사용자 티켓이 필요하지 않습니다.

이상적으로는 사용자가 KDC에 티켓을 요청하지 않거나 KDC에 주체를 등록하지 않고도 Kerberos 보안이 있는 마운트에 액세스할 수 있기를 바랍니다. 파일별 권한에 따라 액세스가 제한되지 않는다면 모든 사용자는 언제든지 모든 파일에 액세스할 수 있습니다.

기존 도구를 통해 이 목표 시나리오에 얼마나 근접할 수 있습니까?

답변1

간단히 대답하자면 현재 NFS Kerberos 인증 메커니즘(RPCSEC_GSS)은 이를 지원하지 않는다는 것입니다. 전화를 거는 주체가 액세스 권한을 갖는 사람입니다. 따라서 사용자가 원하지 않는 경우수동으로티켓을 받으려면 호스트가 자동으로 티켓을 받도록 해야 합니다.~을 위한그들을.

앞으로 최신 RPCSEC_GSSv3 프로토콜에는 호스트가 임의의 사용자를 가장하도록 허용하는 옵션이 있을 수 있지만 아직 완료되거나 구현되지 않았습니다.


호스트가 UID를 가장하도록 허용하려면 Kerberos가 전혀 필요하지 않습니다. sec=sys"이전"에 사용되었던 보안 모드로 다시 전환하십시오. 이 모드에서 호스트는 말 그대로 사용자의 기호 식별자를 지정하게 됩니다. (물론 권한 확인은 계속 발생합니다.)

결국 호스트가 Kerberos를 통해 모든 사용자를 가장하도록 허용하는 것과(호스트의 /etc/krb5.keytab을 사용하여 인증됨) 호스트가 기본 UID 클레임을 통해 모든 사용자를 가장하도록 허용하는 것(호스트의 IPsec을 사용하여 인증됨) 사이에는 기능적 차이가 없습니다. 또는 WireGuard 개인 키 또는) – 후자는 GSSAPI가 달성할 수 있는 것보다 훨씬 더 높은 성능을 제공합니다.


Kerberos 내에서 기존 도구만 사용할 때(RPC에 대한 일종의 호스트 수준 인증을 완전히 구현하지 않고) 가장 가까운 것은 다음과 같습니다.프로토콜 전환을 통한 제한된 위임(S4U2Self + S4U2Proxy) 여기서 서비스는 사용자 이름으로 특정 다른 서비스에 대한 티켓을 얻을 수 있습니다. 이는 일반적으로 Active Directory 환경에서 사용되지만 MIT Kerberos KDC에서도 지원됩니다(및아마Heimdal KDC – Samba 덕분에 코드가 있지만 Heimdal에서 활성화하는 방법을 모르겠습니다.

MIT Kerberos KDC에서 이를 활성화하려면 LDAP 백엔드를 사용해야 합니다. 파일 기반 HDB 백엔드는 추가 필드 저장을 지원하지 않습니다.

  1. ok_to_auth_as_delegate클라이언트의 호스트 주체에 주체 플래그를 설정합니다 (kadmin을 통해 수행하거나 LDAP 속성 0x200000에 OR을 수행하여 수행할 수 있음 krbTicketFlags).

    kadmin.local modprinc +ok_to_auth_as_delegate host/foo.example.com
    
  2. 클라이언트 주체의 krbAllowedToDelegateToLDAP 속성을 가짜 티켓을 생성할 수 있는 NFS 서비스 주체 목록으로 설정합니다. (가치당 하나의 서비스입니다.)

    ldapmodify <<EOF
    dn: krbPrincipalName=host/[email protected],cn=EXAMPLE.COM,ou=Kerberos,o=Example
    add: krbAllowedToDelegateTo
    krbAllowedToDelegateTo: nfs/fs1.example.com
    -
    EOF
    
  3. 루트로서 S4U 기능이 작동하는지 테스트합니다.

    # Acquire host credentials using system keytab
    host_cc=FILE:/tmp/krb5cc_host
    kinit -c $host_cc -k
    klist -c $host_cc
    
    # Acquire NFS tickets on behalf of the user using S4U2Proxy
    kvno -c $host_cc -I $user_name -P nfs/fs1.example.com
    klist -c $host_cc
    
    # Do the same, but put the tickets in that user's cache
    # so that rpc.gssd would be able to find them
    user_cc=FILE:/tmp/krb5cc_$(id -u $user)
    kvno -c $host_cc -I $user -P nfs/fs1.example.com --out-cache $user_cc
    chown $user: $user_cc
    
  4. 설치하다gss-프록시클라이언트에서 nfs-client.conf개별 클라이언트 키탭 대신 S4U2Proxy를 사용하도록 포함된 항목을 편집합니다.

    [service/nfs-client]
      mechs = krb5
      cred_store = keytab:/etc/krb5.keytab
      cred_store = ccache:FILE:/var/lib/gssproxy/clients/krb5cc_%U
      impersonate = yes
      allow_any_uid = yes
      trusted = yes
      euid = 0
    

    이 예는 다음을 기반으로 합니다.https://github.com/gssapi/gssproxy/blob/main/docs/NFS.md#user-impersonation-via-constrained-delegation.

  5. 클라이언트의 구성rpc.gssdGSS_USE_PROXY=1환경에 추가하여 gss-proxy를 사용하는 데몬 :

    # systemctl edit rpc-gssd
    
    [Service]
    Environment=GSS_USE_PROXY=1
    
    # systemctl restart rpc-gssd
    

Kerberos가 NFS에만 사용되고 각 호스트에 제한된 사용자 집합만 필요한 경우 호스트는 다음을 저장할 수 있습니다.클라이언트 키탭(암호 파생 키를 보유) 해당 사용자에 대한 것입니다. 이는 키탭에서 허용하는 것처럼 사용자의 비밀번호를 저장하는 것과 대략 동일합니다.

관련 정보