公開鍵認証(キーペア認証)の大事なところだけざっくりと網羅した
こんにちは。アガルートITパートナーズの大野です。
キーペア認証(公開鍵認証)はSSHを利用した接続に必須の認証方法です。
サーバー管理をする上でSSH周りは特に気をつけたいところですので、知識をアップデートする意味でも一回まとめておきたいと思い執筆しました。
ちなみにSCPやSFTPなどのファイル転送も全てSSH接続の仕組みを利用しているので、鍵の仕組みは全て一緒と考えて良いです。
大まかな仕組み

上記の絵でほぼ説明しているのですが、要は以下のような仕組みです。
- 秘密鍵を使って署名を作る
- 公開鍵を使って署名を検証する(本人であることを確認する)
必ず秘密鍵と公開鍵はペアで使われるのでキーペア認証とも呼ばれています。
以下に秘密鍵・公開鍵の特徴をまとめますが、とにかく「秘密鍵は何があっても外に持ち出さない」とだけ覚えておけば良いかと思います。
秘密鍵
秘密鍵の特徴は以下のとおりです。
- 本人であることの署名を作成するのに使う
- (1)の特徴により、秘密鍵が漏洩した場合には署名が作りたい放題になる
公開鍵
公開鍵の特徴は以下のとおりです。
- 公開鍵は署名の検証にしか使えない
- (1)の特徴より公開鍵は署名の作成には使えないため、通信に乗せて移動をしても安全
キーペアに使う暗号の種類
キーペアの暗号には種類が多々あり、時代と共に変化しています。
略称が多いのでややこしいのですが、メジャーな暗号化の方式に以下のものがあります。
- DSA
- RSA
- ECDSA
- EdDSA (ED25519)
認証方式としてはRSAの歴史が長く、一番普及している形式です。
RSAの特性でセキュリティ強度を上げるためにビット長を長くする必要があり、ビット長が長くなるほど計算パワーが必要になってきます。
一般的にRSAを選ぶ場合は2048bit以上を選ぶ必要があると言われています。
今から鍵を作成するという場合には比較的新しい署名方式である ED25519 を選択しておけば安心でしょう。
ED25519はセキュリティ強度も高く維持しつつビット長が256bitなので計算負荷が低いという特徴があります。
公開鍵の作成と登録
Macで鍵を生成する手順です。windows10でも ssh-keygen がデフォルトで使えるようですのであまり変わりはないかと思います。
# ed25519形式で鍵を作成
% ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): 鍵を生成する際にパスフレーズを求められるので設定します。
秘密鍵が漏洩してもパスフレーズがわからないと署名できないようになるので、万一の時のための保険になります。
5桁6桁のパスフレーズは一瞬で解かれてしまうので、設定するなら10桁超で設定するべきかと思います。入力は非常に面倒になるので、OSに付属のssh-agentに設定を入れることをお勧めします。
入力が終わると ~/.ssh/ 以下にキーペアが生成されます。
% ls ~/.ssh/
id_ed25519 id_ed25519.pub 拡張子 .pubがついているものが公開鍵ですので、この鍵をサーバーサイドに設定する必要があります。
サーバーに公開鍵を登録
サーバーに公開鍵を登録していきます。
/home/{接続したいユーザー}/.ssh
配下に鍵を登録していきます。ディレクトリがなければ作成します。
# ohnoユーザーで接続できるようにする
% cd /home/ohno/
% mkdir .ssh
# 他のユーザーからアクセスできないようにする
% chmod 700 .ssh
# 公開鍵を登録する
% cd .ssh
% touch authorized_keys
% chmod 600 authorized_keys公開鍵用ファイルのデフォルト名は authorized_keys です。(サーバー側の sshd_config でファイル名が定義されていますが、デフォルトで使うことがほとんどです。)
このファイルを作成し公開鍵を登録していきます。
# ローカルマシン(Mac)にて
% pbcopy < ~/.ssh/id_ed25519.pub
# サーバーにて
% echo "{公開鍵をペースト}" | tee -a ~/.ssh/authorized_keys登録が完了すれば、以下のようなコマンドでssh接続が可能となります。
ssh -i ~/.ssh/id_ed25519 ohno@example.com
キーペアをもっと便利に使う
ssh接続をする際に毎回キーの指定などをしていると面倒なので自動化します。
% cd ~/.ssh
% vi configこのconfig ファイルにsshの接続情報などをあらかじめ書いておき、コマンド入力を省くことができます。
# さっきのコマンドをconfig設定に落とした例
Host sshexample
User ohno
HostName example.com
IdentityFile ~/.ssh/id_ed25519上記のconfig設定があった場合
% ssh sshexampleこのコマンドで先ほどのconfigの設定が呼ばれ、 User, HostName, IdentityFileを自動で適用してくれます。
サーバー側での設定
sshdの設定は sshd_config というファイルで行います。(手元のサーバーだと /etc/ssh/sshd_config にありました)
デフォルト設定であまり困ることはなさそうですが、以下のものは確認しておくと良いでしょう。
PubkeyAuthentication
PubkeyAuthentication yes にすることで公開鍵認証を許可します。
コメントアウトされている可能性もあるので念のため確認を。
PasswordAuthentication
`PasswordAuthentication no`としてパスワード認証をさせないようにしましょう。
公開鍵で高めたセキュリティレベルもパスワード認証が残っているとあまり意味がありません。
Port
デフォルトでも良いですが、Port番号を変えておくと攻撃されるリスクが減ります。
Port 10022 などとして変更します。
終わりに
以上、公開鍵認証について基本的なまとめでした。
公開鍵の仕組みはかなり昔から変わらないですが、攻撃側のマシン性能が上がることで使用する暗号形式は変化していきます。
使っている鍵がいつの間にか時代遅れになっているということが無いよう定期的な振り返りが必要だと感じます。