Passando a senha do root com segurança em um shell script

6

Eu sempre inicializo meu laptop GNU / Linux no modo de console. Mas às vezes eu preciso trazer o modo GUI. isso sempre requer a inserção da senha de root. Então eu escrevi o seguinte script "gogui.sh" e coloquei em /usr/bin :

#!/bin/bash
echo "mypassword" | sudo service lightdm start

É uma ideia muito estúpida, como se alguém lesse o arquivo, pudesse facilmente ver minha senha.

A alternativa é essa?

    
por Saeid Yazdani 02.11.2015 / 21:15

5 respostas

36

Passar uma senha para o sudo em um script é totalmente inútil. Em vez disso, adicione uma regra sudo adicionando o comando específico que você deseja executar com a tag NOPASSWD . Tome cuidado para que a regra NOPASSWD específica do comando venha depois de qualquer regra geral.

saeid ALL = (ALL:ALL) ALL
saeid ALL = (root) NOPASSWD: service lightdm start

Mas isso provavelmente não é útil de qualquer maneira. lightdm start inicia um prompt de login, mas você só precisa disso se quiser permitir que outros usuários façam login graficamente. Você não precisa disso, se tudo o que você quer é iniciar uma sessão GUI. Em vez disso, chame startx para iniciar uma sessão da GUI a partir da sessão do modo de texto. Isso não requer nenhum privilégio extra.

Talvez seja necessário especificar explicitamente seu gerenciador de janelas ou ambiente de área de trabalho, pois startx pode não selecionar o mesmo tipo de sessão padrão usado pelo lightdm.

startx -- gnome-session
    
por 02.11.2015 / 22:30
8

Existem algumas opções, e uma delas é adicionar o comando específico usando visudo com o sinalizador NOPASSWD:

%wheel ALL=(ALL) NOPASSWD: /path/to/myscript

cat /path/to/myscript
#!/bin/bash
service lightdm start
    
por 02.11.2015 / 21:54
3

EDITAR
Só notei nos seus comentários que você mencionou o Unity, então parece que você está rodando o Ubuntu. Minha resposta original foi voltada para sistemas SysVinit , mas comandos como telinit ainda existe para compatibilidade e funcionará em distros usando Systemd ou Upstart .

caminho SysV

    telinit 5

Em sistemas Systemd modernos, telinit é redirecionado para systemctl .

modo Systemd

    systemctl isolate runlevel5.target

ou

    systemctl isolate graphical.target

Resposta original:
Em distros não-Systemd mais antigas (RHEL / CentOS 6 e mais antigos, por exemplo), a maneira mais fácil de alternar do modo de console para GUI é com o telinit comando. Nas distros RHEL / Centos, por exemplo, o modo multiusuário baseado em texto é executado no nível 3 e o modo GUI multiusuário é executado no nível 5. A alternação do console para o modo GUI seria feita assim: Por padrão, telinit requer privilégios de root. Para executar isso como um usuário normal sem uma senha, você precisará de uma entrada sudoers ou definir o sinalizador setuid definido no telinit executável. O método sudo é a abordagem preferida, pois pode ser restrito apenas à sua conta.

    
por 03.11.2015 / 05:26
2

A maneira clássica do UNIX é tornar o script setuid :

$ sudo chown root gogui.sh  #not necessary if root is already the owner of the file
$ sudo chmod u+s gogui.sh

Isso definirá um bit de permissão especial no arquivo:

$ ls -l gogui.sh
  -rwsr-xr-x 1 root root [omitted] gogui.sh

(Observe a letra s em vez de x na quarta posição.)

Se você fizer isso, todas as vezes que executar o script, ele será executado com os privilégios do proprietário do arquivo, em vez dos do usuário que o executa.

Agora você pode simplificar seu script gogui.sh para conter somente

/usr/sbin/service lightdm start

Observe que eu adicionei um caminho explícito para o executável (que localizei digitando which service ): isso é necessário em arquivos setuid, porque senão o primeiro programa chamado service encontrado em seu PATH será executado. Esquecer o caminho explícito seria um problema de segurança enorme , já que significa que qualquer usuário pode ajustar a variável PATH e executar um programa de sua escolha com privilégios de root.

Se desejar, você também pode impedir que outros usuários executem os arquivos com chgrp some_group gogui.sh; chmod o-x gogui.sh , o que tornará o arquivo executável apenas para membros de some_group .

    
por 04.11.2015 / 02:08
0

Como você está se referindo especificamente a sudo , escolha a resposta de Gilles . No entanto, como o título da sua pergunta era apenas sobre como obter uma senha para o stdin de um programa e eu tive uma situação semelhante recentemente:

echo $(read -sp "Password: " password; echo $password) | yourcommand

Provavelmente vou ganhar alguns golpes por isso, mas funcionou.

Falando em bash , você provavelmente também pode usar

yourcommand <$(read -sp "Password: " password; echo $password)
    
por 03.11.2015 / 20:36