티스토리 뷰

Spring으로 웹 애플리케이션 개발을 진행하다보면 이미지, 파일 등 정적 리소스를 저장할 저장소가 필요하게 된다.
가장 많이 쓰여지는 것 중 하나가 AWS에서 제공하는 S3가 있는데 이걸 이용하려면 credentials 인증을 어플리케이션에서 해줘야 한다.

 

credentials 인증 방식은 많이 있지만 사람들이 제일 많이 쓰는 방법 중 하나가 application.properties 파일같은 설정파일에 accessKeysecretAccessKey를 넣어서 사용하는데 이는 보안에 매우 취약하다.

 

만약 github에 accessKey, secretAccessKey를 그대로 올리기라도 하면 큰 피해를 입을 수 있으며 실제로 그런 사례가 많이 있다. 그래서 이번에는 accessKey와 secretAccessKey를 어플리케이션 코드에서 제거하면서 보다 안전하게 관리하는 방법에 대해 공유해보고자 한다.

DefaultAWSCredentialsProviderChain.class

aws-java-sdk-core.jar파일안에 해당 클래스가 있는 걸 확인할 수 있는데 이 클래스는 credentials 인증을 할 수 있는 방법을 5가지정도 제공해주는데 4가지정도 알아보자.



EnvironmentVariableCredentialsProvider.class

  • OS 환경변수 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY에 등록되있는 정보를 가져와서 credentials 인증을 한다.

SystemPropertiesCredentialsProvider.class

  • Java System 속성 aws.accessKeyIdaws.secretKey에 등록되있는 정보를 가져와서 credentials 인증을 한다.

ProfileCredentialsProvider.class

  • 사용자 디렉토리/.aws/credentials 파일에 profile을 등록하고 파일안에 aws_access_key_idaws_secret_access_key변수에 선언된 정보를 가져와서 credentials 인증을 한다.
  • 위 방법은 aws cli를 설치하여 configure 세팅하는 과정에서 자동으로 등록된다.

EC2ContainerCredentialsProviderWrapper.class

  • 이 클래스는 어플리케이션이 배포된 서버가 EC2 및 컨테이너환경 일때 동작되는 클래스인데 EC2 및 컨테이너에 S3관련 역할을 부여하면 해당 역할을 통해 credentials 인증을 한다. 

그렇다면 여기서 무엇을 써야할 지 고민하실분들이 계실텐데 3가지 정도 케이스에 대해 좋은방안을 공유하려고 한다. 이것보다 더 나은방법도 있을 수 있지만 일단 필자가 생각나는 방법을 얘기하고자 한다.

local 환경

OS 환경변수에 설정

  • OS 환경변수에 한번 설정해두면 어플리케이션에서 AWS SDK를 이용할 때 어플리케이션 설정파일이 아니라 OS 환경변수를 통해 credentials 인증을 처리한다.

AWS CLI 설치

  • aws cli를 설치하여 aws configure 세팅을 해준다. aws configure 세팅과정에서 accessKey, secretAccessKey를 입력하는 과정이 있는데 작업이 완료되면 사용자 디렉토리/.aws/credentials 파일에 crendetials 정보가 등록되며 어플리케이션에서 AWS SDK를 사용할 수 있다.
  • 그리고 aws cli를 설치하게되면 aws cli 관련 명령어도 쓸 수 있어서 여러모로 편리한 점이 있다.

Java System 속성

  • Java System 속성은 비추천하는데 새로운 프로젝트 열고 어플리케이션 실행할 때마다 매번 VM OPTION 세팅하기가 귀찮고 번거롭기 때문이다.

 

EC2가 아닌 환경 (ex. development)

OS 환경변수 or Java System 속성

  • local이 아니면서 EC2가 아닌환경에서 AWS SDK를 사용하고자 할 때는 OS 환경변수나 Java System 속성에 설정해주는게 괜찮다.
  • 예를들어 development 환경이라고 가정할 때 development는 local에서 정상적으로 개발된 코드를 배포하여 테스트를 하는 서버로 굳이 여기에다 aws cli를 설치할 필요는 없기에 두 가지 방식 중 편한 방법을 선택해서 하면 될 것 같다.

 

EC2 환경 (ex. production)

EC2 IAM 역할 부여

  • 위에서 credentials 인증하는 4가지 방식을 정리했는데 그 중 가장 마지막인 EC2ContainerCredentialsProviderWrapper.class가 동작한다.
  • 해당 코드를 깊게 파고가보면 EC2 인스턴스 메타데이터 서비스(IMDS)를 이용하여 credentials 인증을 처리하여 EC2 환경에서 AWS 서비스들을 이용할 수 있게 된다. 그럴려면 EC2 IAM에 S3 관련된 Role을 부여하면 된다.

 

테스트

테스트용 S3 버킷과 데이터를 생성 후 사용자 디렉토리/.aws/credentials 파일에 credentials 인증정보를 등록해두었다.



테스트가 정상적으로 성공했다.

참고

최소한의 역할만 부여

  • accessKey, secretAccessKey를 발급하거나 IAM Role을 부여할 때는 항상 최소한의 역할만 부여해줘야 한다. 너무 많은역할을 부여해버리면 보안에 좋지 않다.
  • local 같은 경우에는 개발자 개인이 PC 관리를 철저히 해야한다.
  • development 같은 경우에는 서버 내에 accessKey, secretAccessKey가 있어서 확인할 순 있지만 최소한의 역할만 부여해주면 큰 사고는 발생하지 않을 것이다.
  • EC2, ECS에도 마찬가지로 최소한의 역할만 부여해주자.
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함