sshで公開鍵認証をする


:::note warn
Windows Homeエディションではssh関連コマンドがインストールされていないようです。本稿はWindowsPro以上のエディションを使用している人向けです。
:::

# 0.はじめに
opensshが入っている環境でssh接続を行うときは、基本的にコマンドで
```bash
>ssh ユーザ名@IPまたはホスト名
```
と実行すると、パスワードを入力して接続します。

これは単にリモートホスト(サーバ)に対してユーザ名とパスワードで認証するので、**パスワード認証**といいます。イントラネットなどの場合はこの方法を取っている環境が良く見られる気がします。

sshでは認証を行う方法として、このほかに**鍵認証**という方法で認証を行うことができます。

本稿では公開鍵認証をする方法を見ていきます。

# 1.キーペアの作成
公開鍵認証の仕組みは私が改めて説明するよりも、多くの文献がありますので各自で学習して頂くとして、まずは、公開鍵認証で必要な鍵である、秘密鍵と公開鍵のキーペアを作成する必要があります。

opensshが入っている環境、(例えばLinuxやWindowsPro)の場合は次のように`ssh-keygen`コマンドを実行することでキーペアを作成することができます。


## キーペアの作成
```bash
>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\yoyo/.ssh/id_rsa): aaaaa  #キーペアのファイル名を指定
Enter passphrase (empty for no passphrase):  #パスフレーズを指定したい場合は入れる。なしでOK
Enter same passphrase again:　　#パスフレーズを指定したい場合は再度入れる。なしでOK
Your identification has been saved in aaaaa
Your public key has been saved in aaaaa.pub
The key fingerprint is:
SHA256:NkGJR8Rh6akPH21//xGlWybfaecW0nMltmEWRSpPoj8 yoyo@HY2CL003
The key's randomart image is:
+---[RSA 3072]----+
|       =*+     oo|
|      .o=     .. |
|       o..  o o..|
|        o. . =*.o|
|       .S..  +==+|
|      o...o. ..X=|
|       + o .E o+B|
|        o   ..o.+|
|             . o=|
+----[SHA256]-----+
```
:::note warn
パスフレーズを入力すると、鍵認証といえどssh接続時にパスフレーズの入力が求められます。
パスフレーズとパスワードは別です。初学者の方は混乱ポイントなので、最初はパスフレーズなしで作成するとよいでしょう。
:::

これで秘密鍵と公開鍵のキーペアが作成されました。

自分のユーザフォルダを開いてみると、「aaaaa.pub」と「aaaaa」というファイルが存在しているはずです。

:::note info
WindowsPro以上の環境で実行した人は`Win + R`キーで「ファイル名を指定して実行」を開いてから「.(ドット)」を入力して実行すると自分のユーザフォルダを開けます。

例えば私のユーザフォルダは`C:\Users\yoyo`ですので、ここを開くとできています。
:::

この **「aaaaa.pub」が公開鍵 **、**「aaaaa」が秘密鍵** です。

## 秘密鍵の配置
秘密鍵(拡張子がないほう)はユーザフォルダの中にある、`.ssh`フォルダへ格納します。
.sshフォルダがない場合は作成します。

例えば私の場合は`C:\Users\yoyo\.ssh`フォルダの中にaaaaaファイルを格納します。


# 2.公開鍵の登録

次に、**公開鍵**をサーバに登録する必要があります。

大まかなやり方の流れとしては
- サーバ側のユーザディレクトリに、.sshディレクトリを作成する
- そこにauthorized_keysファイルを作成する
- authorized_keysファイルに公開鍵を登録する

という手順になります。

## まずはパスワード認証でログイン
```bash
ssh yoyo@192.168.1.42
yoyo@192.168.1.42's password:
```

## 現在のディレクトリを確認
```bash
pwd           ←現在のディレクトリを表示
/home/yoyo
```
```bash
ls -la        ←現在のディレクトリのファイルを全て表示
total 32
drwx------ 3 yoyo yoyo 4096 May 31 16:15 .
drwxr-xr-x 3 root root 4096 May 21 06:36 ..
-rw------- 1 yoyo yoyo  121 May 31 16:25 .bash_history
-rw-r--r-- 1 yoyo yoyo   18 Apr 30 14:14 .bash_logout
-rw-r--r-- 1 yoyo yoyo  141 Apr 30 14:14 .bash_profile
-rw-r--r-- 1 yoyo yoyo  492 Apr 30 14:14 .bashrc
```

ここ(`/home/yoyo`)に`.ssh`ディレクトリが存在しないので作成する必要があります。

## .sshディレクトリを作成する
```bash
mkdir .ssh
```
## .sshディレクトリに移動
```bash
cd .ssh
```
## authorized_keysファイルを作成
```bash
touch authorized_keys
```
:::note info
面倒な場合は次の手順でauthorized_keysが作れるのでこれはスキップしてもおｋ
:::
## vimでauthorized_keysに公開鍵を書き込み
```bash
vi authorized_keys
```

先ほど作成した公開鍵「aaaaa.pub」をメモ帳などで開いて、authorized_keysファイルにコピペします。

例として、私の場合は以下になっていたのでこれをコピペします。

```bash
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt3m1sRwBPNqFKUliXrNiKlAM3BLN5WCYwoevmIiznJ7uZBvAvQPqDecPpEVurYnD5wGuAX54c7raFsikKHJjSsQutdDpXcQefYQ1I32m5zhCMwRarMWlpxD68ZIWxHm9Z/ZYBK6sfAoAk+WgBOrfGeRkxBjkBO7C1bgixHUStGy+B1DPZHvX928RjTIBAj4PZvN542MU9LRJwcJuK7GhPwo+S+eS7oUY79y1MqnCdODHZ7cUYnsv4qcWE3gwDbaYV3xRpJiOngsQC8fKtdMyYyujVEMaZipcPu4rcBmlarcdaWRpu2Mj8hOrfTEs3vJ4BV8/FiE+34ROC8Qk6sOH5pvYFu5dPuJDHbtypP21x1Xi+PRsJXONub6GS136kVw9AERb1PyKfBl+FEvO2yj9/cZlez/YDGudYAXlto7nmS5fluWB/o/VmTVlRU5X+BujGJfbB2+BY2Hj/1UlPVg2WU267jd/zSBUVJ9zU/TtQrWLN5iLCmK8hvNKDqApC5p8= 
```

※vimの操作手順は別の話になるので本稿では割愛します

# 3.sshdのリスタート
設定反映の為にsshをリスタートしましょう。

## rootユーザに変更
```bash
su -
```
## sshdのリスタート
```bash
systemctl restart sshd
```
# 4.確認
ここまでで公開鍵認証ができるようになっています。
実際に鍵を使って認証できるか試しましょう。

## Windowsからログイン
以下コマンドを参考に鍵でログインします。
`-i`は鍵ファイルのディレクトリを指定するオプションで、秘密鍵のディレクトリを指定する必要があります。

```bash
ssh yoyo@192.168.1.42 -i .ssh\aaaaa
```
ログインできたら成功です。

パスフレーズを入力していない場合はパスワードを求められずにするっとログインできますが、パスフレーズを入力した場合はパスフレーズが求められます。


## ログを見てみる
ユーザがログインするとログに吐き出されます。

### 鍵認証でログインした場合
```bash
>cat /var/log/secure
May 31 16:26:13 ALC102 sshd[2910]: Accepted publickey for yoyo from 192.168.8.101 port 56176 ssh2: RSA SHA256:mmIV0ewRLEpoM02mEMx9XOxQQZnlza1ppE0uWgQbILQ
May 31 16:26:13 ALC102 sshd[2910]: pam_unix(sshd:session): session opened for user yoyo(uid=1000) by yoyo(uid=0)
```

### 通常のパスワード認証をした場合
```bash
May 31 16:27:18 ALC102 sshd[2931]: Accepted password for yoyo from 192.168.1.11 port 56191 ssh2
May 31 16:27:18 ALC102 sshd[2931]: pam_unix(sshd:session): session opened for user yoyo(uid=1000) by yoyo(uid=0)
```

最初の行に違いがあることがわかります。
パスワード認証した場合はssh2で終わっていますが、鍵認証の場合はさらに「RSA~」と続いています。
ここには認証に使用された公開鍵のアルゴリズムと、そのフィンガープリントが表示されています。

# 蛇足
## 鍵認証なので、公開鍵を下さい
実際に現場に入ると、「鍵認証なので、公開鍵を下さい」と言われることがあります。
その場合は`ssh-keygen`で鍵を作り、管理者へその公開鍵を送付することで、管理者が公開鍵を登録してログインできるようになるという流れになると思います。

## 秘密鍵の取り扱い
今回作成したような秘密鍵(拡張子がない「aaaaa」というファイル)は、文字通り秘密の鍵なので、基本的に自分以外の誰かに使用・閲覧などさせてはいけません。共有PCなど、複数人が使用する環境となっているばあいは、その取扱いを厳重に行ってください。

## PubkeyAuthentication
`/etc/ssh/sshd_config`(sshdの設定ファイル)のディレクティブには`PubkeyAuthentication`というものがあります。これは公開鍵認証を行うかどうかを指定する項目です。Almalinuxでは通常、先頭に「#」がついてコメントアウトされているのですが、sshd_configは#がついている項目はデフォルト値が適用されます。

そのためデフォルトで公開鍵認証が有効になっています。うまく鍵認証ができない場合はここが`no`になっていないかも確認するとよいかもしれません。

ただし、noになっている場合は何か理由があって設定している可能性もあるので、確認してからyesに変更しましょう。

|値|動作|
|-|-|
|yes|有効|
|no|無効|
|#(コメントアウト)|有効|

以上で終了です。

良かったら↓も読んでみてください。

https://qiita.com/44dayo/items/cfbdab5ceb3a499b7d53