Skip to content

Actions 참조 SHA 고정 · secret scanning · push protection 적용 #847

Closed

Description

@1hyok

이 이슈는 실제로 끝난 범위만 남기고 닫혔다. 원래 본문은 워크플로 고정과 저장소 설정 정책을 한 이슈에 묶고 있었는데, 앞쪽만 끝나고 뒤쪽이 남은 채 이슈가 열려 있어 «아무것도 안 됐다» 로 읽혔다. 남은 저장소 설정 범위는 #1538 로 옮겼다.

끝난 범위

1. 외부 Actions 참조를 전부 commit SHA 로 고정

2. @master 액션 제거

ScaCap/action-ktlint@master·dvdandroid/action-android-lint@master 를 걷었다. 지금 lint 는 Gradle 태스크를 직접 부른다.

3. reusable workflow · composite action 인벤토리 검사

composite action 4종(setup-ci-config·setup-ci-release-signing·setup-release-config·cleanup-release-config)까지 포함해 훑었고, 이들 안의 uses 도 SHA 다.

4. secret scanning · push protection 활성화

실측 (gh api repos/Afternote/Afternote-FE):

{"secret_scanning":{"status":"enabled"},"secret_scanning_push_protection":{"status":"enabled"}}

5. secret triage · 회전

secret-scanning/alerts 조회 결과 0건. 회전 대상이 없다.

6. Dependabot 이 pinned SHA 의 새 release 를 추적하되 자동 merge 하지 않는다

dependabot.yml 의 github-actions 생태계가 주 1회 그룹 범프를 낸다. 자동 머지 워크플로는 없다 — 실적 #1355(setup-java 5.7.0 → 6.0.0), 사람이 승인하고 머지 큐를 태웠다.

넘긴 범위 → #1538

저장소 설정 쪽은 아직 그대로다 — allowed_actions: "all", sha_pinning_required: false. 워크플로는 이미 전부 호환이지만 설정이 그것을 강제하지 않아, 지금도 누가 @main 참조를 넣으면 그대로 통과한다. 허용 정책 제한과 unpinned 차단 fixture 확인까지 #1538 이 이어받는다.

Activity

  1. self-assigned this
    on Aug 21, 2026
  2. reopened this on Aug 27, 2026
  3. 1hyok commented on Aug 27, 2026

    @1hyok
    CollaboratorAuthor

    2026-08-27 후속 확인

    • develop의 외부 Action 참조는 모두 40자리 SHA로 고정돼 있다.
    • main에는 12개 워크플로에 미고정 참조 30개가 남아 있어, 저장소 sha_pinning_required를 켜면 main push 기반 Firebase 릴리스가 차단된다.
    • Secret Scanning, Push Protection, Private Vulnerability Reporting은 FE 저장소에서 활성화했다.
    • SHA 강제는 호환성 확인 중 잠시 켰다가 즉시 원복했으며 현재 false다.

    main 전용 후속 PR에서 워크플로 로직과 Action major는 유지한 채 참조만 immutable SHA로 고정한다. 이슈는 해당 PR 머지 후 sha_pinning_required=true 재조회까지 열어 둔다.

  4. changed the title [-]security(ci): Actions SHA 고정·허용 정책·secret scanning·push protection 적용[/-] [+]Actions SHA 고정·허용 정책·secret scanning·push protection 적용[/+] on Aug 28, 2026
  5. added
    security보안 취약점·권한·자격·공급망 대응
    area:platformCI·빌드·릴리스·저장소 운영 영역
    and removed
    enhancementNew feature or request
    on Aug 28, 2026
  6. 1hyok commented on Aug 29, 2026

    @1hyok
    CollaboratorAuthor

    이 이슈의 남은 범위

    이 이슈를 열어 둔 채로 4·5번만 남긴다 — 별도 이슈로 쪼개지 않는다. 코드 몫이 없고 남은 것이 이 이슈 범위표의 두 줄 그대로라, 여기가 추적 자리다. 켜는 판단과 실행은 저장소 admin 몫이다.

  7. 1hyok commented on Aug 29, 2026

    @1hyok
    CollaboratorAuthor

    2026-08-30 실측 — 범위 7항목 중 5항목이 이미 충족돼 있습니다. 남은 것은 저장소 설정 2건뿐입니다.

    항목 상태 근거
    1. 외부 uses 40자리 SHA 고정 ✅ .github/workflows/·.github/actions/ 전수 스캔에서 SHA 아닌 uses: 는 전부 로컬 참조(./.github/…)뿐 — 고정 대상인 외부 action 중 floating tag/branch 0건
    2. @master action 교체 ✅ ScaCap/action-ktlint@master·dvdandroid/action-android-lint@master 모두 남아 있지 않음
    3. reusable workflow·composite action 포함 전수 검사 ✅ 위 스캔이 .github/actions/ 까지 포함
    4. SHA pinning required 활성화 ❌ 미확인/미적용
    5. allowed actions 정책 제한 ❌ allowed_actions: "all" — selected-actions 조회가 409 (All actions and workflows are allowed)
    6. secret scanning · push protection ✅ secret_scanning: enabled, secret_scanning_push_protection: enabled
    7. 유효 secret 회전 — 6번이 이미 켜져 있어 신규 발견 시 처리하는 상시 항목

    대부분은 #1333(Actions hardening)이 끌고 온 것으로 보입니다.

    남은 4·5번은 코드가 아니라 저장소 설정 변경이라 여기서 손대지 않았습니다. 특히 5번은 허용 목록에서 action 하나가 빠지면 그 순간 저장소 전체 CI 가 멈춥니다 — 적용 전에 현행 uses 인벤토리를 그대로 허용 목록으로 옮기고, Copilot dynamic workflow 처럼 목록에 안 잡히는 경로가 있는지 확인하는 절차가 필요합니다. 완료 조건도 「기존 automation 이 깨지지 않는다」를 요구하고 있어, 되돌리기 쉬운 시점에 사람이 지켜보며 켜는 편이 맞다고 판단했습니다.

  8. 1hyok commented on Aug 29, 2026

    @1hyok
    CollaboratorAuthor

    실측 갱신 (2026-08-30, origin/develop)

    범위 7개 중 넷이 이미 끝나 있다. 남은 것은 레포 설정 토글 둘뿐이라, 이 이슈에 남은 일이 코드 작업이 아니라는 점을 기록해 둔다.

    끝난 것

    범위 상태 근거
    1. third-party uses SHA 고정 ✅ .github/workflows + .github/actions 의 uses: 22종 중 8종이 로컬 액션(./…), 나머지 14종 전부 40자리 SHA. floating tag·branch 0개
    2. @master 액션 교체 ✅ 현황에 적힌 ScaCap/action-ktlint@master·dvdandroid/action-android-lint@master 가 develop 에 없다
    3. reusable workflow·composite action 검사 ✅ 위 집계가 .github/actions/* 의 composite 까지 포함한 전수다
    6. secret scanning · push protection ✅ repos/… 실조회 — secret_scanning: enabled, secret_scanning_push_protection: enabled

    1·2·3 은 PR #1349(ci/1333-actions-hardening)가 가져간 것으로 보인다.

    남은 것 — 레포 설정 두 개

    actions/permissions → { "allowed_actions": "all", "sha_pinning_required": false }
    
    범위 남은 일
    4. SHA pinning required 활성화 전 워크플로가 이미 호환되므로(위 1) 토글만 남았다
    5. allow policy 제한 allowed_actions 가 아직 all. selected 로 좁히려면 허용 목록을 함께 정해야 한다

    둘 다 레포 관리자 권한이 필요한 설정 변경이고 코드 PR 로 닿지 않는다. 7(유효 secret 회전)은 그 다음이다.

    완료 조건의 「unpinned action 과 test secret 패턴이 각각 정책에 의해 차단되는 것을 fixture 로 확인」은 4·5 를 켠 뒤라야 의미가 있다.

  9. changed the title [-]Actions SHA 고정·허용 정책·secret scanning·push protection 적용[/-] [+]Actions 참조 SHA 고정 · secret scanning · push protection 적용[/+] on Aug 29, 2026
  10. 1hyok commented on Aug 29, 2026

    @1hyok
    CollaboratorAuthor

    본문을 끝난 범위만 남기도록 고쳐 닫는다. 워크플로 참조 고정(외부 uses 전량 SHA·floating 0건·composite action 포함)과 secret scanning·push protection 활성화는 실측으로 확인했고, secret scanning alert 는 0건이라 회전 대상이 없다.

    남은 것은 저장소 설정 쪽 하나다 — allowed_actions: "all" · sha_pinning_required: false. #1538 이 이어받는다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:platformCI·빌드·릴리스·저장소 운영 영역security보안 취약점·권한·자격·공급망 대응

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions