Контейнери у сфері DevOps вже давно не є чимось новим. Їх можна уявити як віртуальні ізольовані середовища, що містять все необхідне для запуску мікросервісів, від невеликих до масштабних програмних рішень.
Подумайте про контейнери як про своєрідну систему пакування: вони дозволяють розробникам зберігати в одному місці всі компоненти, необхідні для функціонування програми, такі як середовища виконання та бінарні коди.
Завдяки контейнерам, розробники можуть безперешкодно переносити додатки між різними середовищами, скажімо, з локальної машини на віртуальний сервер або від етапу розробки до продакшну. Це усуває проблеми несумісності програмного забезпечення та відмінностей конфігурацій між середовищами розробників та кінцевим продуктом.
Згідно зі звітом Statista про контейнерні технології, вже половина світових організацій впровадила оркестрацію контейнерів. Попри широке визнання і переваги, контейнери можуть стати вхідними дверима для кібератак, якщо не приділяти достатньо уваги їхній безпеці.
Ресурс CVE Details, який є важливим джерелом інформації про вразливості в безпеці, зафіксував 62 вразливості у Docker на момент написання цього матеріалу. Чи не є це достатнім приводом для розробників застосовувати найкращі практики, щоб уникнути цих підводних каменів і гарантувати захист контейнерів для успішних процесів DevOps?
У цій статті ми розглянемо концепцію безпеки контейнерів, висвітлимо основні проблеми та запропонуємо найкращі підходи до використання контейнерних технологій.
Що таке безпека контейнера?
Безпека контейнерів – це безперервний процес, що полягає у застосуванні протоколів безпеки, інструментів та політик, для захисту контейнерів та їхнього оточення від потенційних загроз.
Нехтування безпекою може призвести до негативних наслідків для вашої програми, її інфраструктури, середовища виконання, системних бібліотек, операційної системи та ядра, серед інших компонентів.
Оскільки контейнери зазвичай є тимчасовими, призначеними для швидкого розгортання та масштабування, необхідно автоматизувати безпеку на кожному етапі життєвого циклу розробки програмного забезпечення (SDLC).
Також варто ознайомитись зі статтею: Вступ до Kubernetes Kops для початківців
Які виклики виникають у сфері безпеки контейнерів?
Хоча контейнери надають численні переваги, наприклад, прискорення розробки програмного забезпечення, вони не застраховані від проблем. Основна причина полягає в тому, що вони потребують додаткових заходів безпеки і не мають вбудованих механізмів самозахисту.
Контейнери отримують доступ до апаратного забезпечення через хостову операційну систему, що означає, що один контейнер може використовувати декілька базових образів, створюючи тим самим розширену поверхню для атаки та ряд проблем.
Одна з основних проблем – це неправильна конфігурація контейнера. Розробники іноді забувають налаштувати контейнери, залишаючи у використанні налаштування за замовчуванням. Це може призвести до таких вразливостей, як відкриті порти, які можуть не підходити для програми, витоку облікових даних (паролів, токенів) та надмірного надання дозволів середовищу виконання (наприклад, запуск від імені root). Якщо ці стандартні налаштування не змінені, вони відкривають шлях для атак.
Друга проблема – це вразливість контейнерної інфраструктури. Пакети, що містяться в контейнері, такі як код програми, бібліотеки та конфігурації, а також пакети в операційній системі хоста, можуть мати вразливості. Ці вразливості можуть виникнути на будь-якому етапі життєвого циклу програми, наприклад, коли залежності ззовні вбудовуються в образ контейнера, встановлюються бібліотеки з відкритим кодом, базові образи завантажуються із сторонніх реєстрів, і хости стають доступними через мережу та кінцеві точки.
Моніторинг робочих навантажень контейнерів – це ще одна з найскладніших проблем. Динамічна природа контейнерів ускладнює відстеження запущених контейнерів та їхню поведінку в мережі. Покращена видимість допомагає запобігти порушенням та прискорити реагування на інциденти.
Також контейнер стає вразливим, якщо будь-який етап процесу CI/CD не є захищеним, чи то в коді програми, чи в інфраструктурі робочого навантаження. Хоча безпекою потрібно займатись наприкінці життєвого циклу, забезпечення безпеки на кожному етапі розробки захистить ваші програми від потенційних невдач.
Які інструменти можуть вирішити проблеми безпеки контейнерів?
Ви можете гарантувати безпеку та цілісність розгорнутих корпоративних рішень, використовуючи інструменти безпеки. Вони сканують на вразливості та постійно перевіряють контейнери на наявність атак, помилок або інших проблем.
Незалежно від того, чи ви шукаєте інструменти безпеки з відкритим кодом, чи комерційні варіанти, всі вони виконують одну функцію: перевіряють вашу контейнерну інфраструктуру на загальні вразливості та ризики (CVE).
Ось деякі інструменти, які можна спробувати: Pingsafe Editors Choice, Datadog Cloud SIEM, Anchore, Sophos Cloud-Native Security, Bitdefender GravityZone, Sysdig secure, Aqua Security та RedHat Advanced Cluster Security для Kubernetes.
Також рекомендуємо статтю: 11 сканерів безпеки контейнерів для пошуку вразливостей
Найкращі практики безпеки контейнерів
Враховуючи вищеописані проблеми, ось перелік найкращих практик для оптимізації безпеки контейнерів на всіх етапах життєвого циклу програми.
Захист ваших зображень
Зображення контейнерів використовуються для створення контейнерів. Навіть найменша помилка конфігурації чи зловмисна дія може призвести до вразливостей. Щоб цьому запобігти, необхідно:
- Використовувати надійні зображення. Якщо ви не створюєте зображення з нуля, використовуйте зображення з перевірених джерел. Публічні сховища, такі як Docker Hub, можуть містити зображення зі шкідливим програмним забезпеченням або неправильною конфігурацією.
- Включати лише необхідні компоненти. Якщо компонент не потрібен програмі, його слід видалити. Наприклад, в системах UNIX часто є вбудовані файли “awk” та “sed”.
- Включати програму в образ контейнера. Образ контейнера містить частину операційної системи та запущений додаток. Кожен інструмент та бібліотека, додані в контейнер, є потенційною загрозою. Для зменшення ризиків, додавайте в образ контейнера лише потрібну програму, використовуючи статично скомпільований двійковий файл з усіма необхідними залежностями.
Автоматизація сканування на вразливість і керування
Регулярне сканування на вразливості та керування контейнерами та хостами допомагає виявляти вразливості на будь-якому етапі життєвого циклу програми.
З цією метою, використовуйте сканування коду для виявлення помилок та статичне тестування безпеки програми (SAST) для пошуку вразливостей у коді. Аналіз складу програмного забезпечення (SCA) надає інформацію про компоненти з відкритим кодом, дозволяючи порівняти їх зі задокументованими вразливостями.
Сканування зображень аналізує їхній вміст та процес створення на наявність вразливостей. За допомогою інструментів, таких як Clair, можна сканувати відомі вразливості. Також використовуйте динамічне тестування безпеки (DAST), яке виявляє ризики безпеки на основі поведінки контейнера. Інструменти DAST можуть також проводити сканування хоста, перевіряючи компоненти хоста (ядро та ОС) на неправильну конфігурацію.
Хоча ці заходи застосовуються під час життєвого циклу контейнера, корисно застосовувати філософію «зрушення вліво», що означає впровадження безпеки на ранніх етапах розробки. Одним з корисних інструментів для цього підходу є Trivy.
Захист реєстрів контейнерів
Реєстри контейнерів є зручним способом зберігання та розповсюдження зображень. Часто організації мають тисячі зображень, що зберігаються в публічних або приватних реєстрах. Щоб переконатися, що всі члени команди та співавтори використовують безпечні зображення, необхідно:
Впровадити контроль доступу користувачів (для приватних реєстрів). Це дозволить визначити, хто має право публікувати та мати доступ до зображень. Це є базовим заходом безпеки, що запобігає несанкціонованій публікації, зміні або видаленню зображень.
Також слід підписувати зображення, що прив’язує їх до автора, ускладнюючи заміну скомпрометованих зображень. Для додавання цифрових підписів можна скористатись методами Docker Content Trust. І, звичайно, пам’ятайте про постійне сканування зображень для виявлення будь-яких критичних вразливостей.
Моніторинг контейнерів
Для оптимізації видимості робочих навантажень контейнерів можна використовувати інструменти спостереження. Ці інструменти повинні мати можливість відстежувати та перевіряти вразливості у всіх компонентах і забезпечувати реєстрацію подій у реальному часі.
Інструменти моніторингу виявляють загрози, аналізуючи показники та журнали з усіх компонентів стеку контейнерів на наявність аномалій. Завдяки цьому можна оперативно виправляти виявлені помилки конфігурації.
Для збору показників використання ресурсів можна використовувати такі інструменти, як cAdvisor або kube-state-metrics. Для моніторингу активності контейнерів та продуктивності кластерів можна використовувати Grafana або Prometheus.
Для аналізу мережевого трафіку між контейнерами – Wireshark або tcpdump. Якщо ви використовуєте керовану службу Kubernetes, наприклад (AKS), то для відстеження ресурсів та загроз безпеці можна використовувати Azure Monitor.
Також, Azure Log Analytics дозволяє збирати та аналізувати ресурси AKS. Якщо ви використовуєте Amazon EKS, Amazon CloudTrail стане в нагоді для реєстрації подій, а Amazon CloudWatch для моніторингу.
Впровадження безпеки мережі
Заходи контролю безпеки мережі допоможуть захистити контейнери від несанкціонованого доступу. Одним з основних підходів є сегментація мережі, яка ізолює контейнери, обмежуючи їхній доступ лише до необхідних служб.
Якщо ви використовуєте контейнерні програми на Kubernetes, можна налаштувати мережеві політики K8s для керування вхідним та вихідним трафіком модулів у кластерах. Це дозволяє обмежити трафік до певних пакетів на основі міток.
Для забезпечення безпеки з’єднання між модулями можна використовувати протокол TLS. Для захищеного зв’язку між сервером API та іншими компонентами можна обрати TLS або протокол SSL. Балансувальники навантаження будуть корисними для обмеження вхідного трафіку до ваших кластерів.
Для кластерів з мікросервісами, для забезпечення безпечного трафіку можна використовувати такі інструменти як Meshery або Linkerd. І, звісно, не забувайте про захист мережі, особливо, якщо ви користуєтесь хмарним провайдером.
Якщо ви використовуєте Azure Kubernetes Service (AKS), застосовуйте групи безпеки мережі (NSG) для управління трафіком. У випадку з Amazon Elastic Kubernetes Service (EKS), оптимальним рішенням буде використання груп безпеки Amazon virtual private cloud (VPC).
Зменшення поверхневих атак
Мінімізація поверхні атаки має дві важливі переваги: збільшує швидкість обслуговування та знижує ризики порушення безпеки.
Використовуючи багатоетапну збірку, можна створювати легкі зображення з невеликою поверхнею атаки та покращеним часом завантаження та продуктивністю. Для цього є декілька рішень. Для Linux можна використовувати Alpine Linux, BusyBox або Tiny Core Linux.
Для Ubuntu – Ubuntu Minimal. Також можна використовувати Scratch – спеціальний образ Docker, щоб створити мінімалістичні зображення з нуля.
Обмеження привілеїв контейнера
Тут застосовується принцип надання мінімальних необхідних дозволів для виконання конкретного завдання. Запуск контейнерів від імені root надає користувачеві багато привілеїв, таких як встановлення пакетів або права на читання та запис в операційній системі.
Ризик полягає в тому, що зловмисники можуть скористатися підвищенням привілеїв для середовища виконання, якщо контейнер буде зламано. Для запобігання цьому можна запускати контейнери в режимі rootless, або обмежити можливості ядра LINUX тими, які дійсно потрібні для робочого навантаження контейнера.
Безпечне керування секретами
Конфігураційні файли контейнера та докера не повинні містити секрети, таких як сертифікати, паролі, ключі API та токени. Хоча це є основою безпеки, часто можна зустріти жорстко закодовані секрети в процесі збірки або в образах вихідного коду.
У таких випадках конфіденційні дані потрапляють в контейнери та кешуються на проміжних рівнях, навіть після видалення контейнерів. Щоб уникнути цього, краще використовувати рішення для управління секретами, такі як AWS Secrets Manager і Vault.
Розширення можливостей вашої команди
Навчання команди щодо найкращих практик безпеки – це не менш важливий захід. Важливо, щоб кожен член команди міг ідентифікувати загрози безпеці та реагувати на них.
Для цього додайте навчання з безпеки контейнерів до процесу адаптації команди. Забезпечте практичне навчання, постійне навчання та регулярні оцінки безпеки, щоб ваша команда DevOps завжди була в курсі актуальних тенденцій безпеки.
Заключні думки
Безпека контейнерів є невід’ємною частиною процесу розробки програмного забезпечення. Найкращий підхід полягає в інтеграції безпеки від початку написання коду до середовища виконання контейнера, операційної системи хоста та мережевої інфраструктури.
Для цього необхідно розробити стратегічний план, що включатиме перевірку контейнерів, використання тільки перевірених джерел, посилення контейнерів для мінімізації непотрібних сервісів та використання інструментів моніторингу для реєстрації подій.
Завжди підписуйте свої зображення для перевірки даних, що передаються через ваші сервіси. Проводьте регулярне сканування та тести на проникнення для виявлення вразливостей та оперативно вживайте заходів для їхнього виправлення. І пам’ятайте, що з розвитком технологій, необхідно постійно оновлювати свої знання про останні методи безпеки.
Наступним кроком буде вивчення способів автоматизації захисту.