miércoles, 29 de abril de 2020

Linux: listar directorios por tamaño decreciente



Cómo ver una lista de directorios dentro de un directorio ordenados por uso de disco, presentados de mayor espacio usado a menor espacio usado, con un nivel de profundidad.



Si el espacio en disco de una máquina ha disminuido drásticamente en un corto período de tiempo, lo primero que debemos hacer es encontrar dónde se está escribiendo la información, es decir, en qué carpeta. Para ello, podemos usar este one-liner:

du -h --max-depth=1 | sort -hr

Vamos a descomponerlo:

• du utilidad que devuelve el espacio usado por cada uno de los directorios de una ruta.
- opción -h mostrar el resultado en formato "apto para humanos" (GB, MB, KB, etc.)
- opción--max-depth=1 mostrar subdirectorios a un nivel de profundidad.

• sort ordenar el resultado a mostrar por pantalla.
- opción -h mostrar el resultado en formato "apto para humanos" (GB, MB, KB, etc.)
- opción -r ordenar de forma inversa (de mayor a menor).

Un ejemplo de este comando lo podemos ver ejecutándolo dentro de la carpeta /var de un sistema:

root@host:/var # du -h --max-depth=1 | sort -hr 303M . 123M ./log 120M ./adm 44M ./cache 15M ./lib 2.6M ./spool 8.0K ./tmp 4.0K ./yp 4.0K ./opt 4.0K ./crash

El resultado del comando son los subdirectorios a un nivel de profundidad dentro de /var, ordenados por uso decreciente de espacio en disco.

Con esta información, podemos ir entrando directorio a directorio hasta encontrar la carpeta final donde más espacio se está usando, ver a qué aplicación pertenece y reconfigurar la aplicación de turno o aumentar el espacio en disco total del servidor.
0

jueves, 23 de abril de 2020

Obtener 'user logon name' dada una lista de nombres de personas en Active Directory



Cómo obtener el nombre de usuario de alguien en Active Directory sabiendo su nombre propio.



Puede que necesitemos saber el nombre de usuario (user logon name) de Active Directory de una lista de trabajadores de un depertamento de una empresa para aplicarles una configuración concreta. Si son 2 usuarios podemos buscarlos de forma manual, pero si tenemos que conseguir el user logon name de una cantidad considerable de usuarios, lo más efectivo es usar un script que lo haga por nosotros.

A continuación, muestro un par de scripts que nos permiten recuperar el user logon name de un usuario (o lista de usuarios) dado su nombre completo (full name) sobre un directorio activo corriendo en Windows Server 2016 o superior.

Imaginemos que tenemos una lista de usuarios llamada users.txt con nombres propios de usuarios, por ejemplo, Juan García, Javier Torres, Marta Varela, etc. uno en cada línea. Para extraer sus nombres de usuario de Active Directory podemos usar el siguiente script:

$List = Get-Content ".\users.txt"
ForEach ($User in $List) {
Get-ADUser -Filter "Name -eq '$User'" | Select-Object name, samaccountname
} 

El output del script será:

PS C:\Temp> C:\Temp\script.ps1 name samaccountname ---- -------------- Juan Garcia jgarcia Javier Torres jtorres Marta Varela mvarela Álvaro Gutiérrez agutierrez Martín Pérez mperez

De esta forma veremos el output en la terminal, pero ¿qué ocurre si queremos exportar el resultado a un archivo, como por ejemplo, un csv?

Con el siguiente script podemos escribir los nombres propios y los user logon name en un csv:

$aResults = @()
$List = Get-Content ".\users.txt"
ForEach($Item in $List){
$Item = $Item.Trim()
$User = Get-ADUser -Filter "Name -eq '$Item'" | Select-Object name, samaccountname
$hItemDetails = New-Object -TypeName psobject -Property @{
FullName = $Item
UserName = $User.SamAccountName
}
#Add data to array
$aResults += $hItemDetails
}
$aResults | Export-CSV ".\Results.csv"

Podemos modificar el script para escribir solo los user logon name en el archivo, si así lo necesitamos, quitando el parámetro name del selector Select-Object.


Fuentes:

https://stackoverflow.com/questions/20196647/get-users-samaccount-name-from-full-name

miércoles, 15 de abril de 2020

This server's certificate chain is incomplete



Cómo solucionar el problema "This server's certificate chain is incomplete. Grade capped to B." en el scanner de certificados SSL de Qualys (Qualys SSL Server Test).



Hoy en día no basta con instalar un certificado SSL en un servidor web y que este proteja las conexiones HTTPS. El certificado, además de estar presente, debe ser configurado en el servidor web de forma que cumpla con los estandares de seguridad vigentes.

Hay varias formas de comprobar si un certificado está correctamente instalado/configurado. Una de ellas es la herramienta online grauita Qualys SSL Server Test, la cual escanea un dominio y otorga una nota (A, B, C, etc.) a dicho dominio en función de su configuración de SSL.

Uno de los problemas más comunes al instalar un certificado y analizar su configuración es encontrarnos con el mensaje This server's certificate chain is incomplete:



Recordemos que un certificado SSL está compuesto por:

- Una clave privada (archivo .key)
- Una clave pública (archivo .crt)
- Certificados intermedios de la autoridad certificadora que haya emitido el certificado.

Teniendo en cuenta lo anterior, deberemos asegurarnos de instalar todos los certificados intermedios cuando instalemos un certificado SSL en un servidor web.

Algunos servidores web como Apache, permiten apuntar a cada uno de estos archivos individualmente, mientras que otros como NGINX o AWS Load Balancer necesitan que se encadenen la clave privada del certificado y los certificados intermedios para que el certificado quede correctamente instalado.

Para este último caso, debemos encadenar los certificados siguiendo un orden determinado:

claveprivada.crt
XXX_ServerCA2.crt
XXX_USERTrustRSACertificationAuthority.crt
AddTrustExternalCARoot.crt


Los encadenamos uno detrás de otro tal que así:

-----BEGIN CERTIFICATE----- Ddfst345wefsdgsfgxfv.... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- DGHUUY8dDF/YERGzrtdg/5... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- XZRUH3465ydg$$Rfdf&erT... -----END CERTIFICATE-----

Una vez hecho esto, re-escaneamos el dominio en cuestión y veremos que el analizador de Qualys ya no se queja de que el encadenamiento (chain) esté incompleto:



Listo, ya tenemos el certificado SSL bien configurado y con ello obtenemos una A en Qualys.
0

miércoles, 8 de abril de 2020

AWS: mover partición a un disco EBS en Linux



Mover carpeta a un disco EBS distinto al disco principal de una instancia EC2 Linux de AWS.



Puede que tengamos una instancia con un sistema operativo Linux en nuestra cuenta de AWS que ejecute una aplicación que trabaje sobre la carpeta /data. Y puede que esa carpeta vaya a crecer hasta llegar a más de 1 TB de información en los próximos meses. Si nos encontramos ante un caso similar, tiene sentido separar la carpeta /data en una partición independiente, montada en un disco EBS independiente, del cual podamos generar snapshots separados del disco de sistema operativo.

Para mover una carpeta a una partición independiente en un disco a parte, primero necesitamos crear ese disco a parte. Desde la consola de AWS, creamos un nuevo volumen EBS en el apartado 'Volumes'.

Adjuntamos este nuevo disco a la instancia sobre la que queramos hacer el cambio. En este caso, he adjuntado un disco de 50 GB que el sistema ve como xvdc:

admin@ip-10-10-10-10:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 10G 0 disk └─xvda1 202:1 0 10G 0 part / xvdb 202:16 0 30G 0 disk /var xvdc 202:32 0 50G 0 disk

Formateo el disco xvdc con el sistema de archivos ext4:

admin@ip-10-10-10-10:~$ sudo mkfs -t ext4 /dev/xvdc mke2fs 1.43.4 (31-Jan-2017) Creating filesystem with 13107200 4k blocks and 3276800 inodes Filesystem UUID: 4ac39902-6cdc-498a-b3e6-c68c47653629 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424 Allocating group tables: done Writing inode tables: done Creating journal (65536 blocks): done Writing superblocks and filesystem accounting information: done

Monto el disco temporalmente en /mnt:

admin@ip-10-10-10-10:~$ sudo mount /dev/xvdc /mnt

Sincronizo el contenido de /data a /mnt:

admin@ip-10-10-10-10:~$ sudo rsync -aulvXpogtr /data/* /mnt

Edito /etc/fstab para que /data se monte siempre al iniciar la máquina:

admin@ip-10-10-10-10:~$ sudo vi /etc/fstab

/dev/xvdc /data ext4 defaults 0 2

Desmonto el volumen EBS que está actualmente montado en /mnt:

admin@ip-10-10-10-10:~$ sudo umount /mnt

Muevo el contenido de la carpeta original a "data.original" a modo de backup:

admin@ip-10-10-10-10:~$ sudo mv /data /data.original

Creo un nuevo directorio data:

admin@ip-10-10-10-10:~$ sudo mkdir /data

Re-monto todas las particiones existentes en /etc/fstab:

admin@ip-10-10-10-10:~$ sudo mount -av / : ignored /data : successfully mounted

Reinicio la máquina:

admin@ip-10-10-10-10:~$ sudo reboot

Compruebo que /data se monta automáticamente sobre /dev/xvdc al iniciar la máquina:

admin@ip-10-10-10-10:~$ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 7.6G 0 7.6G 0% /dev tmpfs 7.6G 0 7.6G 0% /dev/shm tmpfs 7.6G 17M 7.6G 1% /run tmpfs 7.6G 0 7.6G 0% /sys/fs/cgroup /dev/xvda1 40G 1.5G 39G 4% / tmpfs 1.6G 0 1.6G 0% /run/user/1000 /dev/xvdc1 50G 228M 49G 1% /data

A partir de este momento, cada vez que se reinicie la máquina se montará /data en el volumen EBS, es decir, fuera del disco de sistema operativo. Ahora podemos generar snapshots específicos de este volumen, con una periodicidad distinta a los snapshots del disco principal.
0

miércoles, 1 de abril de 2020

Clonar máquina virtual VMware sin vCenter



Cómo clonar una máquina virtual en VMware sin usar vCenter, sin opción "Clonar".



Si nos conectamos directamente a un host con VMware ESXi, nos encontraremos con que no hay opción para clonar máquinas virtuales, a diferencia de cuando nos conectamos a un vCenter.

Para clonar una máquina virtual cuando no tenemos el botón "Clonar..." la mejor opción es clonar el disco duro mediante terminal, y luego adjuntar este disco a una nueva máquina virtual.

Para ello, nos conectamos por SSH al host y nos dirigimos a la carpeta vmfs:

[root@localhost:~] cd /vmfs [root@localhost:/vmfs] ls -la total 12 drwxr-xr-x 1 root root 512 Mar 12 15:43 . drwxr-xr-x 1 root root 512 Mar 27 12:30 .. lrwxrwxrwx 1 root root 5 Nov 23 04:32 devices -> /dev/ drwxr-xr-x 1 root root 512 Mar 31 10:14 volumes

Entramos en volumes y listamos los datastores:

[root@localhost:/vmfs] cd volumes/ [root@localhost:/vmfs/volumes] ls -la total 4100 drwxr-xr-x 1 root root 512 Mar 27 12:31 . drwxr-xr-x 1 root root 512 Mar 12 15:43 .. drwxr-xr-x 1 root root 8 Jan 1 1970 116ede77-c59075d9-c167-2342d555688d drwxr-xr-t 1 root root 73728 Mar 10 09:37 5e6648f3-ad5e617a-0077-3ce1a1280428 drwxr-xr-t 1 root root 73728 Mar 11 12:56 5e675e95-4dd83910-1e37-3ce1a1280428 drwxr-xr-t 1 root root 73728 Mar 12 12:28 5e675f1d-983e7940-f2e1-3ce1a1280428 drwxr-xr-x 1 root root 8 Jan 1 1970 5e67848a-3668261a-9c5a-3ce1a1280428 drwxr-xr-x 1 root root 8 Jan 1 1970 5e678491-190a564e-fc0e-3ce1a1280428 lrwxr-xr-x 1 root root 35 Mar 27 12:31 HANADATA-DS -> 5e675f1d-983e7940-f2e1-3ce1a1280428 lrwxr-xr-x 1 root root 35 Mar 27 12:31 HANAOS-DS -> 5e675e95-4dd83910-1e37-3ce1a1280428 drwxr-xr-x 1 root root 8 Jan 1 1970 ba262b74-a49e6a58-6d9e-76253d064338 lrwxr-xr-x 1 root root 35 Mar 27 12:31 datastore1 -> 5e6648f3-ad5e617a-0077-3ce1a1280428

Nos vamos al datastore donde se encuentre la máquina origen, en este caso HANAOS-DS:

[root@localhost:/vmfs/volumes] cd HANAOS-DS [root@localhost:/vmfs/volumes/5e675e95-4dd83910-1e37-3ce1a1280428] ls -la total 1485184 drwxr-xr-t 1 root root 73728 Mar 11 12:56 . drwxr-xr-x 1 root root 512 Mar 27 12:32 .. -r-------- 1 root root 12517376 Mar 10 09:32 .fbb.sf -r-------- 1 root root 134807552 Mar 10 09:32 .fdc.sf -r-------- 1 root root 268632064 Mar 10 09:32 .jbc.sf -r-------- 1 root root 16908288 Mar 10 09:32 .pb2.sf -r-------- 1 root root 65536 Mar 10 09:32 .pbc.sf -r-------- 1 root root 1074331648 Mar 10 09:32 .sbc.sf drwx------ 1 root root 69632 Mar 10 09:32 .sdd.sf -r-------- 1 root root 7340032 Mar 10 09:32 .vh.sf drwxr-xr-x 1 root root 77824 Mar 12 15:45 W20SRV drwxr-xr-x 1 root root 73728 Mar 12 15:46 W21SRV d-w-r-xr-T 1 root root 73728 Mar 10 12:20 vmkdump

Nos dirigimos a la carpeta que contiene la máquina a clonar, en este caso llamada W21SRV, y miramos el nombre de su disco (W21SRV.vmdk). Lo necesitaremos luego.

[root@localhost:/vmfs/volumes/5e675e95-4dd83910-1e37-3ce1a1280428] cd W21SRV/ [root@localhost:/vmfs/volumes/5e675e95-4dd83910-1e37-3ce1a1280428/W21SRV] ls -la total 168827072 drwxr-xr-x 1 root root 73728 Mar 27 12:39 . drwxr-xr-t 1 root root 73728 Mar 27 12:39 .. -rw------- 1 root root 172872433664 Mar 27 12:39 W21SRV-flat.vmdk -rw------- 1 root root 270840 Mar 21 05:58 W21SRV.nvram -rw------- 1 root root 502 Mar 12 15:46 W21SRV.vmdk -rw-r--r-- 1 root root 0 Mar 11 12:56 W21SRV.vmsd -rwxr-xr-x 1 root root 4959 Mar 27 12:39 W21SRV.vmx -rw------- 1 root root 47 Mar 12 15:17 W21SRV.vmxf -rw-r--r-- 1 root root 425670 Mar 11 12:59 vmware-1.log -rw-r--r-- 1 root root 703050 Mar 11 15:33 vmware-2.log -rw-r--r-- 1 root root 529093 Mar 12 15:17 vmware-3.log -rw-r--r-- 1 root root 478484 Mar 27 12:39 vmware.log

Creamos una máquina que se llamará TEMPLATE. Para ello, creamos el directorio TEMPLATE:

[root@localhost:/vmfs/volumes/5e675e95-4dd83910-1e37-3ce1a1280428] mkdir ../TEMPLATE

Por último, usamos la utilidad vmfstools para clonar el disco original a un nuevo archivo:

[root@localhost:/vmfs/volumes/5e675e95-4dd83910-1e37-3ce1a1280428/W21SRV] vmkfstools -i /vmfs/volumes/HANAOS-DS/W21SRV/W21SRV.vmdk /vmfs/volumes/HANAOS-DS/TEMPLATE/TEMPLATE.vmdk Destination disk format: VMFS zeroedthick Cloning disk '/vmfs/volumes/HANAOS-DS/W21SRV/W21SRV.vmdk'... Clone: 100% done.

Ahora creamos una nueva máquina virtual en el host:



Creamos una máquina virtual nueva:



Seleccionamos sistema operativo (el mismo que el de la máquina original), compatibilidad con VMware, etc. y pulsamos el botón siguiente.

Eliminamos el disco por defecto y añadimos un disco existente:



Seleccionamos el disco que hemos creado anteriormente haciendo un clon:



Finalizamos el asistente y ya tenemos la máquina creada, con el disco clonado de la otra máquina:



Llegados a este punto, toca revisar que las características de RAM, CPU y red sean las mismas que en la máquina original y listo, ya podemos encender la máquina virtual (NOTA: recordar cambiar la IP).
0