JBoss CLi desde Ansible

JBoss CLi desde Ansible

Ejecutar comandos en JBoss Cli para modificar la configuración, agregar nueva funcionalidad, cambiar prioridades de los logs para encontrar problemas, o configurar un JBoss para una nueva aplicacion es una tarea muy facil, pero cuando se tienen varios cluster de servidores JBoss, varias instancias en un mismo servidor virtual, o crear containers de docker que se configure automaticamente para desplegar una aplicacion, la tarea con JBoss cli se vuelve un muy dificil.

Con la aparacicion de sistemas como chef y puppet esta tarea se vuelve un poco mas facil, pero ejecutar en estos entornos comandos JBoss-Cli es un poco complicado. Con la llegada de Ansible esto se volvio mas facil, el inconveniente es que hasta el momento no existe un modulo para conectarse a JBoss Cli y ejecutar comandos.
Cuando vi la necesidad de ejecutar comandos de JBoss Cli desde Ansible me di cuenta que los playbook y los comandos se volvian muy grandes y podian fallar y que era necesario crear un modulo, con esto en mente desarrolle un Modulo el cual pongo a su dispocicion para ejecutar comandos de JBoss Cli en ansible

El código lo pueden obtener desde mi repo en GitHub: https://github.com/Wolfant/ansible-jbossCli

El uso es muy facil primero debes clonar el repo, y copiar el archivo jbosscli.py en la carpeta de modulos de ansible comunmente en:

/usr/lib/python2.7/site-packages/ansible/modules/web_infrastructure

Con esto ya se puede empezar a usar el modulo desde PlayBooks o comandos simples

Ejemplo:

Para cambiar el intervalo del Deployement scaner:

- jboss:
    command: /subsystem=deployment-scanner/scanner=default:write-attribute(name=scan-interval,value=6000)
    cli_path: /home/user/wildfly-10.1.0.Final/bin

Si se tiene una clave generica para la autenticacion de JBoss CLi recomiendo configurar directamente en el codigo:


module = AnsibleModule(
argument_spec=dict(
src=dict(),
user=dict(default='USUARIO'),
password=dict(default='CONTRASEÑA'),
command=dict(),
cli_path=dict(default='/usr/share/wildfly/bin'),
server=dict(default='localhost:9990'),
verbose=dict(default="False"),
),
mutually_exclusive=[['command', 'src']],
)

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/