Linux等のシェル環境での作業において、あるデータや文字列のストレージへの保存には、平文ではなく暗号化した状態が求められ、それを利用する時の復号化には手間を掛けたくなく、当該環境ですでに利用中の鍵情報を用いて復号化したい場合があります。
たとえば、諸事情によりexpect
コマンドで自動入力するパスワード文字列は、具体的には次のように扱いたいです。
“当該環境ですでに利用可能な鍵情報”としては、シェル環境でssh-agent
が記憶している、SSHの公開鍵認証用の情報が利用できるのでは?と第一に思い当たります。そこで、ssh-agent
を利用するデータの暗号化・復号化方法を探してみたところ、OpenSSL関係の標準的なコマンドでの方法はわかりませんでした (openssl rsautl
の-encrypt
,-decrypt
はデータの暗号化・復号化を行えるがssh-agent
とは関係しない)。
しかし嬉しいことに、私の希望通りの動作をする「sshcrypt」というツールを見つけましたので、簡単に紹介です。
sshcryptの公式ページはGitHub上の、次のところです。
sshcryptはGoLangで書かれていて、公式ページにある1行のInstall手順で導入できます。導入先は~/go/bin/
になるのでPATHを通しておきましょう。
sshcryptにはいくつかの利用法がありますが、ここではssh-agent
を利用する「with Agent」な例を取り上げます。
## ssh-agentにパスフレーズ付きの鍵を登録する (あえて手動で登録している例)
$ ssh-add ~/.ssh/id_ed25519_test1
Enter passphrase for /home/hoge/.ssh/id_ed25519_test1:
Identity added: /home/hoge/.ssh/id_ed25519_test1 (hoge@raspi4)
## ssh-agentに鍵情報が登録されていることを確認
$ ssh-add -l
256 SHA256:JBN7Km/y4jpOCRln7q9xWQgJa8JtbjQrhwW1mJsK5sI hoge@raspi4 (ED25519)
## 文字列「HELLO」をsshcrypt agent-encryptで暗号化する
$ echo HELLO | sshcrypt agent-encrypt | tee encrypted.txt
hA8JV437UjOdEWALIWbM/Etxh9GhY/zNqkLNHiaHk4cbiNMBlIP7lwu8gYOQC2WjBMYCdKR8e+IH8+9xSPOMQg== LNGDhspZmXFSKBe2N0VrmnjoPTxRHISyBobGWdxEEVdHVw64atxW7aXdTSohHYFNh/rX9N/k+4HaJa3yc9g=
## 暗号化した文字列をsshcrypt agent-decryptで復号化する→復号化できた
$ cat encrypted.txt | sshcrypt agent-decrypt
HELLO
## ssh-agentに登録されている鍵情報を削除する
$ ssh-add -D
All identities removed.
$ ssh-add -l
The agent has no identities.
## 暗号化した文字列をsshcryptで復号化する→鍵情報がないため復号化できない
$ cat encrypted.txt | sshcrypt agent-decrypt
There are no SSH keys added to the SSH Agent. Check that you have added keys to the SSH Agent and that SSH Agent Forwarding is enabled if you are using this remotely.
exit status 1
## ssh-agentに別の鍵情報を登録した状態を用意
$ ssh-add -l
256 SHA256:Z2xKLeqKfBG6FD5vw1lTH4Dez4cxJAzX0xLowvl7GV8 hoge@raspi4 (ED25519)
## 暗号化した文字列をsshcryptで復号化する→鍵情報が違うため復号化できない
$ cat encrypted.txt | sshcrypt agent-decrypt
Decryption not possible
exit status 1
sshcryptは、ssh-agent
が記憶する鍵情報を用いて一般的なデータを暗号化・復号化できる、セキュリティに便利さを加えるツールです。自身のssh-agent
が鍵情報を記憶している間のみ有効という点は、USBポートに物理的に挿しておくセキュリティキーの有限性にどこか似ているのかも。私は手元のbashやその他のスクリプトにsshcryptを組み込んで、これから活用していく予感がしています。
Yubico セキュリティキー YubiKey U2F/FIDO2/USB-A ポート/2段階認証/高耐久性/耐衝撃性/防水
ユビコ(Yubico)
Yubico セキュリティキー YubiKey 5 NFC ログイン/U2F/FIDO2/USB-A ポート/2段階認証/高耐久性/耐衝撃性/防水
ユビコ(Yubico)