OpenSSHのユーザ認証で証明書を使う方法
OpenSSHのユーザ認証で証明書を使用する方法について説明します。証明書で認証することにより、ユーザの柔軟な制限や鍵管理を容易にできます。
読み方
- OpenSSH
- おーぷんえすえすえいち
- 証明書
- しょうめいしょ
目次
概要
Secure Shellでよく使用されるユーザ認証は、以下のものでしょう。
- ssh-keygenなどで作成した鍵ペアを使用した公開鍵認証
- パスワード認証
証明書を利用した認証では、証明書でユーザごとにオプションを許可することや有効期限を設定できます。authorized_keysが不要であるため、ユーザの鍵の交換も容易になります。
証明書を利用した認証でできること
証明書では、以下のことが実現できます。
- 証明書の失効により、「ユーザのログイン」を禁止する
- 証明書の有効期限を設定することで、「ユーザの有効期限」を設定する
- ユーザごとに X11のフォワーディング、sshポートフォワーディング, sshエージェントフォワード, PTY, user rc の許可を設定する
証明書認証のメリット
- 「証明書を利用した認証でできること」で前述したコントロールができること
- authorized_keys の設定が不要
「authorized_keysの設定が不要」は、サーバがたくさんある場合にメリットがあります。通常の公開鍵認証の場合、鍵ペアを作り直すたびに、公開鍵の配布が必要になります。証明書を使用する場合、ユーザのauthorized_keysの設定は不要であるため、公開鍵の配布が不要になります。1000台のマシンに公開鍵をばらまこうと思ったら、うんざりしますよね。
ユーザ認証の設定
ユーザ認証の方式によって、必要になる設定が異なります。
認証の方式 | クライアント側のユーザの設定 | リモートのユーザの設定 | サーバ側で必要なもの | 認証局が必要か |
---|---|---|---|---|
パスワード認証 | 不要 | 不要 | パスワード認証の許可 | 不要 |
鍵ペアでの認証 | 鍵ペアの作成 | authorized_keysの設定 | 公開鍵認証の許可 | 不要 |
証明書を用いた認証 | 鍵ペアの作成と認証局に署名された公開鍵 | 不要 | 認証局の公開鍵の設定 | 必要 |
準備
ここでは、認証局(CA)とサーバとクライアントの3つが登場します。 それぞれの作業は、以下の通りです。
作業 | 認証局(CA) | サーバ | クライアント |
---|---|---|---|
1.鍵ペアの作成 | 実施 | 不要 | 実施 |
2.公開鍵の登録 | 不要 | 認証局の公開鍵鍵を登録 | 不要 |
3.証明書の発行 | クライアントの公開鍵を署名する(証明書) | ||
4.証明書の配置 | 認証局の証明書をコピーする |
詳細については、後述します。
クライアント
ログインするときには、プライベート鍵(秘密鍵)と証明書が必要です。
鍵ペアの作成
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)
- 認証局の鍵ペアを作成する
- クライアントの公開鍵を署名する(証明書を作る)
認証局の作成(鍵ペアの作成)
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
サーバ
- 認証局の公開鍵を信頼できる認証局として登録する
- 設定反映のために 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-forwarding
- sshポートフォワーディングを無効にします(デフォルトでは許可します)。
- 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つ以上のアドレス/ネットマスクペアのカンマリストを指定します。
関連項目
ツイート