🐙

GitHub で意図せぬ Public Repository 化をお手軽に検知・防止する

2020/09/26に公開1

GitHub における Private Repository

新規作成の場合

GitHub でリポジトリを作成する場合、このように Public か Private かを選ぶことができます。

途中で変更する場合

また、Private から Public に変更する場合はリポジトリ設定画面の Danger Zone 内 Change repository visibility で設定変更が可能です。

意図せぬ Public Repository 化のリスク

後者の場合は GitHub 側が何重にも予防線を張ってくれているため、余程のうっかりミスをしない限りは誤操作で Public Repository にしてしまうことはないかと思います。

しかし、誤って Public Repository を作成してしまった場合はなかなか気付くことができません。UI 上の差異はリポジトリ名の横にあるアイコンのみのため、ここに意識を向けていない限り、検知は難しいように思います。

これに気付かぬまま commit & push し続けてしまうようなことがあると、重大なセキュリティインシデントに繋がりかねません。

これを GitHub 上の設定で制限できるのか調べてみたところ Member 権限であれば Private Repository を作成できないようにする制限をかけることはできるようなのですが、逆はできないようでした。
(以下の画像のように Public の部分はデフォルトでチェックが入っており、これを disabled にはできません。)

お手軽に検知・防止する方法

今回はこういったことを検知したり防いだりする仕組みを非常に低コストで作成する方法をご紹介します。

Prevent Public Repos

このユースケースにバッチリハマる Prevent Public Repos という GitHub Apps があります。
説明文にも Prevent Repos from being made public in an organization とあり、本当にこのためにあるような App です。

というわけで、これをインストールしましょう。

導入手順

  1. Prevent Public Repos を対象の Organization にインストールする


  2. 対象の Organization 内に org-settings という Repository を作成する(Private Repository としての作成で構いません)
  3. org-settings 内に .github/prevent-public-repos.yml というファイルを作成
    # Configuration for Prevent-Public-Repos
    
    # Turn on Monitor Mode. In this mode the repo visibility is not modified and only an Issue is created
    monitorOnly: true
    
    # Enables detection of repos that change visibility from private to public (not just newly created ones)
    enablePrivateToPublic: true
    
    # Issue Title when repo is privatized
    privatizedIssueTitle: '[CRITICAL] Public Repositories are Disabled for this Org'
    
    # Issue Body when repo is privatized
    privatizedIssueBody: 'NOTE: Public Repos are disabled for this organization! Repository was automatically converted to a Private Repo. Please contact an admin to override.'
    
    # Issue Title when monitor mode is enabled
    monitorIssueTitle: '[CRITICAL] Public Repository Created'
    
    # Issue Body when monitor mode is enable
    monitorIssueBody: 'Please note that this repository is publicly visible to the internet!'
    
    # Users/Groups that should be cc'ed on the issue. Should be users/groups separated by a space.
    # ccList: '@user123 @user456'
    
    # Repos to  exclude in detection. Should be a List of Strings.
    # excludeRepos: ['repo1', 'repo2']
    
  4. 検知できるかテストしてみる

    ためしに Public Repository を作成すると上記のような Issue が作成されましたでしょうか。メンションも飛ばしてくれるので安心です。

ちなみに 2-3 番の手順の設定ファイルの作成については、デフォルト設定のままでよければ不要です。

各オプションの挙動について

基本的にはここHow it works に書いてあるとおりなのでそこを読んでもらえれば一通りわかると思うのですが、 monitorOnlyenablePrivateToPublic の関係性だけ軽く説明しておきます。

  • monitorOnly
    • true
      • 設定後に作成した Repository が Public の場合は対象 Repository に monitorIssueTitle, monitorIssueBody の内容でIssue が自動作成されるのみ
      • enablePrivateToPublic が true の場合、設定から Public Repository に変更したとしても、同様の挙動
    • false
      • 設定後に作成した Public Repository は強制的に Private Repository に変更され、対象 Repository に privatizedIssueTitle, privatizedIssueBody の内容で Issue が作成される
      • enablePrivateToPublic が true の場合、設定から Public Repository に変更したとしても、同様の挙動

終わりに

基本的には発生しないものだとは思いますが、万が一のときに備えた保険と思って設定しておくのはありかなと思います。
設定自体は 10 分かそこらで終わると思うので、GitHub Organization の管理者の方は知っておくと幸せになるかもしれません。


この記事は GitHub 連携で書いています。加筆修正など修正 PR を受け付けています!
https://github.com/serima/zenn-content

Discussion