私は普段Windows 10からコマンドラインのGitでGitHubにアクセスしているが、たまにラズパイまわりの開発をする際にOracle VirtualBox上に作成したラズパイOSの仮想環境からGitHubにアクセスしたい場合がある。久々にこれをやってみたらパスワード認証は去年8月以降できなくなったからアクセストークンを使えというエラーが出た。今回は主に自分用のメモとして事象の解決策を残しておくが、一応読者を想定して適宜解説も織り交ぜようと思う。
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information. fatal: Authentication failed for 'https://github.com/thom-jp/health-tracking-pi.git/'
指示どおりアクセストークンを作ってみた結果、push・pullする度にユーザー名とパスワードを聞かれて煩わしい。
もう一つの方法としてSSH接続すればOKということが分かった。
SSHについて
SSH = Secure Shell…リモートアクセスを安全に行うための通信方式(プロトコル)。
暗号化に使う公開鍵と、復号化に使う秘密鍵によって通信の安全や本人確認が担保される。
今回、公開鍵はGitHubにアップロードするが、秘密鍵は自分しか知らない。
閉める鍵と開ける鍵が別というのはよく南京錠に例えられる。
イメージとしてはこんな感じ。
SSHキーペアの作成作業
次のコマンドでSSHキーのペア(秘密鍵・公開鍵)を作成する。
(1) $cd ~/.ssh (2) $ssh-keygen -t rsa (3) Enter file in which to save the key (/Users/(username)/.ssh/id_rsa): (4) Enter passphrase (empty for no passphrase): (5) Enter same passphrase again:
(1) の説明
sshの鍵は基本的に置き場所が決まっている。
ユーザーのホームフォルダにある.sshというフォルダ内に作成するためまずそこに移動するコマンドがこちら。
(2) の説明
sshの鍵ペアを作成している。-tはタイプ指定オプションで、ここではRSAという暗号化方式を指定している。
(3) の説明
(2)の実行結果としてキー名を質問されるので、何も入れずにEnterを押す。
するとデフォルトで()内に掛かれたid_rsaという名称になる。
(4) 、(5) の説明
秘密鍵にパスフレーズを付加できる。
Linuxログイン用ならパスフレーズを付けた方が良いが、今回はGitHubアクセスで、ここでパスフレーズを付けてしまうとpush/pull操作ごとにパスフレーズの確認が入る可能性がある。(試してない)
今回は趣味開発だし、秘密鍵が流出するリスクも低い※のでパスフレーズは付けずにそのままEnter。
パスフレーズとは
ワードじゃなくてフレーズとなっているのは、かなり長い文字列を付けられるから。
複雑な文字を組み合わせた短いパスワードよりも、アルファベットで構成される超長いパスフレーズのほうが強固で覚えやすいというメリットがある。
例えばこんな感じ「koreharaspberrypikaragithubhenoaccessyoupasufure-zudesu.」※これはRaspberry PiからGitHubへのアクセス用パスフレーズですと書いてる。
長くできる為、逆に覚えやすい意味のあるフレーズを登録できる。
リスクの考え方
A) リスク=資産×脅威×脆弱性
今回の場合、
資産…資産価値のあるものは扱っていないため低い
脅威…昨今IoTを狙った攻撃が多いらしいが、外部公開してるサーバーではないため脅威は中程度
脆弱性…アップデートも定期的にしているので低い
よってリスク低と判断。
B) リスク= 発生確率 × 影響
今回の場合、
発生確率…外部公開してるサーバーではなく、アップデートも定期的にしており、秘密鍵をサーバー外に持ち出すことは無い為、流出の発生確率は低い。
影響…万が一発生したとしても資産的ダメージは無く、風評被害に繋がるような情報も保有していないため、影響は低い
よってリスク低と判断。
完成した鍵
名前を指定しなければ、id_rsaとid_rsa.pubという二つのファイルができる。
このうち.pubとついた方がGitHubに登録する公開鍵(Public Key)である。
※Pubとついてない方は秘密鍵なので外部にアップロードしてはいけない。
公開鍵の登録作業
公開鍵はただの文字列なので適当なテキストエディタで開いてコピーすることができる。
私はxclipというクリップボードツールを導入して内容をコピーした。
次にGitHubにWebからログインしてSSH設定ページにアクセスする。
https://github.com/settings/ssh
右上のNewSSH Keyと書かれたボタンをクリックする。
※私の場合は既に登録済なので表示されているが、一応伏せておいた。
Title欄は任意なので端末名や用途等を自分でわかるように記載する。
Key欄にはコピーした公開鍵テキストを貼り付ける。
SSHでのアクセステスト
次のコマンドを実行。
ssh -T git@github.com
初めてSSHで接続する相手の場合は次のように聞かれるのでyesと入力してEnter。
Are you sure you want to continue connecting (yes/no)?
こんな感じで接続成功メッセージが出たらOK。
Hi thom-jp! You've successfully authenticated, but GitHub does not provide shell access.
なお、私は一発成功したので失敗時の対策は説明できない。必要な方がいたらご自身で検索してみると対処方は見つかると思う。
リモートリポジトリへのアクセス手段切り替え作業
前述の設定をしただけではSSHアクセスにならず、引き続きパスワードを聞かれるので、これもちょっとハマりポイントだった。
どうやら最初にGitHubからCloneしてきたときにHTTPSを選択しているとGitクライアントがそれを記憶しているようで、SSHに切り替える必要があった。
目的のリポジトリのCodeボタンからメニューを開き、SSHを選択するとURLが表示される。
そして次のコマンドでリモートリポジトリを切り替える。
git remote set-url origin ここにコピーしたSSH URLを貼り付け
これで全作業完了。
以降は普通にpush/pullできるようになる。
以上