Питання про баланс безпеки, повторюванності та стабільності
Docker-контейнер проектувався як, перш за все, стабільне і повторюване середовище, контейнер для програми.
Тобто, з цієї точки зору, варто писати
FROM ubuntu:bionic-20230412
RUN apt install pkg=ver
тоді ви завжди отримаєте дійсно той самий докер контейнер з одного і того-ж Dockerfile
але з точки зору безпеки
FROM ubuntu:bionic
RUN apt install pkg
дещо краще, бо ви отримаєте останню версію образа ОС зі всіма виправленнями безпеки, що з точки зору безпеки — краще, але з точки зору повторюванності контейнеру — гірше, бо будуть встановлені інші версії пакетів (більше того — кожного разу ви будете отримувати різні, в загальному випадку, контейнери з іншими бінарниками). Тобто ви порушуєте принцип повторюваності за рахунок підвищення безпеки.
Більше того, збірка
RUN apt install pkg
буде більш стабільною на етапі саме збірки контейнера, бо ubuntu полюбляють видаляти старі версії пакетів з репозиторію через деякий час після виходу виправлення. Тому
RUN apt install pkg=ver
може просто не спрацювати бо пакету вказаної версії просто немає в репозиторіях
Після збірки теж є питання до зберігання старих контейнерів в container registry. з одного боку зберігання старих контейнерів це проблема безпеки — бо є можливість, що їх використають для запуску і використають вразливість. З іншого боку видалення старих контейнерів означає, що ви не зможете зібрати чи запустити старий проект.
Якщо код основної програми розвивається і підтримується постійно, то код інфраструктури не часто потребує змін і якщо повну перевірку інфраструктури робити раз на пів року, то точно вийдуть і нові версії terraform/pulumi/terragrunt/powershell/python і якихось з модулів/провайдерів. Тож прийдеться постійно поновлювати код інфраструктури. Docker containers де всі пайплайни з перевірки та розгортання інфраструктури виконуються теж треба поновлювати.
Так ось, питання — як знайти баланс повторюванності контейнерів та процесу їх збірки, безпеки і часу зберігання у registry.
Накидайте, будь ласка, ідей з цього приводу. Бо потрібна загальна стратегія, яку треба затвердити і обгрунтувати всім учасникам процесу, бо замовник та OPS хочуть мати можливість відкотитись до будь-якої версії. Security хочуть бачити лише стабільні та безпечні образи в репозиторіях та registry, DEV, вочевидь, не мають можливості підтримувати всі виправлення у всіх версіях — та це й неможливо, бо код інфраструктури залежить від версій сторонніх апі чи утиліт.
Як це організовано у вас? Які строки зберігання? Чим обгрунтовані? Що ви обираєте — більш повторювані чи більш безпечні контейнери? Взагалі, буду вдячний за будь-які ідеї.
Усі статті, обговорення, новини про DevOps — в одному місці. Підписуйтеся на DOU | DevOps!
16 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів