パスワードマネージャー — Mac + Windows 統合セットアップと CLI 自動化
1Password / Bitwarden を両機にセットアップし、SSH · Git · dotfiles の自動取得と連携させる。
パスワードマネージャーが真価を発揮する場面は2つある — (1) ブラウザのオートフィル、(2) ターミナル / dotfiles / CI からの自動シークレット取得だ。(1) だけ使っているなら、価値の半分しか享受できていない。(2) をセットアップすると .env への平文シークレット記述をやめられ、新しいマシンを1コマンドでブートストラップできるようになる。パスワードマネージャーの本質はパスワード記憶の代替ではなく、シークレット管理のインフラだと考える — CLI と連携させることで初めて、シークレットがコードから完全に切り離されるからだ。
このガイドでは 1Password(推奨)· Bitwarden を比較し、Mac + Windows 統合セットアップを解説する。
TL;DR
| 項目 | 1Password | Bitwarden |
|---|---|---|
| 価格 | 有料(月額) | 無料 + 有料プラン |
| セキュリティモデル | E2E + Secret Key(デバイス認証) | E2E + マスターパスワード |
| CLI 品質 | ✅ 優秀(op CLI + 生体認証) | 良好(bw CLI) |
| SSH 統合 | ✅ ネイティブ SSH エージェント | 手動 |
| Git 署名 | ✅ SSH キーによるコミット署名 | 手動 |
| モバイル / ファミリー共有 | ✅ | ✅ |
| セルフホスト | ❌ | ✅(Vaultwarden) |
推奨:1Password(開発者ワークフローとの統合が特に優れている)。コストを抑えたい、またはセルフホストが必要な場合は Bitwarden。
1. 1Password のセットアップ
1.1 インストール(Mac)
brew install --cask 1password 1password-cli1.2 インストール(Windows)
winget install --id AgileBits.1Password -e
winget install --id AgileBits.1Password.CLI -e1.3 初回サインイン
デスクトップアプリ → サインイン(メール + Secret Key + マスターパスワード)。Secret Key はサインアップ時に発行された PDF、または登録済みの別デバイスから取得する。
1.4 CLI ↔ デスクトップ連携
デスクトップ → Settings → Developer → 「1Password CLI と連携する」 ✅。これが最重要の手順だ — op コマンドが GUI の生体認証(Touch ID / Windows Hello)経由で認証されるようになる。
確認:
op vault list
# Touch ID/Windows Hello で認証。パスワードは求められない。2. SSH キー統合(1Password)
従来、SSH キーは ~/.ssh/id_ed25519 に平文ファイルとして置かれていた。1Password には組み込みの SSH エージェントが搭載されており、キーはボールト(Vault)に保存され、使用のたびに生体認証で認可される。
2.1 キーを生成する
1Password デスクトップ → 「+」 → SSH Key:
- Name:
personal-ed25519 - Algorithm:Ed25519
- キーペアが自動生成される
2.2 SSH エージェントを有効化
デスクトップ → Settings → Developer → 「SSH エージェントを使う」 ✅
- macOS:
~/.ssh/configに自動追加 - Windows:環境変数が自動設定
2.3 公開鍵を GitHub に登録
1Password ボルト → そのキーアイテム → 「Public key」をコピー → GitHub → Settings → SSH and GPG keys → New SSH key。
2.4 テスト
ssh -T git@github.com
# Hi yourname! You've successfully authenticated...
# (Touch ID / Windows Hello を1回タップ)
~/.ssh/に平文キーファイルを置く必要がなくなる。新しいマシンは 1Password にサインインするだけで SSH が即座に動く。
3. Git コミット署名(SSH キー使用)
GPG より簡単で、同じキーを再利用できる:
git config --global gpg.format ssh
git config --global user.signingkey "ssh-ed25519 AAAA... your-comment"
# 1Password アイテムから公開鍵をコピー
git config --global commit.gpgsign truegit commit → 1Password 生体認証 → 自動署名。同じ公開鍵を GitHub Settings → SSH and GPG keys → 「Add new signing key」に登録する。
4. .env / API キー統合
平文の .env の代わりに 1Password から取得する:
4.1 シークレットを追加する
1Password → 「+」 → API Credential:
- Title:
Anthropic API Key - Credential:
sk-ant-... - Tags:
dev、api
4.2 CLI で取得
op item get "Anthropic API Key" --fields credential
# sk-ant-...4.3 op run — 自動注入
プレースホルダーのみの .env.tmpl:
ANTHROPIC_API_KEY=op://Private/Anthropic API Key/credential
GITHUB_TOKEN=op://Private/GitHub/token
実行:
op run --env-file=.env.tmpl -- npm run dev
# コマンドは実際の値が環境変数として注入された状態で実行される.env.tmpl は安全にコミットできる(参照パスのみで値は含まない)。実際のシークレットはボールト内にのみ存在する。
4.4 chezmoi 統合
mac/dotfiles より、chezmoi テンプレート:
# dot_env.tmpl
export ANTHROPIC_API_KEY={{ onepasswordRead "op://Private/Anthropic/credential" }}
chezmoi apply が自動注入 → 新しいマシンに平文の .env を生成する。
5. Bitwarden — 無料の代替
5.1 インストール
# Mac
brew install --cask bitwarden bitwarden-cli
# Windows
winget install Bitwarden.Bitwarden
winget install Bitwarden.CLI5.2 サインイン + セッション
bw login email@example.com
# マスターパスワード → API キーを返す
# セッションをエクスポート
export BW_SESSION="$(bw unlock --raw)"
# または .zshrc に関数として定義:
function bwl { export BW_SESSION="$(bw unlock --raw)"; }5.3 シークレットを読む
bw get item "Anthropic API"
bw get password "Anthropic API"
bw get notes "Some Long Note"JSON 出力。jq と組み合わせると便利:
bw get item "GitHub" | jq -r '.login.password'5.4 弱点
- SSH エージェント統合なし(キーを手動で保存することは可能だが自動使用はされない)
- Git コミット署名の自動化なし
- 生体認証の統合は OS やアプリに依存する(1Password ほどスムーズではない)
5.5 セルフホスト(Vaultwarden)
# Mac/Linux docker
docker run -d \
--name vaultwarden \
-v ./vw-data:/data \
-p 8000:80 \
vaultwarden/server:latestホームサーバーで実行し、bw config server http://your-server:8000 で切り替える。Bitwarden クライアントはそのまま動く。
6. 2台での作業フロー
Mac で追加したシークレットは Windows でも即座に使える(ボルトの同期は自動):
# Mac で新しいキーを追加
op item create --category="API Credential" \
--title="New Service" \
--vault="Private" \
credential="sk-..."
# Windows の pwsh で即座に使う
op item get "New Service" --fields credential.env.tmpl 自体は Git/Syncthing で両機に共有する(値はボールトにのみ存在し、テンプレートは安全にリポジトリに置ける)。
検証
op vault listまたはbw list folders— 認証が動作しているssh -T git@github.com— 1Password SSH エージェントが Touch ID 1回タップで認証するgit commit -S -m "test"→git log --show-signature→ 「Good signature」op run --env-file=.env.tmpl -- env | grep MY_KEY→ 実際の値が注入される- Windows で 1Password CLI にサインイン → 同じボルトにアクセスできる
トラブルシューティング
op CLI が GUI とペアリングしない
- デスクトップ → Settings → Developer → 「1Password CLI と連携する」が漏れている
- デスクトップが実行中(サインイン済み)である必要がある
- macOS:システム設定 → セキュリティ → 生体認証を許可
Bitwarden セッションが切れる
デフォルトのアイドルロックは 30分。再度 bw unlock --raw を実行してセッションを復元する。.zshrc に自動アンロックを書かないこと — マスターパスワードが環境変数に残り続ける。
2つの SSH エージェント(1Password vs ssh-agent)
~/.ssh/config でピン留めする:
Host github.com
IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
Windows では SSH_AUTH_SOCK を設定する。
op run でクォートが崩れる
op inject を使う方が明確だ:op inject -i .env.tmpl -o .env.runtime && source .env.runtime。平文ファイルが一時的に作成されるため、使用後は必ず削除すること。
ファミリー / チームボールトの権限エラー
1Password Business → ボールトごとの権限設定。CLI がアクセスできるボールトを op vault list で確認する。権限がないとコマンドが失敗する。
参考資料
- mac/dotfiles — chezmoi + 1Password 統合
- multi-os/file-sync —
.env.tmplなどの非シークレットファイルを Syncthing で同期 - 1Password CLI(公式)
- Bitwarden CLI
- Vaultwarden(セルフホスト)
更新履歴
- 2026-05-12:初稿。1Password vs Bitwarden 比較 + SSH 統合 · Git 署名 · env 自動注入 · 2台作業フロー + 5つのトラブルシューティング事例。