Tabla de Contenidos
110.1 Perform security administration tasks
Pertenece a Topic 110: Security
- Weight: 3
- Description: Candidates should know how to review system configuration to ensure host security in accordance with local security policies.
- Key Knowledge Areas:
- Audit a system to find files with the suid/sgid bit set.
- Set or change user passwords and password aging information.
- Being able to use nmap and netstat to discover open ports on a system.
- Set up limits on user logins, processes and memory usage.
- Determine which users have logged in to the system or are currently logged in.
- Basic sudo configuration and usage.
- The following is a partial list of the used files, terms and utilities:
findpasswdfuserlsofnmapchagenetstatsudo/etc/sudoerssuusermodulimitwho,w,last
Auditar acceso de los usuarios al sistema
Privilegios Especiales
Los privilegios especiales de ejecución (bits SUID y SGID) suelen ser causa de inseguridad en el sistema. En efecto, un usuario malintencionado, aprovechando la falta de atención o la ausencia de un compañero o un administrador que no está desconectado de su consola, puede modificar los permisos de ciertos comandos a su favor.
El ejemplo más habitual es el de reescribir un shell como un programa poco usado (por ejemplo sx) y darle los privilegios SUID. Al iniciar este comando, se puede convertir en root.
Un fichero ejecutable con privilegio SUID o SGID podrá ejecutarse por cualquier usuario como si fuese el propio creador/propietario del mismo
El comando siguiente permite buscar todos los ficheros que disponen de los bits SUID o SGID:
find / -type f \( -perm -4000 -o -perm -2000 \)
Una medida de seguridad podría ser guardar el listado obtenido con el comando anterior e ir comparándolo habitualmente con nuevas ejecuciones para ver si ha habido cambios.
- Añade permisos SUID a un binario de ejemplo (usuario):
chmod u+s /home/user/ejecutable - Elimina permiso SUID a un binario de ejemplo (usuario):
chmod u-s /bin/user/ejecutable - Añade elimina permisos SGID a un binario de ejemplo (grupo):
chmod g+s /home/user/ejecutable - Elimina permisos SGID a un binario de ejemplo (grupo):
chmod g-s /home/user/ejecutable
Por ejemplo:
- Obtener el permiso de listar todos los ficheros:
chmod u+s /bin/cat - Quitar el permiso de ejecutar el comando ping:
chmod u-s /bin/ping
Política de Contraseñas
Las contraseñas son la base de la autenticación de un usuario. Deben ser seguras.
Los usuarios deben elegir una buena contraseña, evitando la sencillez o lo más bien lo evidente: nombres de los hijos, de la esposa, de lugares, fecha de nacimiento y, en general, todo lo que importa y que es conocido del entorno profesional o personal.
En Linux, por defecto, no pueden existir cuentas de usuario sin contraseña.
El comando chage nos permite definir parámetros de caducidad de contraseñas. Ejemplo:
# chage -l tempwin Minimum: 7 Maximum: 40 Warning: 10 Inactive: 5 Last Change: abr 10, 2008 Password Expires: may 20, 2008 Password Inactive: may 25, 2008 Account Expires: ene 01, 2010
Para configurar todos esos valores de forma interactiva, lanzamos el comando sin parámetros:
chage tempwin
Por defecto, las contraseñas no caducan
chage también lo podemos utilizar para obligar al usuario a cambiar la contraseña en el próximo inicio de sesión:
chage -d 0 tempwin
Los módulos PAM influyen en la política de gestión de las contraseñas, obligando en algunos casos a elegir una más o menos compleja.
Una buena configuración de PAM puede ayudarnos a ser más o menos estrictos en temas de contraseñas.
/etc/pam.conf/etc/pam.d/*
En estos ficheros se definen reglas con el siguiente formato:
servicio tipo control modulo argumentos
Podemos apilar reglas para crear sistemas de autenticación que tengan que ir cumpliendo condiciones
Ejemplo: Regla para endurecer contraseñas. Editamos /etc/pam.d/common-password:
password requisite pam_cracklib.so try_first_pass retry=3 minlength=12 lcredit=1 ucredit=1 dcredit=1 ocredit=1 difok=4
try_first_pass: número de intentos fallidos de contraseña.minlength: longitud mínima de la contraseñalcredit: número mínimo de minúsculas que debe contener la contraseñaucredit: número mínimo de mayúsculas que debe contener la contraseñadcredit: número mínimo de dígitos que debe contener la contraseñaocredit: número mínimo de otros caracteres que debe contener la contraseñadifok: números de caracteres en los que debe ser distinta la contraseña de la anterior
Seguimiento del login de usuarios
who: muestra los usuarios logueados en el sistemalast: muestra los ultimos usuarios logueadoslastb: muestra los intentos de login incorrectoslsof: muestra ficheros abiertos por un usuario o proceso
Usuarios:
lsof -u tempwin
Si queremos limitarlo a una ruta:
lsof -u -a +D /bin tempwin
Ficheros:
lsof /dev/sda1
Esto último es útil para saber quién está usando la partición /dev/sda1.
Si quisiésemos ver todos los puertos en escucha (LISTEN):
lsof -i -P -n
Visualizar los puertos TCP y UDP así como las conexiones activas en el sistema:
lsof -i | grep sshd
Buscar los procesos que usan un determinado puerto:
lsof -i :80
Ver archivos abiertos por un proceso o programa concreto:
lsof -c httpd
Mostrar procesos que usan IPv4 o IPv6:
lsof -i 4 lsof -i 6
Ver archivos abiertos por un rango de puertos:
lsof -i TCP:1-1024
Bloquear el usuario
Además de usermod, también podemos bloquear una cuenta con passwd:
passwd -l usuario
Para desbloquearla:
passwd -u usuario
Para ver la política de un usuario (y ver si está bloqueada, por ejemplo):
passwd -S usuario
sudo
El comando sudo permite asignar el derecho a ejecutar comandos de administrador (root) a uno o varios usuarios, en una o varias máquinas.
Para que un usuario pueda ejecutar un comando que, en principio, solo puede ejecutar root, debe añadirse un derecho sudo a este usuario para este comando.
En Debian, para tener sudo hay que instalar el paquete sudo
El fichero de configuración de sudo es /etc/sudoers. Es posible editarlo a mano o con el comando visudo. Este último comando comprueba la sintaxis del fichero en el momento de guardar.
La sintaxis queda algo tal que así:
user machine = (user2:group) command
Dónde:
user: el usuario (o alias) al cual se aplica la regla.machine: la máquina (o el alias) en la cual se aplica la regla.user2: la cuenta con la cual el usuario ejecutará el comandogroup: el grupo con la cual el usuario ejecutará el comando.command: el comando que se va a ejecutar.
Si no indicamos algo se supone ALL
Ejemplo:
john ALL=(ALL:ALL) NOPAWSSD:ALL | | | | | | | | | | | | | | todos los comandos | | todos los usuarios | | | | | | | | todos los grupos | host | usuario
Más ejemplos:
tempwin ALL= (ALL) /bin/vi /etc/http/conf/httpd.conf, /usr/bin/systemctl restart httpd, /usr/bin/passwd [A-z]*, !/usr/bin/passwd root
Ver el riesgo de la línea anterior más adelante
Le decimos que al usuario tempwin desde cualquier máquina y con cualquier grupo podrá editar el fichero /etc/http/conf/httpd.conf, reiniciar el servidor web Apache y cambiarle la contraseña a todo el mundo salvo a root.
Otro ejemplo:
tempwin ALL = /sbin/fsck
Estamos dando al usuario tempwin permisos para ejecutar un fsck.
Para dar permisos a todo un grupo (en lugar de ir usuario a usuario), anteponemos el signo del porcentaje (%):
%sudo ALL=(ALL:ALL) ALL
Configurando el archivo /etc/sudoers podemos:
- Crear grupos de usuarios.
- Crear grupos de máquinas.
- Crear grupos de comandos.
- Forzar o no el uso de una contraseña.
- Forzar la ejecución de un comando bajo un usuario distinto de root.
Ejemplo de posibilidades en /etc/sudoers:
Alias
User_Alias OPERATORS = joe, mike, jude User_Alias OP = root, operator Host_Alias SERVERS = 10.1.2.0/255.255.255.0 Cmnd_Alias PRINTING = /usr/sbin/cupsenable, /usr/bin/lpadmin
Reglas:
OPERATORS ALL = ALL pepito ALL = (OP) PRINTING %tecnicos SERVERS = ALL menganito ALL = /bin/ifconfig, /bin/ifup, /bin/ifdown
Un fichero con permisos especiales lo podremos ejecutar (si tenemos permisos) anteponiendo sudo:
sudo ls /root
Pediría la contraseña del usuario que está ejecutando el comando, no la del administrador.
Al ejecutar sudo, se queda registrado en el sistema su uso.
Es muy importante una configuración correcta del fichero /etc/sudoers para evitar que un usuario no administrativo logre permisos de root. Por ejemplo, si permitimos que un usuario pueda abrir un fichero , podríamos salir al shell desde el editor (vi) con :shell y nos convertiríamos en root. Los comandos vi, cat, more, less… tienen también escape de shell. Corrección:
tempwin ALL = (ALL) NOEXEC: /bin/vi /etc/http/conf/httpd.conf, /usr/bin/systemctl restart httpd, /usr/bin/less, /bin/rm
Si queremos ver los permisos o prohibiciones que tenemos aplicadas por sudo:
sudo -l
Si en el fichero /etc/sudoers habilitamos la línea:
Defaults log_output
Podremos usar el comando sudoreplay para ver todo lo que ha ido haciendo cada usuario al utilizar sudo:
sudoreplay <TSID>
Podríamos ver lo que escribió ese usuario en tiempo real.
Si queremos ver quién ha borrado ficheros usando sudo:
sudoreplay -l commando rm
También se puede filtrar por fecha:
sudoreplay -l fromdate 03/11/2021 sudoreplay -l todate 03/11/2021
Opor usuario y comando:
sudoreplay -l user <USUARIO> command <COMANDO>
loginctl
Este comando de systemd que permite listar e interactuar con usuarios y sesiones.
Acciones sobre sesiones:
list-sessions: lista las sesiones (el número de sesión es el ID de la sesión)session-statusshow-sessionterminate-sessionkill-session
Acciones sobre usuarios:
list-usersuser-statusshow-userterminate-userkill-user
Auditar conexiones de red
Algunas cuentas no deben ser interactivas: se deben prohibir las conexiones desde una consola. Se pueden asignar estas cuentas a una aplicación, a un servicio, a una conexión FTP, etc., pero se debería rechazar la conexión (¡no shell!)
Dentro del archivo /etc/shells podremos encontrar las shells más habituales. El shell /bin/false no es realmente un shell. Prohíbe las conexiones interactivas.
Si echamos un vistazo a /etc/passwd, veremos que las cuentas de sistema tiene asociada la shell /bin/false o /usr/sbin/nologin.
Si queremos cambiar la shell de un usuario: usermod -s /usr/sbin/nologin pepito. Con el ejemplo anterior, el usuario pepito no podrá iniciar sesión en el sistema, lo echará.
Antes de pasar por un pseudoshell de conexión, los módulos PAM permiten aplicar numerosas limitaciones. Entre ellas, el módulo pam_nologin, que le permite prohibir la conexión de los usuarios excepto root. Este módulo monitoriza si un usuario intenta conectarse al fichero /etc/nologin
nmap
Herramienta de exploración de red y de control de seguridad.
Permite probar las conexiones de red de una máquina determinada y obtener mucha información.
nmap host
En Debian se instala a través del paquete nmap
En particular, analizando tramas, logra determinar el tipo y la versión del sistema operativo remoto: nmap –A host
nmap -sP 192.168.1.*: barrido equipos activos.nmap <IP>: escaneo de puertos.nmap -A <IP>: escaneo completo.nmap -O <IP>: escaneo de SO.nmap -p<Puerto> <IP>: escaneo de puerto específico
netstat
Permite obtener información y estatísticas de red sobre una máquina local. En particular se puede comprobar cuáles son los puertos a la escucha en su máquina, quién ha establecido una conexión y qué procesos locales (servicios) están a la escucha.
netstat -putan
-p: PID y programa-u: UDP-t: TCP-a: ALL-n: Direcciones IP en vez de hosts
Límites
El comando ulimit permite modificar los límites de recursos disponibles para la shell.
Con ulimit -a podemos ver los límites que tiene establecido un usuario
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 24728 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 24728 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
Se pueden definir en el fichero /etc/security/limits.conf. Los límites se pueden establecer por usuarios o grupos. Ejemplo:
* hard nproc 200 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 @oracleinstall hard nproc 6384
El nombre de los grupos lleva el signo @ delante.
Los límites blandos (soft) lanzan un aviso y los duros (hard) establecen el límite máximo
Ejemplo de la utilidad de los límites con una bomba fork Bash GNU/Linux:
:(){ :|:& };:
:(): define la función:y la ejecuta{: primera instrucción de la función:: carga otra copia de la función:en memoria|: envía la salida a …:: … otra copia de la función:, la cual debe cargarse en memoria&: hace undisownde las funciones.. Si la primera:es finalizada, todas las funciones que dicha función ha empezado deberían cerrarse automáticamente.}: fun de la función:;: una vez definida:, debemos…:: … llamar a:iniciando una reacción en cadena. Cada:arrancará 2 más.
Para prevenir este ataque, si editamos el fichero /etc/security/limits.conf
* hard nproc 200
Estamos diciendo que ningún usuario podrá crear más de 200 procesos.
