Pull to refresh

Comments 20

Все очень правильно написано. Но меня каждый раз передергивает от необходимости фиксировать все версии зависимостей.


RUN apt-get install cowsay=3.03+dfsg1-6

А если пакетов 10, 20, 100? Выглядит так, что на самом деле нужна некая обвязка, которая по условному докерфайлу, который идет с незафиксированными зависимостями и мы его принимаем как "есть", будет генерировать уже полноценный Dockerfile со всеми прописанными зависимостями. Но ни коммерческих решений, ни опенсурсных для этого я не видел. А разработчик… а разработчик чокнется прописывать эти 10, 20, 100 зависимостей на каждый чих… Это, на мой взгляд, вполне автоматизируется и должно быть автоматизировано.

Хотелось бы видить в статье опрос по этому поводу. Кто так делает? Кто понимает что так надо, но всё равно не делает, т.к это постоянно нужно обновлять.
Хорошо тем кто на Go пишет — cобирай FROM scratch и все)

А с node хоть сколько в apt версии пакетов указывай, при yarn install приедет два чемодана node_modules и что там в них никто не знает
На opennet как раз сегодня новость:
Попытки зафиксировать версии пакетов в дистрибутиве приводят лишь на нарастанию устаревших версий в репозитории, не обновляемых годами. Прекращение сопровождения пакета негативно отражается на множестве других пакетов и приводит к ещё большим проблемам. Кроме того, перекрёстные зависимости приводят к тому, что многие библиотеки Node.js становится невозможно деинсталлировать из системы, что, в свою очередь, не позволяет деинсталлировать и другие программы на Node.j

Версии фиксятся в апп а не в либах, если не фиксить версии в апп, то она в самый неудобный момент может сдохнуть.

scratch запускает процессы под root'ом, нужно об этом понить

Некоторые моменты спорны
Использование apt-get upgrade, yum update может привести к тому, что внутри вашего контейнера будет произведена установка неизвестного вам ранее ПО, либо ПО уязвимой версии.
Обычно это рекомендуется делать, чтобы обновить «системные компоненты» Docker образа: kernel, glibc (если он есть) etc. Потому что со времени выпуска образа контейнера могут выйти обновления фиксирующие баги или улучшающие функционал. С другой стороны: установка неизвестного вам ранее ПО — это вообще из ряда вон выходящее. Откуда оно у вас там взялось? Вот пример Dockerfile:
RUN dnf update -y; \
    dnf install -y \
    wget \
    yarn \
    unzip; \
    dnf clean all;

Как сюда может затесаться неизвестное вам ранее ПО и тем более не безопасное? Обновление выполняется с официального репозитория.

Использование curl и wget без мер предосторожности позволяет злоумышленнику выполнять скачивание нежелательных компонентов с неизвестных ресурсов (атака «человек-посередине», при которой злоумышленник может перехватить незащищенный трафик и подменить скачиваемый нами пакет на зловредный).
Тут что-то всего до кучи: MITM и скачивание нежелательных компонентов с неизвестных ресурсов. Чтобы выполнить атаку «Человек посередине» надо хорошо постараться. Как-то оказаться посередине, произвести подмену во время скачивания. Хлопотно это. Куда чаще мелькают новости, что в известных репозиториях обнаруживается подмена оригинальных пакетов на сторонние, либо у известных пакетов обнаруживается странные незаявленные возможности. Это всё куда клоню? Доверяй, но проверяй. И тестируй собранные образы.

Теперь немного не по теме.
Секреты могут по ошибке помещаться в качестве параметра инструкции ENV или передаваться внутрь образа как текстовый файл.
С этим уже надо постараться, чтобы оно оказалось по ошибке в Dockerfile.

В случае, если злоумышленнику удастся заполучить shell внутри вашего контейнера, он может оказаться root'ом, что сильно упростит дальнейшую атаку с выходом за пределы контейнера.
В большинстве случаев не требуется выход за пределы окружения контейнера (чтобы не светиться) и повышение привилегий тоже. Если основное приложение работает от непривилегированного пользователя, то и неосновное тоже будет работать.
RUN dnf update -y; \
dnf install -y \
wget \
yarn \
unzip; \
dnf clean all;

легко. Вы не контролируете, что там в манифесте НОВОЙ ВЕРСИИ пакета, который придет. Там запросто может быть новая зависимость (новый пакет). И я уже писал, что новая версия пакетов wget/yarn/unzip в общем случае может притянуть что-то еще.


Обычно это рекомендуется делать, чтобы обновить «системные компоненты» Docker образа: kernel, glibc (если он есть) etc

лучшая рекомендация — собрать новый базовый образ с новыми запаренными "системными компонентами". И уже из него собирать новый прикладной образ.


Чтобы выполнить атаку «Человек посередине» надо хорошо постараться

не нужно стараться. Любой мобильный провайдер делает перехват HTTP. Я был очень удивлен, когда на Мегафоне вместо скачивания пакета с дебиан оф репо подсовывается что угодно, кроме исходного файла.


Доверяй, но проверяй. И тестируй собранные образы.

это никуда не девается )


В большинстве случаев не требуется выход за пределы окружения контейнера (чтобы не светиться) и повышение привилегий тоже. Если основное приложение работает от непривилегированного пользователя, то и неосновное тоже будет работать.

Злоумышленнику же хочется запустить там Майнер. Или в соседние поды (если речь про кубер) сходить. Все равно будет щупать на предмет «сходить и повысить себе привилегии», а не тихонько сидеть у себя в уголке )

легко. Вы не контролируете, что там в манифесте НОВОЙ ВЕРСИИ пакета, который придет. Там запросто может быть новая зависимость (новый пакет). И я уже писал, что новая версия пакетов wget/yarn/unzip в общем случае может притянуть что-то еще.
точно так же как и не контролируете что в самом wget. С таким подходом можно дойти до абсурда. Или вы серьезно считаете, что ментейнеры дистрибутива (Debian/Ubuntu/RHEL) не заметят какой то левой зависимости?

не нужно стараться. Любой мобильный провайдер делает перехват HTTP.
что мешает использовать https?
что мешает использовать https?

никто не мешает ) пользуйтесь — я разрешаю. А вообще смысла особо для репозиториев RPM/DEB в https нет — там все подписано ключами GPG. Проблема в первую очередь с curl | sh, ну, и потенциальной доступностью репы в целом.


точно так же как и не контролируете что в самом wget. С таким подходом можно дойти до абсурда.

нет, но мне это и не нужно. Мне нужна конкретная версия wget.


Или вы серьезно считаете, что ментейнеры дистрибутива (Debian/Ubuntu/RHEL) не заметят какой то левой зависимости?

не "левой", а нежелательной для меня.

Проблема в первую очередь с curl | sh, ну, и потенциальной доступностью репы в целом.
ну если вы запускаете curl | sh, то ССЗБ. О какой безопасности мы тогда вообще говорим ))

не «левой», а нежелательной для меня.
есть конкретные примеры? Когда при обновлении прилетали «нежелательные» зависимости и именно из-за них возникали уязвимости/риски?
ну если вы запускаете curl | sh, то ССЗБ. О какой безопасности мы тогда вообще говорим ))

По первому в статье есть солюшен, как можно сделать, без организации своего «доверенного» репо:


RUN curl -sSL -o redis.tar.gz \
http://download.redis.io/releases/redis-3.0.1.tar.gz \
&& echo "0e21be5d7c5e6ab6adcbed257619897db59be9e1ded7ef6fd1582d0cdb5e5bb7 \
*redis.tar.gz" | sha256sum -c -```
Любой мобильный провайдер делает перехват HTTP. Я был очень удивлен, когда на Мегафоне вместо скачивания пакета с дебиан оф репо подсовывается что угодно, кроме исходного файла.

Чтоа? А вы не разбирались с Мегафоном почему оно так?

А чего разбираться? Оно и так понятно — подпихивают свою рекламу, куда могут. Насколько это законно я не вдавался в детали.

Спасибо огромное за статью. Было очень интересно!

Лучшая практика — это не использовать Dockerfile, я как-то n лет назад повелся на уговоры смузи-хипстеров и пробовал все перевести с LXC на докер, так замучился писать эти Dockerfile, там целые косяки подводных камней плавают, каждый раз выясняются какие-то нюансы, о которых к тому же с документации не узнать, это еще не говоря о баганутости самого докера, в итоге быстро послал его, сижу на LXC уже наверное более пяти лет и горя не знаю
LXC слишком новое и хипстерское. Нужно OpenVZ.
yum update может привести к тому, что внутри вашего контейнера будет произведена установка неизвестного вам ранее ПО
можно примеры в студию в контексте RHEL? У меня за 15 лет использования, что то ничего неизвестного не устанавливалось при yum update

либо ПО уязвимой версии.
как раз отсутствие yum update скорее приведет к ситуации с дырявым ПО. Или вы предлагаете смотреть changelog на все установленные пакеты?
$ docker run -it --rm centos:7 rpm -qa | wc -l
147
Или вы предлагаете смотреть changelog на все установленные пакеты?

честно — да, это трудоемко. Но оголтелый update (смотрим в общем, не только на RHEL, а вообще) может сделать по очевидным соображениям хуже, чем есть сейчас.
Я уж не говорю о том, что RHEL (именно RHEL) внутри контейнеров очень редко используют — все больше alpine/ubuntu/centos...

Sign up to leave a comment.