公開鍵認証でssh接続するための設定手順
はじめに
公開鍵認証でのssh接続の設定をよく行うのでここにまとめます。
前提と環境
この記事では、クライアント側(ユーザーのパソコン等)とサーバー側(VPSなど)のOSは両方共Ubuntuとしますが、サーバー側のOSはLinuxであれば基本的に同じ作業となります。また、クライアント側についても、Windows Subsystems for LinuxやmacOSであれば同じ作業となります。
- クライアント側OS : Ubuntu18.04
- サーバー側OS : Ubuntu18.04
作業の流れ
作業の流れは以下のようになります。大きく分けて2ステップだけです。
- クライアント側で公開鍵と秘密鍵を作成する
- サーバ側でクライアント側で作成した公開鍵を登録する
以下のサイト様が参考になりました。
VPSによるWebサーバー運用講座の連載2回目です。 今回は、安全にsshのログインを行うため「公開鍵認証(こうかいかぎにんしょう」の設定をします。 公開鍵認証は、そのメカニズムが複雑なため、設定する段階で挫折してしまう方が多いようです。ここでは理論はとりあえず置いといて、設定ができることに重点をおき説明します。今まで公開鍵認証の設定で苦労した方にご一読いた……
もしGoogle Compute EngineのインスタンスにSSH接続したい場合は、以降に記載するクライアント側での作業は同じでサーバ側での作業だけ異なります。 詳しくは以下にまとめました。
クライアント側での作業
まずはじめに接続元となるクライアント側で公開鍵と秘密鍵を作成します。ここでは、クライアント側はUbuntuですが、Windows Subsystems for LinuxやmacOSでも手順は同じです。作成は非常に簡単でssh-keygen
コマンドで作成可能です。実際に鍵を作成する前に、ホームディレクトリに.ssh
というディレクトリを作成して権限を700
(所有ユーザのみ操作可)にしておきます。
$ mkdir .ssh
$ chmod 700 .ssh/
$ cd .ssh
あとは以下のようにssh-keygen
を使用して公開鍵と秘密鍵の両方を作成します。
$ ssh-keygen -t rsa -b 4096
上記では、RSAという暗号化方式で 4096 という値はビット数で鍵の長さを指定しています。ssh-keygen
については、以下の参考サイト様に網羅されおり大変参考になりました。
上記のコマンドを実行すると、以下のように作成する秘密鍵のファイル名を確認されます。何も入力せずに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つが作成されていることを確認できます。
$ ls
id_rsa id_rsa.pub
なお、秘密鍵のid_rsa
の権限は、600
になっていることを確認してください。これがその他の権限になっていると、後々ssh接続の際にエラーとなります。
あとは、公開鍵id_rsa.pub
の中身を、サーバ側に登録します。id_rsa.pub
の中身は以下のようになっています。
$ 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です。
$ vi authorized_keys
そしてauthorized_keys
ファイルの中に、先程クライアント側で作成した公開鍵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
もしすでにauthorized_keys
が存在し、中に別の公開鍵が登録されている場合は、新しい行にペーストすればOKです。
そしてauthorized_keys
の権限を600に設定しておきます。
$ chmod 600 authorized_keys
以上で公開鍵認証を使って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 -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 -i id_rsa -p 10022 vpsusername@xxx.xxx.xxx.xxx
上記のような長いコマンドを、ssh用の設定ファイルを作成しておくことで短縮できます。
具体的には、クライアント側の.ssh
配下に、config
という名前のファイルを作成して、以下のような内容にします。
Host myvps
HostName xxx.xxx.xxx.xxx
Port 10022
IdentityFile ~/.ssh/id_rsa
User vpsusername
おそらく先程のsshコマンドと比較すればどれがどこに対応しているか分かるかと思います。Host
で指定したmyvps
で以下のようにssh接続できるようになります。
$ ssh myvps
config
にはもちろん以下のように複数追記できます。
Host 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という部分を変更します。
#(変更前)
# Port 22
# (変更後)
Port 10022
コメントアウトを外してポート番号を10022に設定しています。 sshd_config変更後は以下でsshを再起動します。
$ sudo systemctl restart ssh
以上でポート番号の変更が完了です。
パスワード認証によるssh接続を無効化する sshは、ここで説明した公開鍵認証だけでなく、より簡単な1つのパスワード認証ももちろん可能です。ただし、パスワード認証だけではセキュリティリスクとなりえるため、ポート番号を変更した手順と同様に、sshd_configを修正して無効化します。具体的には、以下のようにPasswordAuthenticationをnoにするだけです。
PasswordAuthentication no
ただし、上記設定を行う前に、公開鍵認証がすでに成功していることを確認してください。 あとはsshd_config変更後は以下で再起動して完了です。
$ sudo systemctl restart ssh
まとめ
はじめて公開鍵認証でのssh接続を設定した際は全ての用語がわからず中々うまくいかなかった印象ですが、何回も設定を行う過程で理解が進むと思います。
関連記事
- 公開日:2020/02/16 更新日:2020/02/16
圧縮、暗号化、リモート対応の差分バックアップを作成できる「Borg Backup」の使い方
圧縮、暗号化に対応し差分バックアップを作成できるソフトウェアである「Borg Backup」をUbuntuにインストールして使ってみたのでその手順をまとめます。「Borg Backup」はLinux、macOSに対応しています。
- 公開日:2020/02/14 更新日:2020/02/14
自分専用の後で読むサービスを構築できる「Wallabag」をUbuntu + Nginxで構築する手順
後で読むサービスのPocketにかなり近く、機能豊富なオープンソースのWallabagをUbuntuにインストールしたのでその手順をまとめます。
- 公開日:2020/02/12 更新日:2020/02/12
ファイル単位で暗号化して保存できるCryptomatorをインストールして使う手順
Cryptomatorは、ファイル単位での暗号化が可能なソフトウェアです。この記事では、UbuntuにCryptomatorをインストールする手順と使い方をまとめます。
- 公開日:2020/01/22 更新日:2020/01/22
WireGuardでVPNサーバーを構築してスマホやPCから接続する手順
WireGuardはOpenVPNよりもシンプルで高速、より安全なVPNとして開発が進められており、OpenVPNに代わるVPNとして期待されています。この記事ではWireGuardを使ってVPNサーバーを構築し、そのVPNサーバーにUbuntuやiPhoneから実際に接続してみるまでの手順をまとめます。
- 公開日:2020/01/17 更新日:2020/01/17
ディレクトリ表示や移動をインタラクティブに実行できるコマンドツール「Broot」
Linuxで端末を使っている時にディレクトリ構造をざっくり確認したり各ディレクトリにどのようなファイルが入っているかを確認したりしたい場合があると思います。Brootはディレクトリ構造を表示しつつさらにそこから各ディレクトリに移動したりファイルを検索したりできるコマンドラインツールです。