Kerberos 인증 방식

Kerberos 인증 방식

참고: 이 엔진은 TLS 또는 서명 검증의 일부로 외부 X.509 인증서를 사용할 수 있어요. SHA-1을 사용하는 X.509 인증서에 대한 서명 검증은 사용되지 않으며 Vault 1.12부터 해결 방법 없이는 더 이상 사용할 수 없어요. 자세한 내용은 deprecation 공지를 참고하세요.

kerberos 인증 방식은 Kerberos 엔티티에 대한 Vault 토큰을 검색하는 자동화 메커니즘을 제공해요.

Kerberos는 1980년대 MIT가 발명한 네트워크 인증 프로토콜이에요. 그 이름은 그리스 신화의 하데스가 키우는 세 개의 머리를 가진 사냥개 케르베로스(Cerberus)에서 영감을 받았어요. 세 개의 머리는 Kerberos의 세 엔티티—인증 서버, 티켓 부여 서버, 프린시펄 데이터베이스—를 가리켜요. Kerberos는 Active Directory의 인증의 기초이며, 그 목적은 네트워크의 인증 워크로드를 분산하는 것이에요.

Vault의 Kerberos 인증 방식은 원래 Winton의 사람들이 작성했으며, 원래 플러그인을 구축했고 HashiCorp 유지 관리로 가져오기 위해 협력한 것에 특별히 감사드려요.

출처: 문서

본문

사전 요구 사항 (Prerequisites)

Kerberos는 매우 실무적인 인증 방식이에요. LDAPAzure 같은 다른 인증 방식은 구성과 사용에 어느 정도만의 지식이 필요해요. 반면 Kerberos는 이미 익숙한 사람들이 사용하는 것이 가장 좋아요. 사용 사례를 더 간단한 인증 방식으로 달성할 수 있다면 그런 방식을 사용할 것을 권장해요. 그렇지 않다면 Kerberos에 접근하기 전에 그 기초에 익숙해지는 것을 권장해요.

어떻게 지식을 얻든, 이 인증 방식을 사용하기 전에 Kerberos의 높은 수준 아키텍처에 편안한지 확인하고 다음 연습을 해 봤는지 확인하세요.

  • 유효한 krb5.conf 파일 만들기
  • 유효한 keytab 파일 만들기
  • kinitkeytab 파일을 사용해 도메인 서버에 인증하기

그 지식을 갖추고, 이미 테스트되고 확인된 환경을 갖추면 Vault와 함께 Kerberos를 사용할 준비가 된 거예요.

구성 (Configuration)

  • Vault에서 Kerberos 인증을 활성화합니다.
$ vault auth enable \
    -passthrough-request-headers=Authorization \
    -allowed-response-headers=www-authenticate \
    kerberos
  • Kerberos 플러그인용 keytab을 만듭니다(이 keytab은 Vault 서버 자체가 사용하며, 로그인 목적의 또 다른 keytab을 생성해야 해요).
$ ktutil
ktutil:  addent -password -p [email protected] -e aes256-cts -k 1
Password for [email protected]:
ktutil:  list -e
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
  1    1            [email protected] (aes256-cts-hmac-sha1-96)
ktutil:  wkt vault.keytab

KVNO(-k 1)는 서비스 계정의 KVNO와 일치해야 해요. 잘못되면 Vault 로그에 오류가 표시돼요.

keytab에 다른 암호화 유형을 추가할 수도 있어요. 예를 들어 추가 addent 명령으로 -e rc4-hmac을 사용해요.

그런 다음 base64로 인코딩해요.

$ base64 vault.keytab > vault.keytab.base64
  • Kerberos 인증 방식을 인바운드 로그인 요청을 검증하는 데 사용될 keytab과 엔트리 이름으로 구성합니다.
$ vault write auth/kerberos/config \
    [email protected] \
    service_account="vault_svc"
  • Kerberos 인증 방식이 위에서 구성한 서비스 계정으로 LDAP와 통신하도록 구성합니다. 이것은 샘플 LDAP 구성이에요. 여러분의 것은 다를 거예요. 먼저 ldapsearch 같은 도구를 사용해 Vault 서버에서 구성을 테스트했는지 확인하세요.
$ vault write auth/kerberos/config/ldap \
    [email protected] \
    bindpass=$VAULT_SVC_PASSWORD \
    groupattr=sAMAccountName \
    groupdn="DC=MATRIX,DC=LAN" \
    groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" \
    userdn="CN=Users,DC=MATRIX,DC=LAN" \
    userattr=sAMAccountName \
    upndomain=MATRIX.LAN \
    url=ldaps://somewhere.foo

위의 LDAP는 LDAP 인증 방식과 같은 코드에 의존해요. 사용 가능한 파라미터에 대한 자세한 논의는 그 문서를 참고하세요.

  • 성공적으로 인증한 사람들(그들의 LDAP 그룹 멤버십에 기반)에게 부여해야 하는 Vault 정책을 구성합니다. 이는 LDAP 인증 방식과 동일하므로 그룹 멤버십 해석LDAP 그룹 → 정책 매핑을 참고하세요.
$ vault write auth/kerberos/groups/engineering-team \
    policies=engineers

위 그룹은 Kerberos로 인증되고 "engineering-team" LDAP 그룹의 구성원으로 확인된 사람들에게 "engineers" 정책을 부여해요.

인증 (Authentication)

유효한 krb5.confkeytab이 있는 클라이언트 머신에서 다음 같은 명령을 수행하세요.

$ vault login -method=kerberos \
    username=grace \
    service=HTTP/my-service \
    realm=MATRIX.LAN \
    keytab_path=/etc/krb5/krb5.keytab  \
    krb5conf_path=/etc/krb5.conf \
    disable_fast_negotiation=false
  • krb5conf_path — Kerberos 환경과 통신하는 방법을 설명하는 유효한 krb5.conf 파일의 경로예요.
  • keytab_path — Vault에 인증하는 엔티티의 엔트리가 있는 keytab의 경로예요. keytab 파일은 적절한 파일 권한으로 공유 서버의 다른 사용자로부터 보호되어야 해요.
  • username — Kerberos에 로그인하는 데 사용할 keytab 내의 엔트리용 사용자 이름이에요. 이 사용자 이름은 LDAP의 서비스 계정과 일치해야 해요.
  • service — SPNEGO 토큰을 얻기 위해 서비스 티켓을 얻는 데 사용할 서비스 프린시펄 이름이에요. 이 서비스는 LDAP에 존재해야 해요.
  • realm — Kerberos 영역(realm)의 이름이에요. 이 영역은 LDAP 연결에 구성된 UPNDomain과 일치해야 해요. 이 검사는 대소문자를 구분해요.
  • disable_fast_negotiation — Kerberos 인증 방식의 기본인 FAST 협상 사용을 비활성화하기 위한 것이에요. FAST는 Kerberos의 사전 인증 프레임워크예요. 갑옷(armoured) KDC 메시지를 사용해 사전 인증 교환을 터널링하는 메커니즘을 포함해요. FAST는 수동적 비밀번호 추측 공격에 대한 더 높은 저항을 제공해요. 일부 흔한 Kerberos 구현은 FAST 협상을 지원하지 않아요.
  • remove_instance_name — keytab 파일을 파싱할 때 Kerberos 서비스 프린시펄 이름에서 인스턴스 이름을 제거해요. 예를 들어 이 값이 true면 keytab에 foo/[email protected] 서비스 프린시펄 이름이 있어도 CLI가 이를 [email protected]으로만 줄여요.

문제 해결 (Troubleshooting)

고장난 조각 식별하기

여정의 고장난 조각이 식별되면 디버깅 노력을 가장 유용한 방향에 집중할 수 있어요.

  1. Vault를 호스팅하는 머신에 로그인한 상태로 ldapsearch를 사용해 LDAP 구성이 작동하는지 확인하세요.
  2. kinit, keytab, krb5.conf를 사용해 도메인 서버에 인증하세요. Vault의 keytab과 로그인에 사용되는 클라이언트 keytab 둘 다로 이 작업을 수행하세요. 이렇게 하면 Kerberos 네트워크가 작동하는지 확인돼요.
  3. 클라이언트 머신에 로그인한 상태로 다음 명령으로 Vault에 도달할 수 있는지 확인하세요: $ curl $VAULT_ADDR/v1/sys/health.

문제 재현을 위한 명확한 단계 구축하기

가능하면 회사 밖의 다른 사람이 문제를 재현하기 쉽게 만드세요. 예를 들어 다음 같은 명령으로 로그인할 수 있어야 한다고 기대한다면:

$ vault login -method=kerberos \
    username=my-name \
    service=HTTP/my-service \
    realm=EXAMPLE.COM \
    keytab_path=/etc/krb5/krb5.keytab  \
    krb5conf_path=/etc/krb5.conf

그 명령의 오류 출력, krb5.conf 파일 내용, keytab 파일에 나열된 엔트리들을 공유할 준비가 되었는지 확인하세요.

문제를 가장 단순한 형태로 줄인 후에도 여전히 해결에 어려움을 겪는다면, 재현 내용을 Vault 포럼에 게시하거나(가능한 경우) HashiCorp Support에 제공하면 도움을 얻기 훨씬 쉬워요.

추가 문제 해결 리소스

Vault Kerberos 라이브러리에는 완전한 Kerberos와 LDAP 환경의 예시로 참조할 수 있는 작동하는 통합 테스트 환경이 있어요. Docker로 실행되며 다음 명령 중 하나로 시작할 수 있어요.

$ make integration
$ make dev-env

이 명령들은 전체 환경을 띄우고, 사용자를 추가하고, 클라이언트에서 로그인을 실행하는 스크립트의 변형을 실행해요.

API

Kerberos 인증 방식은 완전한 HTTP API를 제공해요. 자세한 내용은 Kerberos 인증 방식 API 문서를 참고해 주세요.

더 알아보기 (Learn more)