Linux

公開鍵認証でssh接続するための設定手順


Photo by Taylor Vick on Unsplash

はじめに

公開鍵認証でのssh接続の設定をよく行うのでここにまとめます。

前提と環境

この記事では、クライアント側(ユーザーのパソコン等)とサーバー側(VPSなど)のOSは両方共Ubuntuとしますが、サーバー側のOSはLinuxであれば基本的に同じ作業となります。また、クライアント側についても、Windows Subsystems for LinuxやmacOSであれば同じ作業となります。

  • クライアント側OS : Ubuntu18.04
  • サーバー側OS : Ubuntu18.04

作業の流れ

作業の流れは以下のようになります。大きく分けて2ステップだけです。

  • クライアント側で公開鍵と秘密鍵を作成する
  • サーバ側でクライアント側で作成した公開鍵を登録する

以下のサイト様が参考になりました。

「よく分かる公開鍵認証」~初心者でもよくわかる!VPSによるWebサーバー運用講座(2) | さくらのナレッジ

VPSによるWebサーバー運用講座の連載2回目です。 今回は、安全にsshのログインを行うため「公開鍵認証(こうかいかぎにんしょう」の設定をします。 公開鍵認証は、そのメカニズムが複雑なため、設定する段階で挫折してしまう方が多いようです。ここでは理論はとりあえず置いといて、設定ができることに重点をおき説明します。今まで公開鍵認証の設定で苦労した方にご一読いた……

クライアント側での作業

まずはじめに接続元となるクライアント側で公開鍵と秘密鍵を作成します。ここでは、クライアント側はUbuntuですが、Windows Subsystems for LinuxやmacOSでも手順は同じです。作成は非常に簡単でssh-keygenコマンドで作成可能です。実際に鍵を作成する前に、ホームディレクトリに.sshというディレクトリを作成して権限を700(所有ユーザのみ操作可)にしておきます。

~/$ mkdir .ssh
$ chmod 700 .ssh/
$ cd .ssh

あとは以下のようにssh-keygenを使用して公開鍵と秘密鍵の両方を作成します。

~/.ssh$ ssh-keygen -t rsa -b 4096

上記では、RSAという暗号化方式で 4096 という値はビット数で鍵の長さを指定しています。ssh-keygenについては、以下の参考サイト様に網羅されおり大変参考になりました。

SSH-KEYGEN (1)

OpenSSH-7.3p1 日本語マニュアルページ

上記のコマンドを実行すると、以下のように作成する秘密鍵のファイル名を確認されます。何も入力せずにEnterを押下すると、デフォルトのid_rsaという名前で作成されます。

$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):

Enterを押下すると、続いてパスフレーズを確認されます。2回入力します。何も入力しない場合はパスフレーズなしとなりますが、基本的には設定するのがベターです。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

上記が完了すると、最終的に以下のようなメッセージが表示されて公開鍵と秘密鍵の作成が完了します。

Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:SHA256:sawrngnbieBhebKbfueKUBEbuget,
The key's randomart image is:
+---[RSA 4096]----+
|    -A_O.   .    |
|   ..A. =        |
|    oB=O*        |
|   o. =  o       |
|    *...A -      ||   = - A C       ||  DD o o        |
|   P-A .         |
| .A...           |
+----[SHA256]-----+

~/.sshを見てみると、秘密鍵のid_rsaと公開鍵のid_rsa.pubの2つが作成されていることを確認できます。

~/.ssh$ ls
id_rsa id_rsa.pub

なお、秘密鍵のid_rsaの権限は、600になっていることを確認してください。これがその他の権限になっていると、後々ssh接続の際にエラーとなります。

あとは、公開鍵id_rsa.pubの中身を、サーバ側に登録します。id_rsa.pubの中身は以下のようになっています。

~/.ssh$ cat id_rsa.pub
ssh-rsa AAAAAAAACCCCDDDDDDfaljetlame/kgwae/A:Fp:ePEI:TJP"e'ptoi/pRpydAbTfWLAF:pikp;i;jugYgywriYWVRIYQWRKQlirkg,w;reg;ogleowvdgvbiuqceqLuSFyS08r/Glmak8YwyufYrF29CXajV+ZxcnG/OLoPstHEi1ENrP8JhbaJose0EDvL4V1AW9ITG+dgmyqtFf4okzP6xZru16sbSin9YH46KeAMVdV07DBACXnF/o0zbi4rekLeuBSqfu11SK8u7O0MFoXQLXkBKjlKv+NHddAHzzhbymyX3ieuuvDkAp1SG2oXF/mH8VQCdUNA70Ff3D+8byIdUQN8oK+j1pfz/p1Jr1d1NGR5c+frnAgjACEyaQcSe8adQmCU+aETKQmaweorjtawp0rg000q0qpwifoqw0w-- username@mypc

上記のssh-rsa AAA...をクリップボードにコピーしておき、後ほどサーバ側で適切なファイルの中にペーストします。

サーバ側での作業

サーバ側での作業も簡単です。クライアント側での作業と同様に、ホームディレクトリに.sshというディレクトリを作成して権限を700に設定しておきます。

~/$ mkdir .ssh
$ chmod 700 .ssh/
$ cd .ssh

後は.ssh配下に、authorized_keysというファイルを作成します。以下ではviエディタを使用していますが、emacsやnanoなどお好きなエディタでOKです。

~/.ssh$ vi authorized_keys

そしてauthorized_keysファイルの中に、先程クライアント側で作成した公開鍵id_rsa.pubの中身をペーストします。

~/.ssh/authorized_keysssh-rsa AAAAAAAACCCCDDDDDDfaljetlame/kgwae/A:Fp:ePEI:TJP"e'ptoi/pRpydAbTfWLAF:pikp;i;jugYgywriYWVRIYQWRKQlirkg,w;reg;ogleowvdgvbiuqceqLuSFyS08r/Glmak8YwyufYrF29CXajV+ZxcnG/OLoPstHEi1ENrP8JhbaJose0EDvL4V1AW9ITG+dgmyqtFf4okzP6xZru16sbSin9YH46KeAMVdV07DBACXnF/o0zbi4rekLeuBSqfu11SK8u7O0MFoXQLXkBKjlKv+NHddAHzzhbymyX3ieuuvDkAp1SG2oXF/mH8VQCdUNA70Ff3D+8byIdUQN8oK+j1pfz/p1Jr1d1NGR5c+frnAgjACEyaQcSe8adQmCU+aETKQmaweorjtawp0rg000q0qpwifoqw0w-- username@mypc

もしすでにauthorized_keysが存在し、中に別の公開鍵が登録されている場合は、新しい行にペーストすればOKです。
そしてauthorized_keysの権限を600に設定しておきます。

~/.ssh$ chmod 600 authorized_keys

以上で公開鍵認証を使ってssh接続するために必要な設定は全て完了です。後は実際にクライアント側からサーバに接続してみます。

公開鍵認証を使ってサーバにssh接続する

実際にクライアント側からサーバにssh接続します。以下のコマンドで接続できます。

~/.ssh$ ssh -i id_rsa vpsusername@xxx.xxx.xxx.xxx

サーバ側に登録済のユーザ名vpsusernameとサーバのIPアドレスxxx.xxx.xxx.xxxが必要となります。
-i id_rsaで秘密鍵を使って公開鍵認証によるssh接続を指定しています。
もしssh-keygenでの秘密鍵の作成時にパスフレーズを設定した場合は、以下のようにパスフレーズを聞かれるので入力してEnterを押下します。

~/.ssh$ ssh -i id_rsa vpsusername@xxx.xxx.xxx.xxx
Enter passphrase for key '/home/username/.ssh/id_rsa':

以上で公開鍵認証によるssh接続ができました。以降にいくつか参考として情報を記載します。

設定ファイルを作成してssh接続を楽にする

ssh接続の度に-i id_rsaのようにオプションを設定するのは億劫です。また、セキュリティ対策としてサーバー側で許可されているssh接続に使用するポート番号が、デフォルトの22ではなく、例えば10022の別番号に設定されている場合は、さらに-p 10022というオプションを設定する必要があり、最終的に以下のようなコマンドになります。

~/.ssh$ ssh -i id_rsa -p 10022 vpsusername@xxx.xxx.xxx.xxx

上記のような長いコマンドを、ssh用の設定ファイルを作成しておくことで短縮できます。
具体的には、クライアント側の.ssh配下に、configという名前のファイルを作成して、以下のような内容にします。

~/.ssh/configHost myvps
  HostName xxx.xxx.xxx.xxx
  Port 10022
  IdentityFile ~/.ssh/id_rsa
  User vpsusername

おそらく先程のsshコマンドと比較すればどれがどこに対応しているか分かるかと思います。Hostで指定したmyvpsで以下のようにssh接続できるようになります。

~/.ssh$ ssh myvps

configにはもちろん以下のように複数追記できます。

~/.ssh/configHost myvps
  HostName xxx.xxx.xxx.xxx
  Port 10022
  IdentityFile ~/.ssh/id_rsa
  User vpsusername
Host sakuravps
  HostName xxx.xxx.xxx.xxx
  Port 22
  IdentityFile ~/.ssh/id_rsa.sakuravps
  User sakuravpsuser

.ssh/configを使用することで、複数のサーバに接続する場合でも管理もしやすくなり、コマンドも短縮できます。

セキュリティ強化のための追加設定

ssh接続周りがセキュリティ的に弱いと、サーバを丸ごと乗っ取られる可能性も大いにあるため、最低限の対策は必要です。例えば、ssh接続するポート番号の変更、パスワード認証によるssh接続の無効化が挙げられます。それぞれについて参考として以降に載せます。いずれもサーバ側での作業となります。

ssh接続するポート番号を変更する

sshは、デフォルトではポート番号22を使用します。そしてこれは攻撃者も当然ながら把握しているため、とりあえずポート番号22への攻撃を行います。そこで、デフォルトのままのポート番号22を使用せずに、適当なポート番号に変更しておきます。変更はsshの設定ファイルを修正して行います。例えばUbuntuの場合は、/etc/ssh/sshd_configがsshの設定ファイルとなります。

$ sudo vi /etc/ssh/sshd_config

そしてこの/etc/ssh/sshd_config内の、Portという部分を変更します。

/etc/ssh/sshd_config#(変更前)
# Port 22
# (変更後)
Port 10022 

コメントアウトを外してポート番号を10022に設定しています。
sshd_config変更後は以下でsshを再起動します。

$ sudo systemctl restart ssh

以上でポート番号の変更が完了です。

パスワード認証によるssh接続を無効化する

sshは、ここで説明した公開鍵認証だけでなく、より簡単な1つのパスワード認証ももちろん可能です。ただし、パスワード認証だけではセキュリティリスクとなりえるため、ポート番号を変更した手順と同様に、sshd_configを修正して無効化します。具体的には、以下のようにPasswordAuthenticationnoにするだけです。

/etc/ssh/sshd_configPasswordAuthentication no

ただし、上記設定を行う前に、公開鍵認証がすでに成功していることを確認してください。
あとはsshd_config変更後は以下で再起動して完了です。

$ sudo systemctl restart ssh

まとめ

はじめて公開鍵認証でのssh接続を設定した際は全ての用語がわからず中々うまくいかなかった印象ですが、何回も設定を行う過程で理解が進むと思います。

SPONSORED LINK

コメントを残す

メールアドレスが公開されることはありません。