Làm thế nào để xử lý các cập nhật bảo mật trong các container Docker?


117

Khi triển khai các ứng dụng lên các máy chủ, thường có sự tách biệt giữa những gì ứng dụng đi kèm với chính nó và những gì nó mong đợi từ nền tảng (hệ điều hành và các gói đã cài đặt) để cung cấp. Một điểm của điều này là nền tảng có thể được cập nhật độc lập với ứng dụng. Điều này hữu ích, ví dụ khi các cập nhật bảo mật cần được áp dụng khẩn cấp cho các gói được cung cấp bởi nền tảng mà không cần xây dựng lại toàn bộ ứng dụng.

Các cập nhật bảo mật truyền thống đã được áp dụng đơn giản bằng cách thực hiện lệnh quản lý gói để cài đặt các phiên bản cập nhật của gói trên hệ điều hành (ví dụ: "cập nhật yum" trên RHEL). Nhưng với sự ra đời của công nghệ container như Docker trong đó hình ảnh container về cơ bản gói cả ứng dụng nền tảng, cách thức chính tắc để giữ một hệ thống với các container được cập nhật là gì? Cả máy chủ và bộ chứa đều có các gói riêng, độc lập, cần cập nhật và cập nhật trên máy chủ sẽ không cập nhật bất kỳ gói nào bên trong các thùng chứa. Với việc phát hành RHEL 7 trong đó các container Docker được đặc biệt chú ý, sẽ rất thú vị khi nghe cách khuyến nghị của Redhat để xử lý các cập nhật bảo mật của các container.

Suy nghĩ về một vài lựa chọn:

  • Để các gói cập nhật trình quản lý gói trên máy chủ sẽ không cập nhật các gói bên trong các thùng chứa.
  • Phải tạo lại tất cả các hình ảnh chứa để áp dụng các bản cập nhật dường như phá vỡ sự tách biệt giữa ứng dụng và nền tảng (cập nhật nền tảng yêu cầu quyền truy cập vào quá trình xây dựng ứng dụng tạo ra hình ảnh Docker).
  • Chạy các lệnh thủ công bên trong mỗi container đang chạy có vẻ cồng kềnh và các thay đổi có nguy cơ bị ghi đè trong lần chứa tiếp theo được cập nhật từ các tạo phẩm phát hành ứng dụng.

Vì vậy, không có cách tiếp cận nào có vẻ thỏa đáng.


1
Ý tưởng tốt nhất cho điều này tôi đã thấy cho đến nay là Project Atomic . Tôi không nghĩ rằng nó khá sẵn sàng cho thời gian đầu mặc dù.
Michael Hampton

1
Valko, bạn đã kết thúc công việc gì? Tôi đang chạy các bộ chứa dài hạn (ví dụ: lưu trữ php-cgi) và những gì tôi đã tìm thấy cho đến nay là: docker pull debian/jessieđể cập nhật hình ảnh, sau đó xây dựng lại (các) hình ảnh hiện có của tôi, sau đó dừng các bộ chứa và chạy lại chúng ( với hình ảnh mới). Các hình ảnh tôi xây dựng có cùng tên với các hình ảnh trước đó, vì vậy việc bắt đầu được thực hiện thông qua kịch bản. Sau đó tôi xóa hình ảnh "không tên". Tôi chắc chắn sẽ đánh giá cao một quy trình làm việc tốt hơn.
miha

1
miha: Nghe có vẻ giống như những gì tôi đã làm. Về cơ bản liên tục cập nhật và xây dựng lại tất cả các hình ảnh như là một phần của việc phát hành mới. Và khởi động lại các container bằng hình ảnh mới.
Markus Hallmann

1
Câu trả lời tốt nhất ở đây giúp ích rất nhiều vì có một kịch bản chứa các dòng lệnh chính để thực hiện chính xác những gì mà ông Zi Ziemke đã nói:
Hudson Santos

Câu hỏi thú vị. Tôi tự hỏi về nó bản thân mình. Nếu bạn có 20 ứng dụng đang chạy trên một máy chủ docker, bạn phải nâng cấp hình ảnh cơ bản, xây dựng lại và khởi động lại! 20 ứng dụng và bạn thậm chí không biết liệu bản cập nhật bảo mật có ảnh hưởng đến tất cả chúng hay chỉ một trong số chúng. Bạn phải xây dựng lại hình ảnh để nói Apache khi bản cập nhật bảo mật chỉ ảnh hưởng đến libpng. Vì vậy, bạn kết thúc với việc xây dựng lại không cần thiết và khởi động lại ...
Dalibor Filus

Câu trả lời:


47

Một ứng dụng gói hình ảnh Docker và "nền tảng", điều đó là chính xác. Nhưng thông thường hình ảnh bao gồm một hình ảnh cơ sở và ứng dụng thực tế.

Vì vậy, cách chuẩn để xử lý các cập nhật bảo mật là cập nhật hình ảnh cơ sở, sau đó xây dựng lại hình ảnh ứng dụng của bạn.


3
Cảm ơn, điều này nghe có vẻ hợp lý. Vẫn chỉ muốn cập nhật nền tảng để có thể nói sẽ không phải kích hoạt đóng gói lại toàn bộ ứng dụng (ví dụ như xem xét việc phải xây dựng lại 100 hình ảnh ứng dụng khác nhau do một hình ảnh cơ sở duy nhất được cập nhật). Nhưng có lẽ điều này là không thể tránh khỏi với triết lý Docker là kết hợp mọi thứ lại với nhau trong một hình ảnh duy nhất.
Markus Hallmann

3
@ValkoSipuli Bạn luôn có thể viết một tập lệnh để tự động hóa quy trình.
dsljanus

Tại sao không nâng cấp apt-get, nâng cấp dnf, pacman -syu, vv tương đương bên trong container? Bạn thậm chí có thể tạo một tập lệnh shell thực hiện điều đó và sau đó chạy ứng dụng, sau đó sử dụng tập lệnh đó làm điểm truy cập của bộ chứa để khi bộ chứa được khởi động / khởi động lại, nó sẽ nâng cấp tất cả các gói của nó.
Arthur Kay

8
@ArthurKay Hai lý do: 1) Bạn làm nổ kích thước thùng chứa, vì tất cả các gói được nâng cấp sẽ được thêm vào lớp container trong khi vẫn giữ gói lỗi thời trong hình ảnh. 2) Nó đánh bại lợi thế lớn nhất của hình ảnh (container): Hình ảnh bạn chạy không giống với bạn xây dựng / kiểm tra vì bạn thay đổi các gói trong thời gian chạy.
Zi 'cá' Ziemke

7
Có một điều tôi không hiểu: Nếu bạn là một công ty mua một phần mềm được vận chuyển như một container docker, bạn có phải đợi nhà sản xuất phần mềm xây dựng lại gói ứng dụng mỗi khi xảy ra sự cố bảo mật ? Công ty nào sẽ từ bỏ quyền kiểm soát các lỗ hổng mở của họ theo cách đó?
Sentenza

7

Các container được cho là nhẹ và có thể thay thế cho nhau. Nếu container của bạn có vấn đề về bảo mật, bạn xây dựng lại một phiên bản của container đã được vá và triển khai container mới. (nhiều container sử dụng hình ảnh cơ sở tiêu chuẩn sử dụng các công cụ quản lý gói tiêu chuẩn như apt-get để cài đặt các phụ thuộc của chúng, việc xây dựng lại sẽ lấy các bản cập nhật từ kho lưu trữ)

Mặc dù bạn có thể vá bên trong các thùng chứa, nhưng điều đó sẽ không có quy mô tốt.



0

Trước hết, nhiều bản cập nhật mà bạn thường chạy trong quá khứ sẽ không nằm trong chính container. Container phải là một tập hợp con khá nhẹ và nhỏ của hệ thống tập tin đầy đủ mà bạn quen nhìn thấy trong quá khứ. Các gói bạn cần cập nhật sẽ là những gói là một phần của DockerFile của bạn và vì bạn có DockerFile, bạn sẽ có thể theo dõi các gói và ID container cần cập nhật. Giao diện người dùng của Cloudstein sẽ sớm được phát hành sẽ theo dõi các thành phần DockerFile này cho bạn để người ta có thể xây dựng sơ đồ cập nhật phù hợp nhất cho các thùng chứa của họ. Hi vọng điêu nay co ich


-1

nó thường thậm chí còn tồi tệ hơn ba lựa chọn bạn cung cấp. Hầu hết các hình ảnh docker không được xây dựng với trình quản lý gói, do đó bạn không thể chỉ vào hình ảnh docker và đưa ra bản cập nhật. Bạn sẽ cần phải xây dựng lại hoặc lấy lại hình ảnh docker.

Việc bạn cần xây dựng lại hoặc đang chú ý đến người khác để xây dựng lại cho các bản vá bảo mật có vẻ không hợp lý trong hầu hết các trường hợp.

Tôi đã xem xét việc triển khai sonarr và radarr trong các container docker nhưng biết rằng chúng sẽ không nhận được các bản cập nhật bảo mật thường xuyên mà container của tôi nhận được là một công cụ thỏa thuận. Quản lý cập nhật bảo mật cho container của tôi là đủ rắc rối mà không phải đối phó với việc bằng cách nào đó phải áp dụng thủ công các cập nhật bảo mật cho từng hình ảnh docker riêng lẻ.


1
Bài viết của bạn sẽ không được coi là một câu trả lời, vì bạn không cung cấp câu trả lời cho câu hỏi. Vui lòng thêm nó dưới dạng một nhận xét cho câu hỏi và xóa "câu trả lời" của bạn. StackExchange không phải là một diễn đàn, nhưng nên được coi là một câu hỏi và trả lời nơi các chuyên gia trả lời các câu hỏi mà họ có thể cung cấp trợ giúp.
Phillip -Zyan K Lee- Stockmann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.