Mọi thứ đều chạy cho đến khi trình chạy bản dựng cần cùng ổ cắm máy chủ mà khách VPN đang dùng, và khi đó không ai giải thích được vì sao một tác vụ có thể đọc khóa của cổng vào. Mọi thứ được cài trên một máy vì nó vừa, và mỗi khách được cấp quyền truy cập rộng vì đó là cách nhanh nhất để nó chạy được. Kết quả là một máy chủ có ranh giới tin cậy chính là dây nguồn. Việc tách vai trò tốn ít công hơn vẻ ngoài của nó, và bắt đầu bằng việc đặt tên cho chúng.

Ba vai trò hiện đang chia sẻ mọi thứ

Một điểm vào VPN, một nhóm dịch vụ riêng và một trình chạy bản dựng muốn những thứ khác nhau. Cái đầu cần một cổng công khai và một mạng hẹp ở phía riêng. Cái thứ hai cần lưu trữ lâu dài và bí mật của ứng dụng. Cái thứ ba chạy mã do người khác viết.

Việc trao cùng một quyền truy cập cho cả ba chính là thứ khiến triệu chứng trở nên khó hiểu, vì khi đó bất kỳ cái nào cũng có thể ảnh hưởng đến hai cái còn lại. Một tác vụ dựng chạm tới ổ cắm của hypervisor là tác vụ có thể dừng VPN. Một khách dịch vụ có tuyến tới mạng quản trị có thể đổi cấu hình switch. Vấn đề nằm ở quyền, và danh sách tiến trình chỉ là nơi nó lộ ra. Đặt tên cho các vai trò trước sẽ cho mỗi quyền một chỗ để trú.

Bản phác dưới đây là điểm khởi đầu cho cách tách đó, không phải lời hứa về tính sẵn sàng cao. Hãy coi nó là giả thuyết cần kiểm chứng, không phải thiết kế hoàn chỉnh.

Tách ba vai trò, không phải ba tiến trình

Ba khách trên một máy chủ cho ba bộ quyền và ba vị trí mạng. Chúng không cho ba miền lỗi, và thiết kế nên nói to điều đó.

Việc tách chỉ hữu ích nếu một khách bị xâm phạm không tự động trao quyền cho những khách khác, và đó là thiết lập của hypervisor, không phải quy ước đặt tên. Gọi một máy ảo là cổng vào không ngăn được khách khác chạm tới máy chủ. Hãy đọc cấu hình switch ảo thay vì tên máy chủ, rồi xác nhận mỗi khách nằm đúng chỗ bạn nghĩ.

host
├─ vpn-gw      10.60.10.2/24   public 51820/udp only
├─ services    10.60.0.10/24   no route to the management network
└─ ci-runner   10.60.20.2/24   outbound only, no host socket

Viết topo ra rồi kiểm chứng bằng những công cụ sở hữu nó. Một khách xuất hiện trên cầu sai là một phát hiện, không phải chi tiết. Sửa mạng trước khi đổi bất kỳ cấu hình dịch vụ nào.

Để khách VPN chỉ mở những cánh cửa nó sở hữu

Công bố cổng đường hầm trên router và không gì khác. Cổng quản trị của khách thuộc về một đường quản trị, không phải internet, và giao diện của chính hypervisor cũng thuộc về đó.

Mạng phía riêng nên với tới những dịch vụ mà người dùng từ xa cần và dừng ở đó. Xác thực ứng dụng vẫn bật, vì đường hầm là vận chuyển chứ không phải đăng nhập. Giữ bảng tuyến của khách VPN đủ nhỏ để mô tả trong một câu. Nếu bạn không mô tả được đơn giản như vậy, ranh giới đã nhoè mất rồi.

virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'

Bất cứ thứ gì đang lắng nghe trên máy chủ mà không cần cho quản trị thì không nên lắng nghe chút nào. Điều đó gồm cả API của hypervisor, thứ dễ bị để lộ trên một giao diện công khai.

Các tác vụ dựng cần một kiểu ranh giới khác

Một tác vụ CI chạy những lệnh do kho mã kiểm soát, nên lòng tin của nó phụ thuộc vào việc ai có thể đẩy mã. Trình thực thi shell chạy những lệnh đó dưới người dùng của trình chạy trên máy chủ, và đó là ranh giới rộng nhất hiện có.

Trình thực thi container hẹp hơn, và một container đặc quyền không thuộc nhóm hẹp đó. Giữ trình chạy trong khách riêng với phạm vi mạng riêng, và chỉ cho nó quyền truy cập artefact và triển khai mà các tác vụ cần. Worker dùng một lần giảm trạng thái lưu lại; chúng không giảm khả năng với tới hay mức lộ bí mật. Cả hai vẫn cần giới hạn rõ ràng.

Khách dịch vụ sở hữu dữ liệu, nên kế hoạch sao lưu của nó là thứ phải chạy được. Giữ kho mã, tệp tải lên và cơ sở dữ liệu trong cùng một lịch. Hãy thử một lần khôi phục thay vì đọc trạng thái tác vụ.

Lập kế hoạch cho lỗi mà cả ba cùng chia sẻ

Một máy chủ là một miền lỗi. Một lần khởi động lại lấy đi đường hầm và mọi dịch vụ riêng cùng lúc, và đó đúng là lúc một đường vào quan trọng nhất.

Giữ quyền truy cập console không phụ thuộc vào khách VPN, dù đó là console vật lý, giao diện quản trị ngoài băng hay console của nhà cung cấp. Một snapshot lưu trên cùng ổ đĩa không phải bản sao độc lập, và bản sao lưu chạy bên trong chính khách mà nó bảo vệ cũng vậy. Rồi kiểm tra khởi động nguội như một chuỗi, không phải một danh sách: máy chủ, các mạng ảo, đường đi của đường hầm và một ứng dụng có tên dưới một tài khoản thường.

virsh list --all
systemctl is-active libvirtd
curl -sS -m 5 -o /dev/null -w '%{http_code}\n' https://10.60.0.10/
ss -ltnp | grep -E ':51820|:443'

Thứ tự khởi động tiến trình không chứng minh gì về tuyến và DNS, nên hãy kiểm tra đường đi thay vì trạng thái các unit. Đường đi mới là thứ người dùng từ xa thực sự cần.

Bài viết liên quan