Keychain trừu tượng hóa backend ký, nhưng việc vận hành một signer trong môi trường production vẫn là trách nhiệm của bạn. Các thực hành này áp dụng cho tất cả các backend; xem Chọn backend để biết cách lựa chọn.
Tách biệt signer nóng và signer lạnh
Sử dụng signer vận hành ("nóng") với số dư thấp cho các giao dịch thường xuyên, tự động, và một signer ("lạnh") riêng biệt có giá trị cao cho các chuyển động ngân quỹ. Bảo vệ signer lạnh bằng MPC custody hoặc cloud HSM và yêu cầu chính sách phê duyệt trước khi ký. Do giao diện hoàn toàn giống nhau, mỗi vai trò có thể sử dụng một backend khác nhau mà không cần thay đổi các điểm gọi.
Xoay vòng khóa có chủ đích
Trên Solana, khóa ký chính là địa chỉ tài khoản, vì vậy việc xoay vòng khóa sẽ tạo ra một địa chỉ mới. Hãy lên kế hoạch xoay vòng như một quá trình di chuyển: cấp phát khóa mới, tái phân công các quyền liên quan (hoặc chuyển tiền) sang địa chỉ mới, rồi thu hồi khóa cũ. Sử dụng các khóa riêng biệt cho từng môi trường để khóa devnet không bao giờ được tái sử dụng trên mainnet.
Cấp quyền truy cập tối thiểu
Giới hạn thông tin xác thực của từng backend ở mức tối thiểu cần thiết để ký. Đối với AWS KMS,
đó là kms:Sign, kms:DescribeKey và kms:GetPublicKey trên khóa cụ thể
(bước kiểm tra tính sẵn sàng dùng hai quyền sau); ưu tiên IAM roles hơn
thông tin xác thực tĩnh. Áp dụng nguyên tắc tương tự cho các chính sách Vault và API
keys của ví được quản lý.
Lên kế hoạch cho tính sẵn sàng
Các backend từ xa phụ thuộc vào dịch vụ mạng. Kiểm tra tính sẵn sàng trước khi phụ thuộc
vào một signer (isAvailable() trong TypeScript, is_available() trong Rust và Python,
IsAvailable(ctx) trong Go), thử lại với backoff đối với các lỗi chỉ xảy ra khi ký, và xác định
đường dự phòng khi có sự cố. Không thử lại một cách mù quáng với backend có phát sóng giao dịch
(Crossmint, chế độ auto native của Fordefi): xem
Xử lý các giao dịch phát sóng chưa được xác nhận. Keychain
bắt buộc HTTPS trên các base URL đã cấu hình, từ chối chuyển hướng và áp dụng thời gian chờ
yêu cầu mặc định.
Xử lý các giao dịch phát sóng chưa được xác nhận
Crossmint và chế độ auto native của Fordefi thực hiện ký và phát sóng giao dịch phía máy chủ, nên một
lần gọi thất bại không có nghĩa là giao dịch chưa được gửi đi. Khi nhà cung cấp có thể đã chấp nhận
giao dịch, Keychain sẽ báo BROADCAST_UNCONFIRMED
(SignerError::BroadcastUnconfirmed trong Rust). Lỗi này kèm theo transaction id của
nhà cung cấp khi yêu cầu tạo đã được chấp nhận, và luôn kèm theo idempotency
key mà yêu cầu tạo đã được gửi đi cùng, được tạo ra từ thông điệp.
- Đối soát với nhà cung cấp bằng transaction id trước khi làm bất cứ việc gì khác.
- Gửi lại giao dịch giống hệt từng byte là an toàn: idempotency key sẽ loại bỏ bản trùng lặp.
- Dựng lại giao dịch (ví dụ với blockhash mới) sẽ tạo ra một key mới và do đó là một lần chuyển mới.
Bảo vệ bí mật và truyền tải
- Các backend từ xa bắt buộc HTTPS trên các base URL đã cấu hình và từ chối chuyển hướng.
Ngoại lệ duy nhất là Vault, cho phép HTTP thuần trên loopback để
vault server -devcục bộ hoạt động được. - Cung cấp API keys, token và thông tin xác thực từ secret manager hoặc biến môi trường — không bao giờ mã hóa cứng hoặc commit chúng vào source control.
- Keychain làm sạch các phản hồi lỗi để tránh rò rỉ bí mật vào log; hãy giữ cho hệ thống ghi log của bạn không chứa thông tin xác thực thô và tài liệu khóa.
Giám sát và kiểm toán việc ký
Theo dõi tỷ lệ thành công khi ký, độ trễ và số lần thất bại, đồng thời cảnh báo khi có đột biến — xem các chỉ số trong Sẵn sàng cho môi trường Production. Bật nhật ký kiểm toán phía nhà cung cấp (KMS, Vault hoặc custodian) và đối chiếu chúng với các giao dịch mà ứng dụng của bạn gửi đi.
Nắm rõ những gì Keychain kiểm tra
- Keychain xác thực chặng ký, chứ không phải giao dịch của bạn: không có mô phỏng, không kiểm tra nội dung giao dịch và không có công cụ chính sách. Hãy thực thi những điều đó trong ứng dụng của bạn hoặc trong các kiểm soát chính sách của nhà cung cấp.
- Chế độ manual native của Fordefi sẽ viết lại giao dịch (blockhash, các lệnh phí Compute Budget) trước khi ký. Hãy tiếp tục từ giao dịch mà nó trả về, không phải giao dịch bạn đã gửi, và chạy nó trước mọi signer khác.
- Rust xóa sạch (zeroize) các bộ đệm khóa trung gian; Python và Go thì không thể. Với backend Memory trong các ngôn ngữ đó, hãy coi toàn bộ bộ nhớ của tiến trình là dữ liệu nhạy cảm.
- Với Ledger, màn hình thiết bị là mô tả duy nhất đáng tin cậy về những gì
đang được ký. Không bật tính năng
unsafe-debughoặc ghi logTRACEchosolana_remote_wallettrong môi trường production, vì cả hai đều ghi log chi tiết thiết bị và giao dịch.
Xem mô hình bảo mật để có bức tranh toàn cảnh.
Is this page helpful?