🦞

ラズパイで育てる!自分だけのAI【基礎編】④ pass+GPGで安全にトークン管理

に公開

はじめに

🎯 この記事の対象読者

  • クレデンシャルが危ない理由を読んで、クレデンシャルの危険性を理解した方
  • Discord Bot Token や API キーを安全に管理したい方
  • Raspberry Pi に SSH で作業する環境がある方

前提知識: Docker 動作済み(Dockerセットアップ)、OpenClaw のセキュリティリスクを把握済み


前回はクレデンシャルが「チャット履歴に残る」「設定ファイルに平文で書かれる」というリスクを見てきました。

では、どうすれば安全に管理できるのか。この記事では pass(Unix Password Store) を使って Discord Bot Token と Gemini API Key を GPG 暗号化して保管する手順を解説します。

次の記事でこれを Docker コンテナに環境変数として渡す流れになります。


pass とは

🔑 pass は Unix の哲学に従ったシンプルなパスワードマネージャーです。

仕組みはシンプルで、シークレットを GPG で暗号化した .gpg ファイル として ~/.password-store/ に保存します。

~/.password-store/
├── discord/
│   └── openclaw.gpg   ← 暗号化された Discord Bot Token
└── gemini/
    └── openclaw.gpg   ← 暗号化された Gemini API Key

pass show discord/openclaw を実行すると GPG が復号して値を表示します。
$(pass show discord/openclaw) の形で他のコマンドにも渡せます。


ステップ 1: SSH でラズパイに接続

ssh pi@<ラズパイのIPアドレ>

以降のコマンドはすべて Pi 上で実行します。


ステップ 2: pass と gnupg をインストール

sudo apt-get update && sudo apt-get install -y pass gnupg

確認します。

pass --version
# → pass 1.7.x
gpg --version
# → gpg (GnuPG) 2.x.x

ステップ 3: GPG 鍵を作成する

pass は GPG 鍵を使ってシークレットを暗号化します。まず鍵を生成します。

バッチ方式で非対話生成

GPG の対話プロンプトは扱いが複雑なので、バッチ方式で生成します。
以下をそのまま Pi で実行してください。

gpg --batch --gen-key <<'EOF'
%no-protection
Key-Type: RSA
Key-Length: 3072
Name-Real: your-name
Name-Email: your-email@example.com
Expire-Date: 0
%commit
EOF

<details>
<summary>Name-Real / Name-Email について</summary>

GPG 鍵の UID(所有者識別子)です。メールは実際には送信されません。
ローカル用途であればダミーで構いません。

用途が分かる名前にすると、複数の鍵を持つようになったときに gpg --list-keys で識別しやすくなります。

例:

  • Name-Real: pi-openclaw
  • Name-Email: openclaw@pi01.local

</details>

生成確認

gpg --list-keys

以下のような出力が出れば成功です。

pub   rsa3072 2026-02-16 [SC]
      ABCD1234ABCD1234ABCD1234ABCD1234ABCD1234
uid           [ultimate] pi-openclaw <openclaw@pi01.local>
sub   rsa3072 2026-02-16 [E]

ステップ 4: pass を初期化する

GPG 鍵のメールアドレスを指定して pass を初期化します。

pass init "openclaw@pi01.local"

~/.password-store/ が作成されます。

pass
# → Password Store(空の状態)

ステップ 5: Discord Bot Token を登録する

Discord Bot Token の取得先はこちらです。

https://discord.com/developers/applications → アプリを選択 → Bot → Token

取得したら Pi で以下を実行します。

pass insert discord/openclaw

プロンプトが表示されるのでトークンをペーストして Enter を押します。

Enter password for discord/openclaw: (ここにペースト)
Retype password for discord/openclaw: (もう一度)

ステップ 6: Gemini API Key を登録する

Gemini API Key の取得先はこちらです。

https://aistudio.google.com/api-keys

pass insert gemini/openclaw

同様にプロンプトへ入力します。


ステップ 7: 確認する

ツリー表示

pass
Password Store
├── discord
│   └── openclaw
└── gemini
    └── openclaw

値の確認(先頭のみ表示)

全体を表示したくない場合は先頭だけ確認できます。

pass show discord/openclaw | head -c 20
# → MTQ2OD...(先頭20文字)

pass show gemini/openclaw | head -c 15
# → AIzaSy...(先頭15文字)

ファイルの実体を確認

ls -la ~/.password-store/discord/
# → openclaw.gpg(暗号化済みファイル)

cat しても意味不明なバイナリが返るだけです。GPG 鍵なしに復号はできません。


トークン・キーの更新・削除

トークンを更新したい場合

--force オプションで上書きできます。

pass insert --force discord/openclaw
# → 新しいトークンを入力するプロンプトが表示される

Gemini API Key も同様です。

pass insert --force gemini/openclaw

特定のエントリを削除したい場合

pass rm discord/openclaw

ディレクトリごと削除する場合は -r を付けます。

pass rm -r discord/

pass ストア全体をリセットしたい場合

rm -rf ~/.password-store

再度 pass init から始められます。

GPG 鍵ごと作り直したい場合

まず鍵のフィンガープリントを確認します。

gpg --list-keys
# → pub 行の下に表示される40文字の文字列
gpg --batch --yes --delete-secret-and-public-key <フィンガープリン>

その後、パスワードストアを削除してからステップ 3 に戻ります。

rm -rf ~/.password-store

おわりに

✅ 今回やったこと:

  1. pass + gnupg のインストール
  2. GPG 鍵のバッチ生成(パスフレーズなし・PoC 用)
  3. pass init でパスワードストアを初期化
  4. Discord Bot Token と Gemini API Key を暗号化して保存

次の記事では、この pass に保存したトークンを $(pass show ...) で取り出して Docker コンテナに渡し、OpenClaw の onboard を実行します。


基礎編:

📚 シリーズ全記事の目次はこちら

Discussion