公開鍵認証を用いたサーバへのSSH接続の各種設定

基本中の基本ですが、何かと聞かれることがあるのでメモ。
公開鍵暗号についての説明は省略します。

※ 以下の操作を行った結果サーバに接続できなくなる可能性があるため、サーバへの物理的なアクセスができない環境である場合は、もしものためにSSH接続を確立させておいて、接続できなくなった時にそこから設定を元に戻すことができるようにしておきましょう。

鍵ペアの作成

まずは公開鍵と秘密鍵のペアを作ります。
鍵ペアはホームディレクトリ下の.sshディレクトリに格納するのが一般的です。

$ mkdir ~/.ssh
$ cd ~/.ssh

では実際に鍵ペアを生成します。ssh-keygenを使用します。

$ ssh-keygen

するとこのような応答が返ってきます。

Generating public/private rsa key pair.
Enter file in which to save the key(/Users/username/.ssh/id_rsa):

これは、鍵ペアを保存する場所を尋ねられています。入力を省略すると括弧内の場所に保存されます。
今回は~/.ssh/にhogeという名前で保存してみます。hogeと入力してEnterで次に進みます。

Enter passphrase (empty for no passphrase):

お次はパスフレーズを尋ねられています。
これは秘密鍵を使用する際に必要となるもので、これを設定すると秘密鍵が流出してもパスフレーズがバレなければ悪用を防ぐことができます。

状況によっては設定する必要がありますが、今回は設定を省略するので、そのままEnterで次に進みます。 ちなみにパスフレーズは2回聞かれるので、2回目も同様に何も入力せずにEnterで次に進みます。

Your identification has been saved in hoge.
Your public key has been saved in hoge.pub.
The key fingerprint is:
SHA256:jjA8XXvt+OlsAg3ty/2X+oD6oTdLvVajGBKYLQpEACQ username@hostname

これで鍵ペアが生成されました。

生成された鍵ペアの確認

先ほど生成した鍵ペアを確認してみます。

$ ls ~/.ssh
hoge hoge.pub

hoge秘密鍵hoge.pubが公開鍵です。 試しに公開鍵がどんなものかを覗いてみましょう。

$ cat ~/.ssh/hoge.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7/JW8d0cElqC2vk+UAg81OQP0I0fmEWGId+bbUboN2xjW0u148EvtEeyxqrme18tfagvGcVoHv5bSgpsyFSqOgvkMEfRpfkwdf738lZ10KeIMgLqk5A3ZijlUM9E5rbiGZrp8o7q/0ADWbxBQu1CLV1M1Xl2lC3hUn6k5xx8V0U+la8XHWl7mXtQ7kvlYs5HaxvijxxoanKOoPQqaH9U4oJxSdEQYEJCvfZppvd6Sj4hgWHO7WBI76PdMhSmyXY0LV49nL7d9oe/wMlGDavYIb8kGFZRGiLpW+Ie26TOYHoZJTv7U8AK5lrA3emYz8+C9THIdK1MjHQlwifUhuYsh username@hostname

何やら長い文字列が出てきました。こちらが公開鍵です。
秘密鍵も同様にして確認できますが、セキュリティ的に問題があるためやめておいた方がいいかと思います。

公開鍵の転送

サーバに公開鍵を転送します。今回はとりあえずホームディレクトリに転送します。

$ scp ~/.ssh/hoge.pub username@server_ip:~

実際にはusernameにはサーバ上のユーザ名、server_ipの部分はサーバのIPアドレスドメインを入れます。
パスワードを聞かれたときは、サーバ上のユーザで設定しているパスワードを入力します。

hoge.pub                                      100%  410    40.0KB/s   00:00

上のようになれば転送完了です。

サーバ上のSSHサーバ(sshd: ssh daemon)は~/.ssh/authorized_keysに登録されている公開鍵を見て認証を行います。
とりあえず.sshディレクトリを作成してその中にauthorized_keysを作成します。

$ ssh username@server_ip
$ (server) mkdir ~/.ssh
$ (server) touch ~/.ssh/authorized_keys

ホームディレクトリにある公開鍵(hoge.pub)をauthorized_keysへ追記します。
追記が完了すれば元のファイルは要らないので消してしまいましょう。

$ (server) cat ~/hoge.pub >> ~/.ssh/authorized_keys
$ (server) rm ~/hoge.pub

これでサーバへの公開鍵の登録は完了です。

SSH接続

では実際に秘密鍵を用いてサーバへSSH接続してみましょう。
秘密鍵の指定は以下のように -i で行います。

$ ssh username@server_ip -i ~/.ssh/hoge

これで無事接続できれば成功です。

秘密鍵指定の省略

SSH接続のたびに秘密鍵を指定するのは面倒すぎるので、configファイルを作成して省略しましょう。
以下のようなファイルを~/.ssh/config に作成することで簡単にSSH接続できるようになります。

Host server_name
  HostName server_ip
  User username
  IdentityFile    ~/.ssh/hoge

server_nameはサーバの名前を自由に決めて設定してください。
上のようにサーバの名前を設定すると、次回から以下のような簡単なコマンドで接続できます。

$ ssh server_name

パスワード認証の禁止(option, root権限が必要)

上の設定で公開鍵認証を用いたSSH接続を行うことができましたが、現状ではパスワード認証も行うことができるはずです。
セキュリティを考えるならば、パスワード認証は禁止にすべきです。

sshdの設定ファイルは /etc/ssh/sshd_config にあります。ssh_configでないことに注意です。
デフォルトだと上のファイルでパスワード認証は許可されていますが、以下のように禁止にしましょう。

(前略)
# PasswordAuthentication yes
PasswordAuthentication no
(後略)

設定を変更したら、sshdを再起動しましょう。OSによって再起動の方法は異なりますが、以下のいずれかのようなコマンドで出来ると思います。

sudo systemctl restart sshd
sudo service sshd restart
sudo /etc/init.d/sshd restart

sshdを再起動したあと、パスワード認証でログインを試みて失敗すれば成功です。

思ったこと

これぐらいは何も見ずに出来るようになるべきかなぁ、と思った。