Files

47 lines
2.1 KiB
Markdown

# Security Policy
## 저장소에 둘 수 없는 항목
- 평문 비밀번호, token, access key, private key
- base64로만 인코딩한 Kubernetes `Secret`
- kubeconfig와 클라우드 provider credential
- Terraform/OpenTofu state, plan, 복호화 산출물
- 실제 비밀이 포함된 `tfvars`, Helm values, `.env`
`.gitignore`는 실수 완화 장치일 뿐 보안 통제가 아닙니다. 비밀이 한 번이라도
커밋되었다면 history 삭제 여부와 관계없이 즉시 폐기하고 회전합니다.
## 허용하는 비밀 관리 방식
프로젝트마다 다음 중 하나를 ADR로 선택하고 CI와 운영 절차를 함께 정의합니다.
- External Secrets 계열 리소스로 외부 secret manager를 참조
- SOPS와 KMS/age를 사용해 암호화한 파일만 저장
- 조직에서 승인한 동등한 GitOps 비밀 관리 방식
SOPS로 암호화한 Kubernetes Secret은 검증 가능한 규칙을 위해
`*.sops.yaml`, `*.sops.yml` 또는 `*.sops.json` 이름을 사용합니다.
암호화 키, 복호화 권한과 secret manager 접근은 workload identity/OIDC와
최소 권한 원칙으로 부여합니다. 장기 cloud access key를 CI secret으로
사용하지 않습니다.
## State와 CI
- remote state는 암호화, locking, versioning을 활성화합니다.
- 환경과 독립 장애 영역은 별도 state로 분리합니다.
- production apply에는 승인, 직렬화와 감사 로그를 적용합니다.
- fork 또는 신뢰하지 않는 PR 코드에 privileged credential을 제공하지 않습니다.
- CI action, provider, module, chart와 image 버전을 검토 가능한 방식으로 고정합니다.
## 노출 사고 대응
1. 노출된 credential과 파생 token을 폐기하고 회전합니다.
2. 영향받은 시스템의 접근 로그와 변경 이력을 확인합니다.
3. 저장소 history와 artifact/cache에서 민감 데이터를 제거합니다.
4. 원인과 영향 범위, 재발 방지 조치를 incident 문서에 기록합니다.
5. 조직의 보안 연락 채널로 보고합니다.
이 템플릿을 실제 조직에서 사용하기 전에 비공개 보안 연락처와 대응 SLA를 이
문서에 추가해야 합니다.