Devo usar o sudo em um script ou sudo em um script inteiro?

Devo usar o sudo em um script ou sudo em um script inteiro?

Eu administro um pequeno grupo de máquinas macOS para estudantes (digamos 20) e todas elas precisam ser configuradas com coisas como homebrew e outros pacotes e aplicativos. Estou escrevendo um script bash para instalar automaticamente todas as coisas necessárias em cada computador. Alguns dos comandos que usarei exigem que sejam executados como root, mas não a maioria deles.

Eu queria saber se seria melhor sudo individualmente cada um desses comandos no script ou deixar o sudo fora do script e sudo o script inteiro. Gostaria de saber qual deles será mais seguro (em termos de segurança) e melhor para minha situação. Prefiro que uma senha não seja solicitada em todo o script, mas também não quero executar todas as linhas do script como root, pois não é seguro.

Responder1

Seguindo o princípio do menor privilégio, execute o mínimo que puder como root. Portanto, sudo de dentro do script.

Observe que na primeira vez que houver um comando que precise do sudo, você poderá ser solicitado. (Isso não será verdade se você usar NOPASSWD em /etc/sudoers, que é uma técnica que muitas pessoas evitarão por ser insegura.) No entanto, quando você executa o sudo e fornece uma senha, o sudo se lembrará do sucesso por um período de tempo. Por padrão, esse período é de cinco minutos. Portanto, se você executou "sudo echo hi", digitou sua senha e executou o script logo depois disso, não haveria necessidade de ser solicitada uma senha ao executar o script. Mais realisticamente, se você apenas executar o script, provavelmente será solicitado a sudo apenas uma vez ... presumindo que seu script leve menos de alguns minutos para concluir as tarefas restantes.

Posso não me preocupar com alguns echocomandos, mas se houver conteúdo significativo que possa ser feito sem permissões extras, então, por uma questão de segurança, geralmente gosto de maximizar o que é feito com elevação mínima.

Como exemplo de minimização de permissões, deixe-me mostrar outro exemplo de cenário. Em vez de:
sudo -c "sample-command >> /var/log/output.txt"

Eu gosto de usar:
sample-command | sudo tee -a /var/log/output.txt >> /dev/null

Ao fazer isso, todo o comando é executado sem sudo, e a única parte que acaba tendo permissões aprimoradas é a parte que precisa de permissões aprimoradas, que é a parte que grava no arquivo.

Claramente, meu objetivo aqui é minimizar o quanto é feito de forma elevada. Da mesma forma, se todo o seu script não exigir elevação, a abordagem preferida (do ponto de vista da segurança) é minimizar o quanto é feito de forma elevada.

Responder2

Depende de quais são os comandos. Para os comandos que baixam da internet é melhor não executá-los como root. Mas o outro comando deve estar ok para ser executado como root. O que eu faria é separar o comando em dois scripts: um para comandos não-root e outro para comandos root

Talvez eu possa ajudar mais se conseguir a lista dos comandos.

Responder3

Normalmente, (presumo) você deseja que o script seja tratado como qualquer outro comando/aplicativo/utilitário. Nesse caso, normalmente não seria solicitada uma senha para aumentar seus privilégios; você simplesmente seria negado e receberia um erro. Algo como:
Permission denied, ouOperation not permitted.

Mas, você mencionou especificamente que:
"..não quero executar todas as linhas do script como root.."
Portanto, realmente não vejo uma alternativa para invocar explicitamente e exclusivamente sudoem/a partir de linhas específicas de código onde for relevante.

Você também mencionou que:
"..prefiro não ser solicitada uma senha em todo o script.."
E é provável que você não o faça. Você não será avisado sempre que o sudo for invocado, a menos que um período significativo de tempo passe entre as operações.

Responder4

Aqui está uma solução: execute o script como rootusing sudoe execute quaisquer comandos que não exijam privilégios elevados como o usuário original usando sudo -u $SUDO_USER <command>.

Aqui está um exemplo de script example.sh:

#!/bin/bash

if [ "$(whoami)" != "root" ] ; then
    echo "Run this script with sudo" >&2
    exit 1
fi

sudo -u "${SUDO_USER:-$USER}" this_command_run_as_user
this_command_run_as_root
this_command2_run_as_root

Você executaria assim:

sudo ./example.sh

A vantagem de fazer desta forma é que a senha do usuário só será solicitada no máximo uma vez no início do script. Você não precisa se preocupar com tempos limite para sudo.

informação relacionada