Як обробляти оновлення безпеки в контейнерах Docker?


117

Під час розгортання програм на серверах зазвичай існує розмежування між тим, що додаток входить у себе, і тим, що він очікує від платформи (операційної системи та встановлених пакетів). Одним із пунктів цього є те, що платформу можна оновлювати незалежно від програми. Це корисно, наприклад, коли оновлення безпеки потрібно терміново застосовувати до пакетів, наданих платформою, не переробляючи весь додаток.

Традиційно оновлення безпеки застосовуються просто шляхом виконання команди менеджера пакунків для встановлення оновлених версій пакетів в операційній системі (наприклад, "yum update" на RHEL). Але з появою технології контейнерів, таких як Docker, де зображення контейнерів по суті поєднують як додаток, так і платформу, який канонічний спосіб оновлювати систему з контейнерами? І хост, і контейнери мають власні, незалежні, набори пакунків, які потребують оновлення та оновлення на хості, не оновлюватимуть жодних пакетів усередині контейнерів. З виходом RHEL 7, де особливо представлені контейнери Docker, було б цікаво почути, що рекомендується Redhat для обробки оновлень безпеки контейнерів.

Думки про кілька варіантів:

  • Якщо дозволити менеджеру пакетів оновити пакети на хості, вони не будуть оновлювати пакети всередині контейнерів.
  • Регенерування всіх зображень контейнерів для застосування оновлень, здається, порушує поділ між додатком та платформою (оновлення платформи вимагає доступу до процесу збирання додатків, який генерує зображення Docker).
  • Запуск вручну команд усередині кожного із запущених контейнерів здається громіздким, і зміни ризикують бути перезаписаними наступного разу, коли контейнери будуть оновлені з артефактів випуску програми.

Тож жоден із цих підходів не здається задовільним.


1
Найкраща ідея для цього, яку я бачив до цього часу, - Project Atomic . Я не думаю, що він цілком готовий до прайм-тайму.
Майкл Хемптон

1
Валько, з яким робочим процесом ти закінчився? Я запускаю довгострокові контейнери (розміщую, наприклад, php-cgi), і те, що я знайшов поки що: docker pull debian/jessieоновити зображення, потім відновити існуючі зображення, потім зупинити контейнери та запустити їх знову ( з новим образом). Образи, які я будую, мають те саме ім’я, що і попередні, тому запуск виконується за допомогою сценарію. Потім я видаляю "безіменні" зображення. Я б точно вдячний за кращий робочий процес.
miha

1
miha: Це схоже на те, що я закінчив. По суті, постійно оновлюючи та відновлюючи всі зображення в рамках створення нових випусків. І перезапуск контейнерів за допомогою нових зображень.
Маркус Холлманн

1
Найкраща відповідь тут дуже допомагає, оскільки є сценарій, який містить основні командні лінії, щоб виконати саме те, що сказав Йоганнес Зімке:
Хадсон Сантос,

Цікаве запитання. Я сам про це дивуюсь. Якщо на одному хості докера працює 20 програм, вам доведеться оновити базові зображення, відновити і перезапустити! 20 програм, і ви навіть не знаєте, чи оновлення безпеки торкнулося їх усіх, або лише один із них. Ви повинні відновити зображення для скажімо Apache, коли оновлення безпеки стосується, наприклад, лише libpng. Так ви закінчите непотрібні перебудови та перезавантаження ...
Далібор Філус

Відповіді:


47

Документ з пакетом зображень Докера та "платформа", це правильно. Але зазвичай зображення складається з базового зображення та фактичного застосування.

Отже, канонічним способом обробки оновлень безпеки є оновлення базового зображення, а потім відновлення зображення програми.


3
Дякую, це звучить розумно. Просто бажаю, щоб оновлення платформи, так би мовити, не повинно було викликати перепакування всього додатка (врахуйте, наприклад, необхідність відновлення 100 різних зображень додатків за рахунок оновлення одного базового зображення). Але, можливо, це неминуче з філософією Докера згуртувати все разом всередині одного образу.
Markus Hallmann

3
@ValkoSipuli Ви завжди можете написати сценарій для автоматизації процесу.
dsljanus

Чому б не apt-get upgrade, dnf upgrade, pacman -yu тощо еквівалент всередині контейнера? Ви навіть можете створити скрипт оболонки, який це робить, а потім запустити додаток, а потім використовувати це як точку входу контейнера, щоб при запуску / перезапуску контейнера оновити всі його пакети.
Артур Кей

8
@ArthurKay Дві причини: 1) Ви підірвите розмір контейнера, оскільки всі пакунки, які отримують оновлення, будуть додані до шару контейнера, зберігаючи застарілий пакет у зображенні. 2) Він перемагає найбільшу перевагу (контейнерних) зображень: зображення, яке ви створюєте, не те саме, що ви будуєте / тестуєте, оскільки ви міняєте пакети під час виконання.
Йоганнес "риба" Зімке

7
Є одне, чого я не розумію: якщо ви компанія, яка купує програмне забезпечення, яке постачається як контейнер для докерів, чи потрібно чекати, коли виробник програмного забезпечення відновить пакет програм кожного разу, коли з’явиться проблема безпеки. ? Яка компанія таким чином відмовиться від контролю над своїми відкритими вразливими місцями?
Сентенца

7

Контейнери повинні бути легкими та взаємозамінними. Якщо у вашому контейнері є проблеми із безпекою, ви відновите версію контейнера, який виправлено, і розгорніть новий контейнер. (багато контейнерів використовують стандартне базове зображення, яке використовує стандартні засоби управління пакетами, наприклад, apt-get для встановлення своїх залежностей; відновлення буде витягувати оновлення із сховищ)

Хоча ви можете латати всередині контейнерів, це не буде добре масштабувати.



0

Перш за все, багато ваших оновлень, які ви традиційно працювали в минулому, просто не опиняться всередині самого контейнера. Контейнер повинен бути досить легким і невеликим набором повної файлової системи, яку ви звикли бачити в минулому. Пакети, які вам доведеться оновити, - це ті, що є частиною вашого DockerFile, і оскільки у вас є DockerFile, ви повинні мати можливість відслідковувати ці пакунки та ідентифікатори контейнерів, які потребують оновлення. Користувацький інтерфейс Cloudstein, який буде випущений незабаром, відстежує ці інгредієнти DockerFile для вас, щоб можна було побудувати схему оновлення, яка найкраще підходить для їх контейнерів. Сподіваюся, це допомагає


-1

це, як правило, навіть гірше трьох запропонованих вами варіантів. Більшість зображень докера не побудовані за допомогою менеджерів пакетів, тому ви не можете просто скористатися зображенням докера та оформити оновлення. Вам потрібно буде відновити або відновити зображення докера.

Той факт, що вам потрібно перебудувати або сподіватися на інших, щоб відновити патчі безпеки, здається в більшості випадків нерозумним.

Я розглядав можливість розгортання sonarr та radarr в контейнерах докера, але знаючи, що вони не збираються отримувати регулярні оновлення безпеки, які отримує мій контейнер, - це вимикач угод. Управління оновленнями безпеки для мого контейнера достатньо клопоту, не маючи справи з тим, щоб якось вручну застосовувати оновлення безпеки до кожного зображення докера окремо.


1
Ваше повідомлення не вважатиметься відповіддю, оскільки ви не надаєте відповіді на питання. Будь ласка, додайте його як коментар до питання та видаліть свою "відповідь". StackExchange не є форумом, але його слід розглядати як питання і відповіді, де експерти відповідають на питання, з якими вони можуть надати допомогу.
Філіп -Зян К Лі- Стокман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.