一般的なデータ暗号化・復号化にssh-agentが記憶した鍵情報を使える「sshcrypt」の紹介

Page content

暗号化・復号化にssh-agentの便利さを

Linux等のシェル環境での作業において、あるデータや文字列のストレージへの保存には、平文ではなく暗号化した状態が求められ、それを利用する時の復号化には手間を掛けたくなく、当該環境ですでに利用中の鍵情報を用いて復号化したい場合があります。

たとえば、諸事情によりexpectコマンドで自動入力するパスワード文字列は、具体的には次のように扱いたいです。

  • パスワードは暗号化した状態でスクリプト内や外部ファイルに書いておく
  • パスワードそのものが必要な時、自身がログインした環境でのみ毎回自動的に復号化して利用する

“当該環境ですでに利用可能な鍵情報”としては、シェル環境でssh-agentが記憶している、SSHの公開鍵認証用の情報が利用できるのでは?と第一に思い当たります。そこで、ssh-agentを利用するデータの暗号化・復号化方法を探してみたところ、OpenSSL関係の標準的なコマンドでの方法はわかりませんでした (openssl rsautl-encrypt,-decryptはデータの暗号化・復号化を行えるがssh-agentとは関係しない)。

しかし嬉しいことに、私の希望通りの動作をする「sshcrypt」というツールを見つけましたので、簡単に紹介です。

sshcryptの使い方

sshcryptの公式ページはGitHub上の、次のところです。

sshcryptはGoLangで書かれていて、公式ページにある1行のInstall手順で導入できます。導入先は~/go/bin/になるのでPATHを通しておきましょう。

sshcryptにはいくつかの利用法がありますが、ここではssh-agentを利用する「with Agent」な例を取り上げます。

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

Agentを用いた復号化が想定通りに失敗する例

## 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 セキュリティキー YubiKey U2F/FIDO2/USB-A ポート/2段階認証/高耐久性/耐衝撃性/防水

ユビコ(Yubico)

Yubico セキュリティキー YubiKey 5 NFC ログイン/U2F/FIDO2/USB-A ポート/2段階認証/高耐久性/耐衝撃性/防水

Yubico セキュリティキー YubiKey 5 NFC ログイン/U2F/FIDO2/USB-A ポート/2段階認証/高耐久性/耐衝撃性/防水

ユビコ(Yubico)

参考リンク