私が探しているユースケースは首のないサーバーを開き、ハードウェアキーを使用して「ロック解除」すると、サーバーのスクリプトは私が接続したことを認識し、PINやパスワードなどの要素なしで自動的に使用されます。
これを達成する最も原始的な方法は、サーバーのスクリプトが検索してコンテンツを復号化するために使用できる暗号化されていない生のAESキーを持つUSBサムドライブを持つことです。欠点は、USBスティックをコピーでき、紛失したときに元に戻せないことです。また、スクリプトがUSBドライブを使用している間にドライブを取り外すと、USBドライブ自体のファイルシステムが破損する可能性があるという問題もあります。
スマートカードやYubikeyはこれらの問題に対する明確な解決策のように見えますが、Yubikeyソリューションを説明するほとんどの人はこれを2番目の認証要素としてgpgと組み合わせるようです。 「追加」認証要素を必要とせず、キーが可能ないくつかの復号化方法の1つになりたいです。私は各ホストにgpgを設定したくないし、「アイデンティティ」や有効期限、信頼チェーンなどをしたくない。もう1つの人気のあるオプションはLUKSと統合することですが、rootではなくユーザースペースオプションがあれば良いと思います。
暗号化されたAESキーを取得し、ハードウェアのRSA秘密キーを使用してそれを復号化するようにYubikeyに直接要求したいです(PINやパスワードは必要ありませんが、デバイスを短く押すか長押しすることで可能です)。
これを達成するための既存のツールはありますか?スクリプト言語ライブラリも良いです。
答え1
最新のLinuxまたは同様のシステムで実行されていると仮定すると、暗号化部分は非常に単純でなければなりません。
(編集:あなたの質問をもう一度読んでみてください。ここに行く認証について質問し、RSA暗号化に関する具体的な質問でここに回答しました。ここで説明されているように設定してから、この種の操作を実行するように設計された pam_pkcs11 を確認することをお勧めします。 )
設定
Yubikeyに「PIV」モードが有効になっていて通信できるOpenSC PKCS#11モジュールがインストールされていることを確認してください。 OpenSSL PKCS#11 "エンジン"もインストールします。
使用Yubico-piv-ツールまたはRSAキーをインストールする別の方法コイン投入口「カード検証スロット9e」のような選択。既存のキーをインポートしたり、Yubikeyの外に存在しないキーを生成したりできます。
契約書に署名
今は簡単です。ファイルでRSAキーを使用できるすべてのソフトウェア しなければならない標準を受け入れるPKCS#11 URI代わりにYubikeyのキーを識別します。
カード認証スロットのキーのURIは次のとおりです'pkcs11:manufacturer=piv_II;id=%04'
。
だからあなたは次のことをすることができます
echo "test payload" | openssl dgst -sha256 -sign 'pkcs11:manufacturer=piv_II;id=%04' -hex
...OpenSSL以外には何もありません。かなりまだ完了していないので追加する必要があります。
-engine pkcs11 -keyform engine
すべての暗号化ソフトウェアの作成者はユーザーを嫌い、怠惰なので、上記のコマンドラインにミルダ明らかな事実は、PKCS#11 URIを提供したという事実に由来します。これも少し最新のOpenSSLはエンジンの代わりに「サプライヤー」を使用しているので、昔ながらだと思います。まだただ仕事を正しくするわけではないので、少し調整が必要な場合があります。その他無意味なビジョンオーダーを使用すると、そうすることができます。
良いソフトウェアに慣れるこれらの追加のヒントは必須であり、単にファイル名をURIに変更し、正しい操作を実行します。そうでない場合はバグを報告してください。
はい
$ yubico-piv-tool -s9e -ARSA2048 -agenerate | tee pubkey.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr9LrzjNbRABqhDQrGi3l
VcQhmUu0lls8k4XnO8c/U0oS6IvH4H7HuqXFfwThYofxIgA2eIXuRXf+V/CSWtXN
40Bb10QKcTXVATm05+KFNWg1GCVg2yrvsUOQSd6MOxAa5goUUi2xOjeLFZRvXuvt
YmLytwY77YqE0WOHYfYuk9kolueZHhq4BSOVRmQpZxKd6/MkWlT46SPc3Bwbyx41
t2U42vlnHYuma3NF6qI+a+LaMyvkFVBkRM6A1WB2u5jjl/ZQmyYsuqg2e8xu7P8m
5/GUH9HjD074+ea1NEdMncPhKjO+pL24BSebtIPUmzEJIh6kCaweJYiMKYuLx15H
HQIDAQAB
-----END PUBLIC KEY-----
Successfully generated a new private key.
$ echo Test | openssl pkeyutl -encrypt -pubin -inkey pubkey.pem > Test.enc
$ openssl pkeyutl -decrypt -in Test.enc -engine pkcs11 -keyform engine -inkey 'pkcs11:manufacturer=piv_II;id=%04'
Engine "pkcs11" set.
Test
署名もできます...
$ echo Test | openssl dgst -sha256 -sign 'pkcs11:manufacturer=piv_II;id=%04' -engine pkcs11 -keyform engine > signature.bin
$ echo Test | openssl dgst -sha256 -verify pubkey.pem -signature signature.bin
Verified OK
長い話を短く
Yubikey PIVのスロットごとにポリシーが異なり、特にPINが必要かどうかに関するポリシーが異なります。私がリンクした文書を読んでください。バラよりhttps://www.infradead.org/openconnect/pkcs11.htmlもっとヒントを見るには発見するトークンに提供されるオブジェクトの URI。
答え2
婦人声明:私はYubikeyを使ったことがありません。
いくつかの背景
YubikeyはOpenPGPを含む多くのプロトコルをサポートしているようです。しかし、「一般的な古い」RSAをサポートすると主張するわけではありません。 IO Yubikey内部のどこかで何かのRSA復号を要求することは不可能ではありませんが、これは公に文書化されていないようです。
代わりに、Yubikeyはすべての意図と目的に合わせて多くのプロトコルを直接実装しています。最大ここでフォーカスは認証(望むものではない)にあります。
実際、ここには妥当な理由があるかもしれません。 AFAIKの専門家は、RSAを使用して大量のデータを暗号化するのは悪い考えだと思います。代わりに、主なプロトコルは通常、対称鍵を使用して一括データを暗号化し、RSAを使用して[はるかに小さい]対称鍵を暗号化します。
暗号化を使用すると多くの間違いを犯す可能性があり、誰かが間違いを乱用するまではわからないので、独自のプロトコルを作成するのは一般的に悪い考えです。
Yubikeyを使用したデータの暗号化と復号化
これは技術的にあなたが要求するものではありませんが、あなたの目標を達成するようです。つまり、ハードウェアYubikeyの助けを借りてのみ解読できるコンテンツを暗号化できるようにしたいのです。
OpenPGPは、RSAを使用してファイルを暗号化するために使用できる完全な暗号化プロトコルです。技術的には、対称鍵を使用してファイルを暗号化し、RSAを使用して対称鍵を暗号化します。また、ほとんどの*nixオペレーティングシステムでも簡単に動作します。
YubikeyはOpenPGP(AKA gpg
)をサポートし、2FAだけでなくスタンドアロンでも使用できます。より正確に言えば、YubikeyはRSA秘密鍵を安全に保存するために使用でき、通常のUSBペンドライブに保存するのとは異なり、秘密鍵をホストに公開することなくOpenPGP暗号化ファイルを復号化するのに役立ちます!
gpg-agent
GPGキーを処理するためのバックエンドです。ねえ。gpg-agent
ファイルを復号化するには、Yubikeyと直接対話できる必要があります。ねえ:
gpg-cardは、スマートカードとUSBトークンを管理するために使用されます。これは、フロントエンドと見なすことができる機能から
gpg --card-edit
スマートカード処理のために始まるscdaemon
デーモンまで、さまざまな機能を提供します。gpg-agent
「というブログ投稿があります。Yubikeyを使用してSSHキーを保存する(RSA 4096)「YubikeyにRSAキーを保存するようにgpgに要求する方法について説明します.
gpg> keytocard
...また録音されましたここ
ここでやるべきことは、使用したいデータを暗号化または復号化することだけです。
# Recipient identifies which public key to encrypt with
gpg --encrypt <filename> -r <recipient ... you>
gpg --decrypt <filename>