LDAP에서 동적 자격 증명 사용하기

LDAP에서 동적 자격 증명 사용하기

동적 LDAP 자격 증명을 사용하고 LDIF를 통해 LDAP 사용자 계정을 관리해요.

시작 전에(Before you start)

  • Vault 권한을 확인하세요. Vault에서 플러그인을 활성화하고 구성할 권한이 있어야 해요.
  • OpenLDAP 또는 Active Directory용 LDAP 플러그인이 구성되어 있어야 해요. 아직 없으면 설정 가이드를 따라주세요.

출처: 문서

본문

1단계: LDAP LDIF 항목 만들기(Create your LDAP LDIF entries)

Vault는 LDIF 항목을 통해 LDAP 계정을 관리해요. LDIF 항목은 Vault가 적절한 LDIF 구문에 대해 파싱하고 검증하는 LDIF 문자열의 base64 인코딩 버전이에요. LDIF 파라미터(*_ldif)는 Go 템플릿 언어를 사용해 계정 템플릿을 정의해요.

LDIF 항목을 만들 때 주의 사항:

  • 줄(빈 줄 포함)의 끝에 있는 후행 공백을 확인하고 제거하세요.
  • 각 modify 블록 앞에 빈 줄이 있고 단일 대시(-)로 닫히는지 확인하세요.
  • 하나의 dn 항목에 대해 하나의 블록에서 여러 수정을 정의할 수 있어요.

LDIF 파일 예시:

dn: uid=johndoe,ou=users,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: johndoe
cn: John Doe
sn: Doe
givenName: John
mail: [email protected]

참고: Active Directory를 호스팅하는 Windows 서버에는 클라이언트가 지정된 시간 동안 이전 비밀번호로 인증할 수 있게 하는 구성 설정이 있어요. 그 동작을 바꾸고 싶다면 learn.microsoft.com의 "Setting in NTLM network authentication behavior" 안내를 참고하세요.

프로그래밍 방식으로 Active Directory에서 사용자를 만들려면 먼저 사용자 객체를 추가하고, unicodePwd 필드로 해당 사용자에게 비밀번호를 제공하고 계정을 활성화해요. 비밀번호 항목은 반드시:

  • 두 개의 콜론(::)으로 시작하고
  • 이중 따옴표(" ")로 감싸고
  • UTF16LE 형식으로 작성하며
  • base64 인코딩을 사용해야 해요.

비밀번호를 설정한 후 userAccountControl 필드로 계정을 활성화할 수 있어요.

결과 설명
512 계정 활성화
65536 동적 사용자 계정의 AD 비밀번호 만료 비활성화

플래그는 누적해서 설정해요. 예를 들어 계정을 활성화하고 비밀번호 만료를 비활성화하려면 66048로 설정해요: (enable + disable password) = 512 + 65536 = 66048

레거시 Windows NT 시스템과의 역호환성이 필요하면 20자 제한이 있는 sAMAccountName을 사용할 수 있어요. username_template(보통 v_{{.DisplayName}}_{{.RoleName}}_{{random 10}}_{{unix_time}}처럼 생겼음)을 정의할 때 이 문자 제한을 염두에 두세요. 역호환이 필요하다면 역할 구성에서 사용자 이름 템플릿을 사용자 지정해 20자 미만의 계정 이름을 생성하는 것을 권장해요.

dn: CN={{.Username}},OU=HashiVault,DC=adtesting,DC=lab
changetype: add
objectClass: user
userPrincipalName: {{.Username}}@adtesting.lab
sAMAccountName: {{.Username}}

changetype: modify
replace: unicodePwd
unicodePwd::{{ printf "%q" .Password | utf16le | base64 }}
replace: userAccountControl
userAccountControl: 66048

dn: CN=test-group,OU=HashiVault,DC=adtesting,DC=lab
add: member
member: CN={{.Username}},OU=HashiVault,DC=adtesting,DC=lab

Active Directory는 memberOf 속성을 수정해 동적 사용자를 그룹에 직접 추가하는 것을 허용하지 않아요. memberOf는 그룹의 member 속성과 연결된 속성 쌍(linked attribute pair)의 역링크(back-link) 절반이기 때문이에요. 연결된 쌍의 정방향 속성만 수정할 수 있어요. 새로 만든 동적 사용자를 그룹에 추가하려면 원하는 그룹에 수정 요청을 보내 새 사용자로 그룹 멤버십을 업데이트해야 해요.

2단계: Vault 역할 구성 파일 만들기(Create a Vault role configuration file)

유지보수와 재사용을 쉽게 하기 위해 동적 역할 세부 정보가 담긴 JSON 파일 ldap-role.json을 만들어 Vault가 LDAP 도메인 사용자 계정을 만드는 방법을 알게 해요. 실패 시 Vault가 부분적으로 생성된 엔티티를 제거하도록 롤백 LDIF(rollback LDIF) 구성은 적극 권장해요. 어떤 이유로든 자격 증명 생성이 실패하면 Vault는 롤백 명령문을 자동으로 실행해요.

{
  "creation_ldif": "@/path/to/creation.ldif",
  "deletion_ldif": "@/path/to/deletion.ldif",
  "rollback_ldif": "@/path/to/rollback.ldif",
  "default_ttl": "1h",
  "max_ttl": "24h"
}

3단계: Vault 역할 저장하기(Save the Vault role)

CLI — vault write에 /{mount_path}/role 경로와 동적 역할 구성으로 새 동적 역할 항목을 만들어요:

$ vault write <mount_path>/role/<role_name> @ldap-role.json

예를 들어:

$ vault write devcreds/role/developers @ldap-role.json

API — 동적 역할 구성과 함께 /{mount_path}/role/{role_name}에 POST 호출:

$ curl                                                \
    --request POST                                      \
    --header    "X-Vault-Token: ${VAULT_TOKEN}"         \
    --namespace "X-Vault-Namespace: ${VAULT_NAMESPACE}" \
    --data @ldap-role.json                              \
    ${VAULT_ADDR}/v1/<mount_path>/role/<role_name>

예를 들어:

$ curl                                                \
    --request POST                                      \
    --header    "X-Vault-Token: ${VAULT_TOKEN}"         \
    --namespace "X-Vault-Namespace: ${VAULT_NAMESPACE}" \
    --data @ldap-role.json                              \
    ${VAULT_ADDR}/v1/devcreds/role/developers

4단계: 자격 증명 생성 테스트하기(Test credential generation)

자격 증명을 생성해 설정을 확인해요.

CLI — vault read에 /{mount_path}/creds/{role_name}을 사용해 동적 역할의 자격 증명 정보를 가져와요:

$ vault read devcreds/creds/developer
Key                    Value
---                    -----
lease_id               devcreds/creds/developer/HFgd6uKaDomVMvJpYbn9q4q5
lease_duration         1h
lease_renewable        true
distinguished_names    [cn=v_token_developer_FfH2i1c4dO_1611952635,ou=users,dc=learn,dc=example]
password               xWMjkIFMerYttEbzfnBVZvhRQGmhpAA0yeTya8fdmDB3LXDzGrjNEPV2bCPE9CW6
username               v_token_testrole_FfH2i1c4dO_1611952635

API — /{mount_path}/creds/{role_name}에 GET 호출:

$ curl                                                          \
    --request GET                                               \
    --header    "X-Vault-Token: ${VAULT_TOKEN}"                 \
    --namespace "X-Vault-Namespace: ${VAULT_NAMESPACE}"         \
    ${VAULT_ADDR}/v1/devcreds/creds/developer

distinguished_names 필드는 creation_ldif 명령문에서 만들어진 DN 배열이에요. 둘 이상의 LDIF 항목이 포함되면 각 명령문의 DN이 이 필드에 포함돼요. 이 필드의 각 항목은 단일 LDIF 명령문에 해당해요. 중복 제거는 일어나지 않고 순서는 유지돼요.

더 알아보기 (Learn more)

  • LDAP 시크릿 엔진 개요에서 동적 역할을 살펴보세요.
  • LDAP 플러그인 설정 가이드와 API 문서를 확인해 보세요.