Назад | Перейти на главную страницу

Chrome под Docker: CAP_SYS_ADMIN против привилегированных?

Я запускаю chromedriver + chrome внутри Docker в своей тестовой среде.

Все работало нормально до последнего обновления CoreOS.

Вот версии, которые кажутся работающими:

VERSION=1185.5.0
VERSION_ID=1185.5.0
BUILD_ID=2016-12-07-0937

И это более новая версия, которая заставляет хром загружать ядра:

VERSION=1235.4.0
VERSION_ID=1235.4.0
BUILD_ID=2017-01-04-0450

Глядя на изменения, кажется, что докер был обновлен с 1.11.x до 1.12.x, что сломало setns() вызов внутри контейнера. setns() используется Chrome для создания пространств имен.

Это примеры выходов:

jsosic-coreos-test-20161207 ~ # docker --version
Docker version 1.11.2, build bac3bae

Изнутри одного контейнера на этом ящике:

[root@2939f21ecfaa /]# /opt/google/chrome/google-chrome
[57:57:0107/015130:ERROR:browser_main_loop.cc(261)] Gtk: cannot open display:

Вот как это сломала новая версия:

jsosic-coreos-test-2017-01-04 ~ # docker --version
Docker version 1.12.3, build 34a2ead

[root@13ab34c36c82 /]# /opt/google/chrome/chrome
Failed to move to new namespace: PID namespaces supported,
  Network namespace supported,
  but failed: errno = Operation not permitted
Aborted (core dumped)

Я обнаружил, что если я запустил контейнер с --cap-add=SYS_ADMIN или --privileged - Chrome работает как положено.

В чем разница между этими двумя переключателями? Какие возможности включены --privileged?

И могу ли я позволить setns() внутри контейнера без ущерба для безопасности?

AFAICS, документация предлагает предоставление возможностей, необходимых для контейнера, вместо использования --privileged переключатель. Запуск в привилегированном режиме кажется, дает контейнер все возможности (какие именно они указаны в первом URL-адресе, при условии, что документы актуальны).

Короче, я бы сказал, что --cap-add=SYS_ADMIN предоставляет контейнеру меньший набор возможностей по сравнению с --privileged переключатель. В примерах в документации Docker (первый URL-адрес), похоже, предпочитают просто добавлять SYS_ADMIN или NET_ADMIN возможность там, где это необходимо.

Одно отличие состоит в том, что --privileged монтирует / dev и / sys как RW, тогда как SYS_ADMIN монтирует их как RO. Это означает, что привилегированный контейнер имеет полный доступ к устройствам в системе. SYS_ADMIN не дает вам этого.