公開鍵認証とは公開された鍵による認証だ。そのままだが、ざっくりの説明が難しいので順々に理解していただければと思う。
このページではSSHにおける公開鍵認証についてお伝えしよう。
SSHにおける公開鍵認証
SSHは下記で説明したとおり、二段階の認証を行う、ホスト認証とユーザ認証だ。
ホスト認証を終えると、次にユーザ認証を開始する。ホスト認証が「ホストに正当性があるかを確認する認証」だったのに対して、ユーザ認証は「実際のログイン処理」を行う。
ここでサーバ側のユーザ名とパスワードを入力することでログインできるが、ユーザ認証の段階でも「公開鍵認証」によるログインが可能となっている。
通常パスワードによるログインも可能になっているが、セキュリティの関係上、公開鍵認証を設定することがほとんどだろう。
実際にキーを生成する
今回はクライアント側で鍵を生成することにする。
ログインを公開鍵認証とするにはまず、公開鍵と秘密鍵のペアを生成しなければならない。鍵を生成するには「ssh-keygen」コマンドを使用する。例えば
$ ssh-keygen -t rsa
もしくは
$ ssh-keygen -t ecdsa
とするとrsaかecdsaの鍵ペアを生成することが出来る。
実行すると下記のような流れで質問されるはずだ。
「鍵をどこに生成するか?」「パスフレーズは何にするか?」という質問がされる。鍵の生成場所はデフォルトのままで問題ない、パスフレーズは少なくともログインパスワードとは違うもので、10文字以上数字と記号をおりまぜたものを設定しよう。
ssh-keygenのオプションは、おおまかに下記のようなものがある。
- -f 鍵ファイルを指定
- -t 暗号タイプを指定
- -p 既存の鍵ファイルのパスフレーズを変更
- -P 古いパスフレーズを指定
- -N 新しいパスフレーズを指定
- -l フィンガープリントを表示する
- -R 指定されたホストの鍵をknow_hostsから抹消する
また暗号タイプには以下のようなものがある。
- rsa1 ssh1世代の暗号形式、基本的には使用してはいけない。
- rsa 現代比較的主流な暗号形式、モダンなssh2環境にてサポートされている。
- dsa モダンなssh2環境にてサポートされている形式の暗号だが、鍵長がこころもとない。
- ecdsa dsaの変種で、短い鍵長でも十分な安全性が確保できるようになっている。
デフォルトでは「/home/<ユーザ名>.ssh/」の下に鍵のペアが生成されるはずだ。ssh1以外は「id_<鍵タイプ>」が秘密鍵であり、「id_<鍵タイプ>.pub」が公開鍵である。ssh1の場合「identity」が秘密鍵、「identity.pub」が公開鍵となるが、ssh1は使用しないようにしよう。
実際に鍵をのぞいてみよう、今回は「ecdsa」形式で鍵を作成した。
秘密鍵
$ cat ~/.ssh/id_ecdsa
公開鍵
$ cat ~/.ssh/id_ecdsa.pub
内容の鍵長がながければ長いほど、文字列も長くなる。今回はecdsaを使用したので比較的短いものとなっている。
公開鍵形式を使用して接続してみる
鍵の作成が完了したら、なにかしらの方法(例えばSFTPなど)で公開鍵をサーバへ転送する。そして公開鍵を「~/.ssh/authorized_keys」に登録する。
$ cat id_ecdsa.pub >> ~/.ssh/authorized_keys
パーミッションも厳格にするため
$ chmod 600 ~/.ssh/authorized_keys
とする
この時点で「公開鍵認証」でのログインが可能になっているので、sshを接続している場合は一旦接続を切断して再度接続してみよう、鍵作成時に設定したパスフレーズをうちこむとログイン出来るはずだ。
ssh-agentを使用してみる
さきほどログインするときに鍵のパスフレーズをきかれたが、パスフレーズ入力を一時的に自動化することも可能だ。そのためには「ssh-agent」というものを使用する。
まずは適切にssh-agentを起動する。ssh-agentコマンドだけで起動すると環境変数の設定を手動にしなければならないので、手間を省くために「eval ssh-agent」とする。
1 |
$ eval `ssh-agent` |
ssh-addコマンドを使用して鍵を登録、覚えてもらう、秘密鍵を指定する
$ ssh-add ~/.ssh/id_<暗号タイプ>
パスフレーズをきかれるのでうちこむ。
$ ssh-add -l
-lオプションで登録されている情報を確認出来る。
以上をおこなって、確認したら、サーバへ接続してみよう。直接ログインできるはずだ。なお一度シェルを終了してもプロセスがいきている状態になるので正常に終了するには
1 |
$ eval `ssh-agent -k` |
を実行しよう。
またssh-agentを終了した場合ssh-addコマンドを再度実行する必要がある。またセキュリティ面では秘密鍵をメモリに保存しておくため、危険がともなうことを念頭において使用しよう。
SSHの設定を見直す
# vi /etc/ssh/sshd_config
1 2 3 4 5 6 7 8 9 10 11 |
# ssh1を使用禁止にする。 Protcol 2 # パスワードでのログインを禁止する PasswordAuthentication no # rootでのログインを禁止する PermitRootLogin no # AllowUsersを利用するとログインできるユーザやホストのアドレスを指定できる。 AllowUsers <ユーザ名>@<アドレス> |
設定を終えたらサービスを再起動することを思い出そう。
# systemctl restart sshd.service
もし現状SSHで接続している場合、サービスの再起動に支障をきたす場合がある。直接実機コンソールを叩くか、サーバ自体を再起動するという選択肢もある。
まとめ
このページでは公開鍵認証についてお伝えした。少々わかりにくい
コメント