Como permitir ao usuário preservar o ambiente com o sudo?

17

Estou com o seguinte erro ao tentar permitir que algumas variáveis ​​de ambiente passem para o novo ambiente ao executar sudo:

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

Algumas informações que podem ser úteis para depurar:

[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

Meu exemplo atual:

[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

Meu arquivo sudoers.d para esta configuração específica:

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

Eu também tentei adicionar !env_resetaos padrões e ainda falha com o mesmo erro. Sinto que estou perdendo algo óbvio e preciso de um segundo par de olhos. O que estou perdendo aqui?

Andy Shinn
fonte
1
Acredito que aproximadamente 93% de nós entenda o ponto de sua pergunta, mas seu comando de exemplo não é muito bom.  , se não falhar completamente, exibirá o valor anterior de , porque o shell expande a variável na linha de comando antes mesmo de ser chamada. Testes melhores são ou ou , onde na verdade estamos analisando o ambiente do processo que está sendo privilegiado. sudo (option(s)) echo $GIT_DIRsudo$GIT_DIRsudosudo printenv GIT_DIRsudo env | grep GIT_DIRsudo sh -c 'echo "$GIT_DIR"'
G-Man Diz 'Reinstate Monica'
Veja também esta pergunta no Stack Overflow .
22618 Franklin Yu

Respostas:

27

Você pode usar o SETENV"Tag" no seu sudoersarquivo, como em:

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

Ou, para combiná-lo com o NOPASSWD:

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

Trecho relevante do sudoers man:

SETENV e NOSETENV

Essas tags substituem o valor da opção setenv em uma base por comando. Observe que, se SETENV tiver sido definido para um comando, o usuário poderá desativar a opção env_reset na linha de comando através da opção -E. Além disso, variáveis de ambiente definidas na linha de comando não estão sujeitas às restrições impostas por env_check, env_deleteou env_keep. Dessa forma, somente usuários confiáveis ​​devem ter permissão para definir variáveis ​​dessa maneira. Se o comando correspondente for ALL, a tag SETENV estará implícita para esse comando; esse padrão pode ser substituído pelo uso da tag NOSETENV.

iodbh
fonte
1

Não especifique a -Eopção. Usando -Evocê está dizendo que todas as variáveis ​​de ambiente do usuário deploydevem ser preservadas, não apenasGIT_DIR

Corrida sudo echo $GIT_DIR deve funcionar porque você adicionou GIT_DIRà env_keeplista

Stian S
fonte