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ự á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.
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/
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/
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/
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
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
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
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
Output có dạng:
{
"credential": {
"notes": null,
"password": "alligator5",
"totp": null,
"uri": "https://github.com",
"username": "example"
},
"domain": "github.com",
"success": true
}
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
Lưu ý:
-
--idvà--domainloạ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 password và username vào lệnh psql:
aac run \
--domain example.com \
--env DB_PASSWORD=password \
--env DB_USER=username \
-- psql
Trong tiến trình psql, bạn có thể đọc:
$DB_PASSWORD
$DB_USER
Inject tất cả field với prefix mặc định
aac run --domain example.com --env-all -- ./deploy.sh
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
Các field có thể map gồm:
usernamepasswordtotpurinotesdomaincredential_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
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()
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/
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
Cấp quyền thực thi:
chmod +x deploy.sh
Sau đó hướng workflow Claude Code vào:
./deploy.sh
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:
- cài
aactrong runner - ghép nối runner với provider
- chạy test hoặc deploy qua
aac run - 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
Codex có thể chạy:
./test-api.sh
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
Vì Cursor thường chạy cục bộ, listener có thể chạy trên cùng máy:
aac listen
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:
Agent viết code
Claude Code, Codex hoặc Cursor sửa endpoint và mở pull request.CI chạy test
Test runner gọiaac runđể lấy API key theo phạm vi, rồi chạy test trên staging.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 quaaac 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
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
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
Trong terminal khác, thử provider demo:
aac connect --provider example --domain test.com --output json
Nếu JSON trả về đúng, bạn đã có vòng lặp tối thiểu.
Bước tiếp theo:
- thay provider demo bằng Bitwarden CLI (
bw) - tạo wrapper script với
aac run - cho Claude Code, Codex hoặc Cursor gọi wrapper script
- 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)