Как Virtuozzo улучшает безопасность Docker для сервис-провайдеров
В бизнес-продразделении Odin* недавно объявили о поддержке контейнеров Docker в Virtuozzo. Эта поддержка — часть нашей стратегии по реализации Virtuozzo как инфраструктурной основы для платформ контейнерной виртуализации, наиболее подходящей для работы в средах, где главные требования — безопасность и производительность.
Стоит отметить, что такие контейнерные проекты, как Docker, иногда называют конкурентами нашим собственным разработкам. На самом деле, мы работаем на разных уровнях — Docker занимается управлением приложениями, а мы виртуализацией — в том числе и той, что используется в Docker. В результате нас нередко связывают партнерские отношения и совместная работа. Например, вместе с Docker мы разрабатываем проекты системных библиотек, предоставляющих интерфейс к ядерным контейнерным компонентам — это и начатый Docker проект Libcontainer (вместе с Canonical, Google и RedHat), и наш — libct (вместе с LXC и Google).Ниже — пример таких возможностей, которые дают совместные технологии.Поддержка Docker внутри Virtuozzo добавляет «контейнеры внутри контейнеров» в ядро Virtuozzo Linux, позволяя создавать контейнеры Docker внутри контейнеров Virtuozzo. Так появляются дополнительные пространства имен для Docker внутри виртуального контейнера Virtuozzo. Аналогичный сценарий в гипервизорах, таких как KVM, работает по умолчанию — поскольку ядро гостевой ОС и ядро сервера там разделены, пространства имен изначально не пересекаются. Теперь же появилась возможность делать то же самое, добавив преимущества контейнерной виртуализации, а именно: быстрый запуск, мгновенное масштабирование, высокую эластичность и производительность, равную производительности физического оборудования.Для сервис-провайдеров и всех остальных, кому нужен многопользовательский режим, это также означает, что контейнер Virtuozzo может устранить проблемы безопасности Docker без потерь производительности, которые дают гипервизоры. Собственные средства разграничения в Docker весьма ограничены — к примеру, как отмечено в этой статье, наличие доступа к командной строке Docker по сути означает наличие прав пользователя root на сервере.Вот пример команды позволяющей получить root:
$ docker run -v $PWD:/stuff -t my-docker-image /bin/sh -c \ 'cp /bin/sh /stuff && chown root.root /stuff/sh && chmod a+s /stuff/sh' Результатом ее выполнения будет копия shell«а в текущем каталоге, c выставленным suid битом (что позволяет запускать shell не от имени текущего пользователя, а от имени владельца файла — в данном случае root).
Очевидно, в такой конфигурации категорически нельзя размещать на одном физическом оборудовании множество потенциально враждебных пользователей, применяющих Docker. Так как они не будут изолированы с точки зрения физических ресурсов, то один пользователь сможет легко получить доступ к данным другого и уничтожить их.
Однако данная проблема легко решается, если на сервере работает Virtuozzo. Создание контейнеров Virtuozzo эффективно разделяет ресурсы сервера, делая сервер по-настоящему многопользовательским. Клиенты, изолированные друг от друга с помощью контейнеров Virtuozzo, могут использовать Docker точно так же, как и на физическом сервере, но с добавлением нового уровня изоляции и управления ресурсами (и поэтому клиенты не конкурируют друг с другом за физическую память, дисковое пространство и ресурсы процессора). В результате у каждого появляются свои собственные контейнеры Docker, а общая производительность остается такой, как если бы они были на физическом сервере.
Вот пример, почему Docker крайне удобен пользователям, которым нужно запустить приложение в облаке. Для начала попробуем запустить Docker-приложение на своем собственном ноутбуке:
$ docker run hello-world Unable to find image 'hello-world: latest' locally Pulling repository hello-world 91c95931e552: Pulling image (latest) from hello-world, endpoint: https://registr91c95931e552: Download complete a8219747be10: Download complete Status: Downloaded newer image for hello-world: latest Hello from Docker. This message shows that your installation appears to be working correctly. … Это можно делать многократно, правя код и устраняя баги (естественно, когда это не hello world, а что-нибудь более полезное) — в какой-то момент мы принимаем решение — все, готово, пора выпускать и внедрять.
Дальше делаем так:
$ export DOCKER_HOST=tcp://server:2376 DOCKER_TLS_VERIFY=1 (Предполагается, что TLS-сертификаты уже разложены и Docker настроен им доверять). Server — это адрес сервера, на котором крутится наше приложение в облаке. Запуск свежей копии приложения на нем теперь — это уже знакомое
$ docker run hello-world Готово — приложение запущено, и, что важно, — оно попало на сервер вместе с окружением и системными библиотеками, с которыми отлаживалось и тестировалось — то есть вероятность сломать его неправильными настройками почти нулевая.Являясь членом unix-группы docker внутри контейнера Virtuozzo, каждый пользователь по-прежнему будет иметь возможность повысить доступ до уровня root –, но это будет root изолированного контейнера, а не root сервера. То есть Virtuozzo-контейнер остается однопользовательским —, но на физическом сервере таких с Docker уже может быть много.Это лишь один из первых поддержанных в Virtuozzo сценариев c контейнерами приложений, который мы реализовали и о котором хотели рассказать. Будут и другие, поэтому следите за обновлениями.
* Под этим новым брендом с марта 2015 года работает бизнес-продразделение компании Parallels, отвечающее за решения для сервис-провайдеров