SSH公開鍵認証の設定方法を学んだのでまとめてみた

こんにちは。 エキサイト株式会社で内定者アルバイトをしています。

今回は、業務中に学んだ「SSH公開鍵認証の設定方法」についてまとめていきたいと思います。

そもそも公開鍵認証とは?

公開鍵認証では、自分だけが持ち他人に知られてはならない秘密鍵(private key)と誰でも知ることができる公開鍵(public key)を用いて認証を行います。 安全にサーバへのログインを行うために用いられることが多いです。

公開鍵と秘密鍵は対になっており、公開鍵を使って暗号化したメッセージは秘密鍵でしか復号できません。また、逆も同様に成り立ちます。

公開鍵認証では、公開鍵と秘密鍵のこの性質を利用します。すなわち、以下のような手順で設定および認証が行われます。

  1. サーバにログインしようとするユーザは公開鍵と秘密鍵のペアを作成する
  2. 公開鍵をサーバに登録する
  3. ユーザは秘密鍵を用いて「署名」を作成し、サーバに送信する
  4. サーバは受け取った署名を登録された公開鍵で検証する。検証が成功すればログインを許可し、失敗した場合はログインを拒否する。

さまざまな場面で使われるパスワード認証と比較した場合の最大の利点は、認証のための情報がネットワーク上に送信されないということです。 パスワード認証では入力したパスワードがネットワーク上を流れサーバに届けられますが、公開鍵認証ではサーバに届くのは署名であり、秘密鍵はネットワーク上を流れることはありません。 したがって、通信の盗聴に対して堅牢であると言えます。

次の章では実際に、この認証を実現するための設定をしていきます。

ではどうやって設定するのか?

鍵ペアの作成

まずは、鍵を生成します。

ssh-keygen -t ed25519

-t オプションでは鍵の生成に使用するアルゴリズムを指定します。ここではed25519(楕円曲線を用いたアルゴリズムの一つ)を指定しています。

ただし、サーバの中にはこのed25519に対応していないレガシーなものもあります。その場合には例えば以下のようにrsaを使いましょう。

ssh-keygen -t rsa -b 4096

-bオプションでは鍵のサイズを指定できます。一般的には鍵サイズが大きくなると、より安全になります。

上記コマンドを実行すると以下のようになり、成功すれば鍵が生成されます。

Enter file in which to save the key (/Users/--username--/.ssh/id_rsa): ← 鍵を保存するファイルを指定します。デフォルトでは/Users/--username--/.ssh/id_rsaになります。
Enter passphrase (empty for no passphrase): ← 鍵に設定するパスフレーズを入力します。設定しない場合はそのままEnterを押します。
Enter same passphrase again: ← パスフレーズの確認です。
Your identification has been saved in /Users/--username--/.ssh/id_rsa
Your public key has been saved in /Users/--username--/.ssh/id_rsa.pub
The key fingerprint is:
---fingerprintがここに表示される---
The key's randomart image is:
---randomart imageがここに表示される---

上記の例では秘密鍵id_rsaに、公開鍵がid_rsa.pubに格納されています。

SSH configファイルの設定

次に、SSH configファイルに設定を書き込みます。

SSH configファイルは~/.ssh/configにあり、SSH接続するためのコマンドの情報を省略するための設定ファイルです。

ファイルには接続するサーバひとつにつき、以下のような内容を記述します。

Host example-host  # 任意の名前
  HostName example-hostname  # 接続したいサーバ
  User example-username  # 接続したいサーバでのユーザ名
  IdentityFile ~/.ssh/id_rsa  # 鍵ファイルへのパス(PC内)

サーバ上での鍵の設定

次に、サーバ上に公開鍵を登録します。

まずはパスワード認証か何かでサーバ内にログインします。(ここだけは、公開鍵認証以外で入る必要があります。)

次に、設定のためのファイルを格納するディレクトリを作成します。

mkdir .ssh

そしてこのディレクトリの権限を変更します。

chmod 700 .ssh

ちなみに、UNIXLinuxではファイルとディレクトリの権限を8進法3桁の数字で表現します。各桁は先頭から自分(ログインユーザ)、グループ、その他に与える権限を表しており、実行許可が1、書き込み許可が2、読み取り許可が4を表しています。0は権限なしを表します。例えば、実行と読み取りを許可したければ、1 + 4で5となります。

したがって、上記の700はログインユーザのみに実行、書き込み、読み取り(4 + 2 + 1)全ての権限を与えることを表しています。

権限を設定したら、.sshディレクトリに移動してauthorized_keysというファイルを編集します。このファイルにはアクセスを許可するユーザが持つ鍵ペアの公開鍵を保存しておきます。

cd .ssh
vim authorized_keys

authorized_keysにローカルで生成した公開鍵をコピペします。

最後に、authorized_keysファイルに対して、自分だけに書き込み、読み取りの権限を与えます。

そう、

chmod 600 authorized_keys

です。

これで、全ての設定が完了しました!

最後にパスワード認証なしでログインできるかを確認しておきましょう。

ssh example-host

example-hostの部分は、SSH configに設定した「任意の名前」に変更してください。

ちなみに...

ここでは、手動で.sshディレクトリやauthorized_keysファイルの作成、権限の設定を行いましたが、実はローカル環境で以下のコマンドを実行することでこれらを全てやってくれます。今回は、内部で何が行われているのかを理解することも目的であったので、上記のような方法を用いました。

ssh-copy-id example-username@example-hostname

登録に使用される公開鍵ファイルはデフォルトでは~/.ssh/id_rsa_XXX.pubが自動で検索されて使用されますが、 -i "登録する公開鍵ファイル"オプションで変更することも可能です。

終わりに

今回は、SSH公開鍵認証を使ってサーバにログインするための設定方法についてまとめました。

では、また次回。

参考にしたもの