티스토리 뷰
AWS Secrets engine을 통해 AWS의 credentials을 관리하는 방법을 소개합니다. 이번 글에서는 터미널 명령어와 GUI를 함께 보도록 하겠습니다. 여기서 다루는 모든 GUI는 오픈소스 버전입니다. HashiCorp Cloud Platform(HCP) 버전과 상이할 수 있는 점을 참고해 주세요. 그럼 시작합니다.
먼저 AWS secrets engine을 활성화합니다.
vault secrets enable aws
혹은 GUI에서 아래와 같이 Secrets Engines 메뉴에서 Cloud > AWS를 선택해 주면 됩니다.
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 정보를 이용해서 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도 관리가 필요합니다. 유출되면 안 되니까요. 아래 명령어를 통해 주기적으로 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을 생성해 주고요
Credential 생성은 방금 생성한 my-role로 들어가서 Generate 버튼만 눌러주면 끝입니다.
아래와 같이 계정이 생성된 걸 확인할 수 있어요.
IAM 계정 회수 시간은 기본 768h입니다. 기본 시간은 아래처럼 AWS Secrets Engine에서 Leases메뉴를 통해 변경할 수 있습니다. 이 시간이 지나면 IAM > Users에 생성된 vault-*로 시작하는 계정이 삭제됩니다.
# 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 쪽으로 들어가서 만들면 됩니다.
# 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을 생성할 수 있습니다.
그리고 Credential을 생성해 줍니다.
이런 식으로 생성된 Credential을 확인할 수 있습니다.
# Assumed Role
마지막으로 Assumed Role입니다. AWS 콘솔에서 Role을 등록해 주는데 이때 Permission을 아래처럼 등록해 줍니다.
이제 터미널에서 아래와 같이 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 된 키에 대한 정보는 확인할 수 없습니다. (유료 버전에서는 확인 가능한지 잘 모르겠네요)
이쪽 메뉴에서 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