Một tác vụ theo lịch và một người đứng trước lời nhắc đăng nhập gọi cùng một API với thông tin xác thực khác nhau, tuổi thọ khác nhau và chủ sở hữu khác nhau. Tác vụ cần một đường mạng, một danh tính ứng dụng và một tập quyền; người cần một lần đăng nhập, một yếu tố thứ hai và một phiên. Trộn hai thứ đó tạo ra tự động hóa hỏng mỗi khi mật khẩu của người thay đổi, hoặc một chính sách đa yếu tố bị làm yếu vừa đủ để giữ một tác vụ cron sống sót.

Ba cổng trông như một

Một quy tắc địa chỉ nguồn hỏi yêu cầu đến từ đâu. Xác thực hỏi ai đang gọi và bằng chứng nào đã được trình ra. Ủy quyền hỏi liệu chủ thể này có được thực hiện thao tác này không. VPN chỉ thay đổi cái đầu tiên trong ba, và nó thay đổi cho mọi tiến trình trên máy chủ chứ không riêng tác vụ, vì vậy hãy giữ ba quan sát riêng biệt trong biên bản sự cố.

Đó là lý do việc đổi nút thoát có thể sửa một lần từ chối do địa chỉ nguồn và để nguyên một token không hợp lệ. Cũng vì thế một token API hợp lệ không làm cho một điểm cuối riêng tư trở nên tiếp cận được từ một tác vụ không có tuyến tới đó.

Con đường tương tác là một mẫu tự động hóa tồi

Viết kịch bản cho lần đăng nhập của một người thì hấp dẫn vì nó chạy được một lần. Kịch bản lưu một mật khẩu, có thể cả hạt giống mật khẩu dùng một lần, rồi phụ thuộc vào một thử thách được thiết kế để đòi hỏi con người. Thực hành bảo mật tốt nhất hiện hành cho OAuth, RFC 9700, cấm cấp quyền resource-owner-password-credentials và giải thích vì sao nó khớp kém với xác thực hai yếu tố và nhiều bước.

Phương án được hỗ trợ thường là một luồng ứng dụng khách bí mật, trong đó máy chủ ủy quyền xác thực ứng dụng và phát hành token. Cấp quyền client-credentials trong RFC 6749 mục 4.4 là một ví dụ. Sự tồn tại của nó không có nghĩa là mọi API chấp nhận nó, hay một nhiệm vụ được người dùng ủy quyền có thể được thay bằng nó, vì đó là những câu hỏi cho chủ sở hữu dịch vụ. Hãy hỏi dịch vụ hỗ trợ mô hình không giám sát nào trước khi viết mã.

Nơi VPN vẫn còn phù hợp

VPN có thể cung cấp đường mạng mà một API riêng tư yêu cầu, và đó là một vai trò hợp lệ. Nó không xác thực tác vụ với ứng dụng và không giới hạn những gì tác vụ được làm. Một địa chỉ thoát dùng chung cũng nhận diện máy chủ chứ không phải tác vụ, nên một mục trong danh sách cho phép cho địa chỉ đó sẽ cho mọi tiến trình chạy trên nó đi qua.

Nếu tác vụ chạy trên một runner dùng chung, sự khác biệt đó càng quan trọng chứ không kém. Một luồng công việc khác trên cùng máy chủ thừa hưởng tuyến và địa chỉ, và API không thể phân biệt hai cái đó. Đó là cùng một điểm yếu như mật khẩu dùng chung, bị dịch xuống một tầng. Hãy đặt giới hạn ở nơi ứng dụng có thể thực thi nó, và cô lập runner nếu bạn không thể thu hẹp danh sách cho phép.

So sánh hai thiết kế một cách trung thực

Đăng nhập của con người cho bạn một người thật, một yếu tố thứ hai thật và một phiên có thể kiểm toán, và nó không thể chạy mà không giám sát. Danh tính ứng dụng cho bạn việc thực thi không giám sát, một phạm vi có thể xem xét và một thông tin xác thực có thể xoay vòng, và nó không thể hành động thay một người dùng chưa ủy quyền gì. Không cái nào là phiên bản yếu hơn của cái kia; chúng trả lời những câu hỏi khác nhau. Hãy chọn bằng cách hỏi liệu tác vụ có phải chạy khi không có ai, và liệu thao tác có phải được quy cho một người dùng cụ thể.

Nếu cả hai câu trả lời là có, thiết kế cần một mô hình ủy quyền chứ không phải một mật khẩu vay mượn. Hãy viết quyết định đó ở nơi người bảo trì tiếp theo sẽ tìm thấy.

Cần xác minh gì trước khi bàn giao

Chạy một thao tác được phép và một lần từ chối bắt buộc từ worker thật, và giữ cả hai kết quả. Sau đó thử một thông tin xác thực đã hết hạn và hành vi khi đường mạng không sẵn có, vì đó là hai lỗi đánh thức ai đó vào ban đêm.

curl -sS -o /dev/null -w '%{http_code}\n' \
  -H "Authorization: Bearer TOKEN" https://api.example.com/v1/records

Ghi lại chủ thể, phạm vi, chủ sở hữu việc xoay vòng và môi trường thực thi bên cạnh kết quả đó. Chính bản ghi đó làm cho lần xoay vòng tiếp theo thành thường lệ chứ không phải sự cố. Đó cũng là phần mà một kiểm toán viên yêu cầu.

Bài viết liên quan