Edited at

SSHの認証方式を、公開鍵認証方式にする。

More than 1 year has passed since last update.

SSHの認証方式はいくつかある。


  • パスワード認証

  • 公開鍵認証

  • ワンタイムパスワード認証

ワンタイムパスワード認証できるの初めて知った...

で、

「ssh接続の認証方式、公開鍵認証方式に変えといて〜」って言われたので、備忘録。

ざっくり言うとこんな感じ。



  • ssh-keygenで公開鍵と秘密鍵を生成

  • 生成した公開鍵は、SSHサーバ側に登録

  • 生成した秘密鍵は、SSHクライアント側に移動

  • パスワード認証もさせないように、ついでに変更しておく(残ってたら無意味なので)


SSHサーバ側:公開鍵と秘密鍵の生成〜公開鍵の設定

まず、

ssh-keygenコマンドで公開鍵と秘密鍵の生成をする。

コマンドを打つと以下を聞かれるので、答えていく。


  • ファイル名:Enter file in which to save the key (/root/.ssh/id_rsa):


    • デフォルトだと「id_rsa」

    • 複数サーバで鍵生成してると被ってくるおそれがあるので、適切な名称に変えて置く事が望ましい



  • パスフレーズ:Enter passphrase (empty for no passphrase):


    • デフォルトだと「(未設定)」

    • 利用者認証のための合言葉みたいなもので、パスワード認証のパスワードとは異なる。

    • 未設定のままでも使えるが、設定しておいた方がセキュリティレベルは上がる



次に、

公開鍵を保存しておくファイルであるauthorized_keysに公開鍵を追記する。

最後に、

パーミッションの確認および変更をして終わり。


sh

# 公開鍵と秘密鍵の生成

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # ファイル名
Enter passphrase (empty for no passphrase): # パスフレーズ
Enter same passphrase again: # パスフレーズ(確認)
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:d/gQiLpY1DivqxMElaeGeh9LkNLU8qof6l4d019qE3k root@xxx.xxx.xxx.xxx.ZZZ
The key s randomart image is:
+---[RSA 2048]----+
| ..o |
|. + oo . . |
| = *+ o . . |
|o B..+. .o |
|.+ ooo..So+E. |
|. +o+oo ..=+ |
| oo=o+ = . |
|..o.o. . . |
|++oo. |
+----[SHA256]-----+

# ファイル名を指定しなかったら`~/.ssh/`に生成される
# 指定してたら、カレントディレクトリに生成される
# 以下は、指定しなかった場合の例
$ ll ~/.ssh/
合計 8
-rw------- 1 root root 0 4月 9 09:48 authorized_keys
-rw------- 1 root root 1675 5月 15 15:20 id_rsa
-rw-r--r-- 1 root root 411 5月 15 15:20 id_rsa.pub

# `authorized_keys`に、公開鍵の中身を追記する
# 追記したら用無しなので削除する
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/.ssh/id_rsa.pub

# パーミッション設定
# - `ll`コマンドなどで確認して問題なければ変更しなくてよいが、以下となっている必要がある
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh



SSHクライアント側:秘密鍵の取得〜公開鍵認証での接続確認

まず、

SSHサーバから秘密鍵をもらってくる。

あとは、

sshコマンドを打つ時に、-iオプションで秘密鍵を指定する。


sh

# scpコマンドなり何なりで、SSHサーバ上の秘密鍵を取得する

# 配置先は正直どこでもいいが、`~/.ssh/`が望ましい
$ scp root@xxx.xxx.xxx.xxx:/root/.ssh/id_rsa ~/.ssh/

# 公開鍵認証でログインできる事の確認
# - パスフレーズを設定してなければそのまま接続できるし、設定してれば入力してねって聞かれる
$ ssh -i ~/.ssh/id_rsa root@xxx.xxx.xxx.xxx
Enter passphrase for key '~/.ssh/id_rsa':


ちなみに、

この時点だとまだパスワード認証できてしまう。


sh

$ ssh root@xxx.xxx.xxx.xxx

root@xxx.xxx.xxx.xxx's password: # <=これがその証拠


SSHサーバ側:パスワード認証の禁止

さっき言った通り、今の時点だとパスワード認証が出来てしまう。

そのため、設定ファイルを書き換えてから、デーモンを再起動する。

ちなみに、

SSHクライアント側の設定より前にやってしまうと、scpコマンドでパスワード認証できなくなる

そのため、最低でも、秘密鍵を取得してから、これからの設定を行う。


sh

# 設定ファイルを開く

$ vim /etc/ssh/sshd_config


/etc/ssh/sshd_config

# PasswordAuthenticationをnoに変更

PasswordAuthentication no

# PubkeyAuthenticationをyesに変更
PubkeyAuthentication yes



sh

# sshデーモンを再起動

$ service sshd restart


SSHクライアント側:パスワード認証での接続不可確認

最後に、

クライアント側からパスワード認証で接続できない事を確認すればOK。


sh

# これでパスワード認証できなくなった

$ ssh root@xxx.xxx.xxx.xxx
root@xxx.xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). # <=これがその証拠


参考

http://www.atmarkit.co.jp/flinux/rensai/linuxtips/430dnypsswdacces.html

https://qiita.com/nnahito/items/dbe6fbfe347cd66ae7e6