sudo: эффективный uid не равен 0 при работе под сервисом tomcat - PullRequest
0 голосов
/ 01 октября 2019

У меня есть небольшое веб-приложение java (grails), развернутое под tomcat 8, из которого я хотел бы выполнить скрипт на локальном сервере, используя sudo. На обычном сервере Debian / Ubuntu все, что мне нужно сделать, это использовать visudo, чтобы позволить пользователю tomcat выполнить sudo без пароля для этого конкретного сценария, и все работает как положено. Когда я пытался установить один и тот же файл war на raspberry pi (модель 3b +, raspbian 10 - buster), загружаясь с SD-карты, выполнение сценария всегда завершалось ошибкой «sudo: эффективный uid не равен 0, это / usr/ bin / sudo в файловой системе с установленной опцией 'nosuid' или в файловой системе NFS без привилегий root.

В попытке отследить эту проблему я написал еще один небольшой исполняемый файл jar, который выполняет ту же функциюфункция (т.е. пытается запустить скрипт с помощью sudo). Эта тестовая программа работает, как и ожидалось, когда вы вошли в систему в интерактивном режиме (bash) как пользователи 'pi' и 'tomcat8' (я должен был установить оболочку для пользователя tomcat8, чтобыполучить интерактивный вход в систему). Затем я использовал strace, чтобы попытаться диагностировать проблему. Все, что я мог понять, это то, что getuid () возвращает 111 (tomcat8) при попытке запустить sudo при работе в службе tomcat8, но возвращает 0при работе в bash.

я также написал небольшую программу на c, которая просто вызывает getuid () и prinрезультат. Если я запускаю его под пользователем tomcat8 в интерактивном режиме (т.е. sudo su tomcat8), он печатает «111», когда я запускаю его без sudo, и «0», когда я запускаю его с sudo. Когда я пытаюсь запустить эту программу из веб-приложения (с помощью компоновщика процессов), я получаю «111», когда команда запускается без sudo, но я получаю ошибку «эффективное имя не равно 0 ...», когда перед командой стоит префиксс sudo.

Я проверил mount, и есть несколько монтирований с атрибутом 'nosuid', но нет корневого каталога / /, где находится / usr / bin и / usr / bin /Судо, похоже, имеет правильные права доступа:

pi@raspberrypi:~/dev $ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 147560 Jan 13  2019 /usr/bin/sudo

В отчаянии я попробовал несколько других вещей, чтобы просто посмотреть, какой эффект они могут иметь: * Добавил пользователя tomcat8 в adm, sudo и другие группы * Попыткаперемонтировать другие крепления без атрибута nosuid, хотя я не смог перемонтировать их примерно на 6 или около того, потому что крепления используются там.

Ни один из них, похоже, не имел никакого эффекта.

Так чтоМне кажется, что пользователь tomcat8 может использовать sudo в bash, но не при работе в качестве демона. Кто-нибудь может дать мне несколько идей относительно того, что здесь происходит? Есть ли способ диагностировать или отслеживать, как эффективный uid определяется ОС?

Другие вещи, которые могут быть важны: я установил openjdk-8-jdk и tomcat8 через apt, и хотя raspbian использует systemd,Tomcat8 запускается через скрипт init.d. Не уверен, что это вызывает проблемы с UID.

Если на SD-карте есть некоторые монтирования с атрибутом nosuid, вызывающие проблему, то почему не происходит сбой при интерактивном запуске?

1 Ответ

0 голосов
/ 02 октября 2019

Оказалось, что проблема была в том, как запускается демон, возможно, из-за изменений в том, как Debian 10 запускает процессы демона. Я удалил сценарий tomcat init.d, заменил его на системный файл systemd и включил следующие свойства:

[Service]
...
NoNewPrivileges=false
AmbientCapabilities=CAP_SETGID CAP_SETUID
SecureBits=keep-caps

Это позволяет демону фактически успешно вызывать setUid (0).

...