「OpenSSHのユーザ認証で証明書を使う方法」の版間の差分
(ページの作成:「OpenSSHのユーザ認証で証明書を使用する方法について説明します。証明書で認証することにより、ユーザの柔軟な制限や鍵管...」) |
(→概要) |
||
(同じ利用者による、間の2版が非表示) | |||
行8: | 行8: | ||
== 概要 == | == 概要 == | ||
[[Secure Shell]]でよく使用されるユーザ認証は、以下のものでしょう。 | [[Secure Shell]]でよく使用されるユーザ認証は、以下のものでしょう。 | ||
− | * [[ssh-keygen]] | + | * [[ssh-keygen]]などで作成した[[鍵ペア]]を使用した[[公開鍵認証]] |
* パスワード認証 | * パスワード認証 | ||
証明書を利用した認証では、証明書でユーザごとにオプションを許可することや有効期限を設定できます。[[authorized_keys]]が不要であるため、ユーザの鍵の交換も容易になります。 | 証明書を利用した認証では、証明書でユーザごとにオプションを許可することや有効期限を設定できます。[[authorized_keys]]が不要であるため、ユーザの鍵の交換も容易になります。 | ||
+ | |||
== 証明書を利用した認証でできること == | == 証明書を利用した認証でできること == | ||
証明書では、以下のことが実現できます。 | 証明書では、以下のことが実現できます。 | ||
行21: | 行22: | ||
* [[authorized_keys]] の設定が不要 | * [[authorized_keys]] の設定が不要 | ||
− | 「[[authorized_keys]] | + | 「[[authorized_keys]]の設定が不要」は、サーバがたくさんある場合にメリットがあります。通常の[[公開鍵認証]]の場合、[[鍵ペア]]を作り直すたびに、[[公開鍵]]の配布が必要になります。証明書を使用する場合、ユーザの[[authorized_keys]]の設定は不要であるため、[[公開鍵]]の配布が不要になります。1000台のマシンに[[公開鍵]]をばらまこうと思ったら、うんざりしますよね。 |
== ユーザ認証の設定 == | == ユーザ認証の設定 == | ||
行42: | 行43: | ||
| [[鍵ペア]]の作成 | | [[鍵ペア]]の作成 | ||
| [[authorized_keys]]の設定 | | [[authorized_keys]]の設定 | ||
− | | | + | | [[公開鍵認証]]の許可 |
| 不要 | | 不要 | ||
|- | |- | ||
行148: | 行149: | ||
ここで、作成した client.key-client.pub をクライアントへコピーしてください。 | ここで、作成した client.key-client.pub をクライアントへコピーしてください。 | ||
− | + | ;-V 期限:証明書の有効期限を指定します。 | |
+ | ;-I certificate_identity:公開鍵公開鍵を署名するときに key identity を指定します。sshの認証後に auth.log に記録が残ります。 | ||
+ | ;-n principals:1つ以上の principal (ユーザ名かホスト名)を指定します。複数の principal を指定する場合は、カンマで区切ります。 | ||
+ | ;-s: 署名に使用する[[プライベート鍵]](秘密鍵)を指定します。この例では、認証局(CA)の[[プライベート鍵]]を指定します。 | ||
+ | 証明書の詳細は、[[ssh-keygen]]コマンドで確認できます。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
$ ssh-keygen -L -f client.key-cert.pub | $ ssh-keygen -L -f client.key-cert.pub | ||
行181: | 行186: | ||
/etc/ssh/sshd_configを開いて、以下の設定を追加します。信頼できるユーザの認証局の鍵を設定します。 | /etc/ssh/sshd_configを開いて、以下の設定を追加します。信頼できるユーザの認証局の鍵を設定します。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
+ | PubkeyAuthentication yes | ||
TrustedUserCAKeys /etc/ssh/ca.key.pub | TrustedUserCAKeys /etc/ssh/ca.key.pub | ||
</syntaxhighlight> | </syntaxhighlight> | ||
行187: | 行193: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
sudo service ssh restart | sudo service ssh restart | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | パスワード認証は、やめた方がいいので、証明書による認証を行うなら、パスワード認証を無効化しておきます。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | PasswordAuthentication no | ||
+ | ChallengeResponseAuthentication no | ||
+ | UsePAM no | ||
</syntaxhighlight> | </syntaxhighlight> | ||
行193: | 行206: | ||
[[ssh]]コマンドには、[[プライベート鍵]]を指定します。 | [[ssh]]コマンドには、[[プライベート鍵]]を指定します。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | $ ssh -l kaworu -v -i client.key 10.0.0. | + | $ ssh -l kaworu -v -i client.key 10.0.0.11 |
OpenSSH_6.4, OpenSSL 1.0.1e-freebsd 11 Feb 2013 | OpenSSH_6.4, OpenSSL 1.0.1e-freebsd 11 Feb 2013 | ||
debug1: Reading configuration data /etc/ssh/ssh_config | debug1: Reading configuration data /etc/ssh/ssh_config | ||
− | debug1: Connecting to 10.0.0. | + | debug1: Connecting to 10.0.0.11 [10.0.0.11] port 22. |
debug1: Connection established. | debug1: Connection established. | ||
debug1: identity file client.key type 1 | debug1: identity file client.key type 1 | ||
行212: | 行225: | ||
debug1: sending SSH2_MSG_KEX_ECDH_INIT | debug1: sending SSH2_MSG_KEX_ECDH_INIT | ||
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY | debug1: expecting SSH2_MSG_KEX_ECDH_REPLY | ||
− | debug1: Server host key: ECDSA | + | 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: skipped DNS lookup for numerical hostname | ||
− | debug1: Host '10.0.0. | + | 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: Found key in /home/user/.ssh/known_hosts:1 | ||
debug1: ssh_ecdsa_verify: signature correct | debug1: ssh_ecdsa_verify: signature correct | ||
行223: | 行236: | ||
debug1: SSH2_MSG_SERVICE_REQUEST sent | debug1: SSH2_MSG_SERVICE_REQUEST sent | ||
debug1: SSH2_MSG_SERVICE_ACCEPT received | debug1: SSH2_MSG_SERVICE_ACCEPT received | ||
− | debug1: Authentications that can continue: publickey | + | debug1: Authentications that can continue: publickey |
debug1: Next authentication method: publickey | debug1: Next authentication method: publickey | ||
debug1: Offering RSA public key: client.key | debug1: Offering RSA public key: client.key | ||
− | debug1: Authentications that can continue: publickey | + | debug1: Authentications that can continue: publickey |
debug1: Offering RSA-CERT public key: client.key | debug1: Offering RSA-CERT public key: client.key | ||
debug1: Server accepts key: pkalg ssh-rsa-cert-v01@openssh.com blen 1089 | debug1: Server accepts key: pkalg ssh-rsa-cert-v01@openssh.com blen 1089 | ||
行232: | 行245: | ||
debug1: read PEM private key done: type RSA | debug1: read PEM private key done: type RSA | ||
debug1: Authentication succeeded (publickey). | debug1: Authentication succeeded (publickey). | ||
− | Authenticated to 10.0.0. | + | Authenticated to 10.0.0.11 ([10.0.0.11]:22). |
debug1: HPN to Non-HPN Connection | debug1: HPN to Non-HPN Connection | ||
debug1: Final hpn_buffer_size = 2097152 | debug1: Final hpn_buffer_size = 2097152 | ||
行241: | 行254: | ||
debug1: Requesting no-more-sessions@openssh.com | debug1: Requesting no-more-sessions@openssh.com | ||
debug1: Entering interactive session. | debug1: Entering interactive session. | ||
− | + | Last login: Mon Dec 29 00:34:20 2014 from 10.0.0.10 | |
+ | $ | ||
+ | </syntaxhighlight> | ||
− | + | 認証に成功するとサーバ側の /var/log/auth.log に、以下のメッセージが記録されます。 | |
+ | <syntaxhighlight lang="bash"> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
− | + | 証明書が同じディレクトリに存在しないと | |
− | + | <syntaxhighlight lang="bash"> | |
+ | Permission denied (publickey). | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | となります。 | ||
+ | |||
+ | 認証に失敗した場合、サーバ側の /var/log/auth.log には、以下のメッセージが記録されます。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Dec 29 13:30:07 ubuntu sshd[50397]: Connection closed by 10.0.0.10 [preauth] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 証明書のオプション == | ||
+ | [[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つ以上のアドレス/ネットマスクペアのカンマリストを指定します。 | ||
== 関連項目 == | == 関連項目 == | ||
* [[OpenSSH]] | * [[OpenSSH]] | ||
+ | * [[公開鍵認証]] | ||
+ | * [[鍵ペア]] | ||
+ | * [[ssh-keygen]] | ||
+ | * [[sshd]] | ||
+ | * [[sshのセキュリティを高める方法]] | ||
<!-- vim: filetype=mediawiki | <!-- vim: filetype=mediawiki | ||
--> | --> |
2014年12月29日 (月) 14:18時点における最新版
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つ以上のアドレス/ネットマスクペアのカンマリストを指定します。