secs-man: ベンダーに依存しないシークレット・バックアップ・ツール

secs-man: ベンダーに依存しないシークレット・バックアップ・ツール

重要なシークレットのベンダーロックインを回避する

secs-man は、シークレットの安全なバックアップ、復元、および検証を行うために設計されたコマンドライン・ツールです。その主な目的は、ユーザーが最も機密性の高いデータを復旧するために、特定のソフトウェア・エコシステムに依存しないようにすることです。暗号化と復元をツール自体から切り離すことで、secs-man は、ソフトウェアがメンテナンスされなくなったり利用できなくなったりした場合でも、シークレットへのアクセス可能性を確保します。

コア・フィロソフィー:相互運用性と標準規格

secs-man の基本的な設計原則は、重要なデータの復旧に、それを暗号化した特定のソフトウェアを必要としないことです。これを実現するために、このツールは独自のフォーマットではなく、広く採用されている技術と標準規格に依存しています。

復旧スタック

secs-man は、以下のコンポーネントのみを使用して完全に再現可能であるように構築されています:

  • A terminal
  • Coreutils: cp, mv, sha256sum などの標準的な Linux ユーティリティ
  • age: モダンでシンプル、かつ軽量な暗号化ツール
  • Manual effort: ツールが利用できない場合に手動で復旧ステップを実行する能力

暗号化に age を、整合性検証に coreutils を使用することで、ツールはソフトウェアの陳腐化によるデータ損失のリスクを最小限に抑えます。

技術的な実装とワークフロー

secs-man は、中央ディレクトリと、管理対象のファイルをリスト化したマニフェスト・ファイル (.secrets-manifest) を利用してシークレットを管理します。このマニフェストには、復元時に使用するオプションの所有者およびモード権限が含まれます。

エクスポートと暗号化

シークレットをエクスポートする際、secs-man は以下の手順を実行します:

  1. Integrity Check: ソースファイルのチェックサムを検証します。
  2. Encryption: インタラクティブなプロンプトを介して提供されるパスフレーズを使用して、age を用いてファイルを暗号化します。このツールは、環境変数、ファイル、または引数からパスフレーズを読み取ることは決してありません。
  3. Checksum Generation: 暗号化されたデータの整合性を保証するために、*.sha256 ファイルを生成します。
  4. Snapshotting: 暗号化されたファイルを、エクスポート・ターゲット・ディレクトリ内のタイムスタンプ付きスナップショットとして保存します。

インポートと復号

シークレットを復元するには、ツールは同じパスフレーズを使用してファイルを復号し、ターゲット・ディレクトリに復元します。マニフェストに指定されている場合、ツールは正しいファイルの所有権と権限を適用します(モードが指定されていない場合はデフォルトで 600 になります)。

検証

ユーザーは verify-export を実行することで、既存のエクスポートの整合性を検証できます。このプロセスでは、すべてのチェックサムが一致することを確認し、古いエクスポートが劣化したり破損したりしていないかを保証します。

リモート・マシンの管理

secs-man には、リモート・ホスト上のシークレットを、暗号化パスフレーズをリモート・マシンにさらすことなく扱うためのコンパニオン・スクリプト secs-man-ssh が含まれています。

  • Exporting from remote: スクリプトはリモートのシークレットをリモート・ホスト上のテンポラリ・ディレクトリにコピーし、それをローカル・ホストへ移動し、その後ローカルでエクスポートを実行します。
  • Importing to remote: スクリプトはスナップショットをローカルでテンポラリ・ディレクトリに復号し、プレーンテキストのファイルをリモート・ホストへコピーし、その後リモートの最終的なシークレット・ディレクトリへインポートします。

このワークフローにより、復号プロセスは、信頼できないリモート・ホストではなく、信頼できるローカル・マシン上で実行されることが保証されます。

手動復旧プロセス

secs-man は標準的なツールを使用しているため、ツール自体がなくても復旧が可能です。

  • Manual Export: 動作は age --passphrase --output filename.txt.age --encrypt filename.txt を実行することと同等です。
  • Manual Verification: 整合性は find . -name "sha256sums.txt" -execdir sha256sum -c sha256sums.txt \; を使用して検証できます。
  • Manual Import: ファイルは age --output filename.txt --decrypt filename.txt.age を使用して復号でき、その後、権限を復元するために手動で chmod および chown コマンドを実行します。

スレット・モデルとセキュリティ上の考慮事項

secs-man は、エクスポート中に、自動的にクリーンアップされないスナップショットを作成します。これは、シークレットのタイプに基づいて、異なるリスク・プロファイルを示します。

  • Authenticating Secrets: 回転可能なキー(例:SSH や WireGuard キー)の場合、スナップショットは最小限の追加リスクをもしかたらしかけます。
  • Decrypting Secrets: マスター・キーやディスク・キーの場合、古いスナップショットは、現在のシークレットが漏洩した場合に過去の復号キーをさらす可能性があります。著者は、これらのタイプのシークレットをローテーション・サイクルに従って更新する際、古いエクスポート・スナップショットを手動で削除することを推奨しています。

Sources