RedHat系ディストリビューションのOSでssh接続を公開鍵認証でしかできないよう設定します。
RedHat系ディストリビューションであればやり方はほとんど同じですのでそのように記載していますが、ここではCentOS7での手順を記載します。
2024年6月にサポートが終了するOSであるためもう環境構築する人は稀だと思いますが、現時点ではまだサポート対象です。
sshとはSecure Shellから来ていて、ネットワークを介して別のコンピューターや機器に接続するプロトコルです。
公開鍵認証とはssh接続方式の1つであらかじめ生成した公開鍵・秘密鍵を使って認証を行います。
図にすると下記の通りです。
公開鍵認証を用いる理由
公開鍵認証を用いる理由はパスワード認証と比べたときのセキュリティ強度の高さです。
パスワード認証ではパスワードをネットワーク上でやり取りするため取得され悪用される可能性があります。
一方、公開鍵認証では公開鍵のみがやり取りされ秘密鍵はやり取りされません。
データの通信時に通信先が公開鍵を送信してくるためそれを通信元はそれを受け取って通信元で復元します。
つまり、やり取りされない秘密鍵は基本的には不正に取得されることがなく、セキュリティ強度が高いと言えます。
CentOS7で公開鍵認証を設定する
CentOS7で公開鍵認証を設定します。
非常に簡単な手順です。
ssh接続できることは前提とします。
CentOS7で公開鍵・秘密鍵を作成する
最初に公開鍵・秘密鍵を作成します。
ssh接続したら適当なパスで良いので下記コマンドを実行します。
ssh-keygen -t ed25519
ssh-keygenは公開鍵・秘密鍵作成用のコマンドです。
-tは鍵の種類を指定するオプションです。
ここではed25519という鍵の種類を指定しています。
楕円曲線に基づく暗号アルゴリズムです。
暗号アルゴリズムに関しては門外漢ですが、多くの公開鍵認証の暗号として採用されており現在でも安全性が高いとされています。
鍵の種類を指定しないとRSAという種類の鍵が作成されるのですが、こちらを使うのは近年は避ける傾向にあります。
廉価に攻撃できることが確認されており安全性に若干の不安があります。
コマンドを実行するとコンソール上で2つの質問がされるので回答しましょう。
1つ目はどこのパスに作成するかというものです。
基本的にはユーザーフォルダの下で/home/[ユーザー名]/.ssh/とかで良いです。
2つ目がパスフレーズで任意で問題ありません。
2つの入力が完了したら指定したパスに下記2つのファイルが生成されているはずです。
- id_ed25519
- id_ed25519.pub
pubがついていないものが秘密鍵、ついているものが公開鍵です。
公開鍵をauthorized_keysに書き込む
作成した公開鍵を利用できるようssh接続の認証時に参照されるファイルに書き込みます。
cat /home/[ユーザー名]/.ssh/id_ed25519 >> /home/[ユーザー名]/.ssh/authorized_keys
catコマンドでid_ed25519の中身をプロンプトに表示しauthorized_keysに書き込んでいるだけです。
エラーが起きていなければ書き込めているはずです。
秘密鍵をクライアント側に移動する
tera termでリモート接続していればファイル>SSH SCP…からクライアント側にファイルを移動できます。
Fromにサーバの秘密鍵ファイルのパスを入力し、Toにクライアントの任意ののディレクトリを入力してReceiveをクリックすればよいです。
サーバをリモート接続せず直接操作していればscpコマンドで転送しましょう。
scp /home/[サーバユーザー名]/.ssh/id_ed25519 [クライアントユーザー名]@[クライアントホスト名]:C:¥Windows¥ユーザー¥[ユーザー名]¥.ssh¥test_key
下記のルールで記載しています。
scp [送信ファイル] [送信先ユーザー名]@[送信先リモートホスト]:[送信先ファイルパス]
送信先ファイルパスは任意の場所で構いませんが、他ユーザーと共有するものではないため私はユーザーディレクトリ配下に置いています。
クライアントの端末が個人に割り当てられているものであればユーザーディレクトリ配下でなくてもどこでも構わないと思います。
test_keyというファイル名も任意ですので適当に分かりやすい名前にしてください。
パスワード認証を禁止する
デフォルト設定ではパスワード認証もできてしまうためパスワード認証を禁止します。
下記のコマンドを実行し、sshのコンフィグファイルを開きます。
vi /etc/ssh/sshd_config
PasswordAuthenticatonという項目があるはずなので、その項目をyesからnoに変更します。
変更後は下記になるはずです。
PasswordAuthentication no
ついでながらviコマンドはviエディタでファイルを開くコマンドです。
viエディタ上ではiを押下することで編集モードになります。
編集モードを終えるにはescを押し、保存するには:wqを順番に押します。
設定変更後に内容を反映するにはsshdの再起動が必要です。
まずはsshd_configの設定が間違っていないか確認するために下記コマンドを実行します。
systemctl status sshd
もしエラーが出力されればsshd_configの記載が誤っているため修正してください。
エラーが出なければ下記コマンドで再起動します。
systemctl restart sshd
これで設定は完了です。
CentOS7のサーバに公開鍵認証で接続する
TeraTermを利用して公開鍵認証接続を試します。
TeraTermを起動したら表示されるポップアップでホスト名を入力してください。
IPアドレスでも結構です。
他の項目はデフォルトでいいと思いますが、インストール後設定をいじっていればTCPを22、サービスをSSHとしてください。
そしてOKボタンをクリックします。
SSH認証ポップアップが表示されるため、ユーザー名とこの手順の中で作成したパスフレーズを入力します。
Authentication Methodでプレインパスワードを使うが選択されていると思うので、RSA/DSA/ECDSA/ed25519鍵を使うを選択し直します。
秘密鍵にはクライアント側に持ってきた秘密鍵のパスを選択します。
この手順の場合下記になります。
C:¥Windows¥ユーザー¥[ユーザー名]¥.ssh¥test_key
この状態でOKを押せば接続完了です。