【30分で完了】SSH公開鍵認証の設定方法を解説
こんにちは。今回はUbuntu 22.04に対して公開鍵認証を使ってSSH接続したいと考えている方々に向けた記事となります。丁寧に説明していますので最後まで見てください。
本ブログ内のSSHに関するまとめ記事を書いたので、こちらもご覧ください。
さて、今回の前提を以下に書きます。
<接続先VPSサーバ情報>
サーバ:ConoHa VPS
OS:Ubuntu22.04
以下のパッケージインストール済み
・OpenSSH:公開鍵認証を用いたSSHやSCP転送にも対応している。
それでは進めていきましょう。
そもそも公開鍵認証を導入する理由は?
理由としてはパスワードを考えて、設定して、SSHする度に入力するという行為をやめたい訳です。
覚えられるぐらいのパスワードですと、総当たり攻撃をされた際に突破されてしまう可能性があります。公開鍵認証方式において秘密鍵は推測困難と知られているのに加えて、ユーザーのデバイスにのみ保存されます。そのため、パスワードを推測されたり盗まれるリスクが非常に低いのが特徴です。
公開鍵認証方式の設定
自身の端末からUbuntuに公開鍵認証でSSH接続することを考えます。公開鍵認証を実現するためには最終的に公開鍵&秘密鍵のペアが以下のようになってる必要があります。
下記のゴールを覚えておきましょう。
・SSH接続元(自身の端末)
→ ~/.ssh/下に秘密鍵がある
・SSH接続先(Ubuntu)
→ ~/.ssh/下に公開鍵(authorized_keys)がある
※各フォルダ/ファイルに適切なパーミッションが設定されている
公開鍵&秘密鍵ペアを生成する
まずは、鍵を生成しましょう。公開鍵と秘密鍵はペアで生成されます。
暗号化する方式は様々ですが、近年では最強の暗号化方式と呼ばれる「ed25519」を使って鍵を生成しましょう。
自身の端末の~/.sshに移動して、以下コマンドを打ちましょう。
ssh-keygen -t ed25519 # ~/.ssh/で実行
以下の質問がされますので答えましょう。
パスフレーズは空でもダイジョブです。設定する場合は覚えておかないと後悔しますので注意。
Enter file in which to save the key:特に理由なければそのままエンター
Enter passphrase (empty for no passphrase):自分で設定するパスフレーズ
Enter same passphrase again:↑上記をもう一度入力
「id_ed25519」と「id_ed25519.pub」ができてれば成功です。.pubの方が公開鍵となります。
今の状態はこうなってる状態です。
・SSH接続元(自身の端末)
→ ~/.ssh/下に公開鍵と秘密鍵がある NG
・SSH接続先(Ubuntu)
→ ~/.ssh/下に鍵なし NG
※各フォルダ/ファイルに適切なパーミッションが設定されていない NG
SSH接続元(自身の端末)で生成した公開鍵をSSH接続先(Ubuntu)へ転送する必要があります。
それでは次を進めていきましょう。
秘密鍵をSSH接続先へ転送する
便利なコマンドがあるので紹介します。以下のコマンドにより、SSH接続元(自身の端末)の公開鍵をSSH接続先(Ubuntu)の~/.ssh/下に「authorized_keys」とリネームして配置しれくれます。
SSH接続元(自身の端末)の.ssh下に移動して以下のコマンドを打ってみましょう。
ssh-copy-id -p [SSHポート番号] -i [公開鍵ファイル名] [接続先ユーザ]@[接続先IP]
SSH接続先(Ubuntu)の~/.ssh/下に移動をして「authorized_keys」があればOKです。
ls ~/.ssh
今の状態はこうなってる状態です。
・SSH接続元(自身の端末)
→ ~/.ssh/下に秘密鍵がある OK
・SSH接続先(Ubuntu)
→ ~/.ssh/下に公開鍵(authorized_keys)がある OK
※各フォルダ/ファイルに適切なパーミッションが設定されていない NG
最後にパーミッションの設定をします。
各フォルダ及びファイルにパーミッションを与える
公開鍵認証がうまく行かない大半の理由は「パーミッション」の問題です。認証のプロセスの中で各々のファイルへアクセスするのですが、適切なパーミッションが与えられてないと「Permission denied」等のエラーが発生します。その他にも「権限ガバガバすぎるからこんなファイル信用できないからダメ!」的なエラーもあります。つまり、パーミッションが厳しすぎてもダメですし、緩すぎてもダメな訳です。
以下にコマンドをまとめました。
chmod 755 home
chmod 755 /home/ユーザー名
chmod 700 /home/ユーザー名/.ssh
chmod 600 /home/ユーザー名/.ssh/秘密鍵ファイル名
chmod 755 home
chmod 755 /home/ユーザー名
chmod 700 /home/ユーザー名/.ssh
chmod 600 /home/ユーザー名/.ssh/authorized_keys
これでパーミッションの設定が完了しました。
・SSH接続元(自身の端末)
→ ~/.ssh/下に秘密鍵がある OK
・SSH接続先(Ubuntu)
→ ~/.ssh/下に公開鍵(authorized_keys)がある OK
※各フォルダ/ファイルに適切なパーミッションが設定されている OK
sshd_configの変更する
最後にSSH接続する際に公開鍵認証方式を採用する設定をしましょう。
sudo vi ~/etc/ssh/sshd_config
以下のように設定ファイルを変更してください。
PubkeyAuthentication yes
変更を保存したらSSHサーバのサービス再起動をします。
sudo systemctl restart ssh #SSHサーバを再起動
sudo systemctl status ssh #SSHサーバの状態を確認
「Active:active(running)」になってればOKです。
公開鍵認証を使ってSSH接続してみよう!
SSH接続元(自身の端末)から以下のコマンドを打ってみましょう。
ssh -i ~/.ssh/[秘密鍵ファイル] [接続先ユーザ]@[接続先IP]
無事接続できれば完了です。
パスワード認証を無効化
秘密鍵でSSH接続できるようになったので、パスワード認証を無効化しましょう。以下の2ファイルの「PasswordAuthentication」をnoにします。
sudo vi ~/etc/ssh/sshd_config
PasswordAuthentication no
※2箇所あるので注意
sudo vi ~/etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication no
まとめ
今回はUbuntu 22.04に対して公開鍵認証を使ってSSH接続する方法を紹介しました。個人でサーバを管理している人にとって、しっかりとしたセキュリティ対策を行うことは非常に重要です。この方法を用いることで、パスワードに依存した認証よりもはるかに強固なセキュリティを確立することが可能になります。