miércoles, 15 de enero de 2025

Permitir acceso solo a ciertas IPs en NGINX



Permitir acceso solo a ciertas IPs.



Nginx incluye un módulo llamado ngx_http_access_module, que permite controlar el acceso a hosts según la dirección IP de origen del cliente. Este módulo permite aceptar o denegar solicitudes a hosts. La sintaxis típica es:

location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; }

Las reglas se evalúan en orden, de arriba hacia abajo, hasta encontrar la primera coincidencia. En este ejemplo, se permiten las subredes `10.1.1.0/16` y `192.168.1.0/24`, excepto la IP concreta `192.168.1.1`. También se acepta tráfico desde la subred IPv6 `2001:0db8::/32`. El resto del mundo queda denegado.


¿Cómo implementarlo de forma segura?


1. Nunca edites directamente `nginx.conf` para modificar IPs. En su lugar, crea un archivo aparte con la lista de IPs que deseas permitir o bloquear. Nómbralo, por ejemplo, nginx-blockips.conf.

2. Agrega una línea para incluir este archivo dentro del bloque `http {}` de tu `nginx.conf`:

include /ruta/a/tu/nginx-blockips.conf;

3. En ese archivo (nginx-blockips.conf), puedes definir las reglas:

deny 192.168.1.1; deny 192.168.1.2; deny 192.168.2.0/24; allow 192.168.1.0/24; deny all;

4. Guarda los cambios, luego verifica la configuración:

nginx -t

Si todo está correcto, recarga Nginx:

nginx -s reload

Y ya puedes probar a acceder desde distintas IPs para comprobar el comportamiento de NGINX desde peticiones enviadas desde diferentes orígenes.


Personalizar la página de error 403


Por defecto, Nginx muestra una página de error 403 muy básica a los clientes cuya IP de origen está incluida en una lista de acceso como no permitida. Para personalizarla:

1. Crea un archivo HTML en el directorio de tu sitio (por ejemplo, `error403.html`):

<html> <head><title>Error 403 – Acceso denegado</title> </head> <body> No tienes permiso para acceder a esta página. No intentes de nuevo. </body> </html>

2. Añade en tu bloque `server {}`:

error_page 403 /error403.html; location = /error403.html { allow all; }

Con esto, Nginx mostrará esa página personalizada en lugar de la predeterminada.
0

miércoles, 8 de enero de 2025

Ver los tipos de cifrado Kerberos de un equipo



Cómo comprobar qué tipo de cifrado Kerberos acepta un equipo de dominio con PowerShell.



En entornos de Active Directory (AD), la autenticación Kerberos es fundamental para la seguridad y el acceso a los recursos de la red. En este tipo de entornos, cada equipo tiene un atributo llamado `msDS-SupportedEncryptionTypes`, el cual indica los tipos de cifrado Kerberos que admite.

Para consultar esta propiedad en un equipo específico, podemos utilizar este comando de PowerShell:

Get-ADComputer -Identity "WBCNDC01" -Properties msDS-SupportedEncryptionTypes | Select-Object -ExpandProperty msDS-SupportedEncryptionTypes

Este comando obtiene la propiedad `msDS-SupportedEncryptionTypes` del equipo WBCNDC01, devolviendo un valor numérico que representa los tipos de cifrado compatibles.


Entendiendo msDS-SupportedEncryptionTypes


El atributo `msDS-SupportedEncryptionTypes` es un campo de bits (bitmask) que indica qué métodos de cifrado son compatibles. Los valores posibles son los siguientes:

0: No se admite el cifrado.
1: DES-CBC-CRC.
2: DES-CBC-MD5.
4: RC4-HMAC.
8: AES128-CTS-HMAC-SHA1-96.
16: AES256-CTS-HMAC-SHA1-96.
24: AES128 + AES256.
31: Todos los cifrados mencionados anteriormente.

Si el comando devuelve, por ejemplo, 24, significa que el equipo admite AES128 y AES256, pero no DES ni RC4. Si el valor devuelto es un número diferente a los mencionados, significa que se trata de una combinación de cifrados activados. Para determinar los cifrados habilitados, se puede analizar el valor como una suma de los valores de la tabla anterior.

Por ejemplo, si el resultado es 20, significa:

4: RC4-HMAC
16: AES256-CTS-HMAC-SHA1-96

Esto indica que el equipo admite RC4-HMAC y AES256, pero no AES128 ni DES.


Desglose automático


Para facilitar esta interpretación, podemos usar el siguiente script de PowerShell para desglosar el valor:

$encryptionTypes = @{
    1 = "DES-CBC-CRC"
    2 = "DES-CBC-MD5"
    4 = "RC4-HMAC"
    8 = "AES128-CTS-HMAC-SHA1-96"
    16 = "AES256-CTS-HMAC-SHA1-96"
}

$computer = Get-ADComputer -Identity "WBCNDC01" -Properties msDS-SupportedEncryptionTypes
$encryptionValue = $computer."msDS-SupportedEncryptionTypes"

Write-Host "El equipo admite los siguientes cifrados:"
foreach ($key in $encryptionTypes.Keys) {
    if ($encryptionValue -band $key) {
        Write-Host "- " $encryptionTypes[$key]
    }
}

Este script mostrará una lista detallada de los cifrados habilitados en el equipo consultado (WBCNDC01).


Modificar los tipos de cifrado admitidos


Si es necesario cambiar los tipos de cifrado admitidos en un equipo, se puede modificar el atributo `msDS-SupportedEncryptionTypes` con el siguiente comando de PowerShell:

Set-ADComputer -Identity "WBCNDC01" -Add @{msDS-SupportedEncryptionTypes=24}

En este caso, estamos estableciendo el valor 24, lo que habilita AES128 y AES256.


Conclusión


El comando `Get-ADComputer` permite obtener los tipos de cifrado Kerberos compatibles en un equipo de Active Directory, lo que es útil para garantizar la seguridad y compatibilidad de los sistemas.
0

miércoles, 1 de enero de 2025

Liberar espacio ocupado "fantasma" en Linux



Cómo encontrar y liberar espacio ocupado no presente en directorios en Linux.



Me he dado cuenta de que un servidor con un disco de 150 GB tenía 118 GB usados:

HOST # ip-10-250-7-164:/home/ec2-user # df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 7.9G 4.0K 7.9G 1% /dev/shm tmpfs 3.2G 8.8M 3.2G 1% /run tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup /dev/xvda3 150G 119 32G 80% / /dev/xvda2 20M 146K 20M 1% /boot/efi tmpfs 1.6G 0 1.6G 0% /run/user/1000

Mirando qué estaba ocupando este espacio veo:

HOST # du -h --max-depth=1 | sort -hr du: cannot access './proc/22284/task/22284/fd/4': No such file or directory du: cannot access './proc/22284/task/22284/fdinfo/4': No such file or directory du: cannot access './proc/22284/fd/3': No such file or directory du: cannot access './proc/22284/fdinfo/3': No such file or directory 32G . 19G ./var 5.8G ./srv 3.6G ./usr 2.1G ./home 591M ./opt 524M ./lib 321M ./run 106M ./boot 24M ./etc 15M ./tmp 9.0M ./sbin 8.5M ./lib64 7.3M ./root 744K ./bin 16K ./dev 8.0K ./CPAN 0 ./sys 0 ./selinux 0 ./proc 0 ./mnt

¿Dónde está el resto del espacio usado?

Si un proceso activo mantiene abierto un archivo que ha sido eliminado, el espacio sigue ocupado hasta que el proceso en cuestión se detenga.

Para encontrar estos archivos:

HOST # lsof | grep deleted nscd 628 nscd 10u REG 0,25 217032 860 /run/nscd/dbEp42mF (deleted) nscd 628 nscd 11r REG 0,25 217032 860 /run/nscd/dbEp42mF (deleted) nscd 628 651 nscd nscd 10u REG 0,25 217032 860 /run/nscd/dbEp42mF (deleted) nscd 628 651 nscd nscd 11r REG 0,25 217032 860 /run/nscd/dbEp42mF (deleted) ...

En este caso, se observa que el proceso nscd tiene archivos abiertos.
Para liberar el espacio usado por todos estos archivos, reinicio el servicio:

HOST # systemctl restart nscd

Hecho esto, el espacio usado de forma "fantasma" se ha liberado:

HOST # df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 7.9G 4.0K 7.9G 1% /dev/shm tmpfs 3.2G 8.8M 3.2G 1% /run tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup /dev/xvda3 150G 32G 119G 22% / /dev/xvda2 20M 146K 20M 1% /boot/efi tmpfs 1.6G 0 1.6G 0% /run/user/1000

Si esto no hubiera funcionado, se podría reiniciar el servidor para liberar todo el espacio ocupado.
0

miércoles, 25 de diciembre de 2024

Habilitar SSL en switches Aruba



Habilitar acceso HTTPS a switches Aruba.



En este artículo veremos cómo habilitar la gestión web segura (HTTPS) en un switch HPE utilizando un certificado self-signed (autofirmado). Esto es útil para evitar el uso de HTTP sin cifrar.

Paso 1: Configurar el perfil de identidad

Lo primero que debemos hacer es definir el perfil de identidad del certificado que usaremos:

SWITCH2# config SWITCH2(config)# crypto pki identity-profile myid subject Enter Common Name(CN) : 10.10.10.1 Enter Org Unit(OU) : LT Enter Org Name(O) : LT Enter Locality(L) : LT Enter State(ST) : LT Enter Country(C) : LT

En este paso, proporcionamos la información básica del certificado, incluyendo:

- CN (Common Name): Normalmente, la IP o el dominio del switch.
- OU (Organizational Unit), O (Organization), L (Locality), ST (State), C (Country): Datos de la organización.

Paso 2: Generar un certificado autofirmado

Ahora, generamos un certificado autofirmado con el nombre "mycert":

SWITCH2(config)# crypto pki enroll-self-signed certificate-name mycert

Esto creará y almacenará un certificado en el switch.

Paso 3: Habilitar la gestión web segura (HTTPS)

Para asegurarnos de que la gestión web solo esté disponible mediante HTTPS, ejecutamos:

SWITCH2(config)# web-management ssl SWITCH2(config)# no web-management plaintext

- web-management ssl habilita HTTPS.
- no web-management plaintext deshabilita HTTP, asegurando acceso solo vía HTTPS.

Paso 4: Verificar la configuración

Para confirmar que HTTPS está habilitado correctamente, usamos:

SWITCH2(config)# show web-management

Salida esperada:

Web Management - Server Configuration HTTP Access : Disabled HTTPS Access : Enabled SSL Port : 443 Idle Timeout : 600 seconds Management URL : http://h17007.www1.hpe.com/device_help Support URL : https://www.hpe.com/us/en/networking.html User Interface : Improved

Esta salida confirma que HTTP está deshabilitado y que solo se permite acceso por HTTPS.
0

miércoles, 18 de diciembre de 2024

Limpieza de cachés en Linux



Cómo limpiar la memoria caché manualmente en un sistema operativo GNU/Linux.



En sistemas GNU/Linux, la gestión de memoria es una de las tareas más críticas del kernel. Para optimizar el rendimiento, el sistema utiliza técnicas como el "caching" agresivo de páginas de disco - entendiendo páginas de disco como las páginas de memoria que el sistema ha leído desde disco y mantiene en RAM para acelerar accesos futuros - y estructuras de datos del sistema de archivos. Sin embargo, en algunas situaciones específicas puede ser útil o necesario liberar estas cachés de forma manual en vez de dejar esta tarea en manos del kernel.

Uno de los comandos más conocidos para este propósito es:

HOST # sudo sync && sudo sysctl -w vm.drop_caches=3

En este artículo analizaremos en detalle qué hace exactamente este comando, cuándo se puede usar y qué precauciones hay que tener al usarlo.


¿Qué hace este comando?


Vamos a desglosarlo en dos partes:

1. sync

El comando `sync` se encarga de vaciar los búferes de escritura del sistema. Es decir, fuerza a que todos los datos pendientes de escritura en disco se sincronicen inmediatamente. Esto es importante antes de liberar cachés, para evitar perder datos que aún no se han escrito físicamente en el disco.

2. sysctl -w vm.drop_caches=3

Este comando instruye al kernel de Linux para que libere diferentes tipos de cachés en memoria:

* vm.drop_caches=1: libera el page cache, es decir, las páginas de archivos almacenadas en memoria.
* vm.drop_caches=2: libera las dentries e inodes.
* vm.drop_caches=3: libera ambos tipos de caché: page cache, dentries e inodes.

Al establecer `vm.drop_caches=3`, se fuerza al sistema a liberar todo lo posible (page cache, dentries e inodes) sin matar procesos ni reiniciar servicios.


¿Por qué o cuándo usar este comando?


Aunque Linux gestiona muy eficientemente la memoria y el uso de cachés, hay situaciones en las que podría tener sentido forzar esta limpieza:

* Pruebas de rendimiento (benchmarks): obtener medidas limpias, eliminando el impacto de cachés.
* Sistemas con poca memoria: último recurso en entornos con poca RAM.
* Si el sistema usa mucha swap, este comando no arreglará el problema.
* Desarrollo: probar scripts o aplicaciones que dependen de operaciones de lectura/escritura en disco.
* Después de copiar o mover archivos muy pesados, para liberar RAM rápidamente.
* Eliminar cachés hace que estas se tengan que volver a cargar desde disco, ralentizando el sistema.
* No debe usarse como tarea programada o cron job regular: reduce la eficiencia del sistema operativo.
* No libera memoria usada por procesos, solo actúa sobre la memoria usada para cachés de disco.


¿Cómo verificar el efecto?


Se puede observar el uso de la memoria antes y después de usar el comando usando `free -h`:

HOST # free -h

También se pueden examinar los detalles de las cachés desde `/proc/meminfo`:

HOST # grep -E 'Cached|MemFree' /proc/meminfo


Alternativas o enfoques complementarios


Si se necesita liberar memoria RAM consumida por procesos concretos, lo más adecuado no es forzar la limpieza de cachés del sistema, sino actuar directamente sobre esos procesos. Una opción sencilla puede ser reiniciar los servicios que están utilizando demasiada memoria, especialmente si son aplicaciones que tienden a acumular consumo con el tiempo, como servidores web o bases de datos.

Para tener una visión más clara del uso de recursos por parte de los procesos, se pueden emplear herramientas como `systemd-cgls`, que muestra de forma jerárquica los grupos de control (cgroups) activos, permitiendo identificar fácilmente qué servicios o usuarios están consumiendo más recursos.

Por otro lado, si se trabaja en un entorno donde el manejo de la memoria debe ser más fino o automático, existen herramientas y configuraciones avanzadas que pueden ayudarte. Por ejemplo, `drop_caches.sh` es un script que automatiza la limpieza de cachés bajo ciertas condiciones.

También se pueden considerar tecnologías como `zram`, que comprime datos en la RAM para maximizar su uso sin necesidad de escribir en disco, o servicios como `earlyoom`, que monitorizan el uso de memoria y pueden finalizar automáticamente procesos antes de que el sistema entre en una situación crítica. Estas soluciones están especialmente pensadas para sistemas con recursos limitados o para garantizar una mayor estabilidad en entornos exigentes.


Conclusión


El comando `sudo sync && sudo sysctl -w vm.drop_caches=3` es una herramienta útil cuando se necesita controlar de forma precisa cómo el sistema utiliza la memoria. Usado en situaciones justificadas, puede ayudar a diagnosticar problemas, liberar recursos temporalmente o preparar entornos de prueba.
0

miércoles, 4 de octubre de 2023

Comprobar si un usuario pertenece a un grupo



Cómo verificar si un usuario pertenece a un grupo de Active Directory con PowerShell.



Imaginemos que tenemos un archivo de texto con una lista de usuarios de Active Directory y queremos saber si esos usuarios son miembros de un grupo.

Podemos leer el archivo, en el cual cada usuario debe ocupar una línea, y verificar que el usuario sea miembro del grupo, con un script de PowerShell.

Para ello, podemos ejecutar el siguiente script desde un controlador de dominio:

$groupName = "Grupo"

$userList = Get-Content -Path "C:\Scripts\usuarios-origen.txt"
$outputFilePath = "C:\Scripts\usuarios-en-grupo.txt"

foreach ($user in $userList) {
    $isMember = Get-ADUser $user | Get-ADPrincipalGroupMembership | Where-Object { $_.Name -eq $groupName }
    
    if ($isMember) {
        "$user" | Tee-Object -FilePath $outputFilePath -Append
    }
}

El nombre del grupo es "Grupo" y debe especificarse dentro de la variable "$groupName".

La ruta con el archivo de texto que contiene la lista de usuarios debe especificarse en "$userList".

Asimismo, el script usa el cmdlet "Tee-Object" el cual muestra por pantalla el output al mismo tiempo que lo graba en un archivo de texto, en este caso, el especificado en la variable "$outputFilePath".
0