【公開鍵認証】Unix系サーバのセキュリティを向上させる

さくらインターネットさんのVPSを使っていますが、

サーバ作成直後に設定しておくべき初期セキュリティ設定 | さくらの VPS ドキュメント

という手順が公開されています。これを参考にしながら設定をしてみました。
私が使っているのはCentOS 8ですが、手順書の内容と同じでした。
ローカルのPCは、Ubuntu20.04です。

1.鍵を作成する

ローカルPCのコマンドラインで以下を実施。
$ssh-keygen -t rsa -C '(メールアドレス)' -f ~/.ssh/id_rsa_sakura-vps
この時、パスフレーズを聞かれるので忘れずに準備しておく。
-Cのオプションは、自分の使っているメールアドレスを使用する。
-fのオプションは、生成されるファイル名なので任意です。良く、id_rsaにしましょうという記述を見ますがそうしなくてはいけないわけではありません。
これを実行すると、~/.sshディレクトリ配下に上の例だと
id_rsa_sakura-vps
id_rsa_sakura-vps.pub
の2つのファイルが生成されます。
id_rsa_sakura-vpsは秘密鍵なので厳重に保管してください。
id_rsa_sakura-vps.pubは公開鍵なのでsshで認証する先のサーバに持って行くものです。

2.公開鍵をサーバへ転送する

さて1で作成した公開鍵は、サーバへ転送しなくてはなりません。
今回はscpコマンドで転送しました。
$scp ~/.ssh/id_rsa_sakura-vps.pub (ユーザ名)@(相手先IPアドレス):~/.
これによりサーバのユーザディレクトリ直下(~/.としています)に公開鍵が転送されます。
引数の最後の:~/.の部分は転送したい先のディレクトリパスを指定すれば良いので送りたい先のディレクトリを指定すれば任意に変えられます。

3.認証キーとして登録する

転送した公開鍵を認証キーとして登録します。
登録する先のファイルは、
~/.ssh/authorized-keys
です。このファイル名はこのまま変えずに使います。
初めて認証キーを登録する際にはまだ.sshディレクトリが作成されていませんので作成します。
sshでサーバへパスワード認証でログインします。
$pwdコマンドでホームディレクトリであることを再確認。
$ls -lコマンドで.sshディレクトリがないことを確認します。
確認が済んだら
$mkdir .ssh
として.sshディレクトリを作成します。
次にアクセス権を設定します。
$chmod 700 .ssh/
そして
$mv id_rsa_sakura-vps.pub .ssh/authorized_keys
として書き込みます。
最後に
$chmod 600 .ssh/authorized_keys
とすれば完了です。

4.公開鍵認証でログインしてみる

上記手順が完了したら、一度サーバからログアウトして再度ログインしてみます。
ログインするには、自分の秘密鍵を使った照合が必要になるので、
$ssh -l (ユーザ名) (IPアドレス) -i .ssh/id_rsa_sakura-vps
とします。パスフレーズの入力が求められ、ログインできます。

5.より安全なSSH接続へ

さくらインターネットさんのページにもありますが、SSHサーバの設定を変更する必要があります。
サーバの/etc/ssh/ssh_configを編集します。
まずは、rootでのログインを許可しないにします。
PermitRootLogin no
次にパスワード認証を許可しないにします。
PasswordAuthentication no
これをやらないと意味がありません。
これをやれば、パスワード認証が無効になるので今までよりセキュリティが強固になると言えます。これをやらないとセキュリティレベルは変わらないので公開鍵認証にする作業の手間が増えただけということになります。
その後、
$sudo systemctl restart sshd
として上記の2つの設定を有効にします。
最後にログアウトして確認です。
  • rootでログインできないこと。
  • パスワードでログインできないこと。
  • 公開鍵認証でログインできること。
さあこれで公開鍵認証が使えるようになりパスワードが使えなくなりました。rootでもログインできません。ちょっとだけセキュリティが強固になりました。

6.SSH接続用ポート番号の変更

ここまでやったら最後の仕上げです。SSH接続用ポート番号を変更します。デフォルトで22を使っているSSH接続ですがここが開いていると「外部接続するようになっている」とわかってしまいます。効果がどれほどあるのかわかりませんが、そのサーバ専用のポートに変更するようにします。

(1)sshdの設定変更

まずは、sshdのポート番号変更です。設定は、
/etc/ssh/sshd_config
に記載されています。

デフォルトでは、
Port 22
となっていますので、その行をコメントアウトして新しいポート番号(仮に10022にします)を設定します。
#Port 22
Port 10022

として保存します。sshdを再起動すれば設定完了です。

$sudo systemctl restart sshd

(2)ファイアウォールの設定変更

※ここは、さくらのVPSの手順書と異なるubuntu向けの手順になります。

まず現在の設定状態を確認します。
$sudo ufw status

ポートが開いていなければ開けていきます。初期設定は何もされていない状態(inactive)だと思いますので、80(http),443(https),10022(ssh)を開けます。(10022は自分で設定したポート番号を使ってください)
$sudo ufw allow 80
$sudo ufw allow 443
$sudo ufw allow 10022

ファイアウォールを有効にします。
$sudo ufw enable

ファイアウォールの状態を確認します。
$sudo ufw status
設定した80,443,10022がIPv4、IPv6とも開いていれば完了です。

念のため、10022でsshが通るか確認しておいてください。
$ssh -l (ユーザ名) (IPアドレス) -i .ssh/id_rsa_sakura-vps -p 10022
ポート番号の-p 10022が追加されています。無事にログインできたでしょうか。

お疲れさまでした。ここまで完了すればひととおり最低限のことはできたでしょう。

7.さくらインターネットさんでは

今回設定したさくらのVPSでは「5.より安全なSSH接続へ」で書いた手順でパスワード認証を無効にできます。しかし、レンタルサーバでは共有サービスのためその手順はできません。せっかく公開鍵認証を使えるようにできるので、ユーザ単位でパスワード認証の有効/無効を切り替えられるようにしていただけるとより安心できるかなと思う次第です。
それでは皆さん、Improve the quality.