DEV Community

Cover image for Bitwarden Agent Access: Chia Sẻ Mật Khẩu An Toàn với AI Coding Agents
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Bitwarden Agent Access: Chia Sẻ Mật Khẩu An Toàn với AI Coding Agents

Nếu bạn dùng Claude Code, Codex hoặc Cursor để làm việc với API thật, vấn đề xuất hiện rất nhanh: tác nhân cần thông tin đăng nhập, còn trình quản lý mật khẩu của bạn được thiết kế để không để lộ chúng. Dán API key vào chat khiến nó nằm trong context của mô hình. Đặt secret vào .env thì công cụ bash của tác nhân vẫn có thể cat và gửi nó đi. Cách đúng hơn là cấp secret theo phạm vi, tại runtime, và không đưa chúng vào context LLM.

Dùng thử Apidog hôm nay

Dự án mã nguồn mở mới của Bitwarden, Agent Access, là một cách tiếp cận nghiêm túc cho bài toán này. Nó gồm một giao thức chia sẻ thông tin đăng nhập, CLI (aac) và SDK Rust + Python để tạo đường hầm mã hóa giữa trình quản lý mật khẩu và một tiến trình từ xa: tác nhân AI, CI runner hoặc script.

Ý tưởng chính: tác nhân chỉ nhận đúng credential cần dùng, theo domain hoặc vault item ID. Nó không thấy toàn bộ vault, không cần đọc .env, và không cần bạn dán secret vào prompt.

Bài viết này hướng dẫn cách cài đặt Agent Access, dùng aac connect, dùng aac run, và tích hợp nó vào workflow với Claude Code, Codex, Cursor và kiểm thử API bằng Apidog. Nếu bạn cần bối cảnh rộng hơn về hygiene cho API credential của AI agent, xem thêm Cách bảo mật thông tin đăng nhập API của tác nhân AI.

Agent Access là gì?

Agent Access là một giao thức mở kèm triển khai tham chiếu do Bitwarden xây dựng. Mục tiêu là để bất kỳ trình quản lý mật khẩu nào cũng có thể đóng vai trò provider.

CLI aac tạo đường hầm mã hóa đầu cuối bằng giao thức Noise. Mô hình gồm hai phía:

  • Provider: lắng nghe request và quyết định credential nào được trả về.
  • Consumer: agent, script hoặc CI job cần credential để chạy một tác vụ.

Consumer có thể yêu cầu credential theo:

  • domain, ví dụ github.com
  • vault item ID

Consumer không thể liệt kê toàn bộ vault. Provider cũng không thấy consumer làm gì với credential sau khi cấp. Audit log tồn tại ở cả hai phía.

Agent Access architecture

Hiện Agent Access vẫn ở giai đoạn xem trước ban đầu. README của dự án cảnh báo rằng API và giao thức có thể thay đổi. Bitwarden cũng nói rõ rằng không nên nhập trực tiếp credential nhạy cảm vào LLM hoặc AI agent.

Vì vậy, pattern nên dùng là: lấy secret tại runtime bằng aac run, inject vào tiến trình con dưới dạng biến môi trường, và không để secret xuất hiện trong prompt hoặc log của agent.

Tại sao điều này quan trọng?

AI coding agent không còn chỉ sửa file. Claude Code, Codex, Cursor và các công cụ tương tự có thể:

  • đọc repository
  • chạy test
  • gọi API
  • tạo pull request
  • chạy script deploy
  • tương tác với CI

Các bước này thường cần credential. Nếu credential nằm trong .env, shell history, log hoặc context LLM, rủi ro tăng rất nhanh.

Sự cố khóa API bị lộ của Postman cho thấy credential management đã khó ngay cả khi chỉ có con người thao tác. Khi thêm agent tự động vào workflow, cách tiếp cận cần chặt hơn.

Nguyên tắc nên áp dụng:

Đừng tin agent nhiều hơn. Hãy đưa cho agent ít dữ liệu nhạy cảm hơn.

Agent Access làm việc này ở cấp giao thức:

  • credential được giới hạn phạm vi
  • dữ liệu được mã hóa khi truyền
  • secret được lấy tại runtime
  • secret biến mất khi tiến trình kết thúc
  • agent không cần nhìn thấy giá trị thật

Các công cụ quản lý key truyền thống vẫn quan trọng. Xem thêm Công cụ quản lý khóa API. Điểm khác của Agent Access là nó được thiết kế trực tiếp cho use case agent và script runtime.

Cài đặt aac

Chọn bản phù hợp với hệ điều hành của bạn.

macOS Apple Silicon

curl -L https://github.com/bitwarden/agent-access/releases/latest/download/aac-macos-aarch64.tar.gz | tar xz
sudo mv aac /usr/local/bin/
Enter fullscreen mode Exit fullscreen mode

macOS Intel

curl -L https://github.com/bitwarden/agent-access/releases/latest/download/aac-macos-x86_64.tar.gz | tar xz
sudo mv aac /usr/local/bin/
Enter fullscreen mode Exit fullscreen mode

Linux x86_64

curl -L https://github.com/bitwarden/agent-access/releases/latest/download/aac-linux-x86_64.tar.gz | tar xz
sudo mv aac /usr/local/bin/
Enter fullscreen mode Exit fullscreen mode

Windows x86_64

Tải aac-windows-x86_64.zip từ trang phát hành mới nhất, sau đó giải nén vào một thư mục nằm trong PATH.

Kiểm tra cài đặt:

aac --help
Enter fullscreen mode Exit fullscreen mode

Nếu Bitwarden CLI (bw) nằm trong PATH, aac sẽ dùng nó làm credential provider mặc định. Nếu chưa dùng Bitwarden CLI, bạn có thể thử nhanh với provider demo:

aac --provider example --help
Enter fullscreen mode Exit fullscreen mode

Quickstart: ghép nối và lấy credential

Chạy listener trên máy chứa vault hoặc provider. Thường đây là laptop của bạn:

aac listen
Enter fullscreen mode Exit fullscreen mode

Lệnh này sẽ in ra pairing token.

Ở phía consumer — có thể là máy từ xa, CI runner, hoặc một terminal khác trên cùng máy — dùng token để kết nối và yêu cầu credential theo domain:

aac connect --token <pairing-token> --domain github.com --output json
Enter fullscreen mode Exit fullscreen mode

Output có dạng:

{
  "credential": {
    "notes": null,
    "password": "alligator5",
    "totp": null,
    "uri": "https://github.com",
    "username": "example"
  },
  "domain": "github.com",
  "success": true
}
Enter fullscreen mode Exit fullscreen mode

Script của bạn có thể parse JSON này và dùng các field cần thiết.

Nếu muốn lấy credential theo vault item ID thay vì domain:

aac connect --id <vault-item-id> --output json
Enter fullscreen mode Exit fullscreen mode

Lưu ý:

  • --id--domain loại trừ lẫn nhau
  • nếu item có cấu hình TOTP, mã TOTP sẽ nằm trong cùng payload
  • không nên in output này vào log CI nếu có chứa secret

Pattern nên dùng: aac run

aac connect hữu ích khi bạn tự xử lý JSON. Nhưng với AI agent và CI, pattern an toàn hơn thường là aac run.

aac run lấy credential rồi chạy tiến trình con với các field được inject dưới dạng biến môi trường. Secret không cần xuất ra stdout, không cần ghi vào disk, và không cần hiện trong prompt của agent.

Inject field cụ thể

Ví dụ inject passwordusername vào lệnh psql:

aac run \
  --domain example.com \
  --env DB_PASSWORD=password \
  --env DB_USER=username \
  -- psql
Enter fullscreen mode Exit fullscreen mode

Trong tiến trình psql, bạn có thể đọc:

$DB_PASSWORD
$DB_USER
Enter fullscreen mode Exit fullscreen mode

Inject tất cả field với prefix mặc định

aac run --domain example.com --env-all -- ./deploy.sh
Enter fullscreen mode Exit fullscreen mode

Các biến môi trường sẽ có prefix AAC_.

Kết hợp --env-all và override tên biến

aac run \
  --domain example.com \
  --env-all \
  --env CUSTOM_PW=password \
  -- ./deploy.sh
Enter fullscreen mode Exit fullscreen mode

Các field có thể map gồm:

  • username
  • password
  • totp
  • uri
  • notes
  • domain
  • credential_id

Đây là model Bitwarden khuyến nghị cho AI agent. Thay vì đưa secret vào context LLM, bạn chỉ cho agent chạy script:

aac run --domain api.stripe.com --env-all -- ./deploy.sh
Enter fullscreen mode Exit fullscreen mode

Agent nhìn thấy command, nhưng không nhìn thấy giá trị thật của secret. Secret chỉ tồn tại trong tiến trình con deploy.sh.

Đây cũng là nguyên tắc cô lập được đề cập trong Cách bảo mật thông tin đăng nhập API của tác nhân AI, nhưng được triển khai bằng công cụ cụ thể.

Dùng SDK Python và Rust

Nếu CLI chưa đủ, bạn có thể tích hợp Agent Access trực tiếp vào ứng dụng.

Python

from agent_access import RemoteClient

client = RemoteClient("python-remote")
client.connect(token="ABC-DEF-GHI")

cred = client.request_credential("example.com")
print(cred.username, cred.password)

client.close()
Enter fullscreen mode Exit fullscreen mode

Module Python được hỗ trợ bởi PyO3, nên phần xử lý giao thức vẫn chạy trên Rust và dùng cùng implementation Noise bên dưới.

Trong ứng dụng thật, tránh print() password như ví dụ demo. Hãy truyền credential trực tiếp vào client hoặc tiến trình cần dùng.

Rust

SDK Rust cung cấp interface RemoteClient ở cấp thư viện. Các ví dụ tham chiếu nằm trong:

examples/rust-remote/
Enter fullscreen mode Exit fullscreen mode

Dùng Rust SDK khi bạn đang viết:

  • CLI nội bộ
  • build runner
  • service cần binary đã biên dịch
  • consumer chạy trong môi trường hạn chế

Với các nhóm đã có hệ thống secrets enterprise, Agent Access có thể bổ sung cho các tích hợp như HashiCorp Vault hoặc Azure Key Vault. Nó không thay thế hoàn toàn vault doanh nghiệp, nhưng phù hợp cho laptop developer, script cục bộ và CI runner.

Tích hợp với AI coding agent

Claude Code

Tạo một wrapper script để Claude Code gọi thay vì gọi deploy trực tiếp.

# deploy.sh
#!/usr/bin/env bash
set -euo pipefail

aac run --domain prod.example.com --env-all -- ./run-deploy.sh
Enter fullscreen mode Exit fullscreen mode

Cấp quyền thực thi:

chmod +x deploy.sh
Enter fullscreen mode Exit fullscreen mode

Sau đó hướng workflow Claude Code vào:

./deploy.sh
Enter fullscreen mode Exit fullscreen mode

Claude Code chỉ thấy script và command aac run. Credential thật chỉ xuất hiện trong tiến trình con run-deploy.sh.

Với Claude Code GitHub Actions, pattern tương tự có thể mở rộng sang CI:

  1. cài aac trong runner
  2. ghép nối runner với provider
  3. chạy test hoặc deploy qua aac run
  4. không lưu API key trong repo hoặc prompt

OpenAI Codex

Với Codex CLI, bạn cũng nên để model gọi wrapper script thay vì gọi trực tiếp công cụ cần secret.

Ví dụ:

# test-api.sh
#!/usr/bin/env bash
set -euo pipefail

aac run --domain staging.example.com --env API_TOKEN=password -- ./run-api-tests.sh
Enter fullscreen mode Exit fullscreen mode

Codex có thể chạy:

./test-api.sh
Enter fullscreen mode Exit fullscreen mode

Nhưng không cần biết API_TOKEN là gì.

Bài viết Codex từ điện thoại của bạn nói về bề mặt sử dụng Codex rộng hơn. Agent Access giải quyết phần credential trong workflow đó.

Cursor

Với Cursor, pattern thực tế là wrap các lệnh terminal hoặc Composer workflow bằng aac run.

Ví dụ:

# local-contract-test.sh
#!/usr/bin/env bash
set -euo pipefail

aac run --domain api.example.com --env-all -- npm run test:contract
Enter fullscreen mode Exit fullscreen mode

Vì Cursor thường chạy cục bộ, listener có thể chạy trên cùng máy:

aac listen
Enter fullscreen mode Exit fullscreen mode

Sau đó script test hoặc deploy chạy như bình thường, nhưng secret không nằm trong .env.

OpenClaw

Agent Access có một kỹ năng OpenClaw chính thức ngay từ đầu, dưới dạng file SKILL.md trong repository. Nếu nhóm của bạn dùng workflow theo kiểu OpenClaw, đây là hướng tích hợp sẵn tốt nhất hiện tại.

Kỹ năng biết cách:

  • kết nối theo giao thức
  • lấy credential
  • chuyển credential cho tool downstream

Xem thêm Hướng dẫn khóa API OpenClaw để đặt Agent Access vào bối cảnh credential management rộng hơn.

Mô hình bảo mật

Agent Access cung cấp ba điểm bảo vệ chính.

1. Mã hóa đầu cuối qua Noise

Traffic giữa consumer và provider được mã hóa bằng Noise Protocol Framework, cùng lớp giao thức được dùng trong các hệ thống như WireGuard và Signal.

2. Credential được giới hạn phạm vi

Consumer chỉ nhận credential mà nó yêu cầu:

  • một domain
  • hoặc một vault item ID

Nó không thể duyệt hoặc liệt kê toàn bộ vault.

3. Không cần ghi secret ra disk

Với aac run, secret được truyền vào tiến trình con qua biến môi trường. Không cần:

  • ghi .env
  • in ra stdout
  • lưu vào shell history
  • dán vào prompt LLM

Những gì Agent Access không giải quyết

Agent Access không phải lớp bảo vệ tuyệt đối. Bạn vẫn cần hiểu các giới hạn sau.

Consumer bị xâm nhập

Nếu agent hoặc tiến trình con độc hại, credential đã được cấp vẫn có thể bị rò rỉ. Phòng thủ ở đây là giảm phạm vi credential, không phải đảm bảo consumer luôn an toàn.

Provider bị xâm nhập

Nếu vault Bitwarden hoặc provider của bạn bị compromise, Agent Access không thể bảo vệ secret gốc.

Dán secret vào LLM

Nếu bạn copy credential vào chat, mọi lớp giao thức phía sau đều vô nghĩa. README của dự án nói rõ: không nhập trực tiếp credential nhạy cảm vào LLM hoặc AI agent.

Dùng aac run thay cho việc dán secret.

Workflow phổ biến: agent viết code, Apidog kiểm tra API

Một workflow thực tế cho team API có thể như sau:

  1. Agent viết code

    Claude Code, Codex hoặc Cursor sửa endpoint và mở pull request.

  2. CI chạy test

    Test runner gọi aac run để lấy API key theo phạm vi, rồi chạy test trên staging.

  3. Apidog xác minh contract

    Apidog chạy kiểm tra OpenAPI contract như một bước CI riêng, cũng thông qua aac run.

Ví dụ script CI:

#!/usr/bin/env bash
set -euo pipefail

aac run \
  --domain staging.example.com \
  --env API_TOKEN=password \
  -- npm run test:contract
Enter fullscreen mode Exit fullscreen mode

Kết quả:

  • agent triển khai code
  • contract API được kiểm tra
  • secret không nằm trong repo
  • secret không xuất hiện trong prompt
  • secret không cần lưu trong .env

Xem thêm Cách kiểm tra các tác nhân AI gọi API của bạn nếu bạn đang xây pipeline kiểm thử cho agent-driven API changes.

Hạn chế cần biết

  • Vẫn là bản preview

    API và giao thức có thể thay đổi. Không nên khóa chặt production workflow vào v0 nếu bạn không có ngân sách bảo trì.

  • Mặc định cần Bitwarden CLI

    Provider mặc định là bw. Cài Bitwarden CLI trước, hoặc dùng --provider example để thử nghiệm.

  • Chưa có file cấu hình ổn định

    Hiện Agent Access chủ yếu được điều khiển bằng flag. Các workflow lặp lại nên được đóng gói trong script.

  • Không thay thế hygiene cơ bản

    Vẫn cần rotate key, dùng scope tối thiểu, không log secret, và không đưa secret vào prompt.

FAQ

Agent Access có miễn phí không?

Có. CLI, SDK và giao thức là mã nguồn mở trong GitHub organization của Bitwarden. Nếu dùng Bitwarden làm vault, chi phí Bitwarden phụ thuộc vào gói bạn đang sử dụng.

Có hoạt động với trình quản lý mật khẩu khác ngoài Bitwarden không?

Giao thức được thiết kế để không phụ thuộc nhà cung cấp. Triển khai tham chiếu hiện hỗ trợ Bitwarden và provider ví dụ. Các provider khác có thể triển khai theo giao thức này trong tương lai.

Có thể dùng mà không cần trình quản lý mật khẩu không?

Có, để thử nghiệm:

aac connect --provider example --domain test.com --output json
Enter fullscreen mode Exit fullscreen mode

Nhưng cho production, bạn cần provider thật như Bitwarden hoặc provider tương thích khác.

Consumer có cần truy cập mạng không?

Có. Consumer cần truy cập network để kết nối tới listener của provider. Nếu chạy cục bộ, listener và consumer có thể nằm trên cùng một máy.

Khác gì so với .env?

File .env nằm trên disk, có thể bị commit nhầm, bị đọc bởi script, hoặc bị agent truy cập qua shell command.

aac run giữ secret trong phạm vi tiến trình con. Khi tiến trình thoát, secret cũng biến mất khỏi runtime đó.

Có thay thế HashiCorp Vault hoặc AWS Secrets Manager không?

Không. Vault doanh nghiệp vẫn phù hợp cho service-to-service secrets ở quy mô lớn.

Agent Access phù hợp hơn cho:

  • laptop developer
  • AI coding agent
  • script cục bộ
  • CI runner
  • workflow cần cấp credential tạm thời theo phạm vi

Anthropic, OpenAI hoặc các nhà cung cấp agent đã tích hợp trực tiếp chưa?

Chưa có công bố chính thức. Cách tích hợp hiện tại là wrap script bằng aac run.

Báo lỗi hoặc đóng góp ở đâu?

Tại GitHub repository. Issue, PR và thảo luận giao thức đều diễn ra ở đó.

Thử ngay

Cài aac, sau đó chạy listener:

aac listen
Enter fullscreen mode Exit fullscreen mode

Trong terminal khác, thử provider demo:

aac connect --provider example --domain test.com --output json
Enter fullscreen mode Exit fullscreen mode

Nếu JSON trả về đúng, bạn đã có vòng lặp tối thiểu.

Bước tiếp theo:

  1. thay provider demo bằng Bitwarden CLI (bw)
  2. tạo wrapper script với aac run
  3. cho Claude Code, Codex hoặc Cursor gọi wrapper script
  4. bỏ thói quen dán API key vào prompt

Kết hợp Agent Access với Apidog cho phần kiểm thử API, bạn sẽ có ranh giới rõ ràng: vault giữ secret, Apidog kiểm tra contract, agent triển khai code, và credential không rời khỏi máy dưới dạng plain text.

Top comments (0)