Виртуальная машина или контейнер – что безопаснее?
К настоящему времени специалисты по безопасности знакомы с технологией виртуализации очень хорошо, учитывая объемы ее внедрения как в центрах обработки данных, так и в облаке - использование виртуализации распространено практически повсеместно. Системные администраторы в своих организациях все чаще сталкиваются с технологиями контейнеризации приложений, которые включают Docker, rkt и связанные с ними технологии управления и автоматизации, такие как Kubernetes, которые окружают их и помогают в вопросах масштабирования.
Практики обязаны принимать решения о технологическом риске, и многие из этих решений включают необходимость оценки одной или обеих технологий: виртуализации и контейнеризации. При сравнении виртуальных машин и контейнеров возникает закономерный вопрос, что из них является более безопасным?
Эти инструменты не эквивалентны, поэтому прямое и буквальное сравнение их безопасности попросту невозможно. Для обеспечения безопасности каждой из этих технологий требуется свой набор инструментов, понимание совершенно разных моделей безопасности и знание совершенно различных экосистем управления. Кроме того, степень безопасности будет также зависеть от конкретного случая применения технологии.
Вместо этого требуется выяснить следующие важные вопросы: какие свойства безопасности есть у каждой из этих технологий и как они используются для достижения целей безопасности? Некоторое объяснение - и более глубокое погружение в тему - может помочь практикующим специалистам сделать собственные выводы о том, как эти инструменты вписываются в профиль риска их организации.
Безопасность виртуализации ОС
В рамках виртуальных центров обработки данных, гибридных облаков и IaaS большинство специалистов по технологиям и безопасности имеют опыт виртуализации ОС. Ключевой особенностью виртуализации ОС является четкая граница сегментации - как между виртуальными хостами, так и между любым конкретным виртуальным хостом и гипервизором. Атаки на сегментацию могут происходить, как показывают многочисленные уязвимости: доказательством могут служить Rowhammers, спекулятивные уязвимости исполнения, такие как Spectre или Meltdown, и случайная ошибка, специфичная для гипервизора. Тем не менее, сегментарные атаки в «естественной среде» встречаются редко, а уязвимости сложно использовать.
Виртуализация ОС помогает в ситуациях, когда важна сильная граница сегментации; например, если группы безопасности не контролируют всю среду, как в многопользовательской облачной среде. Она также может быть полезна, когда командам необходимо быстро вносить изменения в базовую конфигурацию сети в форме микросегментации на сетевом уровне и когда они хотят перенести физическое устройство в виртуальную среду.
Существуют в данном случае некоторые потенциальные недостатки безопасности. Так, могут возникать проблемы управления, особенно в процессе масштабирования. Головной боли могут добавить такие проблемы как нежелательное распространение образов и разрастание устаревших образов в сериализованной форме на диске. Система управления вирутализацией может уменьшить последствия этих проблем, но не может полностью смягчить их.
Простота, с которой разработчики и инженеры могут виртуализировать и мигрировать существующие физические устройства, сводится к двум путям: простая миграция этих устройств на гипервизор потенциально может повысить их безопасность в процессе, но в плохо управляемой среде те же устройства могут преобразовываться в проблемно настроенные хосты, которые вызываются в неожиданных местах и в неожиданное время в данной экосистеме. Со временем артефакты могут собираться на виртуальных образах даже в очень дисциплинированной среде; причиной чего могут быть устаревшие операционные системы, устаревшее промежуточное ПО или старые библиотеки программного обеспечения.
Безопасность контейнеров
Контейнеры приложений, напротив, имеют разные свойства, некоторые из которых укрепляют безопасность, а некоторые – в зависимости от особенностей применения – могут подорвать ее. Ключевым свойством контейнеров является более «пористая» граница сегментации относительно виртуализации ОС.
В контексте виртуализации сегментация обеспечивается гипервизором ниже уровня гостевой ОС. Сегментация, используемая контейнерным движком, работает по-другому. Контейнеры работают в том же экземпляре ОС, что и механизм контейнера; они также работают в той же ОС, что и другие контейнеры. Это верно, даже учитывая, что контейнеры не могут нормально взаимодействовать друг с другом или с механизмом контейнера.
Контейнеры используют функции операционной системы для создания логических сред, в которых представления процессов, файлов и состояния сети невидимы друг для друга. Это достигается через пространства имен. Ресурсы ограничены, и их использование в этих средах контролируется. Однако не все в мире Linux входит пространство имен - дата и время являются заметными исключениями. Например, если специалисты безопасности отключили средства защиты по умолчанию, которые не позволяли контейнеру изменять время в большинстве механизмов контейнеров, это позволило бы контейнеру изменять время на всем хосте, включая другие контейнеры. Аналогичным образом, артефакты ОС работают так же, как и всегда - например, рутовый пользователь по-прежнему является рутовым пользователем.
Сегментация потенциально ограничивает применимость технологии в некоторых ситуациях. Например, ответственный за безопасность может принять решение против применения приложения с высоким уровнем безопасности в ситуации с несколькими арендаторами.
Тем не менее, у контейнеров есть и потенциальные преимущества безопасности в зависимости от того, что вы пытаетесь сделать - как и в случае с виртуализацией ОС, здесь есть как плюсы, так и минусы.
Использование контейнеров способствует формированию менталитета уничтожения старых контейнеров и их последующей передислокации, они не используются достаточно долго. В мире виртуализации ОС экземпляры могут жить достаточно длительное время, чтобы устареть: сбор файлов резервных копий, устаревшие программные артефакты и настройки - вот лишь несколько примеров.
Напротив, контейнер почти наверняка будет снесен и перестроен при необходимости внесения изменений. Это обеспечивает преимущество с точки зрения безопасности. Помимо этого, не стоит недооценивать значение безопасности, которое можно реализовать, благодаря возможности компонентизации компонент приложения или службы, которые в противном случае находились бы на одном виртуальном или физическом устройстве. Это повышает ценность более широкой, защищенной модели развертывания на основе микросервисов.
Суть в том, что сравнивать виртуальные машины с контейнерами и спрашивать «что безопаснее» - это все равно, что спрашивать «что полезнее: молоток или банан?». Ответ полностью зависит от контекста использования. Банан хорош для завтрака, но не пытайтесь забить им гвоздь.