
すべての人のためのローカルパスワードマネージャー
<div align="center"> # APM **すべての人のための、より優れたローカルパスワードマネージャー。** [](https://golang.org) [](LICENSE) [](https://aaravmaloo.github.io/apm) [](https://github.com/aaravmaloo/apm/actions/workflows/ci.yml) [](https://github.com/aaravmaloo/apm/releases/latest) [](https://github.com/aaravmaloo/apm/stargazers) [](https://github.com/aaravmaloo/apm/issues) </div> APMは、GoとRustで書かれた高速なゼロ知識CLIパスワードマネージャーです。パスワードやTOTPコードからSSHキー、医療記録、写真、バイナリファイルまで、**25種類以上の構造化されたシークレット型**を単一の暗号化されたVaultに保存します。このリポジトリからは2つのバイナリが提供されます。個人利用向けの`pm`と、組織で共有するVault向けの`pm-team`です。 --- ### なぜAPMなのか? - **高速で覚えやすい** — コマンドやフラグを暗記する必要はありません。APMは必要な情報をプロンプトで尋ねます。最大限の速度を求めるパワーユーザー向けにCLIフラグも用意されています。 - **ゼロ知識** — マスターパスワードが保存されることはありません。Argon2idを使用して3つの独立した32バイトの鍵を導出します。あなた以外の誰もVaultを復号できません。 - **二重暗号化** — AES-256-GCMまたはXChaCha20-Poly1305を選択できます。AEAD認証に加えてHMAC-SHA256による二重層の完全性保護を提供します。 - **ポータブル** — Vaultファイル1つ、バイナリ1つ。Vaultをどこへでも持ち運べます。 - **オプションのクラウド** — Google Drive、GitHub、Dropboxへ同期できます。完全にオプトイン方式で、APMの利用にアカウントは不要です。 - **AI対応** — スコープ付きトークンを備えたネイティブMCPサーバーにより、Claude、Cursor、その他MCP互換のエージェントがVaultに安全にアクセスできます。 - **チーム対応** — `pm-team`では完全なRBAC、部門、承認ワークフロー、共有Vaultを利用できます。 --- ### クイックスタート ```sh go build -o pm . pm setup # initialize vault and choose security profile pm unlock # start a session pm add # add a secret (interactive) pm get github # fuzzy search and retrieve pm lock # end session ``` **チームエディション:** ```sh cd team go build -o pm-team . ``` ### シークレットタイプ APM は、検証済みフィールドとタイプ固有の表示ロジックを備えた **25 種類の構造化シークレットタイプ** をサポートしています: | # | タイプ | # | タイプ | |---|------|---|------| | 1 | パスワード | 14 | Docker レジストリ | | 2 | TOTP | 15 | CI/CD シークレット | | 3 | 政府発行 ID | 16 | セキュアノート | | 4 | 医療記録 | 17 | リカバリーコード | | 5 | 旅行情報 | 18 | 証明書 | | 6 | 連絡先 | 19 | バンキング | | 7 | Wi-Fi | 20 | ドキュメント | | 8 | API キー | 21 | ソフトウェアライセンス | | 9 | トークン | 22 | 法的契約書 | | 10 | SSH キー | 23 | 写真 | | 11 | SSH 設定 | 24 | 音声 | | 12 | クラウド認証情報 | 25 | 動画 | | 13 | Kubernetes | | | --- ### 機能 **セキュリティ** - ゼロ知識 Argon2id 鍵導出 — マスターパスワードは保存されません - デュアル AEAD 暗号: AES-256-GCM と XChaCha20-Poly1305 - HMAC-SHA256 による二層の完全性チェック - 4 つの調整可能なセキュリティプロファイル: `standard`、`hardened`、`paranoid`、`legacy` - Watchtower (`pm watchtower`): 弱い、使い回された、古い、漏洩した (オプトイン、k-匿名)、露出したパスワード、期限切れ項目、未設定の二要素認証とパスキー、リスクのあるキーとセットアップチェックを評価する 0〜100 のセキュリティスコア、さらに項目ごとの信頼スコアとアクティビティレビュー - 誤ったパスワードには増加する待機時間が課されます (永久的なロックは行いません)。CLI、アプリ、拡張機能で共有されます - 改ざん検知可能な監査ログを Vault の外部に保存 **Vault** - 単一の暗号化された Vault ファイル — あらゆるデバイス間でポータブル - 論理的な区分けのためのスペース (フォルダのようなもの) - インタラクティブなブラウザとキーボードナビゲーションを備えたあいまい検索 - メタデータインスペクター: 作成日、最終アクセス、アクセス回数、信頼スコア **TOTP** - インタラクティブなリストでのライブカウントダウンタイマー - 永続的なカスタム並び順 - 直接コピー: `pm totp github` - 2FA コードを自動注入するための自動入力デーモン連携 **クラウド同期** - Google Drive (OAuth2 PKCE)、GitHub (PAT)、Dropbox (OAuth2 PKCE) - エンドツーエンド暗号化 — プロバイダーが平文を見ることはありません - プロバイダーごとにエントリをフィルタリングする `.apmignore` - 競合解決: 上書き、ローカルを保持、またはキャンセル - バックグラウンド自動同期 **セッション** - 設定可能な有効期限と非アクティブタイムアウトを備えた明示的なロック解除/ロック - 自動化および AI エージェントアクセス用の委任された一時セッション **MCP サーバー** - ネイティブな Model Context Protocol サーバー - スコープ付き権限トークン: `read`、`secrets`、`write`、`admin` - 書き込み操作はデスクトップアプリでの承認を待ちます。アシスタントが自身の変更を承認することはできません - Claude Desktop、Cursor、Windsurf、および任意の MCP クライアントで動作します **リカバリー** | 要素 | コマンド | |--------|---------| | メール OTP | `pm auth email` | | リカバリーキー | `pm auth recover` | | クォーラムシェア (Shamir) | `pm auth quorum-setup` | | WebAuthn パスキー | `pm auth passkey register` | | ワンタイムリカバリーコード | `pm auth codes generate` | **インポート / エクスポート** | 形式 | インポート | エクスポート | |--------|--------|--------| | JSON | `pm import json` | `pm export json` | | CSV | `pm import csv` | `pm export csv` | | TXT | `pm import txt` | `pm export txt` | **ポリシーエンジン** ```yaml name: corporate-standard password_policy: min_length: 14 require_uppercase: true require_numbers: true require_symbols: true rotation_policy: rotate_every_days: 90 notify_before_days: 14 ``` ```sh pm policy load ./policies/ ``` **Team Edition(`pm-team`)** - 複数のロールを備えた RBAC - 暗号化ドメインを分離した部門 - 機密エントリに対する承認ワークフロー - 複数ユーザーでの認証情報共有のための共有 Vault --- ### ブラウザ拡張機能 APM ブラウザ拡張機能は、ログイン情報の入力、該当サイトでのワンタイムコードの提供、新しいログイン情報の保存、およびパスキーの作成と使用を行います。マスターパスワードやパスキーの秘密鍵を参照することは一切ありません。拡張機能は、APM がお使いのマシン上の `127.0.0.1:41417` で提供する小さなブリッジと通信します(別のポートを使用するには `APM_BRIDGE_PORT` を設定してください)。 **Vault にアクセスする 3 つの方法** - デスクトップアプリを使用する場合: アプリが開いている間、ブリッジが動作します。ペアリング要求とブラウザのロック解除はアプリ内に表示されます。 - CLI のみで、リンク済みの場合(推奨): `pm extension link` を一度実行します。これにより `pm` が各 Chromium 系ブラウザ(Chrome、Edge、Brave、Arc、Vivaldi、Chromium)にネイティブメッセージングホストとして登録され、以降はアプリが閉じていてもブラウザが自動的に `pm` を起動します。 - CLI のみで、ターミナルから実行する場合: `pm extension serve` を実行して開いたままにします。デスクトップアプリが提供するのと同じ API を提供し、ロック解除、ロック、ペアリング要求が発生するたびに表示します。 ```sh pm extension link # once per computer; confirm the code the extension shows pm extension serve # unlocks with your CLI session, or asks for the master password pm extension serve --locked # starts locked; unlock from the extension pm extension serve --idle 5m # locks after 5 minutes without browser activity (default 15m, 0 turns it off) ``` `pm extension serve` は、保管庫がロック解除またはロックされているときに1行出力します。停止するには Ctrl+C を押します。保管庫の鍵はメモリから破棄されます。ポートが使用中の場合、プロセスは終了し、APM アプリがすでに拡張機能を提供している可能性があることを通知します。 **ブラウザのペアリング** 1. 拡張機能で「接続」を選択します。拡張機能は6文字のコード(例: `K7M-2QX`)を表示します。 2. APM が同じコードを表示していることを確認します。デスクトップアプリはダイアログを開き、`pm extension link` または `pm extension serve` はターミナルで確認を求めます(例: `Connect Chrome on macOS? Code K7M-2QX [y/N]`)。 3. 承認します。拡張機能はトークンを受け取り、ペアリングが完了します。 リクエストは2分後に期限切れとなり、同時に待機できるのは1件のみです。`pm extension serve` はターミナルで実行されていない場合、リクエストを自動的に拒否します。代わりに手動でペアリングするには、`pm extension token --show` を実行し、トークンを拡張機能の手動ペアリングフィールドに貼り付けます。 **コマンド** | コマンド | 動作 | |---------|--------------| | `pm extension link [--browser chrome,edge] [--no-wait]` | デスクトップアプリが閉じているときに、ブラウザが拡張機能のために `pm` を起動できるようにする | | `pm extension unlink` | ブラウザが `pm` を起動するのを停止する。ペアリングは維持される | | `pm extension status [--port N]` | リンクされているブラウザ、現在拡張機能を提供しているもの、保管庫のロック状態とアイテム数、トークンのフィンガープリントを表示する | | `pm extension serve [--port N] [--locked] [--idle 15m]` | Ctrl+C までこのターミナルから拡張機能を提供する | | `pm extension token [--show]` | ペアリングトークンを出力する。`--show` が指定されない限りマスクされる | | `pm extension rotate` | ペアリングトークンを置き換える。ペアリング済みのすべてのブラウザは再ペアリングが必要。実行中のブリッジは次のリクエストで新しいトークンを取得する | | `pm totp link <entry> <domain>` | ワンタイムコードをサイトにリンクし、拡張機能がそのサイトで提供できるようにする | | `pm totp unlink <entry> [domain]` | ワンタイムコードのサイトリンクを削除する | `pm get` はログインが持つパスキーとそれにリンクされたワンタイムコードを表示し、`pm totp` は各コードのリンクされたサイトを表示します。 **ブリッジがプライベートに保たれる仕組み** - `127.0.0.1` のみで待ち受け、`127.0.0.1` または `localhost` 宛てのリクエストにのみ応答します。これにより DNS リバインディングを防ぎます。 - `Origin` がウェブページであるリクエストはすべて拒否します。CORS ヘッダーを付与するのは `chrome-extension://`、`moz-extension://`、`safari-web-extension://` のオリジンのみです。 - ペアリング以外のすべての呼び出しにはペアリングトークンが必要です。トークンは APM 設定ディレクトリの `bridge_token` に保存され、定数時間で比較されます。 - 一覧および詳細の呼び出しには秘密の値が含まれません。拡張機能は表示または入力時に一度に1つのフィールドを要求し、APM はそのアクセスを記録します。 - パスキーは APM 内で作成および署名されます。拡張機能はサイトのオリジンとクライアントデータのハッシュを送信し、APM は署名前にそのサイトがそのリライングパーティを使用できることを確認します。 **1つのログインに複数のウェブサイト** ログインはメインアドレスを `website` に、その他を `urls` に保持し、デスクトップアプリでは「その他のウェブサイト」として表示されます。拡張機能は、いずれかに一致するページでそのログインを提供します。デフォルトでは、一致とは同じ登録可能ドメインを指すため、`accounts.google.com` と `mail.google.com` はどちらも `google.com` に一致します。 - ポップアップから、現在のサイトをログインに追加したり、ウェブサイトを追加・削除したり、複数のウェブサイトを持つ新しいログインを保存したりできます。 - 保存されていないサイトでログインを入力すると、拡張機能は最初に確認します。「入力して記憶」を選択すると、入力してそのサイトをログインに追加します。 - `pm totp link <entry> <domain>` はワンタイムコードに対して同じことを行います。 **ウェブサイトのロゴ** デスクトップアプリと拡張機能は、各ログインの最初の文字ではなく、そのログイン自身のロゴを表示します。APM はロゴをサードパーティの favicon サービスには決して問い合わせず(問い合わせれば保管庫内のすべてのサイトが知られてしまうため)、サイト自体から取得します。 - 内容: ログイン先の最初のウェブサイトのホスト(ワンタイムコードはそのリンク先サイトを使用)、小文字化され `www.` やポートを含まないもの。`localhost`、IP アドレス、`.local`、`.internal`、およびドットを含まない名前は決して取得されません。 - 方法: APM は `https://<host>/` を読み込み(最大 512 KiB)、ページが宣言する最適なアイコン(`apple-touch-icon`、次に最大の PNG、次に SVG)を選択し、フォールバックとして `https://<host>/favicon.ico` を使用します。HTTPS のみ、リダイレクトは最大 3 回、サイトごとに 6 秒、画像は最大 256 KiB、Cookie なし。ループバック、プライベート、リンクローカル、または CGNAT 範囲に解決されるアドレスは拒否されます。リクエストはシステムプロキシを経由せず、サイトへ直接送信されます。 - タイミング: ボールトがロック解除されており、デスクトップアプリまたは `pm extension serve` が実行されている間のみ、同時に最大 4 サイト。失敗したサイトは 3 日後に再試行され、ロゴは 30 日後に更新されます。 - 場所: APM 設定ディレクトリ内の `icons/`(macOS では `~/Library/Application Support/apm/icons`、Linux では `~/.config/apm/icons`、Windows では `%AppData%\apm\icons`)。各ファイルはそのホストの SHA-256 で命名され、最大 2000 個まで保持されます。キャッシュは暗号化されません: 画像の隣にある各 `.json` ファイルにはそのホスト名が記録されるため、設定ディレクトリを読める人なら誰でも、どのサイトにロゴがあるかを確認できます。 - サイト側が知る情報: あなたの IP アドレスと、APM がそのアイコンを要求したこと(ユーザーエージェントは `APM/<version> (+icon)`)。あなたのアカウントに関する情報は一切ありません。 - 無効化する方法: デスクトップアプリの Settings、Appearance で「Show website icons」をオフにし(ボールト設定 `siteIcons`、`pm extension serve` もこれを尊重します)、「Clear icon cache」を選択してキャッシュを削除します。プロセスからのすべての取得を停止するには `APM_ICONS_OFFLINE=1` を設定します(テストや CI など)。キャッシュされたロゴは、クリアするまで引き続き表示されます。 --- ### セキュリティプロファイル | プロファイル | Argon2 メモリ | イテレーション | 並列度 | 用途 | |---------|--------------|------------|-------------|----------| | `standard` | 64 MB | 3 | 2 | ほとんどのマシン | | `hardened` | 256 MB | 5 | 4 | ワークステーション(≥8 GB RAM) | | `paranoid` | 512 MB | 6 | 4 | サーバー(≥16 GB RAM) | | `legacy` | PBKDF2 | 600,000 | 1 | 後方互換性 | APM は CPU コア数と RAM を自動検出し、`pm setup` 中に最適なプロファイルを推奨します。 ### 開発状況と履歴 (この注記はオーナーによるものです) 2026年3月30日現在、私は APM の GUI に取り組んでいます。当初は CLI アプリケーションとして始まりました。詳細は issue #38 にすべて記載されています。全体として、私は APM をさらに幅広い層に届けたいと考えています。GUI は apm-gui リポジトリとして分離するか、組織を作成して両方のリポジトリをそこへ移す予定です。 私は APM を真に個人的なプロジェクトとして始めました。ある夜、自分用のパスワードマネージャーを作りたいと思ったのがきっかけです。TOTP に使っていた zoho password にうんざりしていました。動作するまで信じられないほど遅く、トークンには平文ファイルを使っていて、安全ではありませんでした。 現時点で、私はプロジェクトを放棄・終了する予定はありません。長期間にわたり機能し続けます。毎日改善に努め、毎日使っています。リポジトリが inactive になることもありますが、それはアプリケーションのテストや実験を行っているときです。 --- ### リリース構造 | ティア | 安定版? | ボールト安全? | 目的 | |------|---------|-------------|---------| | Canary | ❌ | ❌ | 最も早い機能プレビュー — ボールトを破損する可能性あり | | Alpha | ❌ | ✅ | 不安定な機能、ボールトの整合性は保持 | | Beta | ✅ | ✅ | 十分にテストされた機能、慎重なロールアウト | | Stable | ✅ | ✅ | 本番環境対応リリース | > Canary リリースを試す前に、必ずボールトをバックアップしてください。 P.S. リリースによっては、必要以上にティアを増やさずに迅速かつ容易に出荷できるかどうかに応じて、一部のティアがリリースされない場合があります。 --- # AI の使用について APM の開発とスイート全体の保守を一度にすべて行うのは容易ではありません。そのため、私たちは **25%** の AI 生成コード(主に UI の変更や、重要でない・暗号に関係しない変更)を使用しています。ただし、APM では AI の使用に関していくつかのポリシーを設けています。以下に示します。 - AI は小規模な機能や、vault に影響を与えない機能の開発にのみ使用する - AI による編集は慎重に扱い、注意深くレビューする - AI による編集は徹底的にテストする これらのポリシーにより、私たちは AI を責任を持って使用し、APM をすべての人にとってより良いものにしています! ### ドキュメント 完全なドキュメントは **[aaravmaloo.github.io/apm](https://aaravmaloo.github.io/apm)** にあります - [インストール](https://aaravmaloo.github.io/apm/getting-started/installation/) - [最初のステップ](https://aaravmaloo.github.io/apm/getting-started/first-steps/) - [CLI リファレンス](https://aaravmaloo.github.io/apm/reference/cli/) - [アーキテクチャ](https://aaravmaloo.github.io/apm/concepts/architecture/) - [暗号化](https://aaravmaloo.github.io/apm/concepts/encryption/) - [チームエディション](https://aaravmaloo.github.io/apm/guides/team-edition/) - [MCP 統合](https://aaravmaloo.github.io/apm/guides/mcp-integration/) - [コントリビューション](https://aaravmaloo.github.io/apm/contributing/) --- ### コントリビューション コントリビューションを歓迎します。ガイドラインについては [CONTRIBUTING.md](https://aaravmaloo.github.io/apm/contributing/) を参照してください。 --- ### ライセンス [GPL-3.0 License](https://github.com/aaravmaloo/apm/blob/master/LICENSE) © Aarav Maloo