はじめに
LinuxサーバにOpenSSHサーバとクライアントをインストールし、いざSSH接続しようとしたときの認証方式はパスワード認証です1
今回は公開鍵認証方式に移行する手順を書いていこうと思います。
公開鍵認証方式は、秘密鍵と公開鍵を使ったパスワード入力が必要ない方式で、総当たり攻撃やパスワード流出の対策にもなります。
今回試したLinuxサーバは、クラウド上に用意したUbuntu22.04
、ローカルPCはWindowsにWSL2を使用して構築したUbuntu22.04
です。
キーペアの作成
では早速、秘密鍵と公開鍵を作成していきます。
ローカルPCで以下を入力します。
ssh-keygen -t rsa -b 4096
RSA暗号を使った4096ビットの鍵を生成します。
途中でパスワードの入力を求められますが、何も入力せずEnterを押しておきます。
ssh-keygen
デフォルトでは、以下の場所に鍵が作成されます。
鍵 | 場所 | ファイル名 |
---|---|---|
公開鍵 | ~/.ssh | id_rsa.pub |
秘密鍵 | ~/.ssh | id_rsa |
公開鍵をサーバにコピーする
公開鍵認証に使用するため、生成した公開鍵をサーバにコピーします。2
ssh-copy-id [アカウント名]@[ホスト名]
こうすることでLinuxサーバの~/.ssh/authorized_keys
に公開鍵が追加されます。
また、ssh-copy-id
は、ファイルとディレクトリが存在しなければ自動で作成もしてくれる優れものなコマンドです。
念のため、作成されたファイルのパーミッションを確認しておきたいと思います。3
sudo stat /home/tester1/.ssh/authorized_keys -c '%a'
-> 600
公開鍵認証方式でログインできるか試してみる
ここまで終えると、公開鍵認証方式でLinuxサーバへのログインができるようになっているはずです。
実際に試してみたいと思います。
ssh [ユーザ名]@[ホスト名]
この結果、パスワードの入力を求められることなく、Linuxサーバにログインできれば成功です。
二要素認証を取り入れてみる
ここまでの状態で、秘密鍵が保存されているローカルPCを使ってさえいれば、誰でもLinuxサーバにログインできるようになりました。
それでは困るといった場合には、第三者がログインできないように、更にセキュリティを強化できます。
それについては、別記事を書きたいと思います。
パスワード入力を完全に制限する
最後の締めくくりとして、該当のユーザに対してパスワード入力でログインできなくします。
注意: これを行うメリット・デメリットを示します。
- メリット
- 特定のローカルPC、特定のデバイスを持つ者しかログインできないため、セキュリティが高い
- デメリット
- ハードウェアが故障した場合など、ログイン不可となった際の対応策を用意しておく必要がある
まず、他人のローカルPCから該当ユーザでログインを試みるとパスワード入力を求められることを確認しておきます。
例えば、ローカルPCに仮想環境を作っている場合、VMからは公開鍵認証で直接ログインできますが、
ホストPCのPowerShellからはパスワード入力しないとログインできないといった状態です。
以下の編集を行い、パスワード入力を制限してみます。
PasswordAuthentication no
sshを再起動(sudo systemctl restart ssh
)します。
これで、他人のローカルPCからはログインできなくなりました。
(ちなみに、アクセスしてみるとPermission denied (publickey).
となります)
以上で、パスワード認証から公開鍵認証に移行することができました。