OpenSSH 公開鍵認証の設定

  1. SSH (Secure Shell)の概要
  2. OpenSSH インストールと設定
  3. OpenSSH 公開鍵認証の設定

公開鍵認証の設定方法

 SSHの公開鍵認証を設定するには、いろいろと面倒なことがあるのでここにまとめておきます。Ubuntu 9.10、Ubuntu 10.10もこのやり方でできます。(というか、殆ど中身は変わっていないです。)
 そもそもSSHの認証には歴史的な経緯から概ね3種類の認証方法があります。UbuntuのOpenSSHでは、
  • ホストベース認証
  • 公開鍵認証
  • パスワード認証
3種類あります。この設定は/etc/ssh/ssh_config(sshd_configではないので注意)にて行うことができますが、デフォルトではこの認証を上から順に行い認証が成立した時点でログインということになります。安全な接続という意味での基本的な設定は公開鍵認証のみを許可する設定にしておきます。ホストベース認証とパスワード認証をnoに設定して認証を通さないようにします。

ssh_configの設定(公開鍵のみを許可する)
 /etc/ssh/ssh_configをエディタで開き、以下の部分を編集します。(初期のssh_configはバックアップとっておくとよいです。)
# ホストベース認証を切る
HostbasedAuthentication no # ssh2の場合
RhostsRSAAuthentication no # ssh1の場合

# パスワード認証を切る
PasswordAuthentication no # ssh1、ssh2両方に共通

# 公開鍵認証を有効にする
PubkeyAuthentication yes # ssh2の場合
RSAAuthentication yes # ssh1の場合
AuthorizedKeysFile    %h/.ssh/authorized_keys    # 公開鍵の保存場所とファイル名
認証関係の設定はこんな感じになります。LAN内でSSHを利用する場合などはパスワード認証が許可されていてもいいんじゃないか?と思います。公開鍵の設定は面倒くさいですから...。設定後は/etc/init.d/ssh restartで再起動させておいてください。

公開鍵設定と秘密鍵の作成 1 (Mac ターミナル)

 公開鍵と秘密鍵の作成はクライアント側で行います。クライアント側にssh-keygenのコマンドが使える状態じゃないと公開鍵認証ができない...ということになりますが、iMacなどではOpenSSHがあらかじめインストールされているのでssh-keygenコマンドがデフォルトで使用可能です。Windowsの場合はPoderosaやTera Term Pro 2.3あたりでssh接続可能だと思いますが未確認なので割愛。ここではMacクライアントとしてMacのターミナルで公開鍵と秘密鍵を作成する方法を紹介します。RSAとDSAの二つの鍵を作成する方法です。
 RSAはOpenSSHの接続方法で使用し、DSAはSSH2の接続方法で使用するそうです。噂によるとDSAによるSSH2の接続方法が最も強力だとか。しかしRSA認証でもかなり十分な強度です。

 クライアントの端末(ここではMacのターミナル)を立ち上げますが、鍵の作成ユーザーは使用する自身のユーザーで行ってください。スーパーユーザー権限など(rootユーザーなど)で作成しちゃうと厄介なことになります。

RSAの公開鍵と秘密鍵の作成

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa): id_rsa 
Enter passphrase (empty for no passphrase): ***********
Enter same passphrase again: ***********
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
ac:40:50:de:2d:0d:7a:e7:d9:61:ca:bf:f0:dd:22:cf user@user-imac-g5.local
The key's randomart image is:
+--[ RSA 2048]----+
|  ... .          |
|   o o +         |
|    + + + .      |
|   . . * = .     |
|    .   S .      |←なんじゃこりゃ。
|     . . .       |
|      . . .      |
|         o.+..   |
|          ooE..  |
+-----------------+

とコマンドを打ちます。-tオプションで鍵のタイプを指定します。最初にRSAの公開鍵を作成するのでrsaと指定。公開鍵と秘密鍵の保存場所を聞かれるので、ここでは/Users/<ユーザー名>/.ssh/id_rsaを打ち込みます。(*1)次にパスフレーズ(いわゆるパスワード)を聞かれるので適当なパスワードを2回入れます。これでRSAの公開鍵と秘密鍵の作成は終わりです。
*1 /Users/<ユーザー名>/.ssh/id_rsaで作成すると拒否されることがあります。その場合はカレントディレクトリに移動してからid_rsaで指定します。鍵発行の際のトラブルをご参照。

$ ls /Users/<ユーザー名>/.sshで確かめてみると、
  • id_rsa (秘密鍵)
  • id_rsa.pub (公開鍵)
のファイルが作成されている筈です。これが順に秘密鍵と公開鍵ということになります。当然ですが秘密鍵の方が公開鍵よりも容量が多いことがわかります。

DSAの公開鍵と秘密鍵の設定

$ ssh-keygen -t dsa
今度は、rsaをdsaにすればいいだけです。同様に鍵の保管場所を尋ねられるので、/Users/<ユーザー名>/.ssh/id_dsaを指定します。同様にパスフレーズを2回打ち込むと完了です。RSAと同様のディレクトリ内に保存したので上記と同様にファイルの確認ができます。
  • id_dsa (秘密鍵)
  • id_dsa.pub (公開鍵)
の2つのファイルが新たに作成されています。

 これらの鍵ファイルは一応パーミッションを確かめておいてください。
/Users/<ユーザー名>/.ssh (D) [700]
/Users/<ユーザー名>/.ssh/id_rsa [600]
/Users/<ユーザー名>/.ssh/id_rsa.pub [600 or 644]
/Users/<ユーザー名>/.ssh/id_dsa [600]
/Users/<ユーザー名>/.ssh/id_dsa.pub [600 or 644]
に設定しておきます。特に秘密鍵は600でオーナーのみが読むことができるという最低限の設定にすること!

公開鍵をサーバーに設定する

 公開鍵と秘密鍵のペアの作成ができたら、今度はクライアント側で作成した公開鍵をサーバー側(つまりリモート側)に設定します。id_rsa.pubの内容をサーバー側に設定します。
 一応「公開鍵」とうたっているだけあって外部に漏れても構いません。が、大っぴらに転送しないでUSBのフラッシュメモリで持っていくとかいろいろ手段はあると思います。知られなければ知られないほどセキュリティー的にはよいものなので。
$ cat id_rsa.pubで中身を見てみると、かなり長い文字列が保存されています。
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4PNA0PiiItBaE5HP+6TvEHXhh5
KKwrhSDE8iVmTQODzMDHy8PsgCLMUxivgfZs4dfRqotEjrbvcQ6T3b9JnRMVsY
Wz3xPirYq90tlQVsQs48a35SJuENC9uN3sHisWjniL5poRCRRL9H3pNFYZ0R+kC
ZgyLgOLNdpNgWbiymLwRbuBxpzDfIiBYbbrMNEgi1sj2eg4RwtQVI1VZYrqdPAnw
RMX1Gnjnz46j2oLsb1sW+fMAVnjOfertUHHH-iYUT2s5ADt47vJkIocJ9yXF9rzG6tB
jUP/+WKMKjia7C4k2tJ4XMb6sIaWIjI31yptTcw/RRv+yHdJPMIfQ8bq4glL4w== user
@user-imac-g5.locall
このファイル内の全文をサーバー側のauthorized_keysにコピーします。
 サーバー側では、SSHで接続されるユーザーの権限で公開鍵の設定をします。先のid_rsa.pubの中身をすべて、/home/<ユーザー名>/.ssh/authorized_keysというファイル名で設定します。
手順としては、
$ cd /home/<ユーザー名>/.ssh
$ cp <任意の場所>/id_rsa.pub authorized_keys 
$ chmod 600 authorized_keys
という感じでしょうか。勿論エディタを使って手動でコピーしても構いません。
 コピー後は、パーミッションの変更をします。読みだけに使用するので、[600]に設定しておきます。

クライアントからの接続&認証

 設定がうまくいっているかどうか確かめてみます。上記の例の通りMacのターミナルから接続します。ターミナルを立ち上げてから、
$ ssh <ユーザー名>@<IPアドレス or ホスト名>
(または、ポートを22番以外で設定している場合は、)
$ ssh <ユーザー名>@<IPアドレス or ホスト名> -p 1234
で接続します。最初の接続では共通鍵がまだないのでクライアント側にサーバーから共通鍵が送られてきます。
The authenticity of host '[xxx.xxx.xxx.xxx]:xxxx ([xxx.xxx.xxx.xxx]:xxxx)' can't be established.
RSA key fingerprint is 46:46:22:49:2a:69:bd:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes ←yesと入力します。
Warning: Permanently added '[xxx.xxx.xxx.xxx]:1250' (RSA) to the list of known hosts.
Linux xxxx 2.6.31-16-generic #xx-Ubuntu SMP Tue Dec 8 04:01:29 UTC 2009 i686

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/

Last login: Tue Dec 29 09:45:55 2009 from sanjou-osamu-no-imac-g5.local
共通鍵がないと認証が確立されないのでフィンガープリントを確認して接続を続けてください...みたいなことを言ってくるので、RSAキーのフィンガープリントが接続しているサーバー自身のものであるのかを確認してからyesを打ちます。ウィンドウが立ち上がってパスフレーズを求めてくるのでRSAの公開鍵を作成した際のパスフレーズを入力します。

ssh_auth.jpg
認証が終わるとめでたくSSH接続が成功します。


公開鍵設定と秘密鍵の作成 2 (Ubuntu同士)

 SSHが使えるのだったらやはりUbuntu同士は安定感があっていいですよ。Macターミナルと手続きは殆ど同じなのですが、一応紹介しておきます。
 UbuntuはGnome端末がありますのでそれを使います。混乱するといけないのでサーバー(接続先)、クライアント(接続元)ということにしておきます。
 まず、サーバー側の設定が終わっていることを前提として、クライアント側で適当なユーザーにログインします。(Rootとかでログインしないこと。)端末を立ち上げてから$でもって操作します。ssh-keygenでもって公開鍵と秘密鍵を作成します。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa): id_rsa 
Enter passphrase (empty for no passphrase): ***********
Enter same passphrase again: ***********
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
ac:40:50:de:2d:0d:7a:e7:d9:61:ca:bf:f0:dd:22:cf user@hostname
The key's randomart image is:
+--[ RSA 2048]----+
|  ... .          |
|   o o +         |
|    + + + .      |
|   . . * = .     |
|    .   S .      |
|     . . .       |
|      . . .      |
|         o.+..   |
|          ooE..  |
+-----------------+
 手順は同じで、ssh-keygenコマンドを実行し、鍵作成時のファイル名(ここでは、id_rsa)とパスフレーズ(パスワード)を2回タイプします。鍵ファイルは、/home/<ユーザー名>/.ssh/の中に作成されます。ls -alコマンドで見てみてください。
id_rsa 秘密鍵
id_rsa.pub 公開鍵
の二つが作成されているはずです。
 今度はこのクライアント側で作成した公開鍵をサーバー側に設置するわけですが、サーバー側に移動してから、
/home/<ユーザー名>/.ssh/authorized_keys
に公開鍵の中身をそのままコピーします。コピーの方法はなんでも構いません。私の場合はUSBメモリでもっていきました。.sshディレクトリとauthorized_keysファイルは自動的に作成されていないので自分で作成してください。authorized_keysファイルにはid_rsa.pubの内容をそのままコピーします。またはid_rsa.pubをコピーしてそのままリネームします。パーミッションはユーザー自身の読み込み権限[600]があれば大丈夫です。
 で、またクライアント側に戻って、接続テストをします。
$ ssh -p <ポート番号> <接続先のユーザー名>@<ホスト名またはIPアドレス>

user@hostname:~$ ssh -p 1216 user@192.168.11.48
Last login: Fri Nov 26 02:08:16 2010 from omnioo.com
Linux annie 2.6.31-22-generic #68-Ubuntu SMP Tue Oct 26 16:38:35 UTC 2010 i686

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
$

 これで接続成功です。







プロフィール



  • Name :: 山上オサム ♂(37)
  • Hobby :: 武術
  • Work :: Web Designer