회사 프로젝트에서 S3를 이용한 파일 업로드 기능을 사용하고 있었다. AWS S3 인증 과정에서 소스코드에 직접 Id와 key를 넣어 활용하고 있었는데, 이 방법은 보안에 취약하다. 따라서 인증키를 제거하고, IAM 역할이 부여된 AWS EC2 인스턴스의 자격증명을 사용하기로 결정했다.
기존 AWS 관련 지식이 없어서 한참 해맸었다. aws 공식 pdf에 나와있는 여러 메소드를 활용해봤지만, 계속 credential 오류가 발생했다. 🤕 🤕 상사분께 sos를 보냈고, 우선 local에서 aws config를 생성하여 테스트를 해봐야 한다고 말씀해주셨다.
➜ ~ brew install awscli
나의 경우 homebrew를 이용하여 설치하였다.
➜ ~ aws --version
aws-cli/2.7.23 Python/3.10.6 Darwin/21.6.0 source/x86_64 prompt/off
설치가 잘 된 것을 확인할 수 있다.
Access Key 및 Secret Key는 IAM 사용자를 생성할 때 받아두었던 Key를 사용한다
➜ ~ aws configure
AWS Access Key ID [None]: ************
AWS Secret Access Key [None]: ************************
Default region name [None]: ap-northeast-2 // 서울
Default output format [None]:
➜ ~ aws configure list
➜ ~/.aws/credentials
[default]
aws_access_key_id = ************
aws_secret_access_key = ************************
위 명령어를 활용하여 등록한 aws configure 목록을 볼 수 있다.
각자 프로젝트 소스에 있는 키 부분을 삭제해준다. 소스코드에 키가 그대로 적용되어 있으면 보안에 취약해진다!
local에서 ~/.aws/credentials
생성 이후, 테스트 결과 자동 적용 되어 키를 제거했음에도 불구하고, 업로드 기능이 잘 동작했다.
AWSJavaSDK 의 cycle 관련 내용이니 참고해보길 바란다.
You can use DefaultAwsCredentialsProviderChain()
, which according to the documentation, looks for credentials in this order:
AWS_ACCESS_KEY_ID
and AWS_SECRET_ACCESS_KEY
(recommended since they are recognized by all AWS SDKs and CLI except for .NET), or AWS_ACCESS_KEY
and AWS_SECRET_KEY
(only recognized by the Java SDK)aws.accessKeyId
and aws.secretAccessKey
~/.aws/credentials
) shared by all AWS SDKs and the AWS CLI기존 코드에 적용되었던 인증 키 부분을 삭제 후 aws configure 설정과 테스트를 해보는 과정을 통해 aws 자격 증명 정보를 얻어오는 프로세스에 대해 이해할 수 있었다. 그 과정이 순탄치는 않았지만..ㅎ 😂
특정 키 파일이 없을 경우에는 최종적으로 EC2 인스턴스의 IAM role 설정에 접근할 수 있다는 것을 기억하자! 🤟
https://potato-yong.tistory.com/94
https://formulae.brew.sh/formula/awscli
https://stackoverflow.com/questions/61456782/download-and-upload-file-using-iam-role-instead-of-secret-and-access-key
https://www.opentutorials.org/course/2717/11344
https://xlffm3.github.io/spring%20&%20spring%20boot/s3-cloud-front/