VSO AWS 인증

VSO AWS 인증 (AWS auth)

VSO가 다양한 AWS 인증 시나리오에서 Vault의 AWS 인증 방식으로 인증하는 방법을 다룹니다.

출처: 문서

본문

Vault Secrets Operator(VSO)는 Vault에 접근할 때 AWS 인증을 지원해요. VSO는 다음 방법으로 AWS 자격 증명을 가져올 수 있습니다.

  • IRSA가 활성화된 쿠버네티스 서비스 어카운트에서.
  • 기본 EKS 노드 역할에서 자격 증명을 추론해.
  • 오퍼레이터 파드가 실행되는 인스턴스의 EC2 인스턴스 프로파일에서 자격 증명을 추론해.
  • 명시적으로 제공한 정적 액세스 키 ID와 시크릿 키에서.

아래 예제는 여러 AWS 인증 시나리오에서 Vault 역할과 그에 해당하는 VSO의 VaultAuth 프로파일을 구성하는 방법을 보여줘요.

IRSA

  1. IAM roles for service accounts에 대한 Amazon 문서를 따라 OIDC 제공자를 추가해 쿠버네티스 서비스 어카운트가 IAM 역할을 맡을 수 있게 해요.

  2. Vault 인스턴스에 적절한 인증 역할을 만들어요.

$ vault write auth/aws/role/<ROLE_NAME> \
    auth_type="iam" \
    policies="default" \
    bound_iam_principal_arn="arn:aws:iam::<ACCOUNT_ID>:role/<SERVICE_ACCOUNT_ROLE>"
resource "vault_aws_auth_backend_role" "aws_irsa_role" {
  backend                  = "auth/aws"
  role                     = "<ROLE_NAME>"
  auth_type                = "iam"
  token_policies           = ["default"]
  bound_iam_principal_arns = [
    "arn:aws:iam::<ACCOUNT_ID>:role/<SERVICE_ACCOUNT_ROLE>",
  ]
}
  1. VSO에 해당하는 인증 항목을 만들어요.
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultAuth
metadata:
  name: vaultauth-aws-irsa-example
  namespace: <NAMESPACE>
spec:
  vaultConnectionRef: <CONNECTION_NAME>
  mount: aws
  method: aws
  aws:
    role: <ROLE_NAME>
    region: <REGION>
    irsaServiceAccount: <SERVICE_ACCOUNT_NAME>

Terraform은 IRSA를 지원해요. Terraform으로 Elastic Kubernetes(EKS) 클러스터를 관리한다면 AWS EKS 모듈IRSA 서브모듈을 통해 IRSA를 지원합니다.

노드 역할 (Node role)

  1. Vault 인스턴스에 적절한 인증 역할을 만들어요.
$ vault write auth/aws/role/<ROLE_NAME> \
    auth_type="iam" \
    policies="default" \
    bound_iam_principal_arn="arn:aws:iam::<ACCOUNT_ID>:role/eks-nodes-<CLUSTER_NAME>"
resource "vault_aws_auth_backend_role" "aws_node_role" {
  backend                  = "auth/aws"
  role                     = "<ROLE_NAME>"
  auth_type                = "iam"
  token_policies           = ["default"]
  bound_iam_principal_arns = [
    "arn:aws:iam::<ACCOUNT_ID>:role/eks-nodes-<CLUSTER_NAME>",
  ]
}
  1. VSO에 해당하는 인증 항목을 만들어요.
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultAuth
metadata:
  name: vaultauth-aws-node-example
  namespace: <NAMESPACE>
spec:
  vaultConnectionRef: <CONNECTION_NAME>
  mount: aws
  method: aws
  aws:
    role: <ROLE_NAME>
    region: <REGION>

인스턴스 프로파일 (Instance profile)

  1. Vault 인스턴스에 적절한 인증 역할을 만들어요.
$ vault write auth/aws/role/<ROLE_NAME> \
    auth_type="iam" \
    policies="default" \
    inferred_entity_type="ec2_instance" \
    inferred_aws_region=<REGION> \
    bound_account_id=<ACCOUNT_ID> \
    bound_iam_principal_arn="arn:aws:iam::<ACCOUNT_ID>:instance-profile/eks-<PROFILE>"
resource "vault_aws_auth_backend_role" "aws_node_role" {
  backend                  = "auth/aws"
  role                     = "<ROLE_NAME>"
  auth_type                = "iam"
  token_policies           = ["default"]
  inferred_entity_type     = "ec2_instance"
  inferred_aws_region      = "<REGION>"
  bound_account_ids        = ["<ACCOUNT_ID>"]
  bound_iam_principal_arns = [
    "arn:aws:iam::<ACCOUNT_ID>:role/eks-nodes-<CLUSTER_NAME>",
  ]
}
  1. VSO에 해당하는 인증 항목을 만들어요.
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultAuth
metadata:
  name: vaultauth-aws-instance-example
  namespace: <NAMESPACE>
spec:
  vaultConnectionRef: <CONNECTION_NAME>
  mount: aws
  method: aws
  aws:
    role: <ROLE_NAME>
    region: <REGION>

정적 자격 증명 (Static credentials)

  1. Vault 인스턴스에 적절한 인증 역할을 만들어요.
$ vault write auth/aws/role/<ROLE_NAME> \
    auth_type="iam" \
    policies="default" \
    bound_iam_principal_arn="arn:aws:iam::<ACCOUNT_ID>:role/<ROLE>"
resource "vault_aws_auth_backend_role" "aws_static_role" {
  backend                  = "auth/aws"
  role                     = "<ROLE_NAME>"
  auth_type                = "iam"
  token_policies           = ["default"]
  bound_iam_principal_arns = [
    "arn:aws:iam::<ACCOUNT_ID>:role/<ROLE>",
  ]
}
  1. VSO에 해당하는 인증 항목을 만들어요.
apiVersion: v1
kind: Secret
metadata:
  name: aws-static-creds
  namespace: <NAMESPACE>
data:
  access_key_id: <BASE64_ACCESS_KEY_ID>
  secret_access_key: <BASE64_SECRET_ACCESS_KEY>
  session_token: <BASE64_SESSION_TOKEN>   # session_token은 선택 사항
---
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultAuth
metadata:
  name: vaultauth-aws-static-example
  namespace: <NAMESPACE>
spec:
  vaultConnectionRef: <CONNECTION_NAME>
  mount: aws
  method: aws
  aws:
    role: <ROLE_NAME>
    region: <REGION>
    secretRef: aws-static-creds

API

AWS VaultAuth 옵션의 전체 목록은 VSO API 페이지에서 확인할 수 있어요.

더 알아보기 (Learn more)