SSHでパスワードなしログイン 公開鍵暗号を使った認証


概要

SSHで公開鍵暗号を使って認証する際に参考となる情報を載せています。
また公開鍵暗号方式のメリット、デメリットや公開鍵暗号方式の仕組みを簡単にまとめています。
実際の設定作業は最低限必要な手順だけを記しています。

おさえておきたいこと

  • クライアントが公開鍵を生成する。
  • サーバはその公開鍵をクライアントから受け取る。
  • 接続の確立時にサーバとクライアントはそれぞれの公開鍵をもとに簡単な通信を行う。
  • 通信の結果が、共通の公開鍵を持つ二者のみで可能であったことを確認するために秘密鍵を使う。
  • 秘密鍵はクライアントが保管しており、サーバや他のクライアントが利用することはない。
  • 秘密鍵はクライアントが公開鍵を生成する際、同時に生成される。

対象読者と前提条件

  • unixの簡単な知識が必要です。
  • MacOS、Linux、BSDなど Unix系のOSを使用していることを想定しています。
  • クライアントはOpenSSHを使っていることを想定しています。

クライアントの設定

# ホームディレクトリに移動
client$ cd ~

# 公開鍵と秘密鍵の生成を行うコマンド
client$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Xxx/Yyy/Zzz/.ssh/id_rsa):

# 秘密鍵を生成する場所を訪ねられます。
# そのままエンターを押します。

Created directory '/Xxx/Yyy/Zzz/.ssh'.
Enter passphrase (empty for no passphrase):
# パスフレーズを入力するように促されます。
# パスフレーズとはパスワードが長くなったものです。
# 今回は入力なしでログインできるようにしたいのでそのままエンターを押します。
# セキュリティが気になる人はパスフレーズを組み合わせて使うと良いでしょう。

Enter same passphrase again:
# もう一度確認のために同じフレーズを入力します。
# さきほど何も入力しなかった人はそのままエンターを押します。

Your identification has been saved in /Xxx/Yyy/Zzz/.ssh/id_rsa.
Your public key has been saved in /Xxx/Yyy/Zzz/.ssh/id_rsa.pub.
The key fingerprint is:
...
# 上記のようなメッセージが表示されてコマンドが終了します。
# .sshディレクトリを見ると2つのファイルが新たに生成されているのがわかると思います。
# このうちid_rsa.pubが公開鍵で、id_rsaが秘密鍵になります。

公開鍵の実体は英数字で構成されているテキストファイルです。
この公開鍵ファイルの内容をサーバに登録します。

サーバの設定

サーバにログインします。
このとき公開鍵暗号方式で認証したいユーザーでログインしてください。

~/.ssh/authorized_keys にクライアントの公開鍵の内容を追記します。
ディレクトリ、ファイルがない場合には作成してください。

この時、必ず.ssh ディレクトリのパーミッションは 700
authorized_keys ファイルのパーミッションは 600
に設定してください。

# ファイル、ディレクトリがない場合
server$ mkdir .ssh
server$ chmod 700 .ssh
server$ touch .ssh/authorized_keys
server$ chmod 600 .ssh/authorized_keys

# 公開鍵の内容を追記
# 公開鍵ファイルはscpコマンドなどを使用してクライアントからサーバにコピーします。
server$ id_rsa.pub >> ~/.ssh/authorized_keys

# 公開鍵ファイルは用済みなので削除
server$ rm id_rsa.pub

ファイルに追記する方法はどのようなものでも構いません。
authorized_keysはテキストファイルですのでテキストエディタ等で編集することもできます。
ただしこの場合不要なところにスペースや改行が入らないように注意してください。

ファイルの受け渡しもどのような手段でも構いません。
ネットワーク越しであればscpやsftpを使ったり、双方のコンピュータが手元にあればUSBメモリなどを使って直接ファイルをコピーすることもできます。

パスワード認証を無効にする

クライアントが秘密鍵を持っている場合にはパスワードを入力する必要はなくなります。
秘密鍵を持っていないユーザーはパスワードによる認証を受けることができます。
もしサーバにログインするすべてのクライアントが鍵認証を行うのであればパスワード認証を無効にすることをおすすめします。

# 編集する前にファイルをバックアップ
server$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org

# sshサーバの設定ファイルを編集します。
server$ vi /etc/ssh/sshd_config


# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
PasswordAuthentication no
#PermitEmptyPasswords no

メリット

  • 公開鍵暗号を使った認証を行えばパスワードを入力するといった、対話的な手続きを一切必要とせずにサーバとの接続を確立させることができる。
  • 公開鍵暗号方式の認証に併せて、パスワードを使った認証を禁止すればクラッカーが暗号解読の際に用いる「総当たり攻撃(ブルートフォースアタック)」を防ぐことができる。
  • 登録された端末のみアクセスが可能という制限を設けることができる。

デメリット

  • 使用者が同じでも登録されている端末以外からはアクセスできない。
  • 新しい端末でアクセスしたい場合にはその都度登録が必要である。
  • 端末を盗まれるなど、自分の端末を他人が自由に操作できるような状況になってしまった場合に、パスワード入力が不要な分簡単にアクセスを許してしまう。(これに関しては公開鍵暗号にパスフレーズを組み合わせる方法で対策可能)

考察・まとめ

公開鍵暗号方式の認証を説明した文書で、サーバで公開鍵と秘密鍵を作り、公開鍵の内容をauthorized_keysに記述、秘密鍵をクライアントに渡すように指示されているものを見かけることがありますが、これには疑問が浮かびます。

秘密鍵と公開鍵は、それ自体はただのテキストファイルで暗号化や、パスワードなどはかかっていません。
FTPなど暗号化されていない経路を利用してファイルの受け渡しがあった場合には、パケットを盗聴すれば簡単にファイルの内容がわかってしまいます。
サーバにクライアントを登録するたびに秘密鍵を渡すようなやり方ではクライアントの数が多くなるにつれてファイルの内容を知られる危険性も高くなります。
秘密鍵は誰にも知られてはなりません。
秘密鍵があれば誰でもサーバにアクセスできるようになってしまいます。
公開鍵であれば第三者にファイルの内容が知られるようなことがあっても致命的な問題にはなりません。

公開鍵暗号方式では二つの鍵を使って認証の手続きを行うため少々ややこしく感じるところがありますので、基本を抑えしっかりとした理解を心がけたいです。