Não é possível definir o UID em scripts de shell

14

Alguém pode me ajudar a descobrir o que está acontecendo aqui? Eu tenho algumas regras de configuração de contagem de pacotes de rastreamento. Quando executo o seguinte script como root:

#!/bin/bash
iptables -t mangle -xnvL

Eu recebo a saída que espero:

//snip
233203 199929802 MARK  //blah blah blah
//snip

No entanto, quero executar isso como parte do cacti, que é executado como apache. Agora o apache não pode executar o iptables, é por isso que eu tenho o script. Eu configurei como raiz SUID :

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

Mas então eu recebo esta saída:

server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table 'mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

Obviamente, meu kernel está bem, e o fato de estar rodando como não-root está bagunçando alguma coisa, mas não entendo o porquê. Eu verifiquei novamente o SUID com [a demonstração] ( link e confirmei que estava funcionando.

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

Meu objetivo final é obter a saída de iptables -t mangle -xnvL durante a execução do apache para que eu possa usar o cacti para representar graficamente tudo bem.

    
por Tom Ritter 15.05.2009 / 05:25

3 respostas

16

Você não pode usar o SUID root para scripts de shell. Apenas programas reais podem ser raiz SUID, scripts de shell começam com "#!" e o intérprete teria que executar o SUID e isso não funciona por algum motivo que eu não sabia

Dê uma olhada no sudo e instale-o! Edite / etc / sudoerrs, adicione uma linha como esta:

www-data        ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh

Em seguida, basta executar

sudo /usr/local/sbin/iptables_packet_report.sh

do seu código.

Ele não deve solicitar a senha, mas avaliar o processo automaticamente.

Tenho certeza de que suas mensagens de erro também ocorrerão se você acessar manualmente o www-data e executá-lo manualmente

    
por 15.05.2009 / 08:32
13

Como Christian indicou que meu problema era que eu estava tentando o SUID em um script de shell. Conforme explicado aqui , a configuração do SUID em um shell script é uma idéia muito ruim:

executing a shell script under UNIX involves a two-step process: when the kernel determines that a shell script is about to be run, it first starts up a SUID copy of the shell interpreter, then the shell interpreter begins executing the shell script. Because these two operations are performed in two discrete steps, you can interrupt the kernel after the first step and switch the file that the shell interpreter is about to execute. In this fashion, an attacker could get the computer to execute any shell script of his or her choosing

Por causa disso, muitas distribuições Linux modernas ignoram scripts de shell SUID, incluindo o gentoo que eu estava usando. Consegui editar o arquivo sudoers e consegui que funcionasse.

    
por 15.05.2009 / 15:07
2

Eu acho que a solução de Christian é a melhor, mas se você realmente quiser, você pode compilar o script usando shc e depois setuid root no programa compilado.

    
por 15.05.2009 / 19:35