sshに公開鍵認証を設定して安心なsshをする

特に設定をしていない状態でsshをしていると、パスワードを求められると思います。それはパスワード認証といいsshでログインする際にパスワードを使って認証する仕組みを使っている状態です。

その他にsshをする方法として公開鍵認証というものがあります。今回は公開鍵認証の方法をご説明します。

まだsshの設定してないよ、という方はこちらもご覧ください。

centosでsshの設定をしよう!

2018.05.22

公開鍵認証のメリット/デメリット

とりきち
そもそも公開鍵ってなんですの?
とりふみ
簡単にいうと公開鍵と秘密鍵を使って暗号のやり取りをして認証する仕組みだよ

公開鍵認証の詳細は専門の方々や詳しい方の記事にお任せしますが、簡単にいうとサーバーに置く公開鍵とローカルに置く秘密鍵を使って暗号のやり取りを使ってパスワードの代わりによりセキュアな認証をしてくれます。

公開鍵はその名の通り公開して良い鍵で、秘密鍵は外部に流出させてはいけない秘密の鍵ですので取り扱いは要注意です。

メリット

よりセキュリティを考慮した状態を作れるという形です。

  • パスワードがネットワークを流れないので、よりセキュアな状態で認証ができる
  • パスワードではないので攻撃へのリスクが減ります。

デメリット

端的に言えば手間や制限がかかります。

  • サーバーの設定が必要
  • 秘密鍵がない環境だと、ログインできない。

まずは公開鍵と秘密鍵を生成する

それでは早速公開鍵を生成していきます。一番簡単な方法だと`ssh-keygen`とコマンドラインで打つだけで生成できます。実際にやってみます。

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/{YOUR_HOME_DIRECTORY}/.ssh/id_rsa):<ここで絶対パス+ファイル名でも変更できる>
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/{YOUR_HOME_DIRECTORY}/.ssh/id_rsa.
Your public key has been saved in /Users/{YOUR_HOME_DIRECTORY}/.ssh/id_rsa.pub.
The key fingerprint is:

`ssh-keygen`を入力した後に、パスフレーズの入力を求められます(ここは空でも作成できます)。パスフレーズを入力すると`/User/{YOUR_HOME_DIRECTOR}/.ssh/id_rsa`と`/User/{YOUR_HOME_DIRECTOR}/.ssh/id_rsa.pub`の2つのファイルが生成されます。

ファイル名はデフォルでは以下のようになっています。

id_{形式名}
id_{形式名}.pub

つまり指定しなければ、rsaで公開鍵と秘密鍵が生成されます。

ssh-keygenのオプション

以上のようにそのまま公開鍵と秘密鍵を生成できますが、`ssh-keygen`のオプションも指定できます。

ssh-keygen -b [bit数] -t [dsa | ecdsa | ed25519 | rsa | rsa1] -N [new_passphrase] -C [comment] -f [output_keyfile]
  • -b – ビット数
  • -t – 暗号方式の種類の指定。dsa、ecdsa、ed25519、rsaを指定できる(デフォルトはrsa)
  • -N – パスフレーズ
  • -C – コメント。入力しないとmacのユーザー名とかが登録されるので、必要ないなら ” を入力する方が良い。
  • -f – 鍵の保存先。{絶対パス+ファイル名}で指定する。

上記のオプションを使って公開鍵と秘密鍵を作成してみます。

ssh-keygen -b 4092 -t rsa -C myserver -N xxxxxxxx -f /Users/{USER_HOME_DIRECTORY}/.ssh/myserver1/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /Users/{USER_HOME_DIRECTORY}/.ssh/myserver/id_rsa.
Your public key has been saved in /Users/{USER_HOME_DIRECTORY}/.ssh/myserver/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx myserver
The key's randomart image is:
+---[RSA 4092]----+
|=BOB=+ |
|+O=o .B . |
|o.o+=*.o E |
|o +o=+... |
|.. o .oS. |
| . . o |
| . o. . |
| o=... |
| .+oo .. |
+----[SHA256]-----+

上記は`/Users/{USER_HOME_DIRECTORY}/.ssh/myserver/`以下にRSAの4092bitの公開鍵と秘密鍵がxxxxxxxxというパスフレーズで生成されました。

フィンガープリントを確認する

公開鍵の情報を確認することができます。

ssh-keygen -l -f .ssh/hogehoge/id_rsa
4092 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX myserver (RSA)

パスフレーズをあとから変える

パスフレーズはあとから変えることができます。

ssh-keygen -p -P [old_passphrase] -N [new_passphrase] -f [file]

ちなみにパスフレーズって?

とりきち
なんで公開鍵認証でもパスワードいるん?公開鍵アンドパスフレーズなん?
とりふみ
パスフレーズはsshに必要なものではなく、秘密鍵にアクセスするためのパスワードなのよ。

サーバーから送られたきた暗号を復号化するために秘密鍵にアクセスし暗号を解読します。その時に秘密鍵にかけるのがパスフレーズです。そのためパスワード認証とは用いられるの箇所が違います。

公開鍵の配置

公開鍵と秘密鍵が出来上がったら、次に公開鍵をサーバーの`authorized_keys`へ登録しましょう。

先ほど作成した`~/.ssh/hogehoge/id_rsa.pub`を登録してみます。初めて登録する場合は以下のステップです。

  1. 公開鍵をサーバーへ送る
  2. `~/.ssh`を作成
  3. `authorized_keys`を`~/.ssh`以下へ作成する
  4. サーバーへ送った公開鍵を`authorized_keys`へ登録する
  5. sshd_configでパスワード認証をできないようにする

サーバーへ公開鍵を送る

xxx.xxx.xx.xxというIPのサーバーのuserというユーザーに公開鍵を設定します。

scp ~/.ssh/myserver/id_rsa.pub user@xxx.xxx.xx.xx:/home/user/

ちなみにいちいち送らなくても平気

ローカルにある公開鍵をリダイレクトさせることができる。

ssh orthomo@153.126.213.24 `cat >> ~/.ssh/authorized_keys` < ~/.ssh/orthomo_id_rsa.pub

.sshとauthorized_keysを作成する

mkdir ~/.ssh
touch ~/.ssh/authorized_keys

.sshとauthorized_keysはそれぞれパーミッションが決まっています。
.sshのディレクトリは700。公開鍵は600に設定しましょう。

chmod 700 ~/.ssh/
chmod 600 ~/.ssh/authorized_keys

公開鍵を登録する

cat id_rsa.pub >> ~/.ssh/authorized_keys

登録が完了したらid_rsa.pubは削除してしまって問題ありません。

sshしてみる

それでは実際にsshしてみましょう。引数-iで秘密鍵を指定します。

ssh user@xxx.xxx.xx.xx -i .ssh/myserver/id_rsa
Enter passphrase for key '.ssh/myserver/id_rsa': <パスフレーズの入力>

こちらでログインできればできれば、問題なく完了されています。

sshd_configでパスワード認証をできないようにする

無事に公開鍵認証ができるようになったらパスワード認証をできないようにしましょう。パスワード認証ができると公開鍵で認証するメリットがないので、`/etc/ssh/sshd_config`を編集してできないようにします。

# yes から no へ変更
PasswordAuthentication no

秘密鍵を指定しないでログインをしようとすると以下のように表示されます。

ssh serposcope@153.121.75.51
serposcope@153.121.75.51: Permission denied (publickey).

以上で公開鍵の認証が終了です。