# 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를 이 문서에 추가해야 합니다.