0003 — Các Nút CLI cTrader là HTTP + JWT, không SSH/Shell
Ngữ cảnh
Các vùng chứa backtest/run thực thi trên các máy chủ từ xa. Cách tiếp cận rõ ràng — SSH in và chạy docker — cấp ứng dụng chính thực thi mã từ xa tùy ý và thông tin xác thực có tuổi thọ dài trên mỗi nút. Đó là một bán kính phát nổ lớn cho một hệ thống chạy cBots không đáng tin cậy của người dùng.
Quyết định
Mỗi máy chủ từ xa chạy một HTTP agent độc lập CtraderCliNode với không SSH và không shell. Các
ứng dụng chính gọi đại lý qua HTTP; mỗi yêu cầu mang một HS256 JWT có tuổi thọ ngắn (5 phút,
iss=app-main / aud=app-node) được ký bằng bí mật của nút đó. Đại lý:
- chỉ chạy các hình ảnh phù hợp với
AllowedImagePrefix(với ranh giới đường dẫn đểghcr.io/spotwarekhông thể khớpghcr.io/spotware-evil/...); - execs docker qua
ArgumentList— không bao giờ một chuỗi shell; - là không trạng thái, tìm các vùng chứa bằng nhãn
app.instance; - tự đăng ký và nhịp tim để
POST /api/nodes/register; ứng dụng chính upsertCtraderCliNodetheo tên, vì vậy một nút sống sót những thay đổi IP.
Hậu quả
- Một mã thông báo yêu cầu bị rò rỉ hết hạn trong vài phút; không có thông tin xác thực shell đứng để ăn cắp.
- Khả năng của đại lý bị ràng buộc để "chạy một hình ảnh được phép" — nó không thể được biến thành chung shell từ xa.
- Danh tính nút dựa trên tên, vì vậy cấp phát lại một nút với IP mới không mồ côi lịch sử của nó.