shell script: use o sudo dentro dele vs execute-o com o sudo?

13

Ao escrever um script de shell, no qual alguns, mas nem todos os comandos, precisam de privilégios de superusuário, devo

  • adicione sudo aos comandos que precisam de privilégios de superusuário e execute o shell script sem sudo, ou

  • não adicione sudo aos comandos que precisam de privilégios de superusuário, mas execute o shell script com sudo?

Na segunda maneira, só precisarei fornecer minha senha uma vez, mas todos os comandos no script serão executados com privilégios de superusuário, incluindo os comandos que não precisam.

Na primeira maneira, talvez eu precise fornecer minha senha várias vezes para diferentes comandos sudo, enquanto os privilégios de superusuário são concedidos apenas aos comandos que precisam deles.

Por questões de segurança, a primeira maneira é melhor. Por conveniência, o segundo caminho é melhor.

  1. Eu tenho pensado em adotar o primeiro caminho. Portanto, tenho que lidar com a inconveniência de fornecer minhas senhas para vários comandos sudo no shell script.

  2. Stephen Harris escreveu :

    Um script bem escrito detectaria se estava sendo executado com as permissões corretas e não chamava o sudo, mas há muitos scripts ruins

    Então, devo usar o segundo caminho? Se então,

    • como posso escrever "o script detectaria se estava sendo executado com as permissões corretas e não chamava o sudo"?

    • como posso melhorar sua segurança para evitar o problema de conceder privilégios de superusuário a comandos que não precisam deles ao executar o script com sudo?

  3. Essa abordagem simples teria o melhor de ambas as abordagens: adicione sudo a comandos que apenas precisam dela e execute o script com ou sem sudo, dependendo de eu querer conveniência ou segurança? Essa abordagem tem algum problema?

Obrigado.

Tim
fonte
Eu pensei que sudotinha um cache de credenciais padrão. Isso está desativado na sua plataforma?
pipe
@pipe Seu script pode estar adormecido por um certo período de vezes, por exemplo, e dessa maneira o cache pode não funcionar.
LinuxSecurityFreak

Respostas:

15

Para resolver seu primeiro problema:

como posso escrever "o script detectaria se estava sendo executado com as permissões corretas e não chamava o sudo"?

Há uma verificação simples e POSIX para root:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

Como alternativa, no Bash, mais codificadores direcionados ao desempenho podem querer usar:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

Observe que intencionalmente coloquei o código em funções para reutilização.

Para resolver seu segundo problema:

como posso melhorar sua segurança para evitar o problema de conceder privilégios de superusuário a comandos que não precisam deles ao executar o script com sudo?

Você não pode fazer muito sobre isso. Pelo menos nada vem à minha mente. Se eu vi o script, talvez eu tenha sugestões. Mas como você não o incluiu na sua pergunta ... Se você executar o script inteiro com sudoou como root, não vejo como controlar isso.

Para abordar o comentário:

O que você acha de "use o sudo dentro dele vs execute-o com o sudo"

Nos meus scripts, geralmente prossigo com a última abordagem, mas isso não significa necessariamente que eu a recomendo. Porque depende de quem o script se destina - rootapenas; para o usuário principalmente com a exceção de alguns usuários terem sudodireitos; você precisaria literalmente incluir seu script na pergunta para que eu pudesse responder com qualquer valor.

LinuxSecurityFreak
fonte
sudo -u "$SUDO_USER" command...?
Michael Homer
Obrigado. O que você acha de "usar o sudo dentro dele vs executá-lo com o sudo"?
Tim
Obrigado. Essa abordagem simples teria o melhor de ambas as abordagens: adicione sudo a comandos que somente precisam dela e execute o script com ou sem sudo, dependendo de eu querer conveniência ou segurança? Essa abordagem tem algum problema?
Tim
@MichaelHomer Eu queria saber o que sudo -u "$SUDO_USER" commanddeveria significar aqui?
Tim
@ Tim Embora eu não encontre nenhum problema com essa abordagem, alguém pode contestar argumentos razoáveis. Isso está realmente fora do escopo da sua pergunta original. Agora preciso fazer meu backup mensal do M-Disc, para que ainda não esteja disponível hoje, desculpe por isso. Espero ter respondido ao ponto principal pelo menos. Te vejo amanhã.
LinuxSecurityFreak #
-4

Eu acho que posso responder isso.

Então, devo usar o segundo caminho?

Não há nenhuma razão para você ter um problema aqui, é por isso:

Se houver apenas um comando que precise ser executado como root, o runseu programa como rootou sudoporque sudodentro do seu script é o caminho mais longo. Você esqueceu que os programadores são preguiçosos?

Se você precisar de muitos comandos runcomo root, em seguida, executá-lo como rootou sudo.

como posso melhorar sua segurança para evitar o problema de conceder privilégios de superusuário a comandos que não precisam deles ao executar o script com sudo?

Se outros usuários precisarem do runseu programa, configure sudo-os, pois sudoé muito personalizável e atenderá às suas necessidades.

Aqui está um exemplo com sudo:

Sempre use visudoao editar o arquivo sudoers .....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo Também é ótimo para alterar usuários dentro do seu programa / script. Aqui está uma linha de um dos meus scripts:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

como posso escrever "o script detectaria se estava sendo executado com as permissões corretas e não chamava o sudo"?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
como faço para determinar se um script de shell está executando com permissões de raiz

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

EDITAR a pedido do cavalheiro @terdon:

Pense no seu script dessa maneira ....

É um script público (outras pessoas que você não o usará) O que o script faz? Isso lhe diz que horas? Ou atualiza o iptables em 200 sistemas? Se você apenas o usar, ele está relacionado ao trabalho / profissional ou é para uso pessoal?

Você só precisa saber com antecedência em que consiste o seu grupo de usuários, é isso.

Se é writtenpara dar ou vender para administradores, mesmo assim, por que não deveria scriptser permitido executar como root?? Que mal pode causar?

Scripts / programas reais costumam ser executados como usuário privilegiado e ninguém menciona que isso não é problema, mas quando programadores, principalmente novatos como eu, falam sobre essas coisas, então é uma ameaça real à segurança ..... qual é o cara no seu post? referir-se a tentar dizer, embora não seja elegante, é que algumas pessoas olham para o controle que você tem systeme seu código .... você define os arquivos com mais permissões do que você vai usar, você tem todas as verificações em seu lógica ou programador talentoso vai ver perigos no seu código apenas olhando para ele?

Se você code needs rootusar sudo, e se houver muitos, execute-o como root....... minha resposta termina aqui ufa

alguma coisa alguma coisa
fonte
2
@somethingAlgo que você poderia explicar por que recomenda sempre executar o script como root, mesmo quando existe apenas um comando que precisa de privilégios de root? Você oferece duas possibilidades em sua resposta (um comando que requer privilégios de root ou múltiplos), mas sugere a mesma coisa para os dois.
terdon
2
Eu pensei sobre esse assunto e li outras discussões semelhantes. Essa resposta me confunde. (Mas você já tem votos suficientes o suficiente.) #
213 Joe Joe