Si hay una manera de obtener el pid de un proceso antes de que comience, entonces nunca he oído hablar de eso.
Podría escribir un contenedor que se bifurca primero, luego agrega la regla y ejecuta el proceso (asumiendo que el programa que está ejecutando no se bifurca nuevamente), ya que la llamada exec(3) no cambia el PID.
/* NOTE this contains zero error checking */
int main(int argc, char **argv) {
/* Eat argv[0] the name of the wrapper script */
argv++;
argc--;
pid_t my_pid = getpid();
char *iptables_cmd = NULL;
asprintf(&iptables_cmd, "/sbin/iptables -A INPUT -m owner --pid_owner %d -j ACCEPT", my_pid);
system(iptables_cmd);
execv(argv[0], argv);
}
Sobre la base de la respuesta de @Bgs, lo haría así:
- Agregue un nuevo grupo de sistemas, p.
snitch
sudo addgroup --system snitch
- Agréguese a ese grupo, para que no se le solicite una contraseña para ejecutar procesos con el grupo principal configurado:
sudo adduser $USER snitch
- Agregar IPv4 e IPv6 reglas para registrar y rechazar cualquier paquete generado por procesos pertenecientes a ese grupo:
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j REJECT
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j REJECT
- Abra una vigilancia de cola en los mensajes del núcleo:
dmesg -w
- Inicie su proceso objetivo usando
sg
o cualquier otro medio similar:
sg snitch 'your target program'
-m owner --pid-owner PID
Consulte http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html y http://linux.die.net/man/8/iptables
Tenga en cuenta que necesita el módulo ipt_owner, ya que xt_owner no admite --pid-owner.
Por ejemplo (esto es solo una aproximación)
#!/bin/bash
[email protected] &
iptables -m owner --pid-owner %1 -j REJECT
En realidad, sin embargo, es mejor usar --uid-owner y --gid-owner. Primero, el criterio --pid-owner solo coincide con el pid exacto, lo que significa que su programa podría generar fácilmente un proceso secundario que no estaría bloqueado por esta regla. (Al menos no he leído lo contrario). En segundo lugar, iptables(8) advierte que --pid-owner no funciona en los sistemas SMP (lo que puede aplicarse o no a usted, pero en cualquier caso limita la portabilidad). En tercer lugar, hay una condición de carrera en el script anterior, porque el proceso se inicia antes de que se bloquee. (Si hay una manera de obtener el pid de un proceso antes de que comience, entonces nunca he oído hablar de eso).
Parece el propietario El módulo iptables es eso lo que quieres. Primero, verifique si está disponible en su sistema:
iptables -m owner --help
Puede leer más aquí:http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH