Vault에서 네임스페이스 간 접근 구성하기
Vault에서 네임스페이스 간 접근 구성하기
sys/config/group-policy-application 엔드포인트를 사용하면 여러 독립 네임스페이스 간에 시크릿 공유를 활성화할 수 있습니다.
출처: 문서
본문
역사적으로 ID 그룹에 연결된 모든 정책은, 요청을 승인하는 Vault 토큰이 그 그룹과 같은 네임스페이스 또는 하위 네임스페이스에서 생성된 경우에만 적용되었습니다.
이 엔드포인트는 이 제한을 완화하여 운영 오버헤드를 줄여줍니다. 모드가 기본값인 within_namespace_hierarchy로 설정되면 기존 동작이 유지됩니다. any로 설정하면 그룹 정책이 요청 토큰이 어느 네임스페이스에서 왔는지와 관계없이 그룹의 모든 구성원에게 적용됩니다.
전제 조건
- Vault Enterprise 1.13 이상
- 구성된 인증 방법
시크릿 공유 활성화
- 현재 설정 확인하기.
$ vault read sys/config/group-policy-application
Key Value
--- -----
group_policy_application_mode within_namespace_hierarchy
within_namespace_hierarchy가 기본 설정입니다.
group_policy_application_mode설정을any로 변경하기.
$ vault write sys/config/group-policy-application \
group_policy_application_mode="any"
Success! Data written to: sys/config/group-policy-application
이제 계층 관계가 없는 네임스페이스 간에도 정책을 적용하고 시크릿을 공유할 수 있습니다.
예시 인증 메서드 구성
네임스페이스 간 접근은 머신 기반·인간 기반 인증 모두 모든 인증 메서드와 함께 사용할 수 있습니다. 참고용으로 각각의 예시가 제공됩니다.
Kubernetes 인증 메서드
Kubernetes 인증 메서드와 두 네임스페이스를 구성하는 스크립트를 만들고 실행합니다.
# Create new namespaces - they are peers
vault namespace create us-west-org
vault namespace create us-east-org
#--------------------------
# us-west-org namespace
#--------------------------
VAULT_NAMESPACE=us-west-org vault auth enable kubernetes
VAULT_NAMESPACE=us-west-org vault write auth/kubernetes/config out_of=scope
VAULT_NAMESPACE=us-west-org vault write auth/kubernetes/role/cross-namespace-demo \
bound_service_account_names="mega-app" \
bound_service_account_namespaces="client-nicecorp" \
alias_name_source="serviceaccount_name"
# Create an entity
VAULT_NAMESPACE=us-west-org vault auth list -format=json | jq -r '.["kubernetes/"].accessor' > accessor.txt
VAULT_NAMESPACE=us-west-org vault write -format=json identity/entity name="entity-for-mega-app" | jq -r ".data.id" > entity_id.txt
VAULT_NAMESPACE=us-west-org vault write identity/entity-alias name="client-nicecorp/mega-app" canonical_id=$(cat entity_id.txt) mount_accessor=$(cat accessor.txt)
#--------------------------
# us-east-org namespace
#--------------------------
VAULT_NAMESPACE=us-east-org vault secrets enable -path="kv-marketing" kv-v2
VAULT_NAMESPACE=us-east-org vault kv put kv-marketing/campaign start_date="March 1, 2023" end_date="March 31, 2023" prise="Certification voucher" quantity="100"
# Create a policy to allow read access to kv-marketing
VAULT_NAMESPACE=us-east-org vault policy write marketing-read-only -<<EOF
path "kv-marketing/data/campaign" {
capabilities = ["read"]
}
EOF
# Create a group
VAULT_NAMESPACE=us-east-org vault write -format=json identity/group name="campaign-admin" policies="marketing-read-only" member_entity_ids=$(cat entity_id.txt)
- 유효한 JWT로 us-west-org Vault 네임스페이스에 인증하기.
$ VAULT_NAMESPACE=us-west-org vault write -format=json auth/kubernetes/login role=cross-namespace-demo jwt=$(cat jwt.txt) | jq -r .auth.client_token > token.txt
- us-west-org의 Vault 토큰을 사용해 us-east-org 네임스페이스의 시크릿 읽기.
$ VAULT_NAMESPACE=us-east-org VAULT_TOKEN=$(cat token.txt) vault kv get kv-marketing/campaign
userpass 인증 메서드
userpass 인증 메서드와 두 Vault 네임스페이스를 구성하는 스크립트를 만들고 실행합니다.
# Create new namespaces - they are peers
vault namespace create us-west-org
vault namespace create us-east-org
#--------------------------
# us-west-org namespace
#--------------------------
VAULT_NAMESPACE=us-west-org vault secrets enable -path="kv-customer-info" kv-v2
VAULT_NAMESPACE=us-west-org vault kv put kv-customer-info/customer-001 name="Example LLC" contact_email="[email protected]"
# Create a policy to allow read access to kv-marketing
VAULT_NAMESPACE=us-west-org vault policy write customer-info-read-only -<<EOF
path "kv-customer-info/data/*" {
capabilities = ["read"]
}
EOF
VAULT_NAMESPACE=us-west-org vault auth enable userpass
VAULT_NAMESPACE=us-west-org vault write auth/userpass/users/tam-user password="my-long-password" policies=customer-info-read-only
# Create an entity
VAULT_NAMESPACE=us-west-org vault auth list -format=json | jq -r '.["userpass/"].accessor' > accessor.txt
VAULT_NAMESPACE=us-west-org vault write -format=json identity/entity name="TAM" | jq -r ".data.id" > entity_id.txt
VAULT_NAMESPACE=us-west-org vault write identity/entity-alias name="tam-user" canonical_id=$(cat entity_id.txt) mount_accessor=$(cat accessor.txt)
#--------------------------
# us-east-org namespace
#--------------------------
VAULT_NAMESPACE=us-east-org vault secrets enable -path="kv-marketing" kv-v2
VAULT_NAMESPACE=us-east-org vault kv put kv-marketing/campaign start_date="March 1, 2023" end_date="March 31, 2023" prise="Certification voucher" quantity="100"
# Create a policy to allow read access to kv-marketing
VAULT_NAMESPACE=us-east-org vault policy write marketing-read-only -<<EOF
path "kv-marketing/data/campaign" {
capabilities = ["read"]
}
EOF
# Create a group
VAULT_NAMESPACE=us-east-org vault write -format=json identity/group name="campaign-admin" policies="marketing-read-only" member_entity_ids=$(cat entity_id.txt)
- 유효한 사용자로 us-west-org Vault 네임스페이스에 인증하기.
$ VAULT_NAMESPACE=us-west-org vault login -field=token -method=userpass \
username=tam-user password="my-long-password" > token.txt
- us-west-org의 Vault 토큰을 사용해 us-east-org 네임스페이스의 시크릿 읽기.
$ VAULT_NAMESPACE=us-east-org VAULT_TOKEN=$(cat token.txt) \
vault kv get kv-marketing/campaign
API
/sys/config/group-policy-application
튜토리얼
- Secrets management across namespaces without hierarchical relationship