Files
2026-08-28 17:24:26 +09:00

2.2 KiB

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. 조직의 보안 연락 채널로 보고합니다.

보안 이슈는 공개 issue 대신 canonical Gitea 저장소의 비공개 보안 채널로 보고합니다. 대응 우선순위와 SLA는 운영 환경 도입 전에 별도로 승인합니다.