Execute um comando específico com o prompt de senha de root, mesmo se estiver executando como root

4

Eu quero executar um comando específico, como rm , enquanto estiver logado como root, mas quero que o prompt de senha raiz seja mostrado todas as vezes. Quando eu executo su -c "command" como root, não me pediram uma senha.

    
por fdsfad 01.03.2017 / 12:23

3 respostas

10

Especificamente para su , a raiz não recebe uma senha porque as regras PAM do su permitem:

$ grep root /etc/pam.d/su
# This allows root to su without passwords (normal operation)
auth       sufficient pam_rootok.so
# Uncomment this to force users to be a member of group root
# than the default "root" (but this may have side effect of
# denying "root" user, unless she's a member of "foo" or explicitly
# permitted earlier by e.g. "sufficient pam_rootok.so").

Se você quiser que su peça uma senha para root, comente o uso de pam_rootok . Obviamente, su não se importa com os comandos, então qualquer uso de su pelo root irá solicitar a senha.

Você não pode proteger comandos individuais da raiz sem arriscar muita quebra. Apenas bloqueie seu terminal quando sair dele. Não execute sessões raiz.

    
por muru 01.03.2017 / 12:59
8

Você pode usar este código para o script% wrapper rm , mas também pode criar versões semelhantes para mv e find .

Editar 5 de março de 2017 - Alterar o método de verificação ao executar no terminal.

Essa resposta verifica se está sendo executada no terminal e não solicita senha se estiver executando em um script de segundo plano, como inicialização, cron ou GUI. O script pode ser melhorado para garantir que rm foi digitado diretamente no terminal. Então, se outro script como sudo update-grub ou sudo apt update chamado rm uma segunda senha não for necessário.

Eu escrevi um script para proteger com senha rm , como o OP solicitado, e o código abaixo é o mesmo, exceto que exige senha do usuário sudo / root. Também tem edições para evitar que você exclua acidentalmente:

  • /
  • / home
  • / bin

Crie o script

Use gksu gedit /usr/local/bin/rm e copie nas seguintes linhas:

#!/bin/bash

tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi

if [ $Terminal == "Y" ] ; then    

    # Running from terminal don't allow delete of / or /toplevel directory even if sudo
    for i in ${@:1}
    do
        # Skip options -i -r -v -d 
        if [[ ${i:0:1} != "-" ]] ; then
            # if parameter doesn't begin with '-' it's file or directory, so get real path.
            fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
            # We must have at least two '/' in the full path
            levels=$(echo "$fullname" | tr -cd '/' | wc -c)
            if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
                echo "Attempting to remove top level directory '$fullname'"
                echo "Use 'sudo /bin/rm $@' instead."
                exit 1 # error
            fi
        fi
    done
fi


if [ $Terminal == "Y" ] ; then    
# Only running from a terminal needs password (ie not cron)

    # log rm usage to /var/log/syslog
    PARENT_COMMAND="$(ps -o comm= $PPID)"   
    logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"

    # Get password
    Password=$(zenity --password --title="Password for rm")
    encryptPassword=$(echo -n "$Password" | md5sum)

echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.

    if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe  -" ]]; then
        echo "Invalid password!"
        exit 1
    fi

fi # non-terminals can't enter password.

# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"

exit 0

Altere a senha "WE2U" para o que quiser e salve o arquivo.

Marcar o novo script rm como executável

Marcar o novo script rm como executável usando:

sudo chmod +x /usr/local/bin/rm

Como funciona

A menos que a senha seja WE2U , a primeira vez que você executar o script, receberá "senha inválida" e a chave de criptografia da senha digitada será exibida. Copie e cole essa chave de criptografia do terminal no script. Em seguida, comente a linha com o eco que exibiu a chave de criptografia no terminal.

Como o caminho /usr/local/bin é maior na lista do que /bin , nosso comando rm é chamado. Depois de obter uma senha válida, chama /bin/rm para fazer a remoção real.

O script chama logger para gravar sempre que rm foi chamado manualmente usando o terminal. O uso de comandos é registrado em /var/log/syslog .

Retirado da resposta postada em ( Como posso configurar uma senha para o comando 'rm'? ) e modificada para exigir a senha do usuário root também.

    
por WinEunuuchs2Unix 01.03.2017 / 13:00
0

A solução mais simples que consigo imaginar é su para um usuário diferente e depois voltar para root :

su userx -c 'su -c "ls"'

Uma desvantagem disso é que, se você precisar de caracteres especiais no comando, o escape se torna complicado.

    
por kasperd 01.03.2017 / 23:31