Como ejecutar un script bash de un firewall con php

Imagen de Lord

Forums: 

Saludos a toda la comunidad de software libre, soy principiante en lo referente a la programacion con php y scripts bash. Espero me puedan ayudar en mi inquietud: tengo un script bash de un firewall personalizado y deseo ejecutarlo desde mi browser, es decir: iniciarlo, detenerlo. Para ello estoy llamando a mi script bash desde un archivo php de la siguiente manera:
<?
system ('/var/www/html/prueba/myFirewall start');
?>
Tras ejecutar la linea anterior en mi browser me aparece: Firewall iniciado, aparentemente todo esta bien, pero decidi verificar si no hubo problemas ejecutando:

tail -f /etc/httpd/logs/error_log y me muestra el siguiente error:

iptables v1.3.5: can't initialize iptables table 'filter': Permission denied (you must be root)

revisando informacion por ahi, he encontrado que debo asignarle permisos a mi usuario apache para que pueda ejecutar iptables, lo hice con el visudo de la siguiente manera:

apache ALL=(root) NOPASSWD: /sbin/iptables

realizado estos cambios sigo con el mismo inconveniente. No se que estoy realizando mal, si en la mala asignacion de permisos al apache o en llamar mal al script bash de mi firewall desde php.

Me olvidaba estoy trabajando bajo CentOS 5

El bash que manejo es el siguiente:

#!/bin/sh
#Iptables, "O.S Security" - Copyright 05/10/2007
#Script de prueba para CentOS 5, como firewall local

#Si este script se ejecuta en Redhat o sus distribuciones clones como CentOS, Fedora Core, etc.
#poner "YES", sino poner "NO"
REDHAT="YES"

#Caminos
DMESG="/bin/dmesg"
IPTABLES="`which iptables`"
MODPROBE="/sbin/modprobe"

# Esta parte permite al usuario de redhat llamar al script con
# los parametros: start/stop/restart
if [ X"$REDHAT" = X"YES" ]; then
. /etc/rc.d/init.d/functions
case "$1" in
stop)
action "Apagando firewall:" #echo
$IPTABLES -F
$IPTABLES -P FORWARD DROP
exit 0
;;
status)
#echo "The status command is not supported for iptables"
echo "No disponible en este script"
exit 0
;;
restart|reload)
$0 stop
exec $0 start
;;
start)
action "Iniciando Firewall:" #echo
;;
*)
echo "Usage: firewall (start|stop|restart)"
exit 1
esac
fi

################################################################
#Insertando los modulos. Debe hacerse automaticamente si se requiere
dmesg -n 1 #No saca la bandera de copyright
/sbin/modprobe ip_tables
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
#
## Vaciar las reglas que puedan existir
#
# Paquetes provenientes del exterior
$IPTABLES -F INPUT
# Paquetes de la red interna hacia el exterior
$IPTABLES -F OUTPUT
# Forwarding/enmascaramiento
$IPTABLES -F FORWARD
#Tabla de NAT
$IPTABLES -t nat -F

#Activando Reglas Basicas
#Matar paquetes con combinaciones de banderas invalidas
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -m state --state INVALID -j DROP

# Permitir todas las conexiones en la interfaz local
$IPTABLES -A INPUT -i lo -j ACCEPT

#Eliminar conexiones a la interfaz local desde el mundo exterior
$IPTABLES -A INPUT -d 127.0.0.0/8 -j REJECT

#Habilitar pings si estoy en una LAN
$IPTABLES -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

#IPv6 tunneling
#$IPTABLES -A INPUT -p ipv6 -j ACCEPT

#Conexiones
# ssh
#$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT
# http
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
# https
$IPTABLES -A INPUT -p tcp --dport 443 -j ACCEPT
#Webmin
#$IPTABLES -A INPUT -p tcp --dport 10000 -j ACCEPT

#No guardar http ni https pues navegar por largos periodos causan muchas
#conexiones caidas y llenan nuestros logs.
$IPTABLES -A INPUT -p tcp --dport 80 -j REJECT
$IPTABLES -A INPUT -p tcp --dport 443 -j REJECT

#Cerramos rango de los puerto privilegiados
$IPTABLES -A INPUT -p tcp --dport 1:1024
$IPTABLES -A INPUT -p udp --dport 1:1024

#Cerramos otros puertos que esten abiertos en este caso webmin
$IPTABLES -A INPUT -p tcp --dport 10000 -j DROP
$IPTABLES -A INPUT -p udp --dport 10000 -j DROP

##Reglas de captura generales
#iptables viene a estas si no han matcheado en ninguna de las previas
#No tiene sentido guardarlas, no es más que ruido
$IPTABLES -A INPUT -p tcp --syn -m limit --limit 5/minute -j LOG \
--log-prefix "Firewalled packet:"
$IPTABLES -A FORWARD -p tcp --syn -m limit --limit 5/minute -j LOG \
--log-prefix "Firewalled packet:"

#Reject
$IPTABLES -A INPUT -p tcp -j REJECT --reject-with tcp-reset
$IPTABLES -A INPUT -p all -j DROP
$IPTABLES -A -INPUT -j REJECT --reject-with icmp-host-prohibited

$IPTABLES -A FORWARD -p tcp -j REJECT --reject-with tcp-reset
$IPTABLES -A FORWARD -p all -j DROP

#Accept it anyway if it's only output
$IPTABLES -A OUTPUT -j ACCEPT

exit 0

Eso por ejemplo no lo

Imagen de acl

Eso por ejemplo no lo sabía. Claro que mi experiencia está limitada a sh, bash y tcsh. ¿Con qué shell puedes ejecutar scripts con suid?
--
haber != a ver
ha != a

Bueno, si hablamos del día

Imagen de deathUser

Bueno, si hablamos del día de hoy, creo que ningún shell en LINUX le para bola a los SUID y SGID, pero, hace algún tiempo algunos shells eran vulnerables, mientras que el bash ya no lo era, creo que tcsh y csh eran un ejemplo clásico ...

PD: creo que en otros *NIX systems aun se puede encontrar versiones vulnerables de dichos shells, si no me equivoco, bash ni siquiera permite que te saques una copia y le hagas un suid ;)

bye
:)

Intento ejecutar varios scripts firewall usando cron

Imagen de Lord

Gracias por los comentarios en este foro, para aclararles un poco el panorama. Lo que intento hacer es ejecutar scripts por ejemplo un firewall ejecutarlo por la mañana, otro la tarde y otro por la noche, mediante el uso del cron. Es por ello que quise replantear mi pregunta en lo referente a los permisos de apache mediante el sudo para no colocar toda la ruta completa del o los scripts que deseo el sistema ejecute automaticamente, de ahi viene mi inquietud.

Entonces es muy fácil. Si

Imagen de acl

Entonces es muy fácil. Si mandas a correr con el crontab del sistema, el script corre directamente con permisos de root y no necesitas usar sudo. Solo corres el script a la hora que necesitas y listo.
--
haber != a ver
ha != a

Gracias

Imagen de Lord

Gracias a todos los que han posteado en este foro, mi primer foro que creo
y sus comentarios me han servido de mucho.
En realidad lo que estaba realizando originalmente de ejecutar un script bash
desde php lo consigui gracias a la asesoria que aqui me brindaron, con la
respectiva configuracion del sudo que de hecho funciono perfectamente.

Pero quise ir mas alla, no solo ejecutar un script bash de un firewall sino
estructurar una aplicacion web que me permitiese modificar ciertos parametros
del script del firewall como lo hace el webmin, por eso estoy realizando mi
mini webmin con php pero de firewalls. Fue por ese motivo que replantee mi
pregunta original referente a los permisos del sudo en un script, ya que si mi
aplicacion web genera un script, el usuario (administrador) lo pudiese guardar
con el nombre que el crea conveniente por ejemplo: firewall_dia o firewall_domingo,
en este caso como el administrador crea sus propios scripts firewalls mi aplicacion
tendria que poner toda la ruta en el sudo para ejecutarlos, fue que se me vino la
idea de a cada script asignarle permisos de apache para evitar de cierta manera
poner toda la ruta en el sudo.

Mi intencion en mi aplicacion es visualizar los scripts existentes y que el administrador
elija el que crea conveniente y lo ejecute. O a su vez programarlo en el cron para
que en un determinado dia u hora se ejecute automaticamente, como alguien
menciono en este foro si utilizo el cron entonces ya no necesitaria el sudo, pero
creo que si porque si el administrador quiere desactivar un firewall para usar otro
que el genero necesitaria el sudo o lo que yo planteaba de asignar permisos apache
a cada script para que se ejecuten, ahi estoy un poco confundido.

No se que opinan referente a lo que estoy realizando?? voy por buen camino o me estoy
complicando. Ustedes se preguntaran porque hacer un webmin con php de firewalls si hay uno
completo y hecho con muchas funcionalidades??
La respuesta es tener una herramienta que se adecue a mis requerimientos,
se me ocurrio esta idea al ver la interfaz del firewall Astaro y de
cierta manera me vino ese bicho de hacer algo similar :)

Gracias por sus comentarios que me serviran de mucho.

Páginas