들어가며
NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. AWS 환경에서 인프라를 관리하면서 문득 aws-cli 환경에 접근할 때 조금 더 안전하게 접근하려면 어떻게 해야 할까 알아보면서 aws-vault에 대해 알 수 있었습니다. aws-vault를 활용한다면, aws의 credentials 정보를 조금 더 안전하게 관리할 수 있다고 생각했습니다. 그럼 aws-vault를 어떻게 활용할 수 있는지 알아보겠습니다.
aws-vault
AWS CLI를 로컬 환경에서 사용하는 경우 보통 access_key와 secret_key를 발급받습니다. 그리고 aws configure 명령어를 입력하여 사용자의 access_key, secret_key를 등록합니다. 등록된 정보를 사용하면 IAM 사용자에게 부여된 모든 권한을 활용하여 AWS 서비스에 접근가능합니다. 하지만 access_key, secret_key 정보는 작업 환경에서 암호화되지 않은 상태로 저장되거나 노출됩니다. 그리고 IAM 사용자에게 부여되는 access_key는 영구적으로 권한을 보유하기 때문에 한 번 유출되면 되돌리기 어려운 문제가 발생할 수 있습니다. 이때 aws-vault를 활용하면 AWS 인증 정보를 안전하게 보관할 수 있도록 돕습니다.
aws-vault는 맥 OS 키체인, 윈도우 자격 증명 관리자 등을 백엔드로 사용해 인증 정보를 저장하고, 키를 사용할 때도 사용자 키를 직접 사용하지 않고 STS를 경유해 임시 세션 키를 발급받아 사용합니다. 따라서 처음에 인증 정보를 셋업 한 이후에는 인증 정보가 유출되더라도 세션이 유효한 기간만 동작하기 때문에 유효 기간이 지나면 인증 정보를 사용하지 못하도록 구성할 수 있습니다. 그럼 보다 안전하게 aws cli credentials 정보를 관리하기 위해 aws-vault를 사용하는 방법에 대해 알아보겠습니다.
aws-vault 설치
mac os를 사용하기 때문에 저는 다음 명령어를 활용하여 aws-vault를 설치하겠습니다.
$ brew install awscli
$ brew cask install aws-vault
만약 다른 운영체제를 활용한다면, 운영체제 별 패키지 관리자를 통해 aws-vault를 설치하면 됩니다.
$ choco install aws-vault # 윈도우 Chocolatey
$ scoop install aws-vault # 윈도우 Scoop
$ brew install aws-vault # Linux Homebrew
$ yay -S aws-vault # Arch Linux AUR
$ pkg install aws-vault # FreeBSD
$ nix-env -i aws-vault # NixOS
설치가 완료됐다면, 다음 명령어로 정상적으로 설치되었는지 확인합니다.
$ aws-vault --version
v5.4.4
aws-vault 설정
설치가 완료됐다면, aws-vault를 설정하기 앞서, 기존에 사용하고 있는 credentials 정보를 조회합니다.
cat ~/.aws/credentials
조회 후, aws credentials 정보를 복사한 다음, aws-vault에 넣어주기 위해 잠시 보관합니다. 그 후 플레인 텍스트로 저장되어 있는 credentials 정보를 제거합니다.
rm -r ~/.aws/
제거가 완료됐다면, 이제 aws-vault를 활용해서 aws cli 정보를 저장합니다.
$ aws-vault add <PROFILE_NAME>
Enter Access Key ID: ...
Enter Secret Access Key: ...
Added credentials to profile "<PROFILE_NAME>" in vault
<PROFILE_NAME>에는 aws cli 정보를 포함하는 이름을 설정합니다. 그 후 복사해 뒀던 Access Key와 Secret Access Key 정보를 입력합니다.
등록을 하면서, 키체인에도 정보를 등록합니다. AWS 인증 정보를 등록했으면, ls 서브커맨드로 키가 잘 등록되었는지 확인해 볼 수 있습니다.
aws-vault ls
Profile Credentials Sessions
======= =========== ========
con con -
예를 들어 위와 같이 등록이 됐다면, aws-vault를 사용할 준비가 끝났습니다.
aws-vault 사용하기
이제는 aws-vault에 등록된 credentials 정보를 활용해서 명령어를 입력해 보겠습니다. 명령어는 기존 aws 명령어 앞에 aws-vault exec <사용자 이름> -- 을 입력하면 됩니다.
$ aws-vault exec <PROFILE_NAME> -- <COMMAND>
저는 con이라는 프로필 이름을 설정했기 때문에 PROFILE_NAME에 con을 입력할 것이고, aws s3의 목록을 조회할 수 있는 명령어를 입력해 보겠습니다.
aws-vault exec 명령어를 입력했을 때 앞서 키체인에 지정한 패스워드를 함께 입력해야 합니다. 패스워드까지 잘 입력이 끝나면 명령어가 잘 실행될 것입니다.
$ aws-vault exec con -- aws s3 ls
2024-05-15 10:12:07 bucket1
2024-05-15 11:23:25 bucket2
...
aws-vault의 세션 관리 및 장시간 인증 유지하기
aws-vault를 사용하면 sts를 통해 임시 세션 인증 정보가 발급됩니다. 만약 세션이 만료되기 전에 미리 삭제하고 싶다면, 아래처럼 진행할 수 있습니다.
$ aws-vault ls
Profile Credentials Sessions
======= =========== ========
con con sts.GetSessionToken:41m58s
$ aws-vault remove con --sessions-only
$ aws-vault ls
Profile Credentials Sessions
======= =========== ========
con con -
마치며
공부를 하며 그동안 아주 기초적인 것들을 제대로 공부하지 않았다는 것을 깨닫습니다. 좋은 기술을 배우는 것도 좋지만, 기술의 기반이 되는 기초적인 지식을 먼저 쌓는 것이 중요하다는 것을 다시금 깨달았습니다. 기초가 튼튼한 개발자가 되고 싶습니다.
출처
'Project > 서버 개발' 카테고리의 다른 글
[Project] 프로젝트 삽질기62 (feat sentry 잘 활용하기) (0) | 2024.05.19 |
---|---|
[Project] 프로젝트 삽질기61 (feat IAM MFA 강제) (0) | 2024.05.16 |
[Project] 프로젝트 삽질기59 (feat transactional outbox) (0) | 2024.05.06 |
[Project] 프로젝트 삽질기58 (feat Transactional) (0) | 2024.04.21 |
[Project] 프로젝트 삽질기57 (feat 커넥션 풀 누수) (1) | 2024.02.18 |