sshの鍵認証設定
この記事では、クライアント端末からサーバへの鍵認証によるssh接続の設定方法を紹介します。
sshではデフォルトでパスワードによる認証が実施できますが、よりセキュリティの高い認証方式として鍵認証という方法があります。
今回は、クライアント端末をMac、サーバをArch Linuxと想定して、鍵認証方式を設定します。
鍵認証の設定においては、パスワード認証によるsshが実施できることが前提となっていますので、まだパスワード認証によるssh接続を設定していない場合はsshの基本設計から設定してください。
公開鍵、秘密鍵の生成
クライアント端末での~/.sshディレクトリの作成
クライアント端末側で、ターミナルからホームディレクトリを開いた状態にします。以下のコマンドでディレクトリ・ファイルの一覧を表示し、~/.sshディレクトリの有無を確認します。
(クライアント端末)$ ls -la
~/.sshディレクトリが存在しなければ、以下のコマンドでディレクトリを作成して、700のアクセス権限(ディレクトリのオーナー以外はアクセス不可)を付与します。
(クライアント端末)$ mkdir ~/.ssh
(クライアント端末)$ chmod 700 ~/.ssh
公開鍵と秘密鍵の生成
sshの鍵認証では、一般的にrsaが利用されていますが、最近は、ecdsaやed25519などのよりセキュアな暗号が利用できるようになっています。
今回は、セキュリティが高く鍵長を気にしなくて良いed25519を採用したいと思います。ただし、ed25519は対応していないサーバやクライアント端末がありますので、対応していない場合は、ecdsa(ecdsaも駄目ならrsaの4096bit)を利用します。
まず、以下のコマンドでssh-keygenコマンドでed25519の公開鍵 と秘密鍵を生成します。
パスフレーズは鍵にアクセスするためのパスワードになりますので、自分で適当な文字列を決めて入力してください。パスフレーズは今後鍵認証によるssh接続を行う時に必ず使います。
(クライアント端末)$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/mako/.ssh/id_ed25519): 【リターン】
Enter passphrase (empty for no passphrase):【パスフレーズを入力してリターン】
Enter same passphrase again:【パスフレーズを入力してリターン】
Your identification has been saved in /Users/mako/.ssh/id_ed25519.
Your public key has been saved in /Users/mako/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:ofgWrB3avuu1qALBy3EFHB3B+y7lqkLM9pXMzj7TE2Q mako@client-pc
The key's randomart image is:
+--[ED25519 256]--+
| .o=oo |
| . + |
|. . . . |
|.o . + E . |
|+.+ + X S |
|.B @ * |
|o.. * X o |
| ... O B . |
| .o+=@oo |
+----[SHA256]-----+
以下のコマンドでid_ed25519(秘密鍵)、 id_ed25519.pub(公開鍵)が作成されていることを確認します。
(クライアント端末)$ ls ~/.ssh
id_ed25519 id_ed25519.pub
公開鍵の設置
公開鍵の保存用ディレクトリとファイルの作成
サーバで公開鍵の保存用ディレクトリとファイルの作成をします。以下のコマンドでクライアント端末からパスワード認証によるsshでサーバにログインして、公開鍵の保存用ディレクトリとファイルの作成・アクセス権限付与を実施します。
既にサーバ上に公開鍵の保存用ディレクトリとファイルがある場合は実施は不要です。
(クライアント端末)$ ssh -p 【sshのポート番号】 【ユーザ名】@【サーバのIPアドレス】
(サーバ)$ mkdir ~/.ssh
(サーバ)$ touch ~/.ssh/authorized_keys
(サーバ)$ chmod 700 ~/.ssh
(サーバ)$ chmod 600 ~/.ssh/authorized_keys
(サーバ)$ exit
サーバへの公開鍵の設置
scpコマンドを利用して、安全にクライアント端末からサーバに公開鍵をコピーします。
(クライアント端末)$ scp -P 【sshのポート番号】 ~/.ssh/id_ed25519.pub 【ユーザ名】@【サーバのIPアドレス】:.ssh/
次に以下のコマンドでパスワード認証によるsshでサーバにログインして、公開鍵をauthorized_keysに登録します。登録が終わりましたらクライアント端末からコピーした公開鍵を削除します。
(クライアント端末)$ ssh -p 【sshのポート番号】 【ユーザ名】@【サーバのIPアドレス】
(サーバ)$ cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
(サーバ)$ rm -rf ~/.ssh/id_ed25519.pub
(サーバ)$ exit
鍵認証によるssh接続確認
以下のコマンドで鍵認証によるsshを実施して、先程入力したパスフレーズで接続できることを確認します。
(クライアント端末)$ ssh -p 【sshのポート番号】 【ユーザ名】@【サーバのIPアドレス】
パスワード認証によるssh接続の禁止
サーバのsshd設定ファイルの変更
鍵認証を設定したので、パスワード認証を禁止します。/etc/ssh/sshd_configの該当行を以下のように編集してください。
(サーバ)$ sudo vim /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
sshdサービスの再起動
以下のコマンドでサーバ上のsshdサービスを再起動します。
(サーバ)$ sudo systemctrl restart sshd.service
パスワード認証が禁止されたことを確認
サーバからログアウトせずに、クライアント端末から別のターミナルを起動して、パスワード認証によるssh接続が禁止され、鍵認証によるssh接続が許可されていることを確認します。
以下のコマンドを実行し、パスフレーズを入力せずにリターンキーを押下し、パスワード認証を聞かれずに、接続が拒否されることを確認します。
(クライアント端末)$ ssh -p 【sshのポート番号】 【ユーザ名】@【サーバのIPアドレス】
Enter passphrase for key '/Users/mako/.ssh/id_ed25519':【リターン】
【ユーザ名】@【サーバのIPアドレス】: Permission denied (publickey).
次に同様のコマンドでパスフレーズを入力して、鍵認証で接続できることを確認します。
(クライアント端末)$ ssh -p 【sshのポート番号】 【ユーザ名】@【サーバのIPアドレス】
Enter passphrase for key '/Users/mako/.ssh/id_ed25519':【パスフレーズを入力してリターン】
鍵認証で正常に接続できなかった場合は、先ほど残したままのサーバ側に接続しているターミナルから設定等に誤りがないか確認してください。
終わりに
今回は鍵認証によるssh接続の方法を紹介しました。今回の設定セキュリティを十分に確保したssh接続を実現できたと思います。
ですが、ssh接続を実施する際のコマンドが長く覚えづらいです。そこで、sshのconfigファイルを設定することで、エイリアスで接続できるようになります。
sshのconfigファイルの設定方法については~/.ssh/configによるssh接続の管理で紹介していますので、ぜひ読んでみてください。