SOPSでシークレットを暗号化する究極の手法:GitへのAPIキー流出リスクを完全に阻止する

Security tutorial - IT technology blog
Security tutorial - IT technology blog

背景:シークレット流出によるアカウント消失の恐怖

たった5秒間、AWSアクセスキーを含む.envファイルをパブリックリポジトリに誤って<a href="https://itfromzero.com/ja/security-ja/ai%e3%82%b3%e3%83%bc%e3%83%89%e3%82%a2%e3%82%b7%e3%82%b9%e3%83%86%e3%83%b3%e3%83%88%e4%bd%bf%e7%94%a8%e6%99%82%e3%81%ae%e3%82%88%e3%81%8f%e3%81%82%e3%82%8b%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86.html">git push</a>してしまっただけで、ハッカーの恐るべき「速さ」を目の当たりにすることになります。わずか数分後には、自動スキャンボットによって、暗号資産のマイニングスクリプト実行のために数千ドルの費用が発生する可能性があります。プライベートリポジトリであっても、パスワードをプレーンテキスト(plain-text)で保存する習慣は、いわば時限爆弾のようなものです。

多くのエンジニアは.ignoreを使って回避しようとしますが、この方法はチーム内での連携を非常に難しくします。新しいメンバーが加わるたびに、チーム全員がSlackやTelegram経由で設定ファイルを手渡ししなければならず、手間がかかる上に紛失しやすくなります。さらに重要なのは、現在のコミットでファイルを削除したとしても、それはGitの履歴の中に永遠に残り続けるということです。悪意のある者は、過去に遡るだけで全てを手に入れることができます。

そこで登場するのが、MozillaのSOPS(Secrets Operation)です。ファイル全体を判読不能なバイナリにするのではなく、SOPSは値(values)のみを暗号化し、キー(keys)はそのまま保持します。これにより、データの流出を恐れることなく、ファイルの構造を確認したり、git diffを快適に行ったりすることができます。このツールは、PGPからAWS KMS, GCP KMS, Azure Key Vaultなどの主要クラウドサービスまで幅広くサポートしています。

SOPSのインストール:素早く、簡単に、軽量に

OSによりますが、ローカルマシンにSOPSを導入するのに1分もかかりません。

クイックインストールコマンド

MacまたはLinux(Homebrew導入済み)のユーザーは、以下のコマンドを使うのが手っ取り早いです:

brew install sops

または、Linux用のバイナリを直接ダウンロードする場合:

curl -LO https://github.com/getsops/sops/releases/download/v3.8.1/sops-v3.8.1.linux.amd64
sudo mv sops-v3.8.1.linux.amd64 /usr/local/bin/sops
sudo chmod +x /usr/local/bin/sops

PGP「鍵」の生成

個人プロジェクトや小規模なチームであれば、PGPを使用するのが最もコスト効率が良く効果的な方法です。大規模な企業の場合は、アクセス権限を一元管理できるKMSを優先的に使用してください。

以下のコマンドで新しいGPG鍵ペアを作成します:

gpg --full-generate-key

現在最も高いセキュリティを確保するために、RSA 4096ビットを選択してください。作成後、鍵のフィンガープリント(識別子)を取得します:

gpg --list-secret-keys --keyid-format LONG

pub行の文字列(例:1A2B3C4D...)をコピーしてください。これが、SOPSがどの鍵を使用すべきかを知るための「IDカード」になります。

エンジニア向けのヒント: せっかく暗号化するなら、元のパスワードも強力なものにすべきです。123456のような簡単なものではなく、toolcraft.app/ja/tools/security/password-generator などのパスワード生成ツールを使うのがおすすめです。このツールは完全にブラウザ上で動作するため、SOPSと組み合わせて設定ファイルに保存する際も非常に安全です。

実戦:ファイルの直接暗号化と編集

例えば、機密情報を含むsecrets.yamlファイルがあるとします:

api_key: "sk_live_51Mz..."
db_password: "super-strong-pass-2024"
username: "admin"

ステップ1:.sops.yamlでルールを設定する

コマンドを実行するたびに鍵IDを手動で入力するのは大変です!プロジェクトのルートディレクトリに.sops.yamlファイルを作成しましょう:

creation_rules:
  - path_regex: secrets\.yaml$
    pgp: "YOUR_GPG_FINGERPRINT_HERE"

ステップ2:ワンコマンドで暗号化

以下のコマンドを実行して、データを「マトリックス」のように難読化します:

sops -e -i secrets.yaml

ファイルを開くと、api_keyというキーは残っていますが、その値はENC[AES256_GCM,...]という非常に長い文字列に変わっているのが分かります。これでGitHubにプッシュしても完全に安全です!

ステップ3:復号せずに直接編集

これが最も「価値のある」機能です。一時ファイルに復号(不注意による流出のリスクがあります)する必要はありません。ただ次のように入力するだけです:

sops secrets.yaml

SOPSがVimやNanoでファイルを開きます。内容を編集して保存(:wq)すれば、SOPSが即座に新しい内容を自動的に再暗号化します。通常のテキストファイルを編集しているかのようなスムーズな操作感です。

CI/CDへの統合とチーム開発

同僚も復号できるようにするには、彼らの公開鍵(Public Key)を.sops.yamlファイルに追加するだけです。一つのファイルに複数の「鍵」を同時に設定できます。

GitHub Actions of ワークフローへの組み込み

デプロイスクリプトでは、GitHub Secretsに秘密鍵(Private Key)を保存し、アプリケーションが起動する前に復号する必要があります:

# アプリで使用するためにファイルを復号する
sops -d secrets.yaml > secrets.decrypted.yaml

覚えておくべき「極めて重要」なポイント

  • 常にgit diffを確認する: git commitする前に、古いパスワードではなく、難読化された文字列が表示されていることを必ず確認してください。
  • 秘密鍵のバックアップ: 鍵を紛失すると、すべてのシークレットが失われます。「パスワードを忘れた場合」のボタンはありません。1Passwordに保存するか、紙に印刷して金庫に保管してください。
  • 同僚を忘れない: 自分だけで暗号化してチームの鍵を追加していないと、彼らはファイルを前にして途方に暮れることになります。

SOPSの導入には、最初の設定に10〜15分ほどかかるかもしれませんが、それによって得られる安心感は絶大です。これからはgit pushをするたびに、APIキーの流出を心配することなく、自信を持ってコーヒーを淹れに行くことができます。皆さんの成功を祈っています!

Share: