AWS 크레덴셜 안전하기 사용하기 – AWS Vault

AWS의 크레덴셜 정보를 안전하게 사용하기 위한 방법들을 알아보고 있는데, 이번 글에서는 서드파티 어플리케이션인 AWS Vault를 소개하고자 합니다. AWS Vault는 CLI에서 제한되는 여러 상황을 보완하고 더 수준 높은 보안을 달성하는 것에 초점을 맞추고 있습니다. 그렇다면 CLI에서 커버가 되지 않는 부분들은 무엇이 있을까요?

  • 사용자 계정에서 액세스 키를 발급받은 경우, CLI에서는 액세스 키를 그대로 저장하여 사용 가능하지만 액세스 키가 서버 내에서 쉽게 노출될 수 있습니다.
  • 사용자 계정에서 액세스 키를 발급받았는데 MFA가 걸려있는 경우, CLI에서는 액세스 키를 등록하고 사용해도 MFA 인증이 불가하여 사용이 불가능합니다.

이와 같은 상황을 보완하기 위해서 AWS Vault를 사용하면 다음과 같이 해결할 수 있습니다.

  • 액세스 키를 Mac의 경우에는 키체인에 보관하고, 접근 암호를 설정함으로써 암호를 모르면 액세스 키 사용 및 접근이 제한되며, config 파일에 키가 노출되지 않습니다.
  • 액세스 키를 사용할 때 MFA가 걸려있으면, 저장된 MFA 정보를 토대로 인증 절차를 진행하고 임시 보안 자격 증명을 취득하여 토큰 만료시간 내에는 취득한 자격 증명을 반복 사용함으로써 매번 인증할 부담을 덜어줍니다.

설치

AWS Vault의 설치는 brew를 통해서 손쉽게 진행할 수 있습니다.

> brew install aws-vaultCode language: Bash (bash)

액세스 키

기본적으로 AWS CLI에서 사용중인 프로파일 정보와 설정들이 모두 공유되기 때문에 보안이 필요한 프로파일에 대해서만 조치를 취해주면 됩니다. 예를 들어서, demo 프로파일에 액세스 키가 플레인 텍스트로 등록이 되어있다면 다음 명령을 통해서 해당 키를 안전하게 키체인에 저장할 수 있습니다.

> aws-vault add demo
Enter Access Key ID: AKIAXXXXXXXXXXXXXXXX
Enter Secret Access Key: *****************
Added credentials to profile "demo" in vaultCode language: Bash (bash)

중간에 키체인 암호 설정 또는 인증 과정이 나오게 될텐데, 키체인 암호는 절대로 잊어버리지 않도록 주의하시길 바랍니다. 위와 같이 액세스 키를 키체인에 등록 완료하였다면, 이제 AWS CLI에서 저장하고 있는 액세스 키는 반드시 삭제하셔야 합니다. ~/.aws/credentials 파일에서 demo 프로파일에 대한 키 정보를 삭제하시기 바랍니다.

크레덴셜 삭제가 완료되었다면 이제 정상적으로 CLI 사용이 가능한지 테스트를 해봐야 합니다. aws-vault 내의 크레덴셜을 사용하기 위해서는 모든 명령에 추가적인 커맨드를 붙여야만 합니다.

> aws-vault exec demo -- aws s3 ls
2021-09-12 22:08:17 cf-templates-***
2021-09-12 21:33:59 lamanus-***
2021-03-21 14:28:32 wordpress-***Code language: Bash (bash)

액세스 키 with MFA

이번에는 MFA가 등록된 액세스 키에 대한 절차를 살펴보겠습니다. 기본적으로 액세스 키 등록은 위 과정과 동일하게 진행하시면 됩니다. 그리고 MFA 정보를 추가로 등록해주면 되는데, 이는 config 파일에 추가하시면 됩니다.

> vi ~/.aws/config
[profile demo]
mfa_serial=arn:aws:iam::<account_id>:mfa/<mfa_device_name>
region=ap-northeast-2Code language: Bash (bash)

이렇게 mfa_serial 키에 대한 값으로 MFA의 ARN을 입력해주시면 됩니다. 이 정보는 콘솔의 MFA 디바이스에서 확인하실 수 있으며, 위 값에서 <account_id>와 <mfa_device_name> 값을 여러분의 것으로 바꾸시면 됩니다. 이제 aws-vault를 사용해서 CLI 명령을 수행해보도록 하겠습니다.

> aws-vault exec demo -- aws s3 ls
Enter MFA code for arn:aws:iam::<account_id>:mfa/<mfa_device_name>: 123456
2021-09-12 22:08:17 cf-templates-***
2021-09-12 21:33:59 lamanus-***
2021-03-21 14:28:32 wordpress-***Code language: Bash (bash)

명령 입력 후에 곧바로 MFA 인증 절차가 추가된 것을 확인하실 수 있습니다. 코드를 입력하면 임시 보안 자격 증명이 발급되고 결과가 잘 나타나는 것을 볼 수 있습니다. 이후에 같은 명령을 다시 입력하면 AWS Vault 내에 저장된 임시 보안 자격 증명을 사용하여 명령이 수행되므로 시간 내에는 MFA 코드를 다시 입력하실 필요는 없습니다.

크레덴셜 공유

앞서 AWS CLI를 사용하는 경우에는 자격 증명을 오직 CLI 내에서만 사용 가능했습니다. 하지만 AWS Vault는 그 자체로 보안 자격 증명을 관리하고 있으며, 명령어를 Wrapping하고 있기 때문에 AWS CLI 외의 프로그램도 사용할 수가 있습니다.

> aws-vault exec demo -- terraform applyCode language: Bash (bash)

저도 테라폼으로 클라우드 인프라를 여러 계정에서 관리하면서 멀티 프로파일을 사용중인데, 기존에는 별도의 인증 스크립트를 사용했었지만 이제는 손쉽게 AWS Vault를 통해 인증을 받아서 CLI 외의 프로그램에 자격 증명을 손쉽게 제공하고 있습니다. 참 쉽죠?

그렇다면, IntelliJ나 VSCode처럼 명시적으로 크레덴셜을 전달할 수 없는 경우에는 어떤 방식으로 인증 처리를 진행할 수 있을까요? 예컨대 demo 프로파일은 MFA가 걸려있는 액세스 키를 사용하는데, IntelliJ의 AWS Toolkit 플러그인을 사용하게 되면 AWS Vault를 거치지 않기 때문에 인증 오류가 발생하게 될 것입니다.

이러한 상황을 처리하기 위해서 config에 credential_process라는 옵션이 존재합니다. 이는 간략히 설명하자면, CLI의 인증을 타는것이 아니라 외부 프로그램을 통해서 인증을 받아오고 CLI는 이를 그저 제공만 하게 됩니다. demo 프로파일에 대해서는 다음과 같이 옵션을 추가해볼 수 있습니다.

> vi ~/.aws/config
[profile demo]
mfa_serial=arn:aws:iam::<account_id>:mfa/<mfa_device_name>
credential_process=/opt/homebrew/bin/aws-vault exec demo --json --prompt=osascript
region=ap-northeast-2Code language: Bash (bash)

그러면 IntelliJ는 CLI에 자격 증명을 요청하고 CLI는 AWS Vault에 다시 자격 증명을 요청함으로써 MFA와 같은 인증 프로세스를 진행할 수 있게 되는 것입니다.


지금까지 AWS Vault의 장점과 설정 방법, 사용 방법을 알아보았습니다. 앞서 설명드린 많은 내용은 결국 안전하게 AWS 크레덴셜을 사용하기 위한 과정들입니다. 이미 SSO를 사용한 방법은 안전하기 때문에 굳이 AWS Vault를 이용하실 필요는 없습니다. 액세스 키를 사용하거나 여기에 MFA가 걸려 있는 경우에는 꼭 AWS Vault를 사용하셔서 안전하게 크레덴셜을 사용하시기 바랍니다.

Leave a Reply

Your email address will not be published. Required fields are marked *