Set Up Personal Access Token for GitHub

Githubパスワード認証廃止への対応

公開日: 2021-04-25
更新日: 2023-11-15

  Table of Contents

Overview

今回のSolutionの想定OSは以下,

  • Ubuntu 20.04 LTS Focal Fossa
  • Ubuntu 22.04.2 LTS Jammy Jellyfish

Pain

Githubから以下のメールが来たのでその対処をしたい:

1
2
3
4
5
6
7
8
9
10
Hi @Hoo,

You recently used a password to access the repository at HooHoo.

Basic authentication using a password to Git is deprecated and will soon no longer work. 
Visit https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ 
for more information around suggested workarounds and removal dates.

Thanks,
The GitHub Team

対応がなぜ必要かというと, Token authentication requirements for Git operationsをみると

1
2
Beginning August 13, 2021, we will no longer accept account passwords when 
authenticating Git operations on GitHub.com

これにより, コマンドラインでのGit操作, Gitを使用するデスクトップアプリケーション, GitHub.comのGitリポジトリに直接アクセスするアプリやサービスでは, パスワードを用いてリポジトリへアクセスすることができなくなる恐れがあります.

Background

GitHubでは, 従来よりパスワード認証に代わってトークンベースの認証を使用することを推奨していました. 2020年11月にはすでにREST API利用時のパスワード認証を廃止しており, 今回の発表はその適用範囲を大きく広げた形となります.

トークンベースの認証を推奨する理由として, セキュリティ上の利点が挙げられます:

Unique トークンはGitHubにUniqueで, 使用ごとやデバイスごとに生成することができます
Revocable 対象外の認証情報を更新することなく, いつでも個別にトークンを取り消すことができます
Limited トークンの範囲を狭めて, ユースケースに必要なアクセスのみを許可することができます
Random トークンは, 定期的に覚えたり入力したりする必要のある単純なパスワードのように, 辞書やブルートフォース(総当たり攻撃)の対象にはなりません

難しく考えずに, 個人アクセストークンは, GitHub API またはコマンドラインを使用するときに GitHub への認証でパスワードの代わりに使用できる程度の知識で普段は十分です.

だれが影響を受けるのか?

基本的には, Gitの操作にパスワード認証を利用している開発者は影響を受けますが, 以下のいずれかに該当するアカウントは影響を受けません:

  • 既にトークンベースの認証を導入している場合
  • SSHベースの認証を行っている場合
  • 2要素認証を使用したGitHubアカウント

Solution: PATの発行

2021年8月13日までに,

  • HTTPSまたはSSHキーを使用したパーソナルアクセストークンによる認証を導入
  • インテグレーターの場合, WebまたはOAuthデバイス認証フローを使用してアプリに認証を付与
  • two-factor authenticationを有効にする

という対応となります. 今回は「パーソナルアクセストークンによる認証を導入」します.

トークンの作成

  1. 任意のページの右上で, プロフィール画像をクリックし, Settingsをクリック
  2. 左サイドバーで Developer settings をクリック
  3. 左のサイドバーでPersonal access tokensをクリック
  4. Generate new token をクリック
  5. トークンを使用目的に則して設定する, その後 Generate token をクリック
  6. トークンをクリップボードにコピー

トークン使用のテスト

トークンを入手したなら, HTTPS経由でGitの操作をする際にパスワードの代わりにそのトークンを入力することができます.

1
2
3
% git clone https://hostname/username/repo.git
Username: your_username
Password: your_token

以下のコマンドでテストします

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% cd ~/Desktop
% mkdir test
% cd ./test
% git init
% git config core.sparsecheckout true
% git remote add origin https://github.com/RyoNakagami/sample_size.git
% echo sample_size_calculation > .git/info/sparse-checkout\n
% git pull origin master
Username for 'https://github.com': RyoNakagami
Password for 'https://RyoNakagami@github.com': 
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), 2.45 KiB | 502.00 KiB/s, done.
From https://github.com/RyoNakagami/sample_size
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master

動作確認終了後テストフォルダを削除しときます

1
2
% cd -
% rm -rf ./test

REMARKS

  • セキュリティ上の理由から, GitHub は過去 1 年間使用されていない個人アクセストークンを自動的に削除します.

GPG encrypted.netrc.gpgを用いたリモートレポジトリアクセス設定

問題設定

  • コマンドラインで, HTTPS URL を使用してリモートリポジトリに git clone, git fetch, git pull または git push を行った場合, GitHub のユーザ名とパスワードの入力を求められる.
  • Gitがパスワードを求めてきたときは, 個人アクセストークン(PAT)の入力で十分ですが, 毎回入力するのは面倒(特にGitHub 2FA accessをEnabledしている場合は, PAT入力でないとだめ)
  • どこかに平文でPATを保存するのはセキュリティ観点から望ましくない

対応方針

  1. github.comへのアクセス情報を保存した.netrcファイルを作成
  2. .netrcファイルをGPG keyで暗号化し, .netrc.gpgファイルを作成(.netrcファイルはこの時削除)
  3. git-credential-netrc機能を実行可能にする
  4. git config設定

対応作業

STEP 1: .netrcファイルの作成

.netrcファイルは, 元々はftpのためのユーザー設定ファイルで, 自動ログインプロセスで使われる ログイン情報と初期化情報を記載します.

1
2
3
4
5
6
7
8
9
machine github.com
  login <username>
  password <token>
  protocol https

machine gitlab.com
  login <username>
  password <token>
  protocol https

STEP 2: GPG暗号化 & .netrc.gpgの生成

こちらの作業はすでにGPGキーが発行されている前提です.

GPGキーの発行はこちら を参照してください

1
2
3
% gpg -e -r email@example.com ~/.netrc #~/.netrc.gpgが生成される
% shred ~/.netrc
% rm ~/.netrc

これで.netrc.gpgが生成されます.

なお, 暗号化したファイルを復号化したい場合は,

1
2
% gpg ~/.netrc.gpg
% cat ~/.netrc

で確認することができます.

STEP 3: netrc credential helperの設定

git contribには, git-credential-netrc.perlというファイルの中に netrcファイルを参照する機能が実装されています.

これをlocalへcopyして, PATHを通しに行きます.

1
2
3
4
% git clone https://github.com/git/git <git-contribu-path>
% touch ~/.local/bin/git-credential-netrc
% cp <git-contribu-path>/contrib/netrc/git-credential-netrc.perl ~/.local/bin/git-credential-netrc
% sudo chmod +x ~/.local/bin/git-credential-netrc

なお, ~/.local/bin/にPATHが通っていない時は以下のコマンドでPATHを通してください.

1
% export PATH="$HOME/.local/bin:$PATH"

STEP 4: git configの設定

1
2
% git config --global credential.helper "netrc -v"
% cat ~/.gitconfig #設定確認
-d, --debug turn on debugging (developer info), Onにする必要はない
-v, --verbose be more verbose (show files and information found)

References

関連記事

公式ドキュメント

Others



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)