ECS 및 도커 환경변수 설정 방법 및 검토사항 정리

GOMGun·2022년 7월 14일
0

안녕하세요?

곰군입니다.

오랜만에 클라우드 카테고리에 글을 쓰네요.

도커에서 데이터베이스 계정 정보 같은 프라이빗한 정보들을 어떻게 관리하는지에 대한 질문을 보고,

환경변수에 대해 정리를 하고자 합니다.

  1. 도커에서 런타임 환경변수 설정하기
    도커에서 소스에 직접 환경변수를 넣지 않고 런타임에 환경변수를 설정하는 방법은 두 가지입니다.

실행 시 환경변수를 직접 주입하거나 파일로 주입하는 방법입니다.

잘 정리해놓으신 글이 있어서 퍼왔습니다.

https://imjeongwoo.tistory.com/118

[Docker] 컨테이너 시작 환경을 지정하기

컨테이너의 환경변수, 작업 디렉토리 등을 지정하여 생성/실행 docker run [환경설정 옵션] 이미지명[:태그][인수] 옵션 설명 --env=[환경변수], -e 환경변수 설정 --env-file=[파일명] 환경변수를 파일로

imjeongwoo.tistory.com
실행 코드

docker run [환경설정 옵션] 이미지명[:태그][인수]

션 설명
--env=[환경변수], -e 환경변수 설정
--env-file=[파일명] 환경변수를 파일로부터 설정

1-1. -e 옵션을 이용하여 도커 컨테이너 실행 시에 아규먼트로 환경변수 주입(docker run --env옵션)

[user@localhost ~]$ docker run -it -e TEST1=Hello -e TEST2=World --rm centos:latest
[root@aed51cb6343c /]# echo $TEST1
Hello
[root@aed51cb6343c /]# echo $TEST2
World

1-2. 파일로 환경변수 주입(docker run --env-file옵션)

[user@localhost ~]$ cat > env_file
TEST1=Hello
TEST2=World
TEST3=Merong

[user@localhost ~]$ docker run -it --env-file env_file --rm centos:latest
[root@a57793a9cfdd /]# echo $TEST1 $TEST2 $TEST3
Hello World Merong

  1. ECS에서 환경변수 설정하기
    그렇다면 ecs에서는 docker run 명령어를 직접 날릴 수 없는데 어떻게 환경변수를 설정할 수 있을까요?

정답은 테스트정의에서 설정해주면 됩니다.

데스크 정의를 보시면 상기 이미지와 같이 Container definitions 항목이 보입니다.

컨테이너 정의를 누르고 설정을 하실 때 환경변수를 입력하거나 파일위치를 지정할 수 있습니다.

구체적으로 어떻게 정의하면 되는지는 하기 링크를 참조하시면 됩니다.

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/taskdef-envfiles.html

환경 변수 지정 - Amazon Elastic Container Service

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com
상기 링크에서 안내해주는 2가지 방법입니다.

environment 컨테이너 정의 파라미터를 개별적으로 사용합니다. 이것은 docker run에 대한 --env 옵션에 매핑됩니다.
대량으로 environmentFiles 컨테이너 정의 파라미터를 사용하여 환경 변수를 포함하는 하나 이상의 파일을 나열합니다. 파일은 Amazon S3에서 호스팅되어야 합니다. 이것은 docker run에 대한 --env-file 옵션에 매핑됩니다.
많이 본 것 같으시다면 맞습니다.

1번 도커에서 환경변수 설정하기의 내용과 거의 같습니다.

2-1 . ecs에서 개별 환경변수 지정하기
environment 컨테이너 정의 파라미터를 개별적으로 사용합니다. 이것은 docker run에 대한 --env 옵션에 매핑됩니다. 이 내용은 위에 1-1번에서 -e 옵션을 이용하여 도커 컨테이너 실행 시에 아규먼트로 환경변수 주입(docker run --env옵션)과 같은 내용입니다.
하기와 같이 작성하시면 됩니다.

{
"family": "",
"containerDefinitions": [
{
"name": "",
"image": "",
...
"environment": [
{
"name": "variable",
"value": "value"
}
],
...
}
],
...
}

2-2 . ecs에서 환경변수 파일 지정하기
대량으로 environmentFiles 컨테이너 정의 파라미터를 사용하여 환경 변수를 포함하는 하나 이상의 파일을 나열합니다. 파일은 Amazon S3에서 호스팅되어야 합니다. 이것은 docker run에 대한 --env-file 옵션에 매핑됩니다.
이것은 위의 1-2번 파일로 환경변수 주입(docker run --env-file옵션)과 같은 내용입니다.
하기와 같이 작성하시면 됩니다.

{
"family": "",
"containerDefinitions": [
{
"name": "",
"image": "",
...
"environmentFiles": [
{
"value": "arn:aws:s3:::s3_bucket_name/envfile_object_name.env",
"type": "s3"
}
],
...
}
],
...
}

쉽게 설명했지만 파일 지정하기 위해서는 사전 작업 및 검토해야할 사항이 있습니다.

내용 정리해보겠습니다.

환경변수 파일을 저장할 S3버켓을 사전 생성하고 환경변수 파일을 위치시켜놔야 합니다.
파일은 .env 파일 확장명과 UTF-8 인코딩을 사용해야 합니다.

  • 로컬 도커에서 실행할 때는 일반 .txt 확장자도 잘 인식되지만 ecs에서는 .env확장자만 인식합니다.
    ECS 태스크 실행 IAM 역할에 S3객체에 엑세스 권한을 부여해야 합니다. 인라인 정책으로s3:GetObject
    s3:GetBucketLocation
    에 대한 권한을 부여하시거나 AmazonS3ReadOnlyAccess정책을 추가해주시면 됩니다.
    하기 링크를 참조하시길 바랍니다.
    https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/task_execution_IAM_role.html

Amazon ECS 태스크 실행 IAM 역할 - Amazon Elastic Container Service

GetAuthorizationToken API 호출이 태스크의 탄력적 네트워크 인터페이스가 아닌 AWS Fargate 소유의 탄력적 네트워크 인터페이스를 통과하므로 ecr:GetAuthorizationToken API 작업에 aws:sourceVpc 또는 aws:sourceVpce

docs.aws.amazon.com

  1. 환경변수 지정에 관한 보안 검토사항
    3-1. Dockerfile혹은 어플리케이션의 property 파일에 환경변수를 넣는 경우
  • 일반적으로 리포지토리에 체크인되어 다른 사람들과 공유되기 때문에 위험합니다.

3-2. 런타임시 -e 옵션으로 환경변수를 제공하는 경우

  • docker inspect등으로 평문으로 전송한 환경변수가 노출될 수 있어서 보안 위험이 존재합니다.

  • ecs의 경우 "태스크 정의에 지정된 환경 변수는 태스크 정의에 대해 DescribeTaskDefinition 작업이 허용된 모든 IAM 사용자 및 역할에서 읽을 수 있습니다." 라고 안내하고 있습니다.

3-3. env파일을 활용하는 경우

  • 위의 2가지의 경우보다는 안전한 편이지만 버킷에 대한 관리를 철저히 해야 합니다.
  • ecs의 경우 "환경 변수 파일은 Amazon S3의 객체이며 모든 Amazon S3 보안 고려 사항이 적용됩니다."라고 안내하고 있습니다.

https://blog.alyac.co.kr/3393

봇넷들, 노출된 ENV 파일을 찾기 위해 은밀한 대규모 스캔 작전 실행해

Botnets have been silently mass-scanning the internet for unsecured ENV files 공격자들이 지난 2~3년 동안 인터넷에 실수로 업로드되어 웹 서버에 노출된 ENV 파일을 탐색하는 대규모 스캔을 진행해온 것으로..

blog.alyac.co.kr
많은 해커들이 노출된 env파일을 노리고 있기 때문에 파일로 환경변수를 관리하는 경우 버킷엑세스에 대한 관리를 철저히 해야 합니다.

3-4. aws의 권장사항

민감한 데이터는 AWS Secrets Manager 암호 또는 AWS Systems Manager 파라미터 스토어 파라미터에 저장하는 것이 좋습니다. 자세한 정보는 민감한 데이터 지정을 참조하십시오.
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/specifying-sensitive-data.html

민감한 데이터 지정 - Amazon Elastic Container Service

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com
이상 오랜만에 작성한 기술 글이었습니다.

읽어주셔서 감사합니다.

profile
곰군

2개의 댓글

comment-user-thumbnail
2022년 8월 9일

위 내용과 동일한 고민을 며칠동안 하고 있었는데 어느정도 해소가 되는 내용이네요. 감사합니다.

1개의 답글