대상 OS: Ubuntu Server 24.04 LTS
서버에서 비밀값(토큰, API 키, DB 비밀번호, 인증서 프라이빗 키)을 “완벽하게 숨기는” 건 현실적으로 어렵습니다. 대신 목표는 (1) 노출 가능성을 줄이고, (2) 노출되더라도 피해를 제한하는 것입니다. 아래는 운영 현장에서 바로 적용 가능한 ‘최소 규칙’입니다.
비밀값 노출을 줄이는 최소 규칙(바로 적용용)
-
1) 비밀값은 코드/이미지에 박지 말고 “파일/환경”으로 분리
Git 저장소, 도커 이미지, CI 로그에 한 번 들어가면 회수가 어렵습니다. 최소한 서버 파일로 분리하세요.
# 예: 애플리케이션 전용 디렉토리 sudo install -d -m 0750 -o root -g app /etc/myapp # 예: 시크릿 파일 생성(권한 최소화) sudo install -m 0640 -o root -g app /dev/null /etc/myapp/secrets.env # 내용 편집(에디터) sudoedit /etc/myapp/secrets.env # 예시 내용 # DB_PASSWORD='...' # API_TOKEN='...' -
2) 파일 권한/소유권을 ‘최소 접근’으로 고정
비밀값 파일의 권한이 느슨하면, 내부 침해/실수로 유출이 쉬워집니다.
# 소유권/권한 점검 sudo ls -al /etc/myapp/secrets.env # 권한 강화(예: root:app, 0640) sudo chown root:app /etc/myapp/secrets.env sudo chmod 0640 /etc/myapp/secrets.env # 디렉토리도 접근 최소화 sudo chmod 0750 /etc/myapp -
3) systemd 서비스에는 EnvironmentFile로 주입(프로세스 인자에 노출 금지)
비밀값을 커맨드라인 인자로 넘기면
ps로 노출되기 쉽습니다. systemd의 EnvironmentFile을 활용하면 운영이 깔끔해집니다.# 서비스 드롭인 생성 sudo systemctl edit myapp.service # 아래 내용 추가 # [Service] # EnvironmentFile=/etc/myapp/secrets.env # 반영 sudo systemctl daemon-reload sudo systemctl restart myapp.service sudo systemctl status myapp.service --no-pager -
4) 로그에 비밀값이 찍히지 않게 “마스킹”과 “레벨”을 강제
노출은 종종 “파일 유출”이 아니라 “로그/에러 메시지”에서 발생합니다. 토큰을 그대로 출력하는 코드는 반드시 고치고, 운영 로그 레벨도 점검하세요.
# 최근 24시간 내 토큰/키 패턴 검색(예: Bearer, API_KEY 등) # 실제 키워드는 환경에 맞게 추가 sudo journalctl --since "24 hours ago" --no-pager | rg -n "Bearer |API[_-]?KEY|TOKEN|SECRET|Authorization:" || true # 애플리케이션 로그 파일도 점검 sudo rg -n "Bearer |API[_-]?KEY|TOKEN|SECRET|Authorization:" /var/log 2>/dev/null | head -n 50 -
5) “회수/회전(rotate)” 가능한 형태로 발급하고, 주기/절차를 문서화
언젠가 노출된다고 가정하면, 회전이 쉬워야 합니다. 장기 고정 키는 결국 사고로 이어집니다.
# (절차 예시) 교체 전/후 체크리스트를 파일로 남기기 sudo install -d -m 0750 -o root -g root /etc/myapp/runbooks sudo tee /etc/myapp/runbooks/secret-rotation.md >/dev/null