Github Actions 를 사용하여 Image build, push 자동화 시 유의해야 할 보안 문제
내가 채택한 방식이 항상 최선일까? 의심을 하고 또 의심을 해야한다. 특히 보안에 관해서는.
1. 우연히 본 무시무시한 글
단위테스트에 관해 검색하다가 아래 글을 보았습니다.
대략 요약하면 보안에 관련한 이야기 였습니다. 누군가가 깃허브 액션을 사용하여 AWS 에 자동배포를 하기 위해 깃허브 액션을 사용하였는데, 방법이 다음과 같았습니다.
- 민감 정보를 github secrets 에 저장
- github actions 로 application.yml 에 환경 변수로 지정한 값들을 github secrets 에서 꺼내와 넣은 파일을 생성
- gradle build
- AWS deploy
- …
글쓴이는 처음에는 좋은 방법인것 같다는 생각에 시도 하려 했지만, 곧 의문이 들었다고 합니다. 이렇게 빌드 하면 생성된 jar 파일에 민감정보가 들어간 yml 파일이 생성된다는 것! 그리고 맘만 먹으면 이걸로 나쁜짓도 할 수 있다는 것!
해당 방식을 사용한 분의 docker hub 에서 이미지를 다운받아 까보니 BOOT-INF/classes 디렉토리 안에 민감정보가 고대로 있었다고 합니다. 🫣
2. 환경변수는 어디에?
Github Actions 을 이용한 프로젝트 Image build, push 자동화 이 글에서 말했듯이 저의 경우 환경변수 파일(.env 파일) 을 따로 만들어 프론트에게 제공했습니다.
환경 변수를 넣지 않고 만들어 배포했기 때문에 누군가 이미지를 pull 받아 jar 파일을 까보면 application.yml 파일은 이렇게 되어 있을 겁니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
spring:
main:
allow-bean-definition-overriding: true
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
show-sql: true
hibernate:
ddl-auto: update
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
data:
redis:
port: 6379
host: 127.0.0.1
springdoc:
version: v1.0.0
default-consumes-media-type: application/json;charset=UTF-8
secret:
key: ${SECRET_KEY}
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
logging:
level:
root:
info
org:
springframework:
security:
debug
jdbc:
core:
debug
web:
debug
3. 환경변수를 사용하는 것의 이점
- docker compose 파일에서 환경변수 파일을 지정할 수 있다.
- application.yml 을 깃허브에 올릴 수 있다!
- 대신 환경변수 파일을 올리면 안된다.
하지만 도커로 실행하지 않을경우에는 configuration 에 환경변수를 직접 넣어주어야 합니다. 그래도 팀간의 소통과 원활한 협업을 위해 사용하는게 더 나은것 같아요. 😐
This post is licensed under
CC BY 4.0
by the author.