Як дозволити користувачеві зберігати довкілля за допомогою sudo?


17

Я зіткнувся з наступною помилкою, намагаючись дозволити деяким змінним середовища перейти до нового середовища під час запуску sudo:

sudo: sorry, you are not allowed to preserve the environment

Деякі відомості, які можуть бути корисними для налагодження:

[deploy@worker1 ~]$ sudo -l
    Matching Defaults entries for deploy on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, env_keep+="GIT_WORK_TREE GIT_DIR", !requiretty

User deploy may run the following commands on this host:
    (ALL) NOPASSWD: /usr/bin/git, (ALL) /etc/init.d/httpd*, (ALL) /sbin/service, (ALL) /usr/bin/make, (ALL) /bin/echo

Мій приклад запуску:

[deploy@worker1 ~]$ export GIT_DIR="/home/ashinn/testing"
[deploy@worker1 ~]$ sudo -E sh -c 'echo "$GIT_DIR"'
sudo: sorry, you are not allowed to preserve the environment

Мій файл sudoers.d для цієї конкретної конфігурації:

Defaults:deploy         env_keep += "GIT_WORK_TREE GIT_DIR", !requiretty
deploy  ALL=(ALL)       NOPASSWD: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Я також спробував додати !env_resetдо значень за замовчуванням, і він все ще не працює з тією ж помилкою. Я відчуваю, що мені може бути пропущено щось очевидне і мені потрібен другий набір очей. Що я тут пропускаю?


1
Я вважаю, що приблизно 93% з нас розуміють суть вашого питання, але ваша команда прикладу не дуже хороша.  , якщо воно не виходить прямо, відобразить попереднє значення , оскільки оболонка розширює змінну в командному рядку, перш ніж навіть буде викликана. Кращі тести або або , де ми на самому ділі , дивлячись на навколишнє середовище процесу , який працює привілейованими. sudo (option(s)) echo $GIT_DIRsudo$GIT_DIRsudosudo printenv GIT_DIRsudo env | grep GIT_DIRsudo sh -c 'echo "$GIT_DIR"'
G-Man каже: "Відновіть Моніку"

Відповіді:


27

Ви можете використовувати SETENV"Тег" у своєму sudoersфайлі, як у:

deploy  ALL=(ALL)       SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Або поєднувати його з NOPASSWD:

deploy  ALL=(ALL)       NOPASSWD:SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Відповідна уривка чоловіка-судора:

SETENV і NOSETENV

Ці теги замінюють значення параметра setenv на основі команди. Зауважте, що якщо для команди встановлено SETENV, користувач може відключити опцію env_reset з командного рядка через опцію -E. Крім того, змінні оточення , встановлені в командному рядку не поширюються обмеження , що накладаються env_check, env_deleteабо env_keep. Таким чином, лише довіреним користувачам слід дозволяти встановлювати змінні таким чином. Якщо збігається команда ВСЕ, для цієї команди мається на увазі тег SETENV; це значення за замовчуванням може бути замінено за допомогою тегу NOSETENV.


1

Не вказуйте -Eпараметр. Використовуючи, -Eви говорите, що всі змінні середовища для користувача deployповинні бути збережені не тількиGIT_DIR

Запуск sudo echo $GIT_DIRмає працювати, оскільки ви додали GIT_DIRдо env_keepсписку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.