사설 인증기관
조직이 자체 인증기관을 운영하거나, TLS를 끊고 다시 서명하는 프록시를 두고 있다면, 포털이 그 인증기관을 신뢰하기 전까지 바깥으로 나가는 연결이 검증에 실패합니다. 대개 저장소를 내려받는 단계에서 스캔이 멈추 거나, 취약점 데이터 갱신이 되지 않는 증상으로 나타납니다.
이 문서는 그 경우를 다룹니다. 바깥으로 나가는 연결 자체가 없는 망 분리 환경과는 다릅니다.
두 단계이고 순서가 있습니다
먼저 인증서를 컨테이너 안에 넣고, 그다음 도구들이 그 파일을 보게 합니다.
하나만 해서는 동작하지 않습니다. 두 번째가 틀리기 쉬운 쪽인데, 도구마다 읽는 변수가 다르고 같은 변수라도 도구마다 뜻이 다르기 때문입니다.
인증서를 넣습니다
backend와 worker와 beat 컨테이너에 읽기 전용으로 마운트합니다. Docker Compose는
docker-compose.yml 옆에 덮어쓰기 파일을 두면 됩니다.
# docker-compose.override.yml
services:
backend:
volumes:
- /etc/ssl/corp/ca-bundle.pem:/etc/ssl/corp-ca.pem:ro
worker:
volumes:
- /etc/ssl/corp/ca-bundle.pem:/etc/ssl/corp-ca.pem:ro
beat:
volumes:
- /etc/ssl/corp/ca-bundle.pem:/etc/ssl/corp-ca.pem:ro
Compose가 docker-compose.override.yml을 자동으로 읽으므로, 업그레이드가
docker-compose.yml을 교체해도 마운트 설정은 그대로 남습니다.
이 파일에는 사내 인증기관과 공용 루트 인증서를 함께 이어 붙여 둡니다. 이유는 다음 절에 있습니다.
cat /path/to/corp-root-ca.pem /etc/ssl/certs/ca-certificates.crt \
> /etc/ssl/corp/ca-bundle.pem
Helm으로 설치했다면
Secret을 직접 만들고, 차트가 그것을 마운트하고 변수를 설정하게 합니다.
kubectl create secret generic corp-ca --from-file=ca-bundle.pem=/etc/ssl/corp/ca-bundle.pem
env:
extraVolumes:
- name: corp-ca
secret:
secretName: corp-ca
extraVolumeMounts:
- name: corp-ca
mountPath: /etc/ssl/corp-ca.pem
subPath: ca-bundle.pem
readOnly: true
extraEnv:
SSL_CERT_FILE: /etc/ssl/corp-ca.pem
NODE_EXTRA_CA_CERTS: /etc/ssl/corp-ca.pem
REQUESTS_CA_BUNDLE: /etc/ssl/corp-ca.pem
GIT_SSL_CAINFO: /etc/ssl/corp-ca.pem
subPath가 있어야 인증서가 그 경로에 파일로 올라옵니다. 없으면 디렉터리가
덮어써서 위 변수들이 가리키는 파일이 존재하지 않습니다. 마운트는 backend와
beat와 워커 둘에 붙고, 바깥으로 나가지 않는 frontend와 Redis에는 붙지 않습니다.
번들 규칙은 같습니다. 사내 인증기관과 공용 루트 인증서를 한 파일에 담습니다. 이유는 다음 절에 있습니다.