LINUX.ORG.RU
решено ФорумAdmin

sudo без пароля в docker

 , ,


0

2

Кхм, и снова здравствуйте, всем, кто остался на полуЛОРе.

Вопрос по сабжу.

Если кратко, то у при логине ssh обычный юзер может использовать sudo без пароля, а при docker exec - нет. Хотя, казалось бы, что условия аналогичны.

Почему так?

Более подробно написал тут.

Специально для тех, кто не ленится ходить по ссылкам.



Последнее исправление: Twissell (всего исправлений: 2)

Ответ на: комментарий от medoed

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

Twissell
() автор топика
Ответ на: комментарий от Twissell

Eще раз перечитал stackoverflow. В общем, чел там тебе все правильно написал.

Это какое-то учебное задание или реальная задача? Просто, если нужно изолированное окружение, куда люди будут удаленно заходить лучше использовать виртуалки или LXC/LXD.

medoed
()
Ответ на: комментарий от medoed

Реальная задача.

Решение непринципиально, как таковое. Главное, мне объяснить почему это невозможно в рамках архитектуры докера.

Суть в том, что контейнеры запускаются от обычного юзера.

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

Вот.

Twissell
() автор топика

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

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Согласен, НО, если ты читал выше с тем, что придётся выкинуть я уже смирился и осознал. Но не понял почему, где ограничение?

Именно поэтому появился данный топик.

Twissell
() автор топика
Ответ на: комментарий от Twissell

Контейнер (то бишь его корневой процесс) запускается у тебя от рута. Это ты «заходишь» в него (то бишь запускаешь в нём дополнительный процесс в интерактивном режиме) от обычного юзера.

Ну и да:

  1. так верстают только мудаки Dockerfile написан максимально кривожопно, 18 слоёв, 11 вызовов пакетного менеджера. ЗОЧЕМ? http://ix.io/4aLG
  2. ты модифицируешь sshd_config при сборке контейнера, а потом монтируешь sshd_config при запуске. Определись.
  3. УМВР, проблема неясна.
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от kindof
$ podman run -it --rm alpine:latest
/ # apk add openssh sudo
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/community/x86_64/APKINDEX.tar.gz
(1/11) Installing openssh-keygen (9.0_p1-r2)
(2/11) Installing ncurses-terminfo-base (6.3_p20220521-r0)
(3/11) Installing ncurses-libs (6.3_p20220521-r0)
(4/11) Installing libedit (20210910.3.1-r0)
(5/11) Installing openssh-client-common (9.0_p1-r2)
(6/11) Installing openssh-client-default (9.0_p1-r2)
(7/11) Installing openssh-sftp-server (9.0_p1-r2)
(8/11) Installing openssh-server-common (9.0_p1-r2)
(9/11) Installing openssh-server (9.0_p1-r2)
(10/11) Installing openssh (9.0_p1-r2)
(11/11) Installing sudo (1.9.10-r0)
Executing busybox-1.35.0-r17.trigger
OK: 14 MiB in 25 packages
/ # find /etc/pam.d
find: /etc/pam.d: No such file or directory
/ #
intelfx ★★★★★
()
Ответ на: комментарий от intelfx
  1. Спасибо за замечание, ну кхм, у нас «синьор-программист» пытается пихать докер во все поля, как волшебную пилюлю, кхм… кросплатформенности (да можно гонять на arm64 докер контейнеры имиджи собранные на amd64)… мне дальше продолжать или ты сам все понял? ))

  2. Так сложилось исторически, но ты прав. См. №1

  3. Значит и у меня заработает. ЛОРчик все еще вдохновляет, иногда.

Twissell
() автор топика
Ответ на: комментарий от Twissell
$ podman build . -t lor-$(date -Idate)
STEP 1/8: FROM alpine:latest
STEP 2/8: RUN :         && apk update         && apk add --no-cache             php8             php8-common             php8-fpm             php8-pdo             php8-opcache             php8-zip             php8-phar             php8-iconv             php8-cli             php8-curl             php8-openssl             php8-mbstring             php8-tokenizer             php8-fileinfo             php8-json             php8-xml             php8-xmlwriter             php8-xmlreader             php8-simplexml             php8-dom             php8-pdo_mysql             php8-pdo_sqlite             php8-tokenizer             php8-pecl-redis             php8-pdo_pgsql             php8-gd             openssh             sudo             bash             nano             nodejs npm             gmp gmp-dev             git htop             mc nano             acl screen         && :
--> Using cache 340281ca481d65631d9b09c8277ee510757aba4aafd301c0272e2ab4e21d30f4
--> 340281ca481
STEP 3/8: COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
--> Using cache c8d11938c5df848cc425f9ef3b4b2053a6052d09202017dcc8a2539703180fff
--> c8d11938c5d
STEP 4/8: RUN :         && {             echo 'PasswordAuthentication yes';             echo 'Port 8031';             } >> /etc/ssh/sshd_config         && adduser -h /home/userdev -s /bin/sh -D userdev         && echo '%wheel ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/wheel         && adduser userdev wheel         && echo -n 'userdev:mypassword' | chpasswd         && mkdir -pv /var/www/html         && setfacl -R -m u:userdev:rwX /var/www/html         && :
--> Using cache 8299e27fc1fdceca4f47079e042ff3a5e65da7fbed6ebb738cf9760b6e1b469f
--> 8299e27fc1f
STEP 5/8: COPY .screenrc /home/userdev/
--> Using cache 9181093d091a89f138e7929b31df225d424e48a7a05c8dbbbb76a2743a8927fe
--> 9181093d091
STEP 6/8: COPY entrypoint.sh /
--> Using cache 0af393b7a6c672dddd07dc14dc70f127f086d2ab09cb7553a96147847b13bbbd
--> 0af393b7a6c
STEP 7/8: ENTRYPOINT ["/entrypoint.sh"]
--> Using cache 9fa3989db4cb0b50fb9d76ad9357727bbb018481ad539e88d121b5a37db7f153
--> 9fa3989db4c
STEP 8/8: EXPOSE 8031
--> Using cache 31aed97c333cb108954af8d7abcbb77e9babe1a2dcc9d7c974019b264b9daabe
COMMIT lor-2022-09-17
--> 31aed97c333
Successfully tagged localhost/lor-2022-09-17:latest
31aed97c333cb108954af8d7abcbb77e9babe1a2dcc9d7c974019b264b9daabe

$ podman run --rm --detach --name lor -p 8031:8031 lor-2022-09-17:latest
428c4cd284d45cc49fdf1aa33dba250d4b624e9180b1310be9b73c6f5b19788e

$ ssh userdev@localhost -p 8031 'id; sudo id'
Warning: Permanently added '[localhost]:8031' (ED25519) to the list of known hosts.
userdev@localhost's password:
uid=1000(userdev) gid=1000(userdev) groups=10(wheel),1000(userdev)
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)

$ podman exec -it -u userdev:userdev lor sh -c 'id; sudo id'
uid=1000(userdev) gid=1000(userdev)
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Спасибо за зацепки на SO, я бы это объяснял долго и нудно)

Тут еще есть такой момент, что рулится все это через docker-compose а конфигурация вида

services:
    my_api:
        user: "www-data:www-data"

Несмотря на то, что юзер www-data тоже в группе wheel при docker exec и sudo от имени веб-юзера все равно запрашивается пароль.

Twissell
() автор топика
Ответ на: комментарий от Twissell

кросплатформенности (да можно гонять на arm64 докер контейнеры имиджи собранные на amd64)

Это как? Кмк, вы или не поняли своего синьора или одно из двух - на x86_64 вы собираете образ для arm64? Так это нормально.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от Twissell

Главное, мне объяснить почему это невозможно в рамках архитектуры докера.

Возможно, но нельзя так делать. Контейнер докера должен содержать один процесс. Изредка добавляют что-то вспомогательное, но это НЕ хост. Логи вытягиваются наружу, метрики вытягиваются наружу

На него не нужно заходить по ssh, для этого есть docker exec и kubectl exec. Контейнер - это вообще короткоживущий расходник, запускается и удаляется в процессе деплоя

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

router ★★★★★
()
Ответ на: комментарий от Twissell

Я не знаю про синьора-программиста, но то, что написано на StackOverflow - это какая-то каша, явно получившаяся из-за полного непонимания, что такое докер, и как его надо использовать.

Разработка в докере не подразумевает, что в нем запускается ssh, разрабочик входит в контейнер по ssh, и делает там свое хк-хк и в продакшн.

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

По хорошему, пишутся докерфайлы под каждый сервис. Один контейнер - один процесс! Например, nginx - один контейнер, Django/FastAPI - один контейнер. Как там оно в PHP, не знаю, но, наверное, php-fpm - отдельный контейнер.

Конфигурация docker-compose собирает вместе nginx, твой код, и всё остальное (postgres, там, rabbitmq или kafka, и т.д.).

При разработке используется override файл, который использует bind mount, чтобы прокинуть каталог с исходниками в контейнер, для того, чтобы можно было в своём редакторе/IDE менять файлы, и эти изменения сразу же появлялись в контейнере.

Как-то так, лень писать подробную понятную инструкцию, потому что это будет материал для статьи, и готовить его придётся несколько часов.

Короче, проблема у тебя не в докере, а в том, что ты его неправильно используешь.

Для того, что ты хочешь, надо использовать systemd-nspawn контейнеры или lxc/lxd.

emorozov
()
Ответ на: комментарий от router

На него не нужно заходить по ssh, для этого есть docker exec и kubectl exec. Контейнер - это вообще короткоживущий расходник, запускается и удаляется в процессе деплоя.

Знаю и согласен, НО на практике, у нас контейнеры могут находится на разных VPS и обычный разраб с правами на php и npm (читай веб-макака) должен в него попасть без docker exec.

В качестве возможного решения я попробовал ssh на разных портах (для каждого компонента системы), но вылез сабж)

Twissell
() автор топика
Ответ на: комментарий от emorozov

Короче, проблема у тебя не в докере, а в том, что ты его неправильно используешь.

Нет, проблема именно в докере. Его вообще никак не надо использовать. Так называемая «идеология докера» изначально дефективна и представляет из себя кашу из костылей.

lxc

Это получше.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от vvn_black

Нет, именно, что собираем arm64 на arm64, офтопик, да.

Хотя главную ошибку, что докер используется как ВМ это не устраняет… и да… я, скорей всего, буду оттудова валить, но спросить было интересно.

Twissell
() автор топика
Ответ на: комментарий от Twissell

на практике, у нас контейнеры могут находится на разных VPS и обычный разраб с правами на php и npm (читай веб-макака) должен в него попасть без docker exec.

И это, как ни странно, снова дерьмовая практика. «Обычный разраб» должен смотреть в Git-репозиторий и работать через CI, а не ковыряться руками в рабочем окружении.

intelfx ★★★★★
()
Ответ на: комментарий от Twissell

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

Да он при любом подходе не должен ходить в них.

С самого начала видно, что есть конкретное непонимание того, как ведется разработка с использованием контейнеров. При этом, я знаю, что несмотря на то, что Docker уже около 10 лет, по нему до сих пор мало написано толковых статей, чтобы просто прочитать одну, и сразу въехать.

Но это не значит, что надо насиловать концепцию и делать всё неправильно, т.к. это хорошего результата всё равно не даст.

На самом деле, даже если отбросить докер вообще. Разработчик не должен ходить на какие-то машины по ssh и что-то там править. Это и до докера было неверным подходом к разработке.

emorozov
()
Ответ на: комментарий от firkax

Ну, весь мир использует, и что - все ошибаются? Лично я поработов много лет задолго до появления докера, оцениваю его как шаг вперёд. По крайней мере, для разработчиков.

Потому что вот это вот всё «Установить node версии строго 10.11, ни раньше, ни позже. Если у вас Mac OS - то ни в коем случае не через brew! Если у вас Linux, поройтесь в говне мамонта и установите строго Cent OS 7 - на более новых компилироваться не будет!» уже давно набило оскомину, и вызывает в масштабах компании огромные потери времени просто на развертывание и поддержание в рабочем состоянии окружения разработчика.

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

emorozov
()
Ответ на: комментарий от intelfx

В чем причина именно моей, конкретной, проблемы я уже разобрался, теперь остался последний вопрос:

Можно ли запустить в докере sshd от обычного пользователя?

Не для прода, а для понимания :-)

Twissell
() автор топика
Ответ на: комментарий от Twissell

Прямо хороших не знаю. Сам думаю написать, но всё как-то не хватает времени и мотивации. При этом, из IT сайтов и соц. сетей я зарегистрирован только здесь, а у LOR аудитория ничтожно маленькая.

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

В общем, да, возможно лучший способ, который не первый раз слышу - сходить на cs.github.com (новый поиск GitHub) и поискать Dockerfile и docker-compose.yml.

Я сам так делал не раз. К сожалению, надо иметь в виду, что на github также встречаются и примеры плохих Dockerfile, а чтобы отличить плохой от хорошего надо уже хорошо понимать docker. Получается замкнутый круг. Но другого способа действительно нет.

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

emorozov
()
Ответ на: комментарий от emorozov

Ну, Вы не поняли)

Он не сеньор-девопс, он - пхп разраб, понахватался с других проектов, что если систему, бабло приносящую засунуть в докер, а докер засунуть в лямбду, а лямбду засунуть в Амазон… то можно нихера не делать и стричь денежные купоны.

За ответ спасибо!

Twissell
() автор топика
Ответ на: комментарий от Twissell

Придётся менять подход. Например, будет соблазн запихнуть supervisord в докер, но это будет неправильно. Каждый сервис должен быть в отдельном контейнере, docker будет выполнять роль supervisord.

Уточняю, потому что видел примеры, когда впихивали supervisord в докер, увы.

И засунуть в докер большой старый проект - это отдельная нелегкая задача. Особенно, если там не использовался 12-factor подход, например, используются файлы конфигурации вместо чтения конфигурации из окруженя.

emorozov
()
Ответ на: комментарий от emorozov

Да, Вы просто смотрите в хрустальный шар)

Но суть тут не в технологиях, а в человеческих отношениях: когда прибыль от проекта превышает некоторое пороговое психологическое значение у руководства начинается жадность + звёздная болезнь… что печально.

Называется - хачу и всё тут!!!1

Twissell
() автор топика