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
に公開鍵を追記する。
最後に、
パーミッションの確認および変更をして終わり。
# 公開鍵と秘密鍵の生成
$ 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
オプションで秘密鍵を指定する。
# 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':
ちなみに、
この時点だとまだパスワード認証できてしまう。
$ ssh root@xxx.xxx.xxx.xxx
root@xxx.xxx.xxx.xxx's password: # <=これがその証拠
SSHサーバ側:パスワード認証の禁止
さっき言った通り、今の時点だとパスワード認証が出来てしまう。
そのため、設定ファイルを書き換えてから、デーモンを再起動する。
ちなみに、
SSHクライアント側の設定より前にやってしまうと、scpコマンドでパスワード認証できなくなる。
そのため、最低でも、秘密鍵を取得してから、これからの設定を行う。
# 設定ファイルを開く
$ vim /etc/ssh/sshd_config
# PasswordAuthenticationをnoに変更
PasswordAuthentication no
# PubkeyAuthenticationをyesに変更
PubkeyAuthentication yes
# sshデーモンを再起動
$ service sshd restart
SSHクライアント側:パスワード認証での接続不可確認
最後に、
クライアント側からパスワード認証で接続できない事を確認すればOK。
# これでパスワード認証できなくなった
$ 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