SSHについて調べてみた

# はじめに

SSHキー作って適当に検索した記事に書いてある通りに作業して何とか出来たけど、よくよく考えたら結局何やってるん？？？と思い至ったので復習を兼ねて備忘録にしました。

# SSHとは

その前に、当たり前のように使ってるSSHという単語、「そもそもコレがよく分からん」となったので調べてみました。
SSHは **`Secure Shell`** の略で、外部サーバーと通信するためのプロトコルです。（完）
つまりは安全に通信出来るんでしょうね、ええ。

# SSH認証とは

先ほどの説明から察するに、外部サーバーと通信する際に安全に認証するための仕組み、ということで間違いないでしょう。（完）


# SSHキーとは

いよいよ本題。SSHキーとは、SSH認証を行うために使用される鍵なのです。
SSHキーには **`秘密鍵`** と **`公開鍵`** の2つが存在します。
そしてこれらは必ずペアで使用されます。
どうやって使われるのか、イメージしやすくするために自宅の玄関を例に説明します。

自宅の玄関には鍵穴がありますよね。
これは自分だけでなく、お隣さんもご近所さんにも見えています。
通りすがりのおじさんや見ず知らずの誰かさんでも見える場所に付いています。
しかし見えているだけでは特に問題はありませんよね。

次にその自宅の玄関を開けるための鍵。
これは限られた人しか持っていないものです。
この鍵がなければ家に入ることは出来ません。
逆に、この鍵を持っていれば誰であろうと自宅に入ることが出来てしまいます。
誤って誰かの手に渡ってしまわないよう、取り扱いには注意しないといけないですね。

はい。
この例に出てきた玄関の鍵穴が **`公開鍵`** で、その玄関を開けるための鍵が **`秘密鍵`** です。
自宅と同じように外部サーバーには鍵が掛かっていて、そこを開けることの出来る人しか通信が出来ないのです。

そのため、**`秘密鍵`** が他人の手に渡ってしまったらこの世の終わりです。
インターネット上に公開など絶対にしてはいけません。
絶対に。

# どうやって使うの？

ではSSHキーが何なのか分かったところで、次は使い方を説明していきます。
**`公開鍵`** と **`秘密鍵`** はセットになっています。
まずはこの **`公開鍵`** を外部サーバーに登録します。
そして **`秘密鍵`** は自分だけが持っておきます。

たったコレだけ。
こうすることで **`秘密鍵`** を持っている人（自分）は、その外部サーバーと通信できるようになります👏

# GitHubで実践

次はいよいよ実践です。
GitHubアカウントが既にある前提で進めます。

最初のうちは何度失敗しても痛くも痒くもないので気楽にトライしてみましょう👍

```
動作環境
OS:    macOS Monterey 12.2.1
shell: zsh
```
## SSHキーを作成する

まずはSSHキーを作ってみましょう！
作り方はとっても簡単。まず腕の良い鍵職人を探して弟子入りを懇願します。
あとは師匠の技術を目で盗み、、、なんてことはしません。

ターミナルで以下のコマンドを実行しましょう。

```text:terminal
% ssh-keygen
```

するとこのようなメッセージが表示されるので、何も入力せずEnterを押します。

```text:terminal
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/UserName/.ssh/id_rsa):   # <- 何も入力せずにEnter
Enter passphrase (empty for no passphrase):                          # <- 何も入力せずにEnter
Enter same passphrase again:                                         # <- 何も入力せずにEnter
Your identification has been saved in /Users/UserName/.ssh/id_rsa
Your public key has been saved in /Users/UserName/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|          x      |
|         x x     |
|        x x x    |
|       x x x x   |
|          x      |
|          x      |
|        xxxxx    |
|         xxx     |
+----[SHA256]-----+
```

ここまで表示されたらSSHキーの作成は終了です。
デフォルトではSSHキーは `~/.ssh` に作成されています。
確認してみましょう。

```text:terminal
% ls -al ~/.ssh

-rw-------   1 UserName  staff  2622  3  1 01:47 id_rsa          # <- 秘密鍵
-rw-r--r--   1 UserName  staff   586  3  1 01:47 id_rsa.pub      # <- 公開鍵
```

無事に作成できてました👍

※ ssh-keygenコマンドには様々なオプションがあります。
[>> 気になる方はコチラもご覧ください。](https://atmarkit.itmedia.co.jp/ait/articles/1908/02/news015.html)

## 公開鍵をコピーする

次は **`公開鍵`** を外部サーバーに登録するための準備をします。
と言っても **`公開鍵`** の中身をコピーするだけです。

:::note warn
<font color="orange">間違っても **秘密鍵** をコピーしないよう気をつけましょう。</font>
:::

```text:terminal
% pbcopy < ~/.ssh/id_rsa.pub
```

これでクリップボードにコピーされました👌
※ catコマンドで表示して全選択してコピーという記事も見かけますが、コピペミスにも繋がるので上記コマンドがオススメです。

## Githubに公開鍵を登録する

次はいよいよ **`公開鍵`** の登録です。
Githubには [SSHキーを登録するページ](https://github.com/settings/keys) が用意されています。
※`ユーザーアイコンクリック > Settings > SHS and GPG keys` でも辿り着けます。

緑の `New SSH key` を押します。

***
![スクリーンショット_2022-03-01_1_56_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89868/219dbd07-bc8b-1d4a-6d8d-66266f637cbf.png)
***

すると以下のような入力画面が現れます。

***
![スクリーンショット_2022-03-01_1_58_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89868/1e496089-3af3-574c-690e-62b55a4961d8.png)
***

- Title：何でもいいです。どこで（どのPCが）所有してる鍵なのかが分かればいいと思います。
- Key：先ほどコピーした **`公開鍵`** の中身を貼り付けます。

以上の2ヶ所が入力できたら `Add SSH key` を押します。
するとGithubのパスワード入力画面が表示されます。
ログイン時に使用しているパスワードを入力しましょう。
その後、以下のように表示されたら登録完了です👍

![スクリーンショット_2022-03-01_2_10_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89868/f76bd53d-6c24-571f-0e7b-967dfa2126d7.png)

## SSH通信できるか確かめる

ここまででSSH通信の準備は整いました。
実際に通信出来るのか確認してみます。

```text:terminal
% ssh -T git@github.com
```

すると以下のように表示されます。
初めて接続する場合は4行目のように `yes or no` と聞かれます。
`yes` と入力しEnterを押しましょう。

```text:terminal
The authenticity of host 'github.com (52.69.186.44)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes      # <- yesと入力しEnter
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Hi GithubUsername! You've successfully authenticated, but GitHub does not provide shell access.
```

最後の行で `You've successfully authenticated` と表示されています。
無事、接続（認証）成功です👏

今後リポジトリをクローンする際にSSHクローンが出来るようになりました。
めでたしめでたし。

# おまけ

今回のGitHubの例では使いませんでしたが、外部サーバーにリモート接続してコンソールで作業、なんてことも出来ます。（GitHubでは出来ません）

そんな作業をする方にオススメなのが設定ファイルの作成です。
以下に簡単な作り方を残しておきます。

まず、vimでファイルを作成（すでに存在する場合は編集）します。

```text:terminal
% vim ~/.ssh/config
```

下記のように記入（もしくは追記）して保存しましょう。

```text:~/.ssh/config
Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa
```

こうすることで、SSH接続する際の手間が省けるようになります。

```text:terminal
% ssh git@github.com   # <- 設定ファイル作成前
% ssh github           # <- 設定ファイル作成後
```

ちなみに各項目はこのような意味です。

```text:~/.ssh/config
Host github                    # <- 任意の名前。SSH接続時に使用する
  HostName github.com          # <- 外部サーバーのホスト
  User git                     # <- 外部サーバーのユーザー
  IdentityFile ~/.ssh/id_rsa   # <- 認証に使う秘密鍵
```

※ 他にも設定項目がいくつかあります。
[>> 古い記事ですがコチラが参考になるかも](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)

# さいごに

マサカリお待ちしてますm(_ _)m