GitHub で意図せぬ Public Repository 化をお手軽に検知・防止する
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 です。
というわけで、これをインストールしましょう。
導入手順
- Prevent Public Repos を対象の Organization にインストールする
- 対象の Organization 内に
org-settings
という Repository を作成する(Private Repository としての作成で構いません) -
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']
- 検知できるかテストしてみる
ためしに Public Repository を作成すると上記のような Issue が作成されましたでしょうか。メンションも飛ばしてくれるので安心です。
ちなみに 2-3 番の手順の設定ファイルの作成については、デフォルト設定のままでよければ不要です。
各オプションの挙動について
基本的にはここの How it works
に書いてあるとおりなのでそこを読んでもらえれば一通りわかると思うのですが、 monitorOnly
と enablePrivateToPublic
の関係性だけ軽く説明しておきます。
- monitorOnly
- true
- 設定後に作成した Repository が Public の場合は対象 Repository に
monitorIssueTitle
,monitorIssueBody
の内容でIssue が自動作成されるのみ -
enablePrivateToPublic
が true の場合、設定から Public Repository に変更したとしても、同様の挙動
- 設定後に作成した Repository が Public の場合は対象 Repository に
- false
- 設定後に作成した Public Repository は強制的に Private Repository に変更され、対象 Repository に
privatizedIssueTitle
,privatizedIssueBody
の内容で Issue が作成される -
enablePrivateToPublic
が true の場合、設定から Public Repository に変更したとしても、同様の挙動
- 設定後に作成した Public Repository は強制的に Private Repository に変更され、対象 Repository に
- true
終わりに
基本的には発生しないものだとは思いますが、万が一のときに備えた保険と思って設定しておくのはありかなと思います。
設定自体は 10 分かそこらで終わると思うので、GitHub Organization の管理者の方は知っておくと幸せになるかもしれません。
この記事は GitHub 連携で書いています。加筆修正など修正 PR を受け付けています!
Discussion
こちらのAppは動かなくなっている模様です。
手元の新規repositoryで設定して見ましたが動きませんでした。