Bloquear solo ejecucion de binarios y permitir ejecucion de shell script (RHEL)
El tema es el siguiente. Necesito en el /home evitar que puedan ejecutar binarios, pero quiero continuar permitiendo scripts. No estoy seguro que el enfoque sea el correcto, escucho todo tipo de comentarios.
En un equipo que funciona como bastión, audito con una herramienta externa desde allí en adelante todas las conexiones ssh. Ahora lo que me preocupa es que alguien pueda traerse un binario del cliente ssh, renombrarlo y utilizarlo para conectarse desde allí (en ese caso no me quedaría ninguna auditoria de su accionar).
[ lnxtest20 - user20 ]/home/user20 $ ll
total 452
-rwxrwx--- 1 user20 idm 5 Aug 4 13:14 prueba.sh
-rwxr-x--- 1 user20 idm 446728 Aug 4 13:01 ssh
[ lnxtest20 - user20 ]/home/user20 $ mv ssh nutria
[ lnxtest20 - user20 ]/home/user20 $ ls -ld nutria
-rwxr-x--- 1 user20 idm 446728 Aug 4 13:01 nutria
[ lnxtest20 - user20 ]/home/user20 $ ./nutria -l root 10.75.255.220
The authenticity of host '10.75.255.220 (10.75.255.220)' cant be established.
RSA key fingerprint is c5:ca:24:cb:4e:d6:b5:c4:e0:2b:c5:3b:f3:58:7f:9c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.75.255.220' (RSA) to the list of known hosts.
Password:
Probé con la opción noexec en el montado del filesystem, pero esto me bloquea ambas cosas.
[ lnxtest20 - user20 ]/home/user20 $ mount | grep home
/dev/mapper/vg_lnxtest20 -lv_home on /home type ext3 (rw,noexec,acl,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0)
[ lnxtest20 - user20 ]/home/user20 $ ./nutria -l root 10.75.255.2209
-bash: ./nutria: Permission denied
[ lnxtest20 - user20 ]/home/user20 $ cat prueba.sh
date
[ lnxtest20 - user20 ]/home/user20 $ ./prueba.sh
-bash: ./prueba.sh: Permission denied
[ lnxtest20 - user20 ]/home/user20 $
[ lnxtest20 - user20 ]/home/user20 $ file nutria
nutria: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[ lnxtest20 - user20 ]/home/user20 $ file prueba.sh
prueba.sh: ASCII text
[ lnxtest20 - user20 ]/home/user20 $
Alguien tiene alguna opción o idea para comentarme?. De última lo que pensé es en armar un control de puertos abiertos contra procesos en ejecución para lanzar un kill, pero la verdad no me gusta mucho esta idea.
Saludos
Respuestas
Como va, tal vez puedas hacer una combinación. Por un lado le seteás el PATH como te dijeron antes a algo que solo tenga los shell scripts que querés ejecutar.
Y por otro lado le cargas como shell el rbash. El rbash es un restricted bash que te ermite realizar ciertas cosas. Mejor dicho, tiene restringido lo siguiente:
De es manera solo puede ejecutar tus scripts y no se va a poder escapar por ningun lado.
En general los scripts van a requerir de algun binario para realizar su tarea, esto es asi? o vos estas ejecutando todos scripts de perl/python o algun otro lenguaje que interpretado que no require de binarios externos mas alla del obvio interprete?.
*EDIT*
Más tarde lo leo tranquilo de nuevo pero se me ocurre que apelando a tus más oscuros skills de ugly hacker podés armar un layer protector para lograr lo que buscás, la idea sería así:
Si en los directorios del jumphost a los que acceden tus usuarios hay muchas (muchas) escrituras este approach no va a resultar óptimo por el impacto en el sistema.
Lo de limitar sólo por ejecutable en /home no parece que pudiera ser muy efectiva, estoy seguro de que hay alguna forma de saltearlo llamando a tu binario-ssh directamente, o ssh + telnet o ssh+netcat o subiendo un paramiko (ssh en python). Una idea, sin probar, tomada de http://stackoverflow.com/questions/4314163/create-iptables-rule-per-process-service :
Ah también vi que hay en "iptables .... -j LOG" podés loguear el uid que generó el tráfico, así que supongo que en vez de tener un script especial de ssh podés analizar logs.