Pentest Human Gate (chạy trước go-live)
Đối tượng: approver phối hợp sysadmin, chạy lại mỗi khi đổi auth/proxy. Kỳ vọng: mọi cách approve "không phải người" đều phải 403.
Ba phát bắn bắt buộc
# 1. Không JWT, chỉ gửi header giả mạo → PHẢI 403
curl -s -o /dev/null -w '%{http_code}\n' -X POST \
http://127.0.0.1:8080/api/tasks/<id>/approve \
-H 'x-forwarded-email: attacker@evil.com' -H 'x-forwarded-role: admin'
# → 403
# 2. Service token (actor 'system') approve → PHẢI 403
# (dùng token thật của bạn, lệnh tương tự, thêm -H "Authorization: Bearer <token>")
# 3. User role viewer/member approve → PHẢI 403
Phát nào không 403 là sự cố bảo mật P0
Dừng nghiệm thu, gọi sysadmin kiểm tra: Cloudflare JWT verify + nginx strip header + server bind loopback. Xem Kiến trúc tổng thể.
Hai case bổ sung sau Chặng 0B (đã vá — chạy để xác nhận vá còn hiệu lực)
# 4. F1: member Space A đọc/sửa plan của Space B → PHẢI chặn đúng Space
# (trước vá: GET|PATCH /api/plans/:id rơi về rule field-optional, "optional"
# thành không-scope). Dùng danh tính member chỉ-thuộc-A:
curl -s -o /dev/null -w '%{http_code}\n' \
http://127.0.0.1:8080/api/plans/<plan-cua-B> -H 'X-Dev-User: <email-chi-thuoc-A>'
# → 403 (không còn 200 kèm cây plan Space khác)
# 5. Rollback 502-quyền: admin Space rollback → PHẢI 200, và KHÔNG ai được
# "sửa" bằng cách nâng role Arkon
curl -s -o /dev/null -w '%{http_code}\n' -X POST \
http://127.0.0.1:8080/api/wiki/pages/<slug>/revisions/1/rollback \
-H 'Content-Type: application/json' -d '{"projectId":"<id>"}'
# → admin/owner 200; member/viewer/service-token 403.
# Nếu 502 kèm detail về quyền: kiểm global_role + đợi 1 nhịp reconciler —
# CẤM đặt role='admin' trong Arkon (vỡ lọc department, đọc wiki mọi Space).
# Chi tiết: [Phân quyền Arkon](../../reference/phan-quyen-arkon).
Xác minh
- Cả 5 phát trên đều về đúng mã kỳ vọng; phát nào lệch là dừng nghiệm thu.
- Admin Space trong Arkon vẫn là
role='employee'+global_role='knowledge_manager'.
Gặp lỗi? Xem Xử lý sự cố.
Vì sao không có bypass?
- Xác thực 2 lớp ở
POST /api/tasks/:id/approve:actor.typephải là'human', role trên Space>= admin. - Scope
gate:approvecố ý không tồn tại trong scope-registry — không token nào xin được quyền này. - Chi tiết: Vì sao Human Gate không bypass được.