0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初めてのssh

Last updated at Posted at 2021-12-15

#初めてsshを使ってGitHubにアクセスしました。

会社でGitLabの方を使っていて、git cloneする時はいつもhttpでアクセスしてました。

プライベートでGitHubも使うようになって、MacBook Air 2台持ちで家に設置用で1台、外に持ち出し用に1台で両方からgit pull / git pushしてソースコード管理してましたが、毎回 Invalid username or passwordと怒られ、その都度GitHubのdeveloper settingsからPAT (Private Access Token)を再生成して使用してました。

毎回それは面倒なのでググったらsshを使うのが多数派っぽかったので、これを機にsshを使ってみようと思った次第です。

ちなみにPATとsshとどっちがいいの?と思ってググったら以下のstack overflowの記事を見つけました(大体自分が持った疑問て他の人も持ってるんですよね)。
Which is better for GitHub authentication : SSH Key or tokens?
ざっくり言うと、アクセス制御を細かくできる分(リポジトリ内でのアクセス制御やGitHubアクションのアップデート等)PATの方が推奨だそうです。

なお、httpごしのusername, passwordによるアクセスは2021年8月に廃止されたとのこと。

本題の前に、GitHubにおけるsshについての私のざっくり(& 勝手な)理解ですが、sshで生成した公開鍵をgitに保存して、秘密鍵を自分のローカルに置いて(通常 ~/.ssh に保管される)、gitから送られる暗号化されたデータ(by公開鍵)を秘密鍵によって復元できたら、そこからはsshが安全な通信を行ってくれる、です。合ってますかね?

<追記>
ssh-agentがクライアント側にいて、一度サインインしたらssh-agentがソケットオープンして通信が行われるらしい。参考↓
How to set up SSSH and Clone Repository using SSH in Git?

では、本題のsshを使ったGitHubへのアクセスです。
以下のQiitaページを参考にさせて頂きました。

まずはsshキー生成の一例。

$ ssh-keygen -t ed25519.     ← -tオプション(typeのtだろね?)は生成するキー種類指定。ed25519はEdwards曲線デジタル署名アルゴリズム。
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/username/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):     ← passphraseはprivate keyを暗号化するもので、入力すると毎回アクセス時に聞かれるらしい (※1)
Enter same passphrase again: 
Your identification has been saved in /Users/username/.ssh/id_ed25519.
Your public key has been saved in /Users/username/.ssh/id_ed25519.pub.
The key fingerprint is:     ← 公開鍵のハッシュ値。sshサーバーからクライアントに送られサーバーの成りすましの確認に使用される。クライアント側のknown_hostsに登録される。
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx unsername@MacBook-Air.local
The key's randomart image is:'     ← randomartはハッシュ値をビジュアル化したもの。違いを視認しやすいために。
+--[ED25519 256]--+
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
|  xxxxxxxxxxx    |
+----[SHA256]-----+

生成された公開鍵の確認。

$ cat .ssh/id_ed25519.pub 
ssh-ed25519 (ランダムな文字列) username@hostname.    ← デフォルトでは末尾にコメントとしてユーザ名@ホストコンピュータ名が付与される    

<追記>
サーバーはhost keyを持っていて、clientがサーバーに初めて接続すると /.ssh/known_hosts にhost keyが追加される。クライアント側はそれによって同じサーバーにアクセスしているのかどうかわかる仕組み。

続きまして生成したssh公開鍵をGitHubに登録。

GitHubの settings > SSH and GPG keys > New SSH key と行って必要情報(TitleとKey)を入力する。
Titleは文字通り鍵のタイトルとなる文字列です。空欄でもOKですが、空欄にすると上記で生成された公開鍵を丸コピしてKeyに入力した場合、username@hostnameがタイトルになります。username@hostnameを削除してKeyに入力した場合は鍵の先頭から一定の文字列がTitleとなりました。

最後にssh接続してみる。

まずGitHubの以下のページを参考に。正しく設定できてると以下のようにメッセージが表示されます。
SSH接続をテストする

$ssh -T git@github.com     ← -Tオプション(TerminalのTかな?)は Disable pseudo-terminal allocation.
Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.'

$ git clone git@github.com:your-git-username/Your-repository.git
Cloning into 'Your-repository'...
Warning: Permanently added the ECDSA host key for IP address '13.114.40.48' to the list of known hosts.     ← 13.114.40.48調べたらamazonawsのサーバーだった。ECDSAとは?
remote: Enumerating objects: 105, done.
remote: Total 105 (delta 0), reused 0 (delta 0), pack-reused 105
Receiving objects: 100% (105/105), 2.52 MiB | 247.00 KiB/s, done.
Resolving deltas: 100% (32/32), done.

(ご参考) ECDSAはElliptic Curve Digital Signature Algorithm。楕円曲線DSA(デジタル署名アルゴリズム)のこと。

以上です。


<その他予備知識>

RSAとは?
Rivest–Shamir–Adlemanのお三方の頭文字で、rsaアルゴリズムを発明した人たち (RSA (cryptosystem)

ssh シンタックス
ssh username@server.address
もしusername省略したらログインしているアカウントのusernameが使われる。

<その他参考にしたサイト>

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?