Security Policy

이 문서는 source repo가 사내 표준으로 가져야 할 최소 supply-chain 보안 기준을 설명합니다.

1. GitHub Actions

workflow의 기본 권한은 read-only로 둡니다.

permissions:
  contents: read

write 권한이 필요한 job만 job-level permissions로 올립니다. Container publish job은 GHCR push와 provenance attestation 때문에 packages: write, id-token: write를 사용합니다.

Release publish job은 protected environment를 사용합니다. Main merge에서 자동으로 push되는 dev image job은 container-release approval을 거치지 않습니다. Dev image는 최신 integration artifact이고, release image는 승인된 배포 artifact입니다.

Environment Purpose
nexus-release npm, Python, Rust package publish approval
container-release GHCR release image publish approval

사내 production repo에서는 release environment에 required reviewers를 설정합니다.

GHCR dev image retention workflow는 오래된 dev image version을 삭제하기 위해 packages: write 권한을 사용합니다. 이 권한은 release publish approval과 다른 목적입니다. Retention workflow는 release tag, latest, dev tag를 보존하고 오래된 non-release version만 삭제해야 합니다.

2. Action Pinning

샘플에서는 읽기 쉬운 actions/checkout@v4 같은 major tag를 사용합니다. production repo에서는 아래 중 하나를 조직 정책으로 선택합니다.

  • strict: third-party actions를 full-length commit SHA로 pinning
  • managed: verified publisher action tag를 허용하고 Dependabot으로 업데이트

어느 쪽을 택하든 .github/dependabot.yml로 GitHub Actions 업데이트를 추적합니다.

3. Secrets

secret은 workflow 파일에 직접 쓰지 않습니다. Nexus credential은 GitHub Actions variables와 secrets로 분리합니다.

Type Examples
Variable repository URL, username, private module pattern
Secret password or credential passcode

이 샘플은 Nexus CI 계정 하나를 기준으로 NEXUS_PASSWORD secret만 둡니다. npm basic auth와 Cargo publish token은 CI에서 NEXUS_USERNAME/NEXUS_PASSWORD로 생성합니다.

secret을 command line argument로 길게 넘기는 것보다 tool-specific environment variable을 사용합니다. Docker build에서 dependency download credential이 필요하면 BuildKit secret을 사용하고 image layer에 .npmrc, token, password를 남기지 않습니다.

4. Dependency And Image Security

package CI는 lockfile 기반 install을 사용합니다.

  • pnpm: pnpm-lock.yaml, pnpm install --frozen-lockfile
  • uv: uv.lock, uv sync --managed-python --locked
  • Cargo: Cargo.lock, cargo test --locked
  • Go: go.mod, go.work, go test

container publish는 SBOM/provenance attestation을 생성합니다. 실제 product repo에서는 image vulnerability scan과 license policy check를 release gate에 추가합니다.

5. Ownership

workflow와 release/security 문서는 CODEOWNERS로 review owner를 지정합니다. sample owner는 @tirosh-chain/platform으로 두며, 실제 repo에서는 사내 GitHub team 이름으로 바꿉니다.