como: Por favor, sudo, faça _not_ setup qualquer ambiente, especialmente $ SUDO_USER?

3

Eu quero iniciar um processo como outro uid e ele não deve precisar de nenhuma informação de $(env) , então eu removo o ambiente antes do sudo -u powerlessuser /bin/processCmd , ou seja, eu corro isso

env -i sudo -u powerlessuser /bin/processCmd

acontece que o sudo pensa que é necessário repovoar o meio ambiente, o que eu gostaria de pedir para não fazer. Existe, por exemplo, $SUDO_USER set que até informa o powerlessuser 's /bin/processCmd sobre mim (tm) que chamou o comando, o que acho muito indiscutível. Alguma ajuda?

É como eu também achei possível usar env -i stripping após o sudo, ou seja, fazer isso:

sudo -u powerlessuser /usr/bin/env -i /bin/processCmd

que resolve o problema de alguma forma, mas eu realmente gostaria de saber se existe uma maneira de fazer sudo não adicionar nenhuma informação em primeiro lugar, eu naveguei man 8 sudo em que encontrei documentação que sudo adiciona ambiente e que, mas não ajuda como fazer sudo não fazer isso

@ terdon ♦: Eu quero que todas as variáveis de ambiente limpas não sejam necessárias. Eu sou incapaz de dizer quais variáveis ambientais são necessárias, mas apenas para manter a questão, eu não encontrei a razão pela qual $SUDO_USER seria necessário por um processo para ser chamado como um usuário não-distorcido. Portanto, ficaria satisfeito em saber como informar sudo para não vazar SUDO_USER

Atualizar - problema com problema xy

Por mais que eu esteja muito interessado em evitar qualquer coisa do tipo xy-problema, temo que não seja o caso aqui. Isso porque, na verdade, eu não tenho um problema diferente do que o declarado na pergunta, ou seja, que pesquisando uma maneira de fazer com que o sudo não faça algo , o que eu posso razoavelmente esperar: ambiente e deve, na melhor das hipóteses, não adicionar coisas a ele, ou seja, $SUDO_USER . Por esta razão estou bastante convencido a não ter nenhum outro problema, já que já tenho uma cura para esse problema que sudo me deixa, por exemplo:

sudo -u powerlessuser /usr/bin/env -i /bin/processCmd

qual "limpa depois de sudo", de modo nenhum é o meu problema outra coisa, porque usando o env -i subseqüente resolveu qualquer problema lá. A única coisa que peço é saber se teria havido de fato uma maneira como sudo --empty-env que então geraria o novo processo com um ambiente esvaziado, que pelo menos não diria a $SUDO_USER que uid executou o% originalsudo.

Para todos que mostraram interesse em me ajudar com essa pergunta, eu gostaria de agradecê-los! Eu também deixo algum tempo, talvez haja uma possibilidade de mudança de --empty-env . Se não, talvez alguém que esteja dentro do sudo possa dizer, isto é, com referência às fontes que tal tarefa é impossível, já que o sudo não pode deixar de colocar o indesejado $SUDO_USER no interior.

Novamente, nenhum problema xy, pelo fato de que não é realmente um problema para começar, ou seja, eu não sofro das falhas de sudo aqui, como é resolvido por um env -i subseqüente, que em "filosofia unix" é a única coisa que env -i faz bem, ou seja, limpar o ambiente. Eu talvez não esperasse nem mesmo um comportamento razoável de sudo , já que o sudo tem um propósito diferente, que não está preocupado com o vazamento de variáveis de ambiente. Mesmo assim, o fato de que sudo oferece alguns sinalizadores relacionados a variáveis de ambiente engana e pensa que lidaria bem com variáveis de ambiente.

    
por humanityANDpeace 13.03.2016 / 10:15

2 respostas

2

Se a ferramenta não fizer o que você deseja, você poderá aprimorá-la usando um script de wrapper. Eu uso esse script ( noenv ) para manter limpos os ambientes de criação. Usando como

sudo -u powerlessuser noenv /bin/processCmd

faria o que você está pedindo. (O script deve estar no caminho padrão, caso contrário você deve fornecer o caminho no comando).

Script:

#!/bin/sh
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $
# trim the environment to minimal (PATH may still be long...)
env | sed -e 's/=.*//' -e '/^[  ].*/d' | \
while true
do
    read value
    if test -z "$value" ; then
        # honor assignments to variables in the parameter list
        while test $# != 0
        do
            case "x$1" in
            *=*)
                eval $1
                name='echo "$1"|sed -e 's/=.*//''
                export $name
                shift 1
                ;;
            *)
                break
                ;;
            esac
        done
        exec "$@"
        break
    fi
    case "$value" in
    HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME)
        ;;
    *\ *|*\(*|*\)*|*\!*)
        #echo "...skipping $value"
        ;;
    *)
        #echo value:"$value"
        unset "$value"
        ;;
    esac
done

Para esclarecer, eu não escrevi isso usando /usr/bin/env , porque alguns dos sistemas nos quais eu estava construindo não tinham um recurso POSIX que a questão mencionada: a opção -i . Esses são sistemas antigos da BSD, incluindo SunOS 4 e HPUX 10 (verificando minha memória na página de manual de" env "no FreeBSD).

O script, a propósito, reduz os valores de várias linhas (mas o único que você pode encontrar é TERMCAP , e isso apenas em máquinas muito antigas). A segunda expressão sed deve ser um intervalo com a aba e o espaço .

Para o POSIX (no qual você provavelmente está mais interessado), você pode fazer algo que use o recurso para transmitir valores selecionados do ambiente pai, por exemplo,

env -i foo="bar"

e, portanto, ambos são personalizáveis. Para um grande conjunto de variáveis, isso pode ser desajeitado e um script é uma escolha melhor.

sudo desaprova TERMCAP em qualquer caso. Isso está em uma lista (longa) de variáveis que é útil remover do ambiente.

sudo insiste em definir determinadas variáveis. Lendo a fonte plugins/sudoers/env.c , você verá este pedaço perto do fim de rebuild_env :

/* Add the SUDO_USER, SUDO_UID, SUDO_GID environment variables. */
CHECK_SETENV2("SUDO_USER", user_name, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_uid);
CHECK_SETENV2("SUDO_UID", idbuf, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_gid);
CHECK_SETENV2("SUDO_GID", idbuf, true, true);

debug_return_bool(true);

ou seja, logo antes do retorno (somente) bem-sucedido dessa função, ele define suas próprias variáveis , usando seus próprios valores .

    
por 13.03.2016 / 16:17
0

Se você estiver procurando descompactar somente envs específicas, como SUDO_USER, você pode filtrá-las ao chamar sudo usando a opção 'env -u'.

Por exemplo,

sudo -u powerless env -u SUDO_USER -u SUDO_UID ./some_script.sh

anula o SUDO_USER e o SUDO_UID no ambiente que executa o script ./some_script.sh.

Observe a ordem, pois -u tem um significado diferente quando segue sudo vs. env

    
por 02.03.2018 / 00:33