Bảo mật
Aki MCP Server giữ quyền truy cập theo điều kiện của bạn
Vì server có thể đối mặt với Internet công khai, bảo mật được thiết kế sẵn từ gốc, không phải thêm vào sau. Đây là những gì bảo vệ bạn, và cả những đánh đổi bạn phải chịu trách nhiệm.
Whitelist nghiêm ngặt, không phải blocklist
Công cụ shell chỉ chạy lệnh bạn cho phép rõ ràng. Blocklist dễ lọt vì mặc định là cho phép; whitelist thì an toàn khi có sự cố.
- Fail-safe: lệnh lạ hoặc mới bị chặn tự động.
- Bề mặt tối thiểu: chỉ đúng các lệnh bạn duyệt mới chạy được.
- Chi tiết tới subcommand: git chỉ giới hạn ở
status/log/diff/show. - Hạn chế prompt injection: lệnh bị chèn không có câu lệnh ngoài danh sách để leo thang.
- Ưu tiên kiểm tra: các binary nhiều cờ có thể thoát khỏi chế độ chỉ-đọc bị cố tình loại ra, và các dạng ghi của git (
branch -D,tag -d,remote set-url,--output=) bị từ chối mặc định.
Triết lý thiết kế: tiện dụng trước, guardrail sau. Allowlist bảo vệ trước model yếu hoặc quá hăng. Nó không phải ổ khóa chống lại chính bạn, chủ máy.
Xác thực và phân quyền
- Mọi lệnh gọi
/mcpcần Bearer token OAuth 2.1 hợp lệ. Không có kiểu token-in-URL. - Claude, ChatGPT, Grok và Notion kết nối bằng passphrase và tự đăng ký qua DCR (RFC 7591), nên không có Client ID hay Secret nào để dán; ChatGPT và Grok đăng ký như public client, Notion như confidential client. Chỉ Gemini dùng Client ID/Secret bí mật cấp sẵn mà
akimcpin ra lúc khởi động. - Chỉ redirect URI của các client đã biết được chấp nhận (
claude.ai,chatgpt.com,grok.com, proxy OAuth redirect của Google cho Gemini, và các host callback cố định của Notion dướinotion.sovànotion.com, khớp chính xác hostname qua https nên domain giả mạo bị loại), và client vẫn phải qua màn hình consent bằng passphrase và PKCE trước khi nhận token. - Một access token dùng chung (hiệu lực một năm) phục vụ mọi client, nên panel hiển thị và roll nó ở một chỗ.
Tự chặn dò mật khẩu và nhìn rõ
Gatekeeper giới hạn tần suất thử sai, và mục 7 của panel cho thấy ai đang giữ quyền truy cập và ai đã dùng.
- 5 lần sai, bị chặn 15 phút: 5 thông tin xác thực bị từ chối trong 60 giây (sai passphrase, sai client secret, Bearer không hợp lệ ở
/mcp) sẽ chặn người gọi 15 phút, trả429kèmRetry-After. - Chặn tràn đăng ký: 100 lần
POST /registertrong 10 phút cũng bị chặn, và danh sách client ngừng tăng ở mức 500. - Mỗi người gọi được đếm theo địa chỉ mà ingress của nó ghi: Cloudflare Tunnel theo
CF-Connecting-IP, Tailscale Funnel theo phần tử cuối củaX-Forwarded-For, edge riêng của bạn (PUBLIC_ORIGIN) theo một trong hai. Header mà ingress không ghi sẽ bị bỏ qua, nên client không tự chọn được khóa của mình (từ 3.0.1). - Client thật an toàn: Bearer token hợp lệ không bao giờ bị tính hay từ chối, lỗi giao thức hoặc đường dẫn lạ cũng không bị tính.
- Bạn tự chỉnh: mọi ngưỡng đều chỉnh được ở mục 7 của panel, nơi liệt kê người gọi bị chặn kèm nút Release.
- Thấy tất cả: bảng Clients (lần đầu thấy, lần duyệt gần nhất, lần cấp token gần nhất, địa chỉ và agent), Active now, và 200 dòng mới nhất của
security.log. - Bí mật được che: passphrase và access token hiện dạng dấu chấm kèm nút con mắt, ảnh chụp màn hình không lộ gì.
Nếu lộ bí mật
Panel biến việc dọn dẹp thành vài cú bấm. Chọn dòng khớp với thứ bị lộ.
- Passphrase bị nhìn thấy:
Roll passphrase, rồiRoll & sign out all clients. - Access token bị nhìn thấy:
Roll & sign out all clients. - Có client lạ trong danh sách: cả hai lần roll, rồi kết nối lại các AI bạn tin.
- Connector không còn dùng:
Remove, rồiRoll token.
Thông tin xác thực không lọt vào kết quả của tool
Các file chứa bí mật của chính akimcp bị đóng với mọi tool, và thứ gì vẫn lọt vào kết quả sẽ bị che trước khi tới nhà cung cấp AI.
- File thông tin xác thực bị đóng: công cụ file không đọc cũng không ghi
tokens.json,passphrase.txt,oauth-client.json,oauth-dcr-clients.jsonhaycloudflared-cred.json.run_cmdvàtask_starttừ chối lệnh nhắc tới các file này, cònsearch_contentbỏ chúng khỏi kết quả. - Che thông tin ở mọi kết quả: mọi giá trị dạng token lấy từ các file đó, passphrase và panel token trong
instance.jsonđều hiện là[redacted], kể cả trong thông báo lỗi và trước khi output dài bị cắt. Nhờ vậy một lệnhgrep -rlỡ quét thư mục dữ liệu, hay một bản sao nằm trong log của task, cũng không làm lộ bí mật. - Chặn sai sót, không chặn được model cố tình: bản sao đã mã hóa (nén hoặc base64) sẽ không bị nhận ra, và model nào tự mở rộng allowlist tới một shell đầy đủ thì đọc được mọi thứ bạn đọc được.
setting.jsonvẫn đọc và ghi được có chủ đích, để AI chỉnh thư mục và allowlist khi bạn nhờ.
Mỗi tầng bảo vệ điều gì
Một gatekeeper, bearer cả trên loopback
Gatekeeper trên 127.0.0.1:9999 là lối vào duy nhất cho cả client local và (qua ingress tùy chọn) client từ xa; mọi tool chạy in-process phía sau, và Bearer token bắt buộc ngay cả trên loopback.
Panel chỉ ở local
Control panel bind vào 127.0.0.1:9998, cần token mỗi lần chạy, và không bao giờ được đẩy ra edge công khai.
Fetch chống SSRF
Bộ fetch LAN chặn cloud metadata, IP link-local, scheme không phải HTTP, kèm giới hạn dung lượng và thời gian.
Bí mật ở chế độ 0600
Passphrase, client secret và token nằm trong ~/.aki/mcpsv/ ở mode 0600, ngoài repo, không bao giờ vào git.
Mặc định AI làm được và không làm được gì
Mặc định được phép
Chạy bộ shell ưu tiên kiểm tra, đọc và tìm file trong thư mục được phép, và mọi hành động đều là tool call hiện rõ. Một số helper dev duyệt sẵn (npm run, open, sips, ffmpeg) có thể ghi.
Mặc định không thể
Chạy lệnh ngoài allowlist, chạy các dạng ghi của git, ghi vào thư mục script tin cậy qua công cụ file, chạm tới panel local, hay gọi mạng ra ngoài tùy ý.
Đánh đổi thật lòng bạn phải biết
- Gốc file mặc định là toàn bộ thư mục home (
$HOME) cộng~/.akivà~/.claude. Hãy thu hẹp trong panel trên máy nhạy cảm. ~/.claudeđược cấp ở mức thư mục, nên token phiên và lịch sử chat bên trong cũng nằm trong tầm với. Gỡ bằng cách sửa trực tiếp danh sách thư mục.- Bất kỳ lệnh ghi nào bạn thêm vào allowlist (ví dụ
git commit) là trách nhiệm của bạn và làm rộng bề mặt. - Với một token dùng chung, Remove đăng xuất client nhưng chưa phải thu hồi tức thì. Roll token để cắt quyền ngay.
- Bộ giới hạn tần suất nằm trong bộ nhớ, nên khởi động lại sẽ xóa danh sách bị chặn. Tên client do client tự khai, nên hãy tin cột địa chỉ và thời gian hơn nhãn tên.
- Sau Tailscale Funnel, bộ chặn tin phần tử cuối của
X-Forwarded-For. Việc Funnel ghi địa chỉ thật của người gọi vào đó được đọc từ mã nguồn của Tailscale, chưa thấy trên một request Funnel thật; header của Cloudflare Tunnel đã được xem trực tiếp. - Gemini đang thử nghiệm: kết nối OAuth chạy được nhưng dùng tool chưa ổn định.
Thu hồi truy cập bất cứ lúc nào từ mục 7 của panel: Remove client, rồi Roll token. Nếu nghi lộ bí mật, dùng Roll & sign out all clients.