Điều gì bảo vệ một bên thuê, nói thẳng.
Không có chứng nhận nào chúng tôi không nắm, không có tính từ nào thay cho chốt kiểm soát. Đây là những gì được thực thi, thực thi ở đâu, và những gì còn thiếu.
Cách ly là chuyện cấu trúc, không phải chuyện canh chừng.
Mọi truy vấn trên dữ liệu thuộc một không gian làm việc đều mang id của không gian đó trong điều kiện lọc. Không tồn tại đường truy cập không giới hạn phạm vi nào để người ta quên dùng.
Kiểu hỏng mà thiết kế này loại bỏ là kiểu bình thường nhất: một hệ thống đúng đắn, trong đó một endpoint mới viết vội bỏ sót mệnh đề WHERE. Nếu tầng dữ liệu không trả lời một câu hỏi không nêu tên không gian làm việc, thì endpoint đó không biên dịch thành một lỗ rò — nó không biên dịch được.
Các bài kiểm thử rò rỉ theo hướng đối kháng ghim chặt tính chất này thay vì tin vào quy ước, bởi một quy ước chỉ đáng tin bằng người cuối cùng đã đọc tập tin đó.
internal/tenancy · migrations/0002
Nhật ký kiểm toán chỉ ghi thêm ở cơ sở dữ liệu, không phải ở ứng dụng.
Một trigger báo lỗi với mọi thao tác sửa hoặc xóa. Một ứng dụng quyết định không viết lại lịch sử là một chính sách; một cơ sở dữ liệu từ chối viết lại mới là một chốt kiểm soát.
Đây chính là khác biệt mà kiểm toán viên hỏi tới và nhà cung cấp thường không trả lời được. Nếu thứ duy nhất ngăn một lần sửa hồi tố là “không có đường mã nào làm thế”, thì một script hỗ trợ, một lần migration, hay một người vận hành cầm bảng điều khiển đều làm được, và nhật ký sẽ không hề hay biết.
internal/tenancy · migrations/0002 audit_log_immutable()
Khóa xoay mà không gián đoạn. Đăng nhập chống được lừa đảo.
Một quy trình xoay khóa cần cửa sổ bảo trì là quy trình xoay khóa không bao giờ diễn ra.
- 01
Id khóa với thời hạn chồng lấn
Khóa API và khóa ký webhook của mỗi không gian làm việc đều mang một id khóa. Trong lúc xoay, cả hai đều hợp lệ, nên bạn chuyển đổi theo lịch của mình rồi thu hồi khóa cũ sau.internal/tenancy · internal/outbox/sign.go
- 02
Passkey cho cả thành viên lẫn người vận hành
WebAuthn với yêu cầu bắt buộc về xác minh người dùng và thông tin xác thực có thể khám phá — không phải tùy chọn, vì những khóa này đứng ngay trước một dòng tiền. Đăng nhập kiểu khám phá tự tìm ra tài khoản từ chính thông tin xác thực, nên không phải gõ gì cả và cũng chẳng có gì để lừa lấy.internal/passkey
- 03
Xác thực hai lớp bằng ứng dụng, lưu đúng cách
Bí mật TOTP không thể băm được — vì khâu xác minh phải tính lại mã từ nó — nên bí mật của thành viên được niêm phong bằng AES-256-GCM dưới một khóa con riêng theo ngữ cảnh, thay vì lưu dạng rõ. Bộ đếm của một mã đã được chấp nhận sẽ được ghi ngược lại, nên không thể dùng lại mã đó trong cùng khung thời gian.internal/membertotp · internal/secretbox
- 04
Băm được thì băm, không được thì niêm phong
Mật khẩu hay mã khôi phục thì được băm, vì nền tảng chỉ cần trả lời “có phải cái này không?”. Bí mật mà nền tảng buộc phải đọc lại thì được niêm phong, và những kho có trước cấu trúc này đang được chuyển sang chứ không bị bỏ nguyên như cũ.internal/secretbox
Không gì rò ra qua một URL do bạn cấu hình.
Đích đến của webhook, xét về bản chất, là đầu vào chịu ảnh hưởng của kẻ tấn công — đó là một URL do bên thuê gõ vào, rồi nền tảng gọi tới nó từ bên trong mạng của chính mình.
Bộ điều phối chạy một chốt chặn lưu lượng đi ra trước khi gửi yêu cầu, thay vì tin vào tên máy chủ; đó là thứ tự duy nhất có tác dụng: một lần kiểm tra sau khi phân giải, hoặc kiểm tra trên chuỗi ký tự thay vì trên địa chỉ thật, chính là lần kiểm tra mà kỹ thuật DNS rebinding sinh ra để đi xuyên qua. Đích loopback và mạng nội bộ chỉ được phép trong sandbox và các lần chạy kiểm thử đầu-cuối, và sự nới lỏng đó là một cờ khai báo rõ ràng chứ không phải đoán môi trường.
internal/outbox/ssrf.go · internal/outbox/dispatcher.go
Chúng tôi không phải bên lưu ký, và mã nguồn từ chối trở thành như vậy.
Không giữ tiền thành viên. Không giữ khóa riêng. Không có thông tin xác thực của nền tảng nằm trong kênh thanh toán của bên thuê.
Thành viên trả cho bạn
internal/rails
Cấu hình từ chối thứ của chúng tôi
internal/rails
Rút tiền là chỉ thị, không bao giờ là chuyển tiền
internal/claims
Xác minh mà không giữ giấy tờ.
Phiên của nhà cung cấp chạy trên tài khoản của chính bạn. Thứ trả về là một quyết định và một mã định danh không thể đảo ngược.
Mã định danh đó đủ để thực thi quy tắc một người một vị trí, và không hơn. Nó không đủ để dựng lại một danh tính, và đó chính là điểm mấu chốt: cách an toàn nhất để giữ một bản quét hộ chiếu là không giữ nó, và một vụ rò rỉ không thể để lộ dữ liệu chưa từng được lưu.
internal/verification
Những gì chúng tôi không tuyên bố.
Nếu bạn đang điền bảng đánh giá nhà cung cấp, đây là những dòng chúng tôi sẽ trượt. Biết ở đây vẫn hơn biết vào tháng thứ tư.
See /contact#security
Gửi bảng đánh giá, hoặc lấy một sandbox và tự xem.
Cách nào cũng được. Một trong hai nhanh hơn.