SSH -priv-keyのみでファイルを暗号化しますか?


22

SSH秘密鍵のパスワードを知って、自分だけが読めるようにファイルを暗号化するとします。機密情報を暗号化または難読化するリポジトリを共有しています。それにより、リポジトリに情報が含まれることになりますが、特別な場合にのみ開きます。

  1. SSHエージェントを使用している場合、ファイルを暗号化して自分だけが後で開くことができる簡単な方法はありますか?

  2. ここで質問するためになぜGPGを使用する必要があるのか​​わかりません。基本的にパスワードを知っているので、SSHキーと同じパスワードでファイルを復号化するだけです。これは可能ですか?

回答:


27

要件は有効だと思いますが、対称暗号化と非対称暗号化が混在しているため、一方で難しいこともあります。私が間違っている場合は修正してください。

推論:

  1. 秘密鍵のパスフレーズは、秘密鍵のみを保護することです。
  2. これにより、次の状況が発生します。秘密キーを使用して、自分だけが解読できるものを暗号化する場合。あなたの秘密鍵はそのためのものではありません。あなたの公開鍵はそうするためのものです。秘密鍵で暗号化したものは、公開鍵(署名)で復号化できますが、それは間違いなくあなたが望むものではありません。(公開鍵で暗号化されたものはすべて、秘密鍵でのみ復号化できます。)
  3. したがって、データを暗号化するには公開鍵を使用する必要がありますが、そのためには秘密鍵のパスフレーズは必要ありません。復号化する場合にのみ、秘密鍵とパスフレーズが必要になります。

結論:基本的に、対称暗号化のためにパスフレーズを再利用したいと思います。パスフレーズを指定したいプログラムはssh-agentのみであり、このプログラムはパスフレーズのみで暗号化/復号化を行いません。パスフレーズは、秘密鍵のロックを解除して忘れた場合にのみ存在します。

推奨事項:パスフレーズで保護されたキーopenssl encファイルgpg -e --symmetricを使用するか、暗号化に使用します。情報を共有する必要がある場合は、両方のプログラムの公開鍵インフラストラクチャを使用して、PKI / Web of Trustを作成できます。

opensslでは、次のようなものです。

$ openssl enc -aes-256-ctr -in my.pdf -out mydata.enc 

そして復号化のようなもの

$ openssl enc -aes-256-ctr -d -in mydata.enc -out mydecrypted.pdf

更新:上記のopensslコマンドは、データの改ざんを防止しないことに注意することが重要です。encファイルを単純にビットフリップすると、復号化されたデータも破損します。上記のコマンドではこれを検出できません。たとえば、SHA-256などの適切なチェックサムでこれを確認する必要があります。これを統合した方法で暗号化する方法があり、これはHMAC(ハッシュベースのメッセージ認証コード)と呼ばれます。


5
SSHキーは非対称キーであり、ファイルの暗号化には適していません。その結果、最後に指定したコマンドは機能しません。RSAでファイルを暗号化しようとしていますが、RSAで暗号化できるのは非常に小さいペイロード(モジュラスのサイズからパディングを引いたもの)だけです。通常の方法では、使い捨ての対称キーを生成し、RSAで暗号化し、対称キーで実際のデータを暗号化します。sshキーをgpgにインポートすることも可能かもしれませんが、これはhhhの要件を実装するための健全な方法ですが、gpgキーでgpgを使用するのは正しいことです。
ジル 'SO-悪であるのをやめる

1
対称-flagを指定してgpgを提案するのはなぜですか?それはまた動作します"gpg -e something"が、異なる場合ですか?

1
@hhhファイルを共有しないと想定したので、公開鍵暗号を使用するよりも単純な対称を使用する方が安全です。公開鍵/秘密鍵のペアなどは不要です。pgp.net / pgpnet / pgp-faq / から:「RSAはPGPチェーンの中で最も弱いリンクであると考えられています。」これは、x509などの他のpubkeyメカニズムにも適用されます。
バスケス

1
openssl -one-linerはどのように見えますか?と同等の何か$ gpg -e --symmetric

1
これを使用して、encrypt:openssl enc -aes-256-cbc -in my.pdf -out mydata.enc、decrypt with:openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdf両方のコマンドがパスワードを要求します。man encキーファイル、base64エンコーディングなどのすべてのオプションについては(rh / fedora / centosを参照)
vasquez

21

opensslユーティリティーはかなり遍在しているようなので、このユーティリティーを使用したいと思います。

RSA公開鍵と秘密鍵をPEM形式に変換します。

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
$ openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > id_rsa.pub.pem

公開鍵でファイルを暗号化する:

$ openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -in file.txt -out file.enc

秘密鍵でファイルを復号化する:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc -out file.txt

しかし、Gillesが上記でコメントしたように、これは公開鍵よりも小さいファイルの暗号化にのみ適しているため、次のようなことができます。

パスワードを生成し、対称的にファイルを暗号化し、パスワードをファイルに保存する公開鍵で暗号化します。

$ openssl rand 64 | 
tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) |
openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem  -out file.enc.key

秘密鍵でパスフレーズを復号化し、それを使用してファイルを復号化します。

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key | 
openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt

暗号化されたファイルと暗号化されたパスフレーズの2つのファイルになりますが、スクリプトに入れるとうまく機能します。

tar cvf file file.enc file.enc.key片付けることもできます。

最適には、パスフレーズのサイズを最大化し、rand 64公開キーのサイズを変更します。


OPの風変わりな要件を考慮して、非常にうまく行われました。
rsaw

2
この素敵な投稿だけを見つけました。ssh-keyから生成できる対称キーの最大サイズは、ssh-key自体よりも12バイト短いことがわかりました。そうでない場合、rsautlは「キーサイズに対して大きすぎるデータ」で失敗します。そのため、これはスクリプトで機能しましたKEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')。キーの長さを自動生成するためです。ssh-keygenの最小キー長が768ビットである場合、これは依然として最小の対称キーが672ビット、つまり84バイトになります。
マークフ

6

luks / dm-cryptを見てください。適切なオプションを使用して、ssh-private-keyを暗号化キーとして使用できます。

更新:LV-block-deviceでLUKSを使用した暗号化の例(VGシステムでのLVテスト):

KEY=/home/youraccount/.ssh/id_dsa
DEVICE=/dev/system/test
cryptsetup luksFormat $DEVICE $KEY
cryptsetup luksOpen $DEVICE test_crypt --key-file $KEY

これにより、ブロックデバイス/ dev / mapper / test_cryptが生成され、これを使用してデータを保存できます(選択したファイルシステムでフォーマットした後)。

削除するには、アンマウントしてを使用しますcryptsetup luksClose test_crypt


再利用しやすいようにMVOを提供してもらえますか?"$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."正しく理解できれば、この方法はファイルシステムレベルの暗号化です。umount / mountが必要なfsを暗号化しますか、これを読み間違えていますか?

2
私はこれがあなたがそれがすると思うことをしないと思います。--key-filecryptsetup のオプションは、ファイルの実際のコンテンツを1つの大きなパスワードとして使用します。ファイルからopensslキーを読み取らず、そのまま使用します。--key-file必要に応じて、ランダムバイトのファイルを使用できます。
パトリック

@hhhはい、これはFSレベルの暗号化です。
ニルス

4
@Nilsが、プライベートキーのパスワードを変更するとどうなりますか。キーファイルのデータが変更されたため、ファイルを解読できなくなります。--key-file本当にオプションの選択が不十分な名前である必要があります--password-file
パトリック

1
@Patrickこれは事実です-パスフレーズを変更すると、ファイルが変更されるため、キーが変更されます(luksの観点から)。しかし、sshの観点からすれば、パスワードファイルとは名付けません。私の答えは目立っていないことを知っていますが、それはいくつかのアイデアを提供すると思います。
ニルス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.