application.yml 파일에 중요한 개인정보나 AWS 정보가 들어있다면 보안에 매우 취약합니다!
예를 들어 다음과 같이 S3를 사용할 때 access-key와 secret-key가 깃허브에 올라간다면, 누군가 언제든지 접근을 할 수 있게됩니다. 따라서 이를 막고자, 필자는 S3뿐만 아니라 다른 개인정보들도 보호하고 싶어서 Jasypt 라이브러리를 사용해 암호화를 진행했습니다.
Jasypt에 관한 내용은 아래 블로그를 참조했고, 여기서는 설명하지 않겠습니다.
암호화를 진행했다면 이 암호를 깃허브에 보여주지 않아야합니다. 하지만 필자의 CI/CD는 Github Actions와 AWS Code Deploy를 사용했는데 docker-compose.yml 파일이 깃허브에 올라와있고 Docker를 사용하는 환경이기 때문에 docker-compose.yml에 비밀번호를 적어줘야 합니다.
위의 그림과 같이 말이죠!
하지만, docker-compose.yml에도 필자의 비밀번호가 노출되었습니다. 다음과 같이 빌드, 배포에 필요한 파일들을 하나의 zip파일에 담아 S3에 전송하고 내려받는 구조이기 때문입니다. 따라서, zip파일을 한번에 보내는 방식이 아니라, 파일 각각을 운영서버로 전달하면 해결이되지만, 너무 복잡할 것 같아 다른 방법을 선택했습니다.
운영 EC2에 시스템 환경변수를 설정해 놓고, docker-compose.yml에 등록하는 것이죠
그렇다면, 리눅스 시스템 환경변수 설정은 어떻게 하면 될까요?
루트 디렉토리로 나와 /etc로 들어가면
다음과 같은 파일들이 있습니다.
bashrc파일을 vim을 사용해 들어가서 비밀번호를 설정합니다.
다음과 같이 설정하면 됩니다.
그러면 docker-compose config으로 파일을 출력했을때 ${SPRING_JASYPT_PASSWORD}대신 비밀번호가 출력되는 것을 확인할 수 있습니다!
하지만, docker-compose config로 출력했을때 비밀번호가 정상적으로 출력되어도, 스프링 부트 시스템은 정상적으로 암호화가 되지 않았습니다.
왜 그런 걸까 생각을 해보다가, docker는 완전히 격리된 컨테이너 환경이라는 것이 떠올랐고 구글링을 해보니 대부분의 자료들이 .env파일로 환경변수를 넘겨주는 것을 확인할 수 있습니다.
즉, 리눅스 시스템 환경변수를 docker-compose.yml에서 사용할 수 없다고 판단했습니다..
도커라는 건, 서버의 상태를 쉽게 관리하기 위해서 어떠한 프로그램도 컨테이너로 만들고, 어떤 환경에서도 돌아가야 되는데 리눅스 시스템 환경변수를 전달한다면 도커의 장점이 사라지는 것이죠!
예를 들어 똑같은 docker-compose.yml파일을 가지고 다른 운영체제에서 실행을 하는데, 환경변수가 설정이 되어 있지 않다면 비밀번호가 빈값이 들어가, 어떤 환경에서도 돌아가는 도커의 장점이 사라집니다.
따라서, 도커는 환경변수를 .env라는 파일로 관리할 수 있도록 설정관리를 해줍니다.
필자는,
다음과 같은 .env.password파일을 만들고
다음과 같이 비밀번호를 설정해주고
docker-compose.yml 파일안에 .env파일을 설정해줬습니다.
여러가지 방법중 어떤 방법이 가장 적합할지 생각하느라 시간이 많이 소요되었지만, 여러가지를 시도해보며 리눅스와 도커에 익숙해질 수 있었던 과정이였습니다! 또한, 컨테이너라는 개념과 장점들에 대해 깊게 생각해볼 수 있었던 시간이였습니다.
'Dev > Docker' 카테고리의 다른 글
[Docker] Dockerfile의 COPY와 리눅스 cp의 차이 (0) | 2023.05.09 |
---|---|
[Docker] Docker 바인드마운트 사용해 파일 저장하기(vs 볼륨마운트) (0) | 2022.04.18 |
[Docker] Docker TimeZone설정(UTC -> KTC) (0) | 2022.03.24 |
[Docker] Docker(도커)란? 도커가 나오게 된 배경은? (0) | 2022.01.04 |