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を有効にする
という対応となります. 今回は「パーソナルアクセストークンによる認証を導入」します.
トークンの作成
- 任意のページの右上で, プロフィール画像をクリックし,
Settings
をクリック - 左サイドバーで
Developer settings
をクリック - 左のサイドバーで
Personal access tokens
をクリック Generate new token
をクリック- トークンを使用目的に則して設定する, その後
Generate token
をクリック - トークンをクリップボードにコピー
トークン使用のテスト
トークンを入手したなら, 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を保存するのはセキュリティ観点から望ましくない
対応方針
github.com
へのアクセス情報を保存した.netrc
ファイルを作成.netrc
ファイルをGPG keyで暗号化し,.netrc.gpg
ファイルを作成(.netrc
ファイルはこの時削除)git-credential-netrc
機能を実行可能にする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
- Token authentication requirements for Git operations
- How to update remote origin to use access token instead of SSH key?
(注意:GitHub Accountが必要となります)