ti-enxame.com

Não é possível definir scripts de shell

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

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

Eu recebo a saída que eu 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 iptables, , e é por isso que eu tenho o script. Eu configurei como raiz suout :

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

Mas então 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 que eu estou correndo como não-raiz está brincando de algo, mas eu não entendo porque. Double verificar o suid com [a demonstração] ( http://en.wikipedia.org/wiki/setuid#demonstration e confirmou 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 como Apache para que eu possa usar cactos para representar tudo bem.

14
Tom Ritter

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

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

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

Então apenas corra

Sudo /usr/local/sbin/iptables_packet_report.sh

do seu código.

Deve então não pedir a senha, mas avaliar o processo automaticamente.

Tenho certeza de que suas mensagens de erro também aconteceriam se você estivesse manualmente em dados www e executá-lo manualmente

16
Christian

Como Christian indicou que meu problema era que eu estava tentando suid em um script de casca. como explicado aqui Setting Suid em um script de shell é uma ideia muito ruim:

executar um script de shell sob UNIX envolve um processo de duas etapas: Quando o kernel determina que um script de shell está prestes a ser executado, ele inicia primeiro uma cópia suid do intérprete do shell, então o intérprete do shell começa a executar o script de shell. Como essas duas operações são executadas em duas etapas discretas, você pode interromper o kernel após a primeira etapa e mudar o arquivo que o intérprete do shell está prestes a ser executado. Desta forma, um invasor poderia obter o computador para executar qualquer script de casca de sua escolha

Por causa disso, muitas distros modernas do Linux ignoram os scripts de shell suid, incluindo o Gentoo que eu estava usando. Eu consegui editar o arquivo sudoers e consegui funcionando.

13
Tom Ritter

Acho que a solução do Christian é melhor, mas se você realmente quisesse, você pode compilar o script usando SHC e depois raiz setuid no programa compilado.

2
Kyle Brandt