SSH公開鍵認証で接続する

レンタルサーバにリモート接続する際SSHを利用しますが、パスワードによる認証を無効にして秘密鍵だけでログインできるようにしてサーバをセキュアにします

設定作業はSSH接続するクライアントリモートサーバでそれぞれ行います

おおまかな作業手順

秘密鍵・公開鍵の作成

SSH接続する為の秘密鍵と公開鍵を作成します
秘密鍵は自分自身が持ち、公開鍵は接続するリモートサーバに設置する為のものです

鍵の作成はssh-keygenコマンドで行います
以下はMacOSでの実行です

% ssh-keygen -t rsa -b 4096 -C "foo@example.com" 
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/foo/.ssh/id_rsa): ※作成する秘密鍵のファルイ名を指定。省略時はかっこ内のファイル名となる
Enter passphrase (empty for no passphrase): ※パスフレーズを指定する(省略可能)
Enter same passphrase again: 
Your identification has been saved in /Users/foo/.ssh/id_rsa
Your public key has been saved in /Users/foo/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:gmtzvy1gf+MKNJUVnnENuHz0vrlWJO/itbOQ/n19PXI foo@example.com
The key's randomart image is:
+---[RSA 4096]----+
|          +ooo   |
|         +.+. .  |
|        o.oo .   |
|     . .  o . o .|
|    . + S  . . + |
|     ooo      o o|
|    +.oo     o =+|
|   . o oo.o ..*EO|
|        +*o. +**B|
+----[SHA256]-----+

上記実行で、秘密鍵id_rsa、公開鍵id_rsa.pubがホームディレクトリ/Users/foo/.sshに作成されます
秘密鍵・公開鍵作成時にパスフレーズを指定すると、この公開鍵を使いSSH接続する際にパスフレーズが必要となり、よりセキュアとなります(秘密鍵を盗まれたとしてもパスフレーズがわからないとログインできない)

公開鍵の設置

前節で作成した秘密鍵・公開鍵の内、公開鍵id_rsa.pubの内容をリモートサーバの接続ユーザ(本例ではfooユーザ)のホームディレクトリに設置します。
具体的には、id_rsa.pubの内容を、ファイル~/.ssh/authorized_keysの最後に追記します。
なお、~/.ssh/authorized_keysファイルが存在しない場合は、パーミッション600で新規作成します。(.sshフォルダがない場合は作成)

まずは、公開鍵をサーバに転送します。
以下はMacOSでの実行

% scp ~/.ssh/id_rsa.pub foo@サーバ:~

リモートサーバに公開鍵が転送できたら、リモートサーバで公開鍵を設置します
以下はリモートサーバ(linux)で実行

# (存在しない場合).sshディレクトリ作成
$ mkdir -p .ssh && chmod 700 $_
# authorized_keysファイルの作成
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
# クライアントから転送した公開鍵(~/id_rsa.pub)の内容をauthorized_keysファイルの最後に追記
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

秘密鍵でSSH接続確認

SSH公開鍵による接続の為の準備が整ったので、クライアントから接続できるか確認します

% ssh foo@サーバ
Last login: Sun Oct 23 12:29:46 2022 from xxxxxx

秘密鍵ファイルは -i オプションで指定できます

% ssh foo@サーバ -i [秘密鍵ファイル]

SSH認証を鍵認証だけにする

リモートサーバへのパスワードによるSSH接続を無効にし、鍵認証だけにします。
SSHサーバの設定ファイル/etc/ssh/sshd_configを変更します

# rootによる接続を許可しない
PermitRootLogin no
# パスワードによる認証を無効
PasswordAuthentication no
# 鍵認証を有効にする ... 既にこの設定になっているはず
PubkeyAuthentication yes

変更後はsshdサーバを再起動します

$ sudo systemctl restart sshd