3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SSH用の鍵管理にYubiKeyを使ってみた

Last updated at Posted at 2021-09-20

#YubiKeyとは
yubicoが販売している公開鍵管理やMFAとして利用できるハードウェアトークン。
FIDO2 U2Fに準拠しているほか、PIV対応、TOTPなどの多要素認証機能など、豊富な機能が魅力。

内部に秘密鍵を保持でき、外部に書き出せないという特徴があるため、セキュアに鍵管理を行うことができる。
秘密鍵と公開鍵のKeyPairはYubiKey内部で生成したり(秘密鍵の外部出力不要)、既存のKeyPairをImportすることも可能。

活用方法の例

  • Windowsのログイン認証時に、YubiKeyの差込み+タッチ必須にする(多要素認証)
  • PCに秘密鍵をコピーすることなくSSH接続に公開鍵暗号方式を利用する

接続形態(USB Type-A/USB Type-C/NFC)や機能の異なる複数製品が販売されている。
接続形態や機能の異なる複数製品がある

#実現したい構成
####YubiKeyのSlotに複数の秘密鍵を格納して、SSH接続するときに自動的に秘密鍵を選択させたい。####
Composition.jpg

#今回やったこと

  • YubiKeyの初期設定
  • SSH接続するときに利用する、複数の秘密鍵をYubiKeyのSlotにインポート
  • IaaS(主にAWS)で利用している既存の鍵をYubiKeyにImport
  • PagentをPC起動時に、YubiKeyにインポートした秘密鍵(CAPI)の設定を自動で読み込むように設定

#環境
####YubiKey

####OS

  • Windows 10
  • RasberryPi (Raspberrypi 5.10.17-v7)

####Software

  • YubiKey Manager (Win)
  • yubico-piv-tool (RasberryPi)
  • PuTTy CAC
  • Pageant
  • PuTTygen

#参考リンク


#1.YubiKeyの初期設定
今回、YubiKeyはWindows 10にインストールしたYubiKey Managerと、RaspberryPi OSにインストールしたyubico-piv-toolを使って設定や鍵管理をしています。

##YubiKey Managerを使った初期パスワードの変更
YubiKey Managerは、YubiKeyの鍵の保管状況の確認や、各種パスワード設定が行えるツールです。

YubiKeyに鍵のImportなどを行うにはPINPUKManagement Keyという3つのパスワードが必要となります。出荷時にデフォルトのパスワードは設定されていますが、そのままではセキュリティ上問題なので、YubiKey Managerを使って、この初期パスワードを変更します。

##Windows版 YubiKey Managerのインストール##
yubico社の公式HPから、Downloadします。
YubiKeyManager.png

Windows 10にインストールするのでx64版を選択します。
YubiKeyManagerx64.png

ダウンロードした実行ファイルを、管理者権限で実行します。
x64exe.png

インストール後に起動すると、こんな感じ。
unplugged.png

YubiKeyをUSB接続すると、変更できるようになります。
plugged.png

Applications > PIV > PIN Management のConfigure PINsを選択します。
PIV_PIN.png

3種類のパスワードを設定します。まずは、PINこれはSSH接続する時など、秘密鍵の内容を読むときに使います。
ConfPIN.png

出荷時にはデフォルトのPINが設定されています。Current PINは、右側のUse defaultにチェックを入れると自動的に現在のパスワードが入力されます。New PINに6~8文字の数字を設定します。Confirm new PINは確認です。
PIN.png

次に、PUKを設定します。これはPINを3回入力間違いをした際に、ロック解除するためのパスワードです。
ConfPIN.png

入力内容は、PINとまったく同様です。
出荷時にはデフォルトのPUKが設定されています。Current PUKは、右側のUse defaultにチェックを入れると自動的に現在のパスワードが入力されます。New PUKに6~8文字の数字を設定します。Confirm new PUKは確認です。
PUK.png

最後に、Management Keyを設定します。YubiKeyに秘密鍵をインポートする際などに利用します。yubico-piv-toolのコマンドでも利用するので、作業が終わるまでテキストファイルなどにコピーしておくのがお勧めです。
ConfPIN.png

Current Management Keyは、PINやPUKと同様に、Use defaultにチェックをいれればOKです。New Management Keyは長いためGenerateで生成するのがいいでしょう。Protect with PINはチェックなしにしておきます。
ManagementKey.png

以上で初期設定は完了です。

#2. YubiKeyにインポートする秘密鍵をpem形式に変換
YubiKeyにインポートする鍵は、OpenSSHで利用できるPEM形式でなくてはいけません。

PEM形式で保存している場合は、そのままyubico-piv-toolを使うLinuxにSCP等でコピーしてください。

PuTTyなどで使うためにppk形式などで秘密鍵を保存していた場合は、PEM形式に変換が必要です。
WindowsならPuTTygenなどを使って変換可能ですが、PuTTygenのOpenSSH形式は新旧2種類あって、新しい形式はインポートできないので注意

PuTTygenでppk形式の秘密鍵を開き、
PuTTygen > Conversions > Export OpenSSH Keyを選択します。
すぐ下のExport OpenSSH Key(force new file format)を選択するとインポートできないので注意
出力したら、RaspberryPiなどのLinuxにSCP等でコピーします。
puttygenconv.png

PuTTygenで出力した秘密鍵(sample.pem)を、SSHKeygenでフォーマットを整えます。(上書き保存されるので注意)
パスワードなしで保存したいので、-pオプションを付与。-mオプションでPEM形式を指定。-fオプションで出力ファイル名を指定。

ssh-keygen -p -f sample.pem -m pem

生成した秘密鍵を元に、公開鍵を生成します。

openssl rsa -in sample.pem -pubout > sample_pub.pem

#3. Raspberry Pi OSに、yubico-piv-toolのインストール
apt-get installするだけです。

apt-get install yubico-piv-tool

#4. YubiKeyに秘密鍵のインポート
YubiKeyには、利用用途の異なる4つのSlotが存在します(9a、9c、9d、9e)。
9eのCard Authenticationなどは日本では利用することはなく、SSHの認証に関してはどのSlotでも使えるので好きなスロットを使います。
なお、YubiKeyの中には上記4つ以外のSlotも存在し、古い秘密鍵が保管されますが認証には利用できません。

ここでは、Slot 9cに秘密鍵をインポートします。
YubiKeyをRaspberry PiのUSBポートに差してください。

注意
-kオプションの後に、空白を入れずにManagement Keyの文字列を入力してください
気付かず、エラーになる罠があります。なぜ、こんな仕様に…。(´・ω・`)

-sオプションでスロットを指定するので、異なるSlotにインポートする場合は書き換えてください。

yubico-piv-tool -a import-key -s 9c -i [秘密鍵のファイル名] -K PEM -k[Management Keyの文字列]

yubico-piv-tool -a import-key -s 9c -i sample.pem -K PEM -k012345678901234567890123456789012345678901234567

公開鍵を自己署名して、自己署名証明書を作ります。
-Sオプションで入力するCNの欄に入力した値が、YubiKeyを接続した際の証明書選択画面に表示されます。
コマンド実行時に、PINの入力を求められるので、YubiKey Managerで設定したPINを入力します。

yubico-piv-tool -a verify-pin -a selfsign-certificate -s 9a -S "/CN=[CNの内容]/OU=[OUの内容]/O=[Oの内容]/" -i [公開鍵のファイル名] -o [自己署名証明書のファイル名] --valid-days=[有効日数]

yubico-piv-tool -a verify-pin -a selfsign-certificate -s 9a -S "/CN=test.example.local/OU=admin/O=example.local/" -i sample_pub.pem -o sample_cert_9c.pem --valid-days=3650

下記のコマンドで、YubiKeyのSlotに自己署名証明書が入っていないことを確認します。

yubico-piv-tool -a status -s [Slot名]

yubico-piv-tool -a status -s 9c

自己署名証明書をYubiKeyにインポートします。

yubico-piv-tool -a import-certificate -s 9a -i [自己署名証明書のファイル名] -K PEM -k[Management Keyの文字列]

yubico-piv-tool -a import-certificate -s 9a -i sample_cert_9c.pem -K PEM -k012345678901234567890123456789012345678901234567

YubiKeyのSlotに自己署名証明書がインポートされたことを確認します。

yubico-piv-tool -a status -s [Slot名]

yubico-piv-tool -a status -s 9c

[実行結果サンプル]

# yubico-piv-tool -a status -s 9c
CHUID:	108421c84210c3eb34109f089a07e3c3eb34109f089ac84210c3eb34109f089a07e3710842108421c84210c3eb34109f089a07e8421c84210c3eb3
CCC:	No data available
Slot 9c:	
	Algorithm:	RSA2048
	Subject DN:	CN=test.example.local, OU=admin, O=example.local
	Issuer DN:	CN=test.example.local, OU=admin, O=example.local
	Fingerprint:	bb923eb65c1862ba4927e4925fb4b83f8701f9bd9bb923eb65c1862b923eb659
	Not Before:	Sep 18 10:55:39 2021 GMT
	Not After:	Sep 17 10:55:39 2026 GMT
PIN tries left:	3

以上でYubiKey側の準備は完了です。

#5. PuTTy CAC + Pageantのセットアップ
Windows 10に戻って、SSH接続用のクライアントを構成します。
通常のPuTTyでは、YubiKeyにインストールした秘密鍵を使って接続することができません。
代わりに、PuTTy CACを利用します。

PuTTy CACから、x64版のMSI Installersをダウンロードして、インストールしてください。Pageantもインストールされます。
PuttyCAC.png

##Pageantの設定
YubiKeyをRaspberry Piから、Windowsに差し替えます。

スタートからPageantを起動し、タスクバーのPageantアイコンをダブルクリックします。
pageant.png

Add CAPI Certを押します。
addcapicert.png

Windowsの証明書選択画面が表示されるので、「その他」を押します。
cert_select.png

YubiKeyに含まれる証明書の情報が表示されるので、インポートした証明書を選択します。
cert_selected.png

Pageantに証明書の登録が完了しました。
Pagent_added.png

##サーバーへSSH接続を行う(Tera Term + Pageantの場合)
Pageantが起動している状態で、Tera Termを起動します。
※PuTTy CACでも接続可能ですが、私の好みでTera Termを使います。
teraterm.png

ホストに接続先のFQDN or IPアドレスを入力します。
teraterm_ssh.png

ユーザー名を入力し、「Pageantを使う」を選択します。
putty_user.png

PINの入力ポップアップが出るので、YubiKey Managerで設定したPINを設定します。
enterPIN.png

接続先サーバーにつながります。

##サーバーへSSH接続を行う(PuTTy CAC + Pageantの場合)
Pageantが起動している状態で、PuTTy CACを起動します。
putty.png

Host Nameに接続先のFQDN or IPアドレスを入力し、Openを押します。
putty_cac_ssh.png

Login as:というプロンプトが表示されるので、ユーザー名を入力します。
putty_cac_loginas.png

PINの入力ポップアップが出るので、YubiKey Managerで設定したPINを設定します。
enterPIN.png

接続先サーバーにつながります。

##サーバーへSSH接続を行う(Pageantを使わずに、PuTTy CACだけでSSHする場合)
PuTTy CACを起動します。
putty.png

Host Nameに接続先のFQDN or IPアドレスを入力します。
putty_cac_ssh.png

左側のCategoryから Connection > SSH > Certificate を展開し、「Set CAPI Cert...」を押します。
putty_cac_ssh2.png

Windowsの証明書選択画面が表示されるので、「その他」を押します。
cert_select.png

YubiKeyに含まれる証明書の情報が表示されるので、インポートした証明書を選択します。
cert_selected.png

Openを押します。
putty_cac_ssh3.png

Login as:というプロンプトが表示されるので、ユーザー名を入力します。
putty_cac_loginas.png

PINの入力ポップアップが出るので、YubiKey Managerで設定したPINを設定します。
enterPIN.png

接続先サーバーにつながります。

#Pageant起動時に、CAPIなどの証明書を読み込む方法(2021/9/20追記)
Pageantを起動時に自動実行させて、証明書を読み込む設定を入れる方法は、下記記事を参照ください。
[Win] Pageantを自動起動させて、あらかじめCAPIを読み込む設定を入れたい

以上

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?