티스토리 뷰

AWS Secrets engine을 통해 AWS의 credentials을 관리하는 방법을 소개합니다. 이번 글에서는 터미널 명령어와 GUI를 함께 보도록 하겠습니다. 여기서 다루는 모든 GUI는 오픈소스 버전입니다. HashiCorp Cloud Platform(HCP) 버전과 상이할 수 있는 점을 참고해 주세요. 그럼 시작합니다.

먼저 AWS secrets engine을 활성화합니다.

vault secrets enable aws

 

혹은 GUI에서 아래와 같이 Secrets Engines 메뉴에서 Cloud > AWS를 선택해 주면 됩니다.

선택 후 나오는 Path, method Options은 기본 값을 따릅니다

 

Secrets Engine이 연결 됐으니 root 계정을 등록해 줘야 하는데요. 여기서 표현하는 root는 AWS의 루트 계정이 아닙니다. Vault를 통해 IAM을 생성하기 위한 계정입니다. 편의상 여기서는 vault-admin이라고 칭하겠습니다. 이 계정을 먼저 AWS Console 상에서 아래와 같은 Policy를 설정해서 생성합니다. 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachUserPolicy",
                "iam:CreateAccessKey",
                "iam:CreateUser",
                "iam:DeleteAccessKey",
                "iam:DeleteUser",
                "iam:DeleteUserPolicy",
                "iam:DetachUserPolicy",
                "iam:GetUser",
                "iam:ListAccessKeys",
                "iam:ListAttachedUserPolicies",
                "iam:ListGroupsForUser",
                "iam:ListUserPolicies",
                "iam:PutUserPolicy",
                "iam:AddUserToGroup",
                "iam:RemoveUserFromGroup",
                "sts:GetFederationToken"
            ],
            "Resource": [
                "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/vault-*",
                "arn:aws:sts::ACCOUNT-ID-WITHOUT-HYPHENS:federated-user/vault-*"
            ]
        }
    ]
}

 

생성이 완료되면 아래 절차대로 Access key를 생성합니다.

생성된 access key와 secret key를 잘 보관해주세요

 

위에서 생성한 Access key 정보를 이용해서 Vault가 AWS와 통신할 수 있도록 해줍니다. ( 여기를 유심히 봐주세요 aws/config/root라는 경로가 보일 텐데요, 여기서 root가 등장합니다. vault에서는 이 계정을 루트라고 부릅니다. AWS의 root 계정과 헷갈리지 않도록 주의하세요 )

vault write aws/config/root \
    access_key=AKIAJWVN5Z4FOFT7NLNA \
    secret_key=R4nm063hgMVo4BTT5xxxxxxxxxxxxxxxx \
    region=us-east-1

 

GUI에서는 Dynamic IAM root credentials 페이지에서 설정할 수 있습니다.

Access key와 Secret key 정보를 입력하고 저장 버튼을 누릅니다

 

기본 설정은 끝났습니다. 그런데 이렇게 등록된 Access key와 Secret key도 관리가 필요합니다. 유출되면 안 되니까요. 아래 명령어를 통해 주기적으로 rotate 시켜주도록 합니다. 이렇게 하면 Access key 자체가 rotate 됩니다. 이제 저 안에 담긴 Secret key는 여러분도 확인할 수 없는 상태가 됩니다.

vault write -f aws/config/rotate-root

( root 계정에 대한 rotate 기능은 GUI로 제공하지 않습니다 )

자, 기본적인 준비가 끝났습니다. 이제 Vault에서 credentials을 관리하는 아래와 같은 네 가지 방법에 대해 알아보도록 하겠습니다.

1. IAM User
2. Federation Token
3. Session Token
4. Assumed Role

아, 중요한 개념 2개를 먼저 숙지하면 좋습니다. 이후부터는 Role과 Credential이라는 키워드가 나올 겁니다. Role은 단어 그대로 어떤 역할로 Credential을 만들지 정의해 놓은 “틀” 정도로 생각해 주시면 됩니다. 그리고 Credential은 그 틀로 자격증명을 만드는 겁니다.

그럼 하나씩 생성하는 과정을 살펴볼게요. 모든 과정은 Role을 먼저 만들고 해당 Role을 이용해서 Credential을 생성하는 방식으로 진행됩니다. 1개의 Role을 통해 여러 개의 Credential을 만드는 것도 당연히 가능합니다. 어떤 역할(혹은 권한)을 수행할 수 있는 Credential을 요청이 있을 때마다 생성하는 겁니다. 가령, RDS에 접근 가능하도록 설정된 Role이 있고, 회사에 "스티브"와 "제시"가 각각 Credential을 요청해서 받아 간다고 생각하시면 됩니다.

 

# IAM User

role 생성은 write 옵션을 통해 aws/roles/my-role처럼 role의 이름을 쓰고 credential_type과 기타 정보를 넣어주면 됩니다. 다음은 inline-policy 한 개만 갖는 IAM을 생성하는 기본 예시입니다. 

vault write aws/roles/my-role \
    credential_type=iam_user \
    policy_document=-<<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:*",
      "Resource": "*"
    }
  ]
}
EOF

 

아래처럼 Policy ARN, IAM Groups을 지정하는 것도 가능합니다. policy_document를 별도의 파일로 처리하는 것도 가능해요. 이때는 policy_document=@policy.json 같은 형식으로 써주면 됩니다.

vault write aws/roles/my-other-role \
    policy_arns=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess,arn:aws:iam::aws:policy/IAMReadOnlyAccess \
    iam_groups=group1,group2 \
    credential_type=iam_user \
    policy_document=-<<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:*",
      "Resource": "*"
    }
  ]
}
EOF

 

이렇게 Role을 생성했으면 해당 Role로 Credential을 만들어 내면 됩니다.

$ vault read aws/creds/my-role
Key                Value
---                -----
lease_id           aws/creds/my-role/f3e92392-7d9c-09c8-c921-575d62fe80d8
lease_duration     768h
lease_renewable    true
access_key         AKIAIOWQXTLW36DV7IEA
secret_key         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
session_token     <nil>

 

이제 해당 access_key와 secret_key를 통해 ec2:* 관련된 동작을 수행할 수 있습니다. 화면으로 살펴보면 아래와 같습니다. 먼저 Role을 생성해 주고요

복수의 Policy ARN 등록이 필요한 경우 먼저 하나를 입력하고 Add 버튼을 누른후 같은 방식으로 여러번 반복하면 됩니다

 

Credential 생성은 방금 생성한 my-role로 들어가서 Generate 버튼만 눌러주면 끝입니다.

쉽죠?

 

아래와 같이 계정이 생성된 걸 확인할 수 있어요.

3번 생성해 봤습니다

 

IAM 계정 회수 시간은 기본 768h입니다. 기본 시간은 아래처럼 AWS Secrets Engine에서 Leases메뉴를 통해 변경할 수 있습니다. 이 시간이 지나면 IAM > Users에 생성된 vault-*로 시작하는 계정이 삭제됩니다.

여기서는 테스트를 위해 1분으로 지정했습니다

 

# Federation Token

Federation Token도 위에 IAM과 유사하게 생성 가능한데요. 여기서는 policy document를 파일로부터 입력받아 보겠습니다. policy.json 파일을 아래와 같이 생성해 주세요.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "ec2:*",
      "sts:GetFederationToken"
    ],
    "Resource": "*"
  }
}

 

그리고 아래와 같이 aws/roles/ec2_admin Role을 생성해 줍니다.

vault write aws/roles/ec2_admin \
    credential_type=federation_token \
    policy_document=@policy.json

 

Credential을 ttl=60m으로 설정해서 60분 후에 만료되도록 설정해 봅니다.

$ vault write aws/sts/ec2_admin ttl=60m
Key             Value
lease_id        aws/sts/ec2_admin/31d771a6-fb39-f46b-fdc5-945109106422
lease_duration  60m0s
lease_renewable false
access_key      ASIAJYYYY2AA5K4WIXXX
secret_key      HSs0DYYYYYY9W81DXtI0K7X84H+OVZXK5BXXXX
session_token   AQoDYXdzEEwasAKwQyZUtZaCjVNDiXXXXXXXXgUgBBVUUbSyujLj

 

화면에서는 아래와 같이 Role을 생성할 수 있습니다.

터미널에서 실행하는 것과 별반 다르지 않아요

 

그리고 Credential은 아래처럼 방금 생성한 ec2_admin 쪽으로 들어가서 만들면 됩니다.

TTL을 설정하지 않을 수도 있습니다

 

# Session Token

Session Token은 아래와 같이 Role을 생성할 수 있습니다.

vault write aws/roles/temp_user \
    credential_type=session_token

 

그리고 다음과 같이 Credential을 생성해 줍니다. 

$ vault read aws/sts/temp_user ttl=60m
Key             Value
lease_id        aws/creds/temp_user/w4eKbMaJOi1xLqG3MWk7y8n6
lease_duration  60m0s
lease_renewable false
access_key      ASIAJYYYY2AA5K4WIXXX
secret_key      HSs0DYYYYYY9W81DXtI0K7X84H+OVZXK5BXXXX
session_token   AQoDYXdzEEwasAKwQyZUtZaCjVNDiXXXXXXXXgUgBBVUUbSyujL

 

Session Token의 경우 vault-admin 계정의 권한을 사용하기 때문에 별도의 policy document를 지정하지 않습니다. 또한 vault-admin 계정이 TOTP가 설정되어 있는 경우 아래와 같이 mfa_serial_number를 통해 디바이스를 함께 등록해줘야 합니다. 이건 GUI에서 지원하지 않는 기능입니다.

vault write aws/roles/mfa_user \
    credential_type=session_token \
    mfa_serial_number="arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:mfa/device-name"

 

이렇게 등록한 Role로 Credential을 만들 때는 mfa_code를 함께 넘겨줍니다.

vault read aws/creds/mfa_user mfa_code=123456

 

MFA를 사용하지 않는 경우, 화면에서는 아래와 같이 Role과 Credential을 생성할 수 있습니다.

앞서 언급한 것처럼 policy document 입력이 없습니다

 

그리고 Credential을 생성해 줍니다.

TTL은 최소 900초 이상부터 설정이 가능합니다

 

이런 식으로 생성된 Credential을 확인할 수 있습니다.

Lease id는 공유 값으로 invoke하거나 renew, lookup 할 때 사용됩니다

 

# Assumed Role

마지막으로 Assumed Role입니다. AWS 콘솔에서 Role을 등록해 주는데 이때 Permission을 아래처럼 등록해 줍니다.

그리고 Trust relationships에 아래와 같이 설정해 줍니다.

 

이제 터미널에서 아래와 같이 Role을 생성해 줍니다.

vault write aws/roles/deploy \
    role_arns=arn:aws:iam::619402649469:role/vault-role \
    credential_type=assumed_role

 

그리고 Credential을 생성합니다.

$ vault write aws/sts/deploy ttl=60m
Key             Value
lease_id        aws/sts/deploy/31d771a6-fb39-f46b-fdc5-945109106422
lease_duration  60m0s
lease_renewable false
access_key      ASIAJYYYY2AA5K4WIXXX
secret_key      HSs0DYYYYYY9W81DXtI0K7X84H+OVZXK5BXXXX
session_token   AQoDYXdzEEwasAKwQyZUtZaCjVNDiXXXXXXXXgUgBBVUUb

 

화면으로 살펴보면 다음과 같습니다.

터미널에서 했던 것과 다르지 않습니다

 

Role이 생성 됐으면 바로 Credential까지 얻을 수 있습니다. 이미 Role안에 Role ARN이 들어있는데 왜 다시 입력받는 메뉴가 있는지는 모르겠습니다. 앞서 생성한 vault-role을 넣어도 되고, 안 넣어도 됩니다.

 

Generate 버튼을 누르면 아래와 같이 키가 생성됩니다. 

 

Copy credentials 버튼을 눌러서 정보를 복사하고 꼭 저장해 두도록 합니다.

{
  "accessKey": "ASIAZAN2GL56QZAZTHFW",
  "secretKey": "HeIJs0egqNKGhepT/SVx05882L8yW+40/VKRsV7/",
  "securityToken": "IQoJb3JpZ2luX2VjELL//////////wEaDmFwLW5vcnRoZWFzdC0yIkYwRAIgMv/l3YW+Ex4IXRl0aJOOQ7lZKmV/ErEqVrqOim7D4d4CIDN2grIVT2CBa1IqPhjAMjE1lDPCY3lXc+KjiRKe6UJbKscCCOv//////////wEQARoMNjE5NDAyNjQ5NDY5IgwEFNZB/FOhveGnu/QqmwJQM4nawH3m7YObM5VIfAvo5h/PMZejYyvvfV6J0P9hJ38twoFaFYkQvZoYg+eMT1BNZGrwboloZx0qwpqqAL/LDtaCwwNF6DR3qcvsn4xH6mUMTbofaAUNH7XmOpuCuY3XSXBquDfp6z7hJ9Ysh2C1Li7z1hDT5YDctjtP88UFjU6ADk/GpwggqyHfJR6Fx/VXdAvJsOsS0SVIbEVcGl9gqm4XekqKxOFvGuJTyOHH3DD8Duubcp/h5/esOL66deGD3wKXaO98soxqC4kCY5x74orl2pJn6eSq/dqY/8uLCC/a6SCJvm6kXKxlLtg80S6+Q9A6TINAZoivc/mo+20B1xG4Nwje6MHxYvN53mps8wHgX9yzeFOX81rVMOTCz7cGOp4B2qo02wXF4u0cppqun6oViHT+H66yFjId/lQuFkG2eEOxR0UPu7wn+h/AAH0VL93JsuSYWZXEz1tIkSdyLvUpja5h4gHFYM+z3uTIwl8kNP/e7lwHFCxCsUKU1ULS3OlsjmC/MAjhAzK1iF+QO+mVU0G0/+FKLVUaeu22BjLx88ip72vmmG19mqOP9EGsC573QLNGrPMRrR0xHHHXNS0=",
  "leaseId": "aws/creds/deploy/CEf76FEi3cXJCTrULVIe7mJh"
}

 

# leases 정보

지금까지 생성한 토큰 정보들은 lease 메뉴에서 확인할 수 있습니다. 좌측 메뉴에서 Access로 진입하고 Leases로 들어가면 그동안 발급받아 아직 Expire 되지 않은 모든 키에 대한 정보가 남아있습니다. 안타깝게도 Expire 된 키에 대한 정보는 확인할 수 없습니다. (유료 버전에서는 확인 가능한지 잘 모르겠네요)

leases / aws 메뉴로 따라들어가 보세요

 

이쪽 메뉴에서 Revoke lease를 통해 즉시 Credential을 만료시킬 수도 있습니다.

 

# Wrap UP

Vault를 통해서 Credentials을 쉽게 관리할 수 있는 방법에 대해 살펴봤습니다. 터미널 명령어를 처음 접했을 때 꽤 혼란스러웠습니다. 저와 같은 느낌을 받으신 분이 계실지 모르겠는데요. IAM User와 Session Token의 Credential을 생성하는 명령어는 vault read인데, federation token과 assumed role은 vault write입니다. 어떤 이유 때문에 통일되지 않았을지 혼란스러웠고, Role과 Credential 개념도 헷갈렸습니다. 

터미널 명령어와 함께 화면을 다뤘는데 이해에 조금 더 도움이 되셨기를 바랍니다. :-)

 

 

'개발 > Vault' 카테고리의 다른 글

Vault 컨셉과 기능 소개  (0) 2024.09.29
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday