Hardening RHEL – Tips

En todos los años de experiencia que tengo revisando servidores
RHEL/CentOs/Debian/Ubuntu muy pocas veces he visto que se tome el tiempo de asegurar los servidores,muchos administradores novatos se limitan a configurar el firewall e instalar el famoso y peligroso Webmin. ( una vez vi que alguien lo instalo y 3 horas después le toco formatear el servidor por culpa Black Hats chinos).

He recolectado las mejores practicas de Hardenin de Linux,
La mayoría son para RHEL/CentOs 6, muy pocos tiene RHEL/CentOs 7 así que lo voy a dejar de lado “for a while”

Voy a dividir este post en varios para no hacerlos tan largos.

Algo que muy pocos conocen, es el servicios Audit, audit es un sistema que
registra todo lo que haces y se hacen en el sistema operativo, es manejado por medio de reglas, por defecto el sistema no configura ninguna clase de regla.
Aquí expongo un set reglas, algunas son necesarias en el contexto del standar OpenSCAP [1]

Las siguientes reglas deben ir en: /etc/audit/audit.rules, son válidas para RHEL 6 de 64Bits

# Reglas Antonio Insuasti 2015 <antonio[at]insuasti.ec>
# Reglas basadas en SCAP

# audit_rules_exec
-w /etc/passwd -p wa -k passwd_changes
-w /etc/selinux/ -p wa -k selinux_changes
-w /usr/local/sbin -p x -k eject_commands
-w /usr/local/bin -p x -k eject_commands
-w /bin -p x -k eject_commands
-w /sbin -p x -k eject_commands
-w /usr/sbin -p x -k eject_commands
-w /usr/bin -p x -k eject_commands

# audit_rules_modules
-w /usr/sbin/insmod -p x -k modules
-w /usr/sbin/rmmod -p x -k modules
-w /usr/sbin/modprobe -p x -k modules
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules
# audit_rules_time
-a always,exit -F arch=b64 -S adjtimex -k audit_time_rules
-a always,exit -F arch=b64 -S settimeofday -k audit_time_rules
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -k audit_time_rules
-a always,exit -F arch=b64 -S clock_settime -k audit_time_rules
-w /etc/localtime -p wa -k audit_time_rules

# audit_rules_usergroup_modification
-w /etc/group -p wa -k audit_rules_usergroup_modification
-w /etc/passwd -p wa -k audit_rules_usergroup_modification
-w /etc/gshadow -p wa -k audit_rules_usergroup_modification
-w /etc/shadow -p wa -k audit_rules_usergroup_modification
-w /etc/security/opasswd -p wa -k audit_rules_usergroup_modification

# audit_rules_networkconfig_modification
-a always,exit -F arch=b64 -S sethostname -S setdomainname -k audit_rules_networkconfig_modification
-w /etc/issue -p wa -k audit_rules_networkconfig_modification
-w /etc/issue.net -p wa -k audit_rules_networkconfig_modification
-w /etc/hosts -p wa -k audit_rules_networkconfig_modification
-w /etc/sysconfig/network -p wa -k audit_rules_networkconfig_modification
# audit_rules_access_control – RHEL 6
-a always,exit -F arch=b64 -F auid=0 -S unlink -S unlinkat -S rename -S renameat -k root_delete
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k user_delete
-a always,exit -F arch=b64 -S chmod -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S chown -S fchown -S fchownat -S lchown -k change_perms
-a always,exit -F arch=b64 -S chown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchmod -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchmodat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchownat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fsetxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S lchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S lremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S lsetxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S removexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S setxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S creat -S open -S openat -S open_by_handle_at -S truncate -S ftruncate -F exit=-EACCES -F auid>=500 -F auid!=4294967295 -k access
-a always,exit -F arch=b64 -S creat -S open -S openat -S open_by_handle_at -S truncate -S ftruncate -F exit=-EPERM -F auid>=500 -F auid!=4294967295 -k access
-a always,exit -F arch=b64 -S mount -F auid>=500 -F auid!=4294967295 -k export
-a always,exit -F arch=b64 -S rmdir -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete
-w /etc/sudoers -p wa -k actions

# Audit para programas Jboss
# SETUID_PROG_PATH
#-a always,exit -F path=/home/jboss/jboss6/bin/ -F perm=x -F auid>=500 -F auid!=4294967295 -k eject_commands
##

Luego se debe reiniciar el servicio de auditd

$ service auditd restart

Para revisar que las reglas estén creadas podemos usar el comando:

$ auditctl -l

Ahora cada paso que se de en el sistema será registrado, uno de los problemas es que el archivo audit.log incrementa su tamaño muy rápido, y para eso hay dos configuraciones que debemos tomar en cuenta en el archivo /etc/audit/auditd.conf existen tres parámetros importantes:

num_logs = 5
max_log_file = 6
max_log_file_action = ROTATE

La primera es la cantidad de archivos de logs que se va a almacenar
la segunda es el tamaño máximo del archivo de log en megas
y la ultima es la acción que se va a tomar cuando llegue al máximo de tamaño.

Cuando estamos analizando logs importan 3 cosas:

  • Cantidad de archivos de log
  • Peso en MB de los archivos de log
  • Dispersión de datos

Más cantidad de archivos con menos espacio generan una mayor dispersión, esto hace que en contexto de audit buscar una fecha sea mucho mas complicado.
Dependiendo del nivel de historia que se requiera. Sugiero como mínimo almacenar 120MB de logs y/o 3 meses

num_logs = 12
max_log_file = 10
max_log_file_action = ROTATE
Comunmente

Comunmente en el Sysctl se deben agregar estas lineas, las cuales son recomendadas en OpenScap
# Antonio Insuasti 2015
# Basado en SCAP
fs.file-max = 4194304
kernel.exec-shield = 1
kernel.randomize_va_space = 2
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 26214400
net.core.somaxconn = 3000
net.core.wmem_max = 12582912
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_sack = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 10240 87380 12582912

History

Muchas veces se necesita saber la fecha en la que se ingresan los comandos, esto se puede hacer de forma global con un archivo en /etc/profile.d/ , lo llamaremos history.sh ( se tiene que agregar permisos de ejecución) y poner solo esta línea:

export HISTTIMEFORMAT=”%d/%m/%y %T ”

Links:

[1] http://www.open-scap.org/
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sect-Using_SCAP_Workbench.html
https://fedorahosted.org/scap-workbench/

Blogs:
http://foxglovesecurity.com/
http://linux-audit.com/
https://securityblog.redhat.com/
http://www.cyberciti.biz/

Reglas Udev – Para montar Discos

Caso particular: Mi laptop es una Lenovo X1 Carbon, Tiene 8GB en RAM y disco de 180 SSD.

El problema: Como tengo poco espacio adquirí un USB externo de 1TB USB v3.  Cree una partición EXT 4 de 500GB, este espacio me sirve para almacenar los discos de mis maquinas virtuales y necesito que cada vez que se conecte se monte en un espacio especifico el cual es: /storage/KVMDisks  y por otro lado el espacio debe pertenecer al usuario y al grupo con GUID 36 (qemu/KVM)

Como sabemos Fedora 20 monta los dispositivos en:

/var/run/media/{USER}/{FSLabel}

Como este no es el directorio en donde se debe montar esta partición lo que se debe hacer es crear una regla UDEV que se ejecute antes de las regla que monta los dispositivos USB.

 

udevadm info --query=all --name=/dev/sdb1 --attribute-walk

al final obtenemos la siguiente regla:

 

#  udevadm control –reload-rules
# udevadm info  –query=all –attribute-walk  –name=/dev/sdb1
# udevadm test –action=add $(udevadm info –query=path –name=/dev/sdb1)

10-local.rules

ACTION=="add|change", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="059b", ATTRS{idProduct}=="0070" , RUN+="/bin/mount /home/KVMHome"

Manual: http://www.reactivated.net/writing_udev_rules.html

https://fedoraproject.org/wiki/Getting_started_with_virtualization