AI에게 코드를 작성하게 하여 GitHub에 공개하는 것은 매우 쉬워졌지만, 보안 설정은 뒤로 미루기 쉽습니다.
이 글에서는 15가지의 공개 리포지토리에 무료로 적용할 수 있는 보호 설정을 단계별로 소개합니다. AI가 main 브랜치에 직접 푸시하는 운영 환경에서도 문제가 없도록 구성했습니다.
다루는 예시는 shoyo-maya-bot의 리포지토리 그룹입니다.
| 보호 기능 | 방어 대상 | 설정 주체 |
|---|
| 규칙셋 (Rulesets) | main 삭제 및 히스토리 조작 | 사람 (설정 화면) |
| ... | SECURITY.md | 보고 방법이 불분명할 때 |
CODEOWNERS | 누가 리뷰할지 결정되지 않았을 때 | AI로도 작성 가능 |
| CodeQL | 코드의 취약점 | AI로도 작성 가능 |
| Actions SHA 고정 | 사용 중인 Action이 교체되는 것 | AI로도 작성 가능 |
| ... | | |
위 세 가지는 리포지토리 설정을 변경하는 작업입니다. 이는 AI 세션만으로는 변경하기 어려워 보통 사람이 직접 수행합니다. 아래 여섯 가지는 파일을 배치만 하면 되므로, AI에게 맡길 수 있습니다.
GitHub의 규칙셋은 JSON 형식으로 작성하고 불러올 수 있어, 리포지토리가 많은 경우에 편리합니다.
{
"name": "protect-default-branch",
"target": "branch",
...
}
불러오는 절차는 다음과 같습니다.
- 리포지토리의 Settings → Rules → Rulesets -
New ruleset 아래 ▼ → Import a ruleset → JSON 선택 - Enforcement status가 Active인지 확인 후 Create를 누릅니다.
'PR 필수', 'CI 통과 필수', '리뷰 필수'는 처음에는 설정하지 않았습니다. 이유는 두 가지입니다.
- AI가
main에 직접 푸시하며 작업하기 때문에, 이를 추가하면 작업이 멈춥니다.
- 계정이 한 명일 경우, 자신의 PR을 스스로 승인할 수 없습니다 (리뷰 필수로 설정하면 아무도 머지(merge) 할 수 없게 됩니다).
팀에서 사용을 시작할 때는 'PR 필수 + CI 통과 필수'를 추가하는 것을 권장합니다.
모든 리포지토리에 일괄적으로 적용할 수 있습니다.
- 오른쪽 상단 아이콘 → Settings → Code security -
'Private vulnerability reporting'의 Enable all을 활성화하고, 'Enable by default for new public repositories'에도 체크합니다.
활성화되면 리포지토리의 Security 탭에 'Report a vulnerability' 버튼이 나타납니다.
Dependabot alerts는 각 리포지토리의 Settings → Advanced Security (또는 Code security)에서 활성화합니다. Dependabot에는 두 가지 기능이 있으니 주의해야 합니다.
| 기능 | 역할 |
|---|
| Dependabot alerts | 의존성(Dependency)에 알려진 취약점이 있을 경우 알림을 제공합니다. |
| Dependabot version updates | 의존성을 새 버전으로 올리는 PR을 생성합니다 (dependabot.yml로 설정). |
dependabot.yml 파일을 배치만 한다고 해서 alerts가 활성화되지는 않습니다.
SECURITY.md 파일이 있으면 Security 탭의 'Security policy'가 활성화됩니다. 작성 내용은 짧아도 괜찮습니다.
# 보안
## 취약점을 발견했다면
공개 Issue에는 적지 말고, GitHub의 **Security** 탭 → **Report a vulnerability**를 통해 알려주세요 (비공개로 전달됩니다).
CODEOWNERS는 .github/CODEOWNERS에 배치합니다. PR이 올라오면 작성자에게 자동으로 리뷰 요청이 들어갑니다.
# 회사 내 배포 시에는 팀 계정으로 변경해야 합니다 (예: @your-org/your-team)
* @your-account
CodeQL은 공개 리포지토리의 경우 무료로 사용할 수 있습니다. build-mode: none으로 설정하면 Java나 Python을 빌드하지 않고도 분석할 수 있습니다. 언어에 actions를 추가하면 워크플로우 파일까지 검사해 줍니다.
name: codeql
on:
push:
...
actions/checkout@v7
이처럼 태그를 지정하는 방식은, 태그가 변경될 경우 다른 내용이 실행됩니다. 커밋 SHA로 고정하고 버전을 주석에 남기는 것이 안전합니다.
SHA는 git ls-remote
으로 확인할 수 있습니다.
git ls-remote https://github.com/actions/checkout 'refs/tags/v7.0.1*'
주석이 달린 태그(annotated tag)의 경우, ^{}
이 붙은 줄의 SHA가 커밋입니다.
88585263c0627ee42c0e1c5143a112c8d6f4aa18 refs/tags/v4.38.2
2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 refs/tags/v4.38.2^{} ← 이쪽을 사용합니다
또한, 체크아웃 시에는 persist-credentials: false
를 추가해야 합니다. 이것을 추가하지 않으면 이후 단계에서 인증 정보를 읽어갈 수 있습니다. push가 필요한 작업(job)에만 예외로 적용하세요.
고정하는 것을 잊지 않도록 하려면, 테스트로 확인하는 것이 확실합니다.
PIN = re.compile(r"uses:\s*([^@\s]+)@([0-9a-f]{40})\s+#\s*v\d")
def test_actions_are_pinned():
for wf in Path(".github/workflows").glob("*.yml"):
...
SHA로 고정하더라도, Dependabot은 새로운 버전의 SHA와 버전 주석을 수정한 PR(Pull Request)을 발행해 줍니다.
쌓이지 않게 관리하는 요령은 두 가지입니다.
- 그룹으로 묶기. Actions 업데이트를 하나의 PR에 모으면 개수가 줄어듭니다. -
- 이관이 필요한 메이저 버전은 제안받지 않기. API가 변경되는 의존성은 수동으로 이관합니다.
version: 2
updates:
- package-ecosystem: github-actions
...
gitleaks는 모든 커밋에서 API 키나 토큰을 탐색합니다. Docker 이미지로 실행하면 설치가 필요 없습니다.
secret-scan:
runs-on: ubuntu-latest
steps:
...
에뮬레이터의 공개 개발용 키와 같은 오탐지는 .gitleaks.toml
에서 이유와 함께 제외할 수 있습니다.
[extend]
useDefault = true
[allowlist]
...
놓치기 쉬운 부분은 커밋에 기록되는 이메일 주소입니다. 개인 이메일 주소로 커밋하면, 공개 리포지토리에서는 누구나 볼 수 있습니다.
GitHub의 Settings → Emails에서 다음 두 가지를 활성화하세요.
Keep my email addresses private(내 이메일 주소를 비공개로 유지)
Block command line pushes that expose my email(이메일을 노출하는 명령줄 푸시 차단)
이미 공개해 버린 부분은 히스토리를 수정하여 강제 push(force push)하는 수밖에 없습니다. 커밋 SHA가 모두 바뀌고, 닫힌 PR에서는 오래된 커밋이 그대로 남아 있을 수도 있으므로, 처음에 설정해 두는 것이 가장 좋습니다.
규칙셋으로 자신도 막는다. 리뷰 필수 설정을 한 사람의 계정으로 넣으면, 아무도 병합(merge)할 수 없게 됩니다. 단계적으로 강화해야 합니다.
dependabot.yml만으로 알림(alerts)까지 활성화되었다고 착각한다. 업데이트 PR과 alerts는 별개의 기능입니다.
태그로 고정했다고 생각한다. @v4
은 'v4 계열의 최신'으로 변경될 수 있습니다. 고정하려면 SHA를 사용하세요.
AI에게 설정 화면 조작까지 의존한다. 설정을 변경하는 작업은 대부분 AI 세션에서는 불가능합니다. 파일로 해결할 것은 AI에게, 설정 화면을 건드리는 것은 사람에게 분리해야 합니다.
- 공개 리포지토리를 지키는 것은 대부분 무료이며, 파일을 배치하는 것만으로 적용 가능합니다.
- 설정 화면 조작(규칙셋・취약점 보고・alerts)은 사람이 해야 합니다.
- Actions는 커밋 SHA로 고정하고, 고정하는 것을 잊지 않도록 테스트로 방지해야 합니다. - 커밋 이메일 주소는 처음에 비공개로 설정해 두어야 합니다.
이 글은 Zenn에도 게시되었습니다.