Если ты знаешь своих врагов и знаешь себя, ты можешь победить в сотнях сражений без единого поражения.
Китайский стратег и мыслитель Сунь-цзы
Несколько лет назад я проводил пентест (тест на проникновение), и, потратив 3 дня, я не смог найти ни одной проблемы с безопасностью.
Так как это никогда раньше не случалось, можно догадаться как я был разочарован.
Оказалось, что я не сделал двух вещей.
Во-первых, я не следовал мудрости Сунь-цзы.
«Если ты знаешь своих врагов и знаешь себя, ты можешь победить в сотнях сражений без единого поражения»
У меня были знания, но не было мудрости. Мудрость узнает о цели, прежде чем вы атакуете ее.
Следующие два дня я потратил, изучая приложения (как пользователь) и попытался снова сделать тесты на уязвимости приложения.
Угадайте, сколько проблем с безопасностью мне удалось найти? много!
Поэтому, прежде чем вы научитесь атаковать контейнеры, нужно понять несколько вещей о контейнерах.
· Что такое контейнер (Docker)?
· Зачем он нужен?
· Кто им пользуется, где и когда?
· Как Docker может сделать мою жизнь проще?
Итак, давайте копаться.
Что такое Docker?
Если вы занимаетесь информационными технологиями или технологиями в целом, вы, возможно, слышали о Docker.
Согласно Википедии
Docker — это набор продуктов «платформа как услуга» (PaaS), использующих виртуализацию на уровне ОС для доставки программного обеспечения в пакетах, называемых контейнерами.
Похоже на просмотр иностранного фильма без субтитров, правда? Позвольте мне объяснить простым языком.
Примечание: в будущем, мы будем использовать слова «контейнер» и «докер» взаимозаменяемо.
Так что же такое Docker?
Docker — это средство контейнеризации, которое помогает вам создавать, упаковывать и запускать приложения.
Проще говоря вместо того, чтобы просто упаковывать приложение, вы также упаковываете среду, необходимую для его запуска.
Так что меньше подвижных частей, меньше шансов возникновения катастрофы.
Почему вам стоит изучить Docker?
Допустим, вы разрабатываете приложение с использованием Python, где необходимо убедиться, что приложение работает не только на вашем компьютере, но и на производственной системе. Но это приложение сможет работать или нет, почему?
Потому что в производственной системе могут быть установлены разные версии Python или разные версии библиотек /модулей Python.
Здесь-то Docker и вступает в игру.
Преимущества Doker/ контейнера
Решает коллизию зависимостей
Docker решает эту проблему. С помощью Docker мы можем упаковать приложение с необходимой средой (ОС, библиотеки) и отправить приложение. Поскольку он упакован в один пакет, он не вызовет проблем с коллизией зависимостей.
Кроссплатформенность
Поскольку один и тот же образ контейнера может быть запущен на любом компьютере с Linux, Mac и Windows, Docker обеспечивает кроссплатформенную совместимость и помогает в простом запуском.
Написано один раз, а работает везде!
Теперь вы можете сказать: я не разработчик (но я занимаюсь операциями), так зачем мне нужен Docker?
Масштабируемость
С помощью Docker можно легко масштабировать инфраструктуру в соответствии с вашими потребностями. При увеличении нагрузки на серверы можно увеличить количество контейнеров Docker. Аналогичным образом, при уменьшении трафика можно уменьшить количество работающих контейнеров.
Надлежащее использование ресурсов
В отличие от виртуальных машин, нет необходимости выделять дополнительные ресурсы (например, оперативная память, ЦП и жёсткие диск) для ОС. Контейнеры используют функции ядра хоста (такие как namespace(пространства имен),cgroup (контрольная группа) и т.д.) для запуска контейнера.
Обеспечивает хорошую безопасность
Docker обеспечивает хорошие параметры безопасности по умолчанию и снижает сложность запуска приложении, что помогает уменьшить поверхность атаки Docker. По мере продвижения вперед мы будем обсуждать больше параметров безопасности.
Docker имеет множество других преимуществ, поэтому ведущие технологические компании используют /начали использовать его.
Вот некоторые из компаний, которые используют контейнерную технологию Docker:
· Uber
· Visa
· PayPal
· Shopify
· Quora
· Splunk
Ресурс: https://www.docker.com/customers
Существует множество стартапов, которые постепенно начинают использовать технологию Docker из-за вышеупомянутых преимуществ.
Поэтому, если вы хотите быть курсе последних технологий, важно знать, как работает Docker.
Контейнеры против виртуальных машин (VMs)
Давайте сравним контейнеры с виртуальными машинами, чтобы понять преимущества Docker.
В виртуализации каждая виртуальная машина имеет свою гостевую операционную систему/ ядро. Это само по себе является преимуществом, поскольку виртуальные машины независимы и изолированы от хост-системы. Однако такой подход имеет существенный недостаток - выделение дополнительной памяти и хранилища для каждой виртуальной машины.
Например, вам нужно запустить 100 виртуальных машин одновременно, каждая с 1 ГБ ОЗУ, 1 ядром ЦП и 20 гигабайтами диска.
1 ГБ * 100 = 100 ГБ
1 ядро процессора * 100 = 100 ядер процессора
20 ГБ дискового пространства * 100 = 2000 ГБ диска
Это резко увеличивает стоимость и снижает производительность всей системы (привет, шумные соседи).
Поскольку контейнерная технология использует функции ядра хоста для запуска контейнера, здесь не задействована гостевая ОС, что делает контейнеры более экономичными, быстрыми и эффективными, чем виртуальные машины, поскольку они имеют меньше уровней по сравнению с виртуальными машинами.
Таким образом, сэкономленные ресурсы можно лучше использовать для работы большего количества контейнеров.
Изображение стоит тысячи букв, давайте посмотрим на изображение, которое иллюстрирует этот аспект.
Первая половина изображения показывает, что контейнеры (арендаторы) используют то же ядро (Дом), что и владелец (Host OS).
На второй половине, виртуальные машины ( арендаторы ) не имеют общего ядра с владельцем (Host OS). Каждой виртуальной машине выделяется выделенное ядро и аппаратные ресурсы (пространство), которые не могут использоваться другими арендаторами.
Из-за уменьшения накладных расходов в стеке контейнеров, контейнеры загружаются быстрее и работают намного быстрее, чем виртуальные машины.
Одним словом, контейнерная технология имеет больше преимуществ, чем виртуализация.
Значит ли это, что технология виртуализации исчезает?
Нет, виртуализация все еще здесь. Существует множество сценариев, где виртуализация подойдем больше, чем контейнерная технология.
Подводя итог, вот простая таблица сравнения.
Виртуальные машины Контейнеры
Занимает много памяти на ЖД Занимает мало памяти на ЖД
Имеет собственную ОС Использует хост ОС
Запуск занимает несколько минут Запуск занимает несколько миллисекунд
Более безопасный Менее безопасный
Использует больше ресурсов Использует меньше ресурсов
* Злоумышленнику необходимо скомпрометировать гостевую и хост-операционную систему, чтобы получить доступ к другим виртуальным машинам, в то время как в Docker – только хост операционную систему .
Недостатки Doker/ контейнера
Люди обычно говорят о преимуществах Docker, но никто не говорит о его недостатках.
Как и любая другая технология, Docker также имеет некоторые недостатки.
Плохая поддержка ГИП
Docker не поддерживает приложения с графическим интерфейсом пользователя по умолчанию. Есть некоторые обходные пути и хаки для преодоления этой проблемы, но они являются взломами, а не функциями.
Плохая поддержка Windows
Docker отлично подходит для ОС Linux. Поддержка Windows стала улучшаться в последнее время, но она все еще далека от поддержки Linux.
Отсутствие зрелых средств для обеспечения безопасности
Отсутствие гостевой ОС в контейнере является одновременно благом и проклятием. Благо, так как это делает все быстрее и эффективнее, но и проклятие, поскольку использование док-контейнера может привести к общесистемному компромиссу. Кроме того, инструменты мониторинга безопасности для Docker не так развиты, как не контейнерные среды.
Отсутствие поддержки "голого металла"
Для работы Docker нужна хост-ОС. Он не работает на сервере «с нуля», как, например, Hypervisor типа 1.
Архитектура Docker и его компоненты
Давайте теперь разберемся с архитектурой Doker и его компонентами.
Архитектура Docker довольно проста и состоит из двух основных компонентов.
1. Docker Client (CLI) (Doker Клиент)
2. Docker Server (Daemon) (Doker Сервер)
Docker Client (CLI) - клиент Docker общается с Docker Daemon и просит его выполнить задание от его имени. Например, клиент (CLI) может запросить подробные сведения о запущенных контейнерах, а Daemon отвечает состояниями запущенных контейнеров.
Docker Server (демон) - Docker Daemon — это фоновый процесс, который управляет изображениями, контейнерами и томами Docker, как показано на рисунке ниже.
На самом деле я соврал, Docker (> 1.11) уже не так прост.
Модуль Docker состоит из множества компонентов (docker CLI, dockerd, containerd и runC).
Разве это не круто? Помимо технологического тривия, который впечатлит ваших друзей на вечеринке.
Это разделение помогает переключать часть стека с любой другой альтернативой и устраняет зависимость от одного поставщика. Например, среда выполнения runC может быть заменена на CRI-O, все еще используя dockerd и containerd из Docker.
Что это значит для меня?
Роль Docker в DevOps
Docker широко используется в Agile, непрерывной интеграции и непрерывной доставке (CI/ CD), микро сервисах и DevOps.
После того, как разработчики закончили тестировать приложение, они упаковывают его в контейнер, а затем команда Ops просто развернет контейнер.
Роль Docker в отрасли безопасности
Большинство организаций (если не все) переходят на контейнерные технологии, чтобы помочь им достичь скорости, масштабируемости и гибкости.
Очевидно, что отрасли безопасности необходимо обеспечить безопасность этих сред, поэтому растет спрос на специалистов по безопасности, которые разбираются в Docker и DevOps и т. д.
Docker широко используется для запуска инструментов безопасности в DevSecOps. В моей компании мы используем докер для запуска различных инструментов SCA, SAST, DAST и мониторинга для наших клиентов.
Докер также может помочь вам получить от нескольких сотен до нескольких тысяч снарядов в рамках пост-эксплуатации.
Заключение
Сегодня вы узнали, насколько мощные контейнеры и как можно их использовать, чтобы быстрее выходить на рынок. Используя контейнерные технологии, предприятия могут быстрее выходить на рынок, получать больше клиентов и больший доход, обеспечивать занятость большему количеству людей и создавать богатства для своих стран.
В следующий раз мы изучим технические подробности, детали Docker, такие как слои Docker, образы, контейнеры, реестр и многое другое.
С нетерпением жду встречи на следующей неделе.
С наилучшими пожеланиями и хорошего настроения.