Container không phải máy ảo: namespace, cgroup và ảo giác cách ly
Ảnh: Medium

Container không phải máy ảo: namespace, cgroup và ảo giác cách ly

Hình dung container như máy ảo nhỏ dẫn tới quyết định bảo mật sai. Thực ra nó chỉ là tiến trình Linux chạy trên nhân của máy chủ — namespace, cgroup, và ảo giác cách ly.

Rất nhiều người hình dung container như một máy ảo nhỏ gọn, nhẹ nhàng. Hình dung đó tiện lợi nhưng sai ở đúng chỗ nguy hiểm nhất — nó dẫn tới những quyết định bảo mật hớ hênh. Thực tế container không phải máy ảo: nó chỉ là một tiến trình Linux bình thường, chạy trên đúng cái nhân của máy chủ, chỉ khác ở chỗ bị giới hạn tầm nhìn và tài nguyên.

Ba cơ chế tạo nên container

  • Namespace quyết định tiến trình nhìn thấy gì. Namespace PID làm tiến trình tưởng nó là số 1 và không thấy tiến trình nào khác của máy chủ; namespace mạng cho nó một ngăn xếp mạng riêng; namespace mount cho nó một cây thư mục riêng. Toàn bộ "container" mà bạn thấy thực chất là một tiến trình bị bịt mắt một cách có chọn lọc.
  • cgroup quyết định tiến trình dùng được bao nhiêu: giới hạn CPU, RAM, băng thông ổ đĩa. Đây là thứ ngăn một container ngốn hết tài nguyên làm chết những container khác trên cùng máy.
  • Hệ tệp phân lớp cho phép nhiều container dùng chung các lớp chỉ đọc, mỗi cái chỉ thêm một lớp ghi mỏng của riêng mình lên trên. Đó là lý do tạo một container mới gần như tức thì và tốn rất ít đĩa — chúng không sao chép cả hệ thống, chúng chia sẻ nền chung.

Hệ quả bảo mật

Đây là điểm mà hình dung "máy ảo nhỏ" gây hại. Vì mọi container dùng chung một cái nhân với máy chủ, một lỗ hổng leo thang đặc quyền trong nhân có thể đưa kẻ tấn công từ bên trong container ra thẳng máy chủ — vượt qua cái ranh giới mà nhiều người tưởng là kín. Máy ảo có thêm một lớp ngăn cách thật là bộ ảo hoá, một biên giới cứng mà container không có. Từ đó suy ra vài nguyên tắc không nên bỏ qua:

  • Đừng chạy container bằng quyền root nếu không thật sự bắt buộc — root trong container gần với root máy chủ hơn bạn nghĩ.
  • Đừng gắn socket điều khiển của Docker vào bên trong một container: đó thực chất là trao quyền root trên toàn máy chủ cho thứ chạy trong container đó.
  • Cần cách ly nhiều bên không tin nhau — chạy mã của người lạ — thì dùng máy ảo, đừng dựa vào container. Container cách ly để tiện quản lý, không phải để phòng thủ trước kẻ thù.

Vì sao vẫn nên dùng

Nói vậy không phải để chê container, mà để dùng nó đúng chỗ mạnh. Giá trị thật của nó là đóng gói và tái lập môi trường: cùng một ảnh chạy giống hệt nhau trên máy bạn, trên máy đồng nghiệp, và trên máy chủ sản xuất — chấm dứt vĩnh viễn câu "trên máy tôi thì chạy được". Đó mới là điều khiến container thay đổi cách phần mềm được xây và triển khai. Còn sự cách ly chỉ là phần thưởng kèm theo — hữu ích, nhưng có giới hạn, và biết giới hạn đó nằm ở đâu là khác biệt giữa dùng container an toàn và tự tạo cho mình một lỗ hổng.

Chia sẻ

Thảo luận