GitHub Appsを使って権限を制限したアクセストークンを作る

2020/09/13 15:57:592020/09/16 16:32:07


GitHubではPersonal Access Tokenといって、発行したユーザーの使える機能がほぼ全て行使できるアクセストークンを作ることができますが、許可内容を機能単位でしか制限できないので、単純にリポジトリのreadをつけただけでも自分がアクセスできるプライベートリポジトリほぼ全てへのアクセスを与えることになります。これは非常に危険で、漏洩した場合のことなど考えると軽々しく使えるものではありません。
しかしGitHub Appsなら、限定したリポジトリのreadのみを持たせたアクセストークンなどを作成することができます。
以下にその手順を紹介します。node12以上でnpxが使える環境が望ましいです。
またCot Editorで無題を開いておくと良いです。

アプリを作る
GitHub Appsの案内に従いApps一覧まで行き、新規作成ページへ行きます。
  • ホームページURLは適当にhttps://user.github.io(私ならhttps://ci7lus.github.io)などにします。
  • Webhookなどの不要な機能はチェックを外します。
  • 権限設定では、ContentsRead-onlyのアクセスをつけるとリポジトリを読み取れるようになります。トークンに必要な機能を有効化してください。
  • 後から変更できます
  • 一番下のインストール先はOnly on this accountのまま、アプリを作成します。
作成後はプライベートキー発行をバナーで推奨されているので、そのまま発行します。
  • 手元に.pemで終わるファイルが落ちてきますが、あとから必要になるので場所を把握しておいてください。
この時About下のApp IDとされる数字をメモっておきます。
  • 後からでも普通に確認できます
リポジトリを選択する
次にユーザーに対して先ほど作ったアプリをインストールします。アプリ管理画面の左サイドバーのInstall Appから認証画面へ進みます。
Repository Accessを選択できるので、All RepositoriesではなくOnly select repositoriesを選び、必要なリポジトリを選択します。
  • ここに何も出ていない場合はアプリの権限にContentsのRead-onlyが不足している可能性があるので、アプリの設定画面に戻って選択し直してください。
アプリのインストールが完了するとhttps://github.com/settings/installations/000000000のようなページに移動しているので、000000000をこれまたメモっておきます。
  • これも後から確認できます

アクセストークンをつくる
npxが使用できるコンソールで以下のコマンドを実行してください。
shell.sh
$ npx obtain-github-app-installation-access-token -a <アプリを作るでメモったApp Id> -i <リポジトリを選択するでメモった数字> -k <アプリを作るで落ちてきたpemファイルへのパス> 
v1.XXXXXXXXXXXXXXXXXXXXXXXX
アクセストークンが出てきました。これで許可したリポジトリへアクセスできるかチェックしてみましょう。
shell2.sh
$ curl -H "Authorization: token v1.XXXXXXXXXXXXXXXXXXXXXXXX" https://api.github.com/repos/ユーザーID/許可したリポジトリ/branches 
{ 
     "name": "master", 
     "commit": { 
       "sha": "XXXXXXXXXXXX", 
       "url": "https://api.github.com/repos/username/repo/commits/aaaaaa" 
     }, 
     "protected": false 
   } 
 ]
認証できていそうだったら終わりです。できてなかったら…よくわかりません

アクセストークンを無効化する
Personal Access Tokenはトークンの管理画面から無効化できますが、当然このアクセストークンも無効化できます。
アプリの設定画面のPrivate keysで必要であれば新しい秘密鍵を発行した後、無効化したいトークンの作成に使ったキーをDeleteで削除するだけです。同時にそのキーで発行したトークンは全て無効化されます。
発行先に合わせて秘密鍵を使い分けると無効化時の手間が減りそうですが、Personal Access Tokenと違って秘密鍵には名前をつけられないので、いざ無効化したいときにどれがどれだかわからなくなりそうです。


著者の画像

ci7lus

@ci7lus

Caramelize - Made withCaramelizeand / Privacy