OpenSSHのユーザ認証で証明書を使う方法

提供: セキュリティ
2014年12月29日 (月) 14:12時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

OpenSSHのユーザ認証で証明書を使用する方法について説明します。証明書で認証することにより、ユーザの柔軟な制限や鍵管理を容易にできます。

読み方

OpenSSH
おーぷんえすえすえいち
証明書
しょうめいしょ

概要

Secure Shellでよく使用されるユーザ認証は、以下のものでしょう。

証明書を利用した認証では、証明書でユーザごとにオプションを許可することや有効期限を設定できます。authorized_keysが不要であるため、ユーザの鍵の交換も容易になります。

証明書を利用した認証でできること

証明書では、以下のことが実現できます。

証明書認証のメリット

  • 「証明書を利用した認証でできること」で前述したコントロールができること
  • authorized_keys の設定が不要

authorized_keysの設定が不要」は、サーバがたくさんある場合にメリットがあります。通常の公開鍵認証の場合、鍵ペアを作り直すたびに、公開鍵の配布が必要になります。証明書を使用する場合、ユーザのauthorized_keysの設定は不要であるため、公開鍵の配布が不要になります。1000台のマシンに公開鍵をばらまこうと思ったら、うんざりしますよね。

ユーザ認証の設定

ユーザ認証の方式によって、必要になる設定が異なります。

ユーザ認証の設定
認証の方式 クライアント側のユーザの設定 リモートのユーザの設定 サーバ側で必要なもの 認証局が必要か
パスワード認証 不要 不要 パスワード認証の許可 不要
鍵ペアでの認証 鍵ペアの作成 authorized_keysの設定 公開鍵認証の許可 不要
証明書を用いた認証 鍵ペアの作成と認証局に署名された公開鍵 不要 認証局の公開鍵の設定 必要


準備

ここでは、認証局(CA)とサーバとクライアントの3つが登場します。 それぞれの作業は、以下の通りです。

手順
作業 認証局(CA) サーバ クライアント
1.鍵ペアの作成 実施 不要 実施
2.公開鍵の登録 不要 認証局の公開鍵鍵を登録 不要
3.証明書の発行 クライアントの公開鍵を署名する(証明書)
4.証明書の配置 認証局の証明書をコピーする

詳細については、後述します。

クライアント

  1. 鍵ペアの作成
  2. 認証局(CA)に公開鍵を署名してもらう(証明書)

ログインするときには、プライベート鍵(秘密鍵)と証明書が必要です。

鍵ペアの作成

ssh-keygen鍵ペアを作成します。

$ ssh-keygen -f client.key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in client.key.
Your public key has been saved in client.key.pub.
The key fingerprint is:
**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:** kaworu@ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|            E    |
|           .     |
|        S   o o  |
|         . o = + |
|        o + o = B|
|         + . . BB|
|              .=@|
+-----------------+

認証局(CA)

  1. 認証局の鍵ペアを作成する
  2. クライアントの公開鍵を署名する(証明書を作る)

認証局の作成(鍵ペアの作成)

ssh-keygen鍵ペアを作成します。

$ ssh-keygen -f ca.key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ca.key.
Your public key has been saved in ca.key.pub.
The key fingerprint is:
**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:** kaworu@ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
|         =..     |
|        o + .    |
|       o.+ . .   |
|      ..=.. . . o|
|       oS .  . .o|
|      .o . o o  .|
|       .. . =  . |
|        .  o  E  |
|         ..      |
+-----------------+

証明書の作成

クライアントの公開鍵(client.key.pub) と 証明書の プライベート鍵 (秘密鍵) を用いて、証明書 (client.key-cert.pub) を作成します。

$ ssh-keygen -s ca.key -I 'Test-CA' -n kaworu -V +365d client.key.pub
Signed user key client.key-cert.pub: id "Test-CA" serial 0 for kaworu valid from 2014-12-29T00:03:00 to 2015-12-29T00:04:07

ここで、作成した client.key-client.pub をクライアントへコピーしてください。

-V 期限
証明書の有効期限を指定します。
-I certificate_identity
公開鍵公開鍵を署名するときに key identity を指定します。sshの認証後に auth.log に記録が残ります。
-n principals
1つ以上の principal (ユーザ名かホスト名)を指定します。複数の principal を指定する場合は、カンマで区切ります。
-s
署名に使用するプライベート鍵(秘密鍵)を指定します。この例では、認証局(CA)のプライベート鍵を指定します。

証明書の詳細は、ssh-keygenコマンドで確認できます。

$ ssh-keygen -L -f client.key-cert.pub
client.key-cert.pub:
        Type: ssh-rsa-cert-v01@openssh.com user certificate
        Public key: RSA-CERT **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**
        Signing CA: RSA **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**
        Key ID: "Test-CA"
        Serial: 0
        Valid: from 2014-12-29T00:03:00 to 2015-12-29T00:04:07
        Principals:
                kaworu
        Critical Options: (none)
        Extensions:
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc

サーバ

  1. 認証局の公開鍵を信頼できる認証局として登録する
  2. 設定反映のために sshd を再起動します

公開鍵の設定

認証局の公開鍵 (ca.key.pub) を /etc/ssh にコピーします。

sudo cp ca.key.pub /etc/ssh/
sudo vim /etc/ssh/sshd_config

/etc/ssh/sshd_configを開いて、以下の設定を追加します。信頼できるユーザの認証局の鍵を設定します。

PubkeyAuthentication yes
TrustedUserCAKeys /etc/ssh/ca.key.pub

sshd_configの設定変更を反映するために、sshdを再起動します。

sudo service ssh restart

パスワード認証は、やめた方がいいので、証明書による認証を行うなら、パスワード認証を無効化しておきます。

PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

使い方

client.key と client.key-cert.pub の2つのファイルを同じところに置いて下さい。 sshコマンドには、プライベート鍵を指定します。

$ ssh -l kaworu -v -i client.key 10.0.0.11
OpenSSH_6.4, OpenSSL 1.0.1e-freebsd 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to 10.0.0.11 [10.0.0.11] port 22.
debug1: Connection established.
debug1: identity file client.key type 1
debug1: ssh_rsa_verify: signature correct
debug1: identity file client.key-cert type 4
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.4_hpn13v11 FreeBSD-20131111
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 pat OpenSSH*
debug1: Remote is not HPN-aware
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff
debug1: skipped DNS lookup for numerical hostname
debug1: Host '10.0.0.11' is known and matches the ECDSA host key.
debug1: Found key in /home/user/.ssh/known_hosts:1
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: client.key
debug1: Authentications that can continue: publickey
debug1: Offering RSA-CERT public key: client.key
debug1: Server accepts key: pkalg ssh-rsa-cert-v01@openssh.com blen 1089
debug1: ssh_rsa_verify: signature correct
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to 10.0.0.11 ([10.0.0.11]:22).
debug1: HPN to Non-HPN Connection
debug1: Final hpn_buffer_size = 2097152
debug1: HPN Disabled: 0, HPN Buffer Size: 2097152
debug1: channel 0: new [client-session]
debug1: Enabled Dynamic Window Scaling
 
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
Last login: Mon Dec 29 00:34:20 2014 from 10.0.0.10
$

認証に成功するとサーバ側の /var/log/auth.log に、以下のメッセージが記録されます。

Dec 29 13:41:58 ubuntu sshd[50470]: Accepted publickey for kaworu from 10.0.0.11 port 16209 ssh2: RSA-CERT ID Test-CA (serial 0) CA RSA ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff

証明書が同じディレクトリに存在しないと

Permission denied (publickey).

となります。

認証に失敗した場合、サーバ側の /var/log/auth.log には、以下のメッセージが記録されます。

Dec 29 13:30:07 ubuntu sshd[50397]: Connection closed by 10.0.0.10 [preauth]

証明書のオプション

ssh-keygenの-Oオプションでは、鍵の署名を行うときに、証明書オプションを指定できます。-Oオプションは、複数回指定できます。

clear
すべてのパーミッションを有効にします。
force-command=command
シェルやコマンドの変わりに実行するコマンドを強制します。
no-agent-forwarding
sshエージェントフォワードを無効にします(デフォルトでは許可します)。
no-port-forwardingsshポートフォワーディングを無効にします(デフォルトでは許可します)。
no-pty
PTY割り当てを無効にします(デフォルトでは許可します)。
no-user-rc
sshdによる ~/.ssh/rc の実行を無効にします(デフォルトでは許可します)。
no-x11-forwarding
X11フォワーディングを無効にします(デフォルトでは許可します)。
permit-agent-forwarding
sshエージェントフォワードを許可します。
permit-port-forwarding
sshポートフォワーディングを許可します。
permit-pty
PTY割り当てを許可します。
permit-user-rc
sshdによる ~/.ssh/rc の実行を許可します。
permit-x11-forwarding
X11 フォワーディングを許可します。
source-address=address_list
ソースアドレスを制限します。address_listには、CIDRフォーマットの1つ以上のアドレス/ネットマスクペアのカンマリストを指定します。

関連項目




スポンサーリンク