Bitácora de EleKtR0

English - Italiano - Deutsch - Français - Português - русский

6 de diciembre de 2025

Implementaciones libres de S3

Lista de implementaciones open source del protocolo S3 para almacenamiento en red: 

RustFS
PetaSAN
Minio
Garage
SeaweedFS
Ceph+RadosGateway

Etiquetas: ,

16 de enero de 2025

Imágenes para localizar problemas en Kubernetes / Docker Swarm

Indico aquí una lista de imágenes interesantes para encontrar problemas en Kubernetes o Docker Swarm:

Echo Server. Un nginx que devuelve en cada petición todo el contenido de la petición incluyendo las cabeceras HTTP:
registry.k8s.io/echoserver:1.10

Imagen de Traefik que devuelve en cada petición todo el contenido de la petición incluyendo las cabeceras HTTP:
traefik/whoami:latest

Una imagen basada en Debian Jessie con herramientas (dig, nslookup, etc) para localizar problemas de resolución de nombres:
registry.k8s.io/e2e-test-images/jessie-dnsutils:1.7

Otra imagen con herramientas para localizar problemas de resolución de nombres:
registry.k8s.io/e2e-test-images/agnhost:2.53

En esta URL encontramos otras muchas imágenes útiles creadas por la gente de Kubernetes para testeo y depuración: https://raw.githubusercontent.com/kubernetes/k8s.io/main/registry.k8s.io/images/k8s-staging-e2e-test-images/images.yaml

Etiquetas: , ,

29 de junio de 2024

Mis optimizaciones al instalar un sistema Linux

Anoto por aquí una serie de cosas a tener en cuenta al instalar un nuevo sistema Linux para optimizarlo todo lo posible: 

- Habilitar zram. En Debian instalo el paquete zram-tools y habilito el servicio zramswap.service en systemctl

- Usar noatime,nodiratime o relatime en los sistemas de ficheros de Linux para evitar escrituras innecesarias (/etc/fstab)

- Añadir los parámetros --disk-cache-dir=/dev/null --disk-cache-size=1 al arranque de Chrome / Chromium para deshabilitar la caché y evitar escrituras innecesarias en disco (/etc/chromium.d/default-flags).

- Establecer browser.cache.disk.enable=false en about:config de Firefox para deshabilitar la caché y evitar escrituras innecesarias en disco.

- Deshabilitar servicios innecesarios en systemctl.

- Deshabilitar ipv6 si no vamos a usarlo: 

  net.ipv6.conf.all.disable_ipv6 = 1 

  net.ipv6.conf.default.disable_ipv6 = 1 

  net.ipv6.conf.lo.disable_ipv6 = 1 

  net.ipv6.conf.tun0.disable_ipv6 = 1 

- Deshabilitar ipv6 en NetworkManager, ya que por defecto escucha en el puerto 546/udp:

 nmcli connection modify <nombre_conexion> ipv6.method ignore 

- Montar /tmp y /var/tmp como tmpfs

 

Etiquetas: , ,

25 de abril de 2024

Configuración por defecto de JVM

Para obtener la configuración por defecto de JVM, incluyendo valores de memoria, se puede usar este comando:
java -XX:+PrintFlagsFinal -version

Etiquetas: , ,

18 de abril de 2024

Obteniendo licencia de Windows OEM desde la BIOS

Para obtener el número de licencia de Windows versión OEM que tengamos en la BIOS podemos usar este comando en Linux:
strings /sys/firmware/acpi/tables/MSDM | grep -E '[A-Z0-9]{5}(-[A-Z0-9]{5}){4}'
Necesitaremos ejecutarlo como usuario root para que el comando funcione.

En Windows se puede consultar ejecutando este comando en PowerShell como administrador:
wmic path softwarelicensingservice get OA3xOriginalProductKey

Etiquetas: , ,

28 de diciembre de 2023

Chuleta rápida de comandos Linux

La web cheat.sh es una maravilla que permite obtener una referencia rápida y ejemplos de uso de comandos Linux.

Para consultar algo desde línea de comandos de forma rápida podemos añadir al fichero .bashrc lo siguiente:

alias cheat='function _cheat(){ curl cheat.sh/$1; };_cheat'

 Y lo usaríamos de la siguiente forma para consultar ejemplos de openssl:

cheat openssl

Etiquetas: , ,

22 de octubre de 2023

Aceleracion hardware en el navegador

Hay muchos artículos donde explican cómo habilitar la aceleración por hardware en el navegador pero no es tan sencillo encontrar la forma de consultar en los principales navegadores de Linux si la aceleración por hardware está funcionando por lo que dejo las URLs necesarias para Chrome / Chromium y Firefox:

Chrome / Chromium: chrome://gpu/

Firefox: about:support

En el caso de Chrome y derivados podemos consultar información interna sobre las reproducciones que estemos realizando, si por ejemplo estamos reproduciendo un vídeo en Youtube, abriendo otra pestaña con la URL chrome://media-internals/

Hay una lista de las URLs internas de Chrome y derivados para obtener todo tipo de información en https://beebom.com/chrome-urls/

Etiquetas: , , , , ,

2 de junio de 2023

Recargar configuración de Jenkins desde disco

Si hemos modificado alguna configuración de Jenkins o una tarea directamente accediendo a los ficheros en disco y queremos recargar esa configuración hay que hacerlo desde la Script Console ejecutando el siguiente comando:

Jenkins.instance.getAllItems(AbstractItem.class).each { it.doReload() }; 
No funcionará hacerlo de otra forma porque tanto la opción de recarga de configuración que ofrece Jenkins en la pantalla de administración como intentarlo con Jenkins-cli no produce el resultado esperado. Hay un bug en esta funcionalidad que sigue abierto en la URL https://issues.jenkins.io/browse/JENKINS-30870

Etiquetas: , ,

12 de mayo de 2023

Instalación desatendida de Red Hat Enterprise Linux

Para realizar una instalación desatendida de Red Hat Enterprise Linux con un fichero kickstart necesitaremos crear este fichero a partir del que se copia en la ruta /root/anaconda-ks.cfg tras una instalación previa o bien desde cero con la documentación de este formato de fichero El siguiente paso será arrancar con una ISO de RHEL, que puede ser Boot iso ya que no vamos a necesitar otra cosa si instalamos los paquetes desde un repositorio en red, con estos parámetros en la pantalla inicial:
inst.ks=http://IP_SERVIDOR_WEB/ks.cfg ip=IP_ESTATICA::GATEWAY:NETMASK:HOSTNAME.DOMAIN:INTERFAZ:none 
 

 IP_SERVIDOR_WEB es la ip del servidor web donde alojamos el fichero kickstart

IP_ESTATICA es la ip de la interfaz de red local que se configura inicialmente donde instalamos para poder acceder al servidor web anterior

GATEWAY ip del gateway

NETMASK máscara de subred de la interfaz de red local

HOSTNAME.DOMAIN nombre y dominio que tendrá inicialmente el equipo

INTERFAZ nombre de la interfaz de red, normalmente enp1s0 o eth0 

 

Un ejemplo de fichero kickstart sería el siguiente:

# Generated by Anaconda 34.25.0.29
# Generated by pykickstart v3.32
#version=RHEL9

text 
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream

%addon com_redhat_kdump --disable

%end

# Keyboard layouts
keyboard --xlayouts='es'
# System language
lang es_ES.UTF-8

# Network information
network  --bootproto=dhcp --device=enp1s0 --noipv6 --no-activate

# Use CDROM installation media
cdrom

%packages
@^minimal-environment

%end

# Run the Setup Agent on first boot
firstboot --enable

# Generated using Blivet version 3.4.0
ignoredisk --only-use=vda
autopart
# Partition clearing information
clearpart --none --initlabel

timesource --ntp-disable
# System timezone
timezone Europe/Madrid --utc

# Root password
rootpw --iscrypted $6$d2fDfieZew3$7dP/2Movv18TJoIZ9KEM4Iwei0NF6m6a9dDAGMj013f2qu6ReLIv9geB/BFBcQ1vrjKFA5VICIo0yS8S4ze0r/

Etiquetas: ,

10 de mayo de 2023

Desconectar un pendrive / disco USB de forma segura

La forma más segura de desconectar un disco externo USB o un pendrive en Linux es desmontar el dispositivo con umount y ejecutar uno de estos dos comandos, dependiendo de lo que tengamos instalado en el sistema y distribución Linux:
udisksctl power-off -b /dev/sdb

udisks --detach /dev/sdb
El disco /dev/sdb debe cambiarse por el que queramos desconectar de forma segura.

Etiquetas: ,

8 de junio de 2022

ModSecurity en Nginx Ingress Controller - Kubernetes

Para habilitar ModSecurity en una publicación concreta al usar Nginx Ingress Controller en Kubernetes hay que añadir las siguientes anotaciones:
nginx.ingress.kubernetes.io/enable-modsecurity: "true"
nginx.ingress.kubernetes.io/enable-owasp-core-rules: "true"
nginx.ingress.kubernetes.io/modsecurity-transaction-id: "$request_id"
nginx.ingress.kubernetes.io/modsecurity-snippet: |
  SecRuleEngine On

Fuente: ModSecurity with ingress-nginx

Etiquetas: , ,

9 de octubre de 2021

Resetear contraseña de root en MariaDB / MySQL

 

Si necesitamos arrancar una base de datos MySQL / MariaDB de la que no conocemos la contraseña del usuario root podemos hacerlo con lanzando el demonio de la base de datos con el comando mysqld o mysqld_safe con el parámetro --init-file=FICHERO

FICHERO debe ser un fichero que contenga un comando SQL , sin comentarios, para cambiar la contraseña de root. Por ejemplo:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('prueba');

Arrancaríamos la base de datos con

mysqld_safe --init-file=FICHERO
y probaríamos a entrar con mysql -u root -p usando la contraseña que hemos puesto.

En las pruebas que he hecho he tenido que poner el fichero usado en el parámetro --init-file en el directorio donde se ubican los datos de MySQL / MariaDB, por defecto en /var/lib/mysql, ya que con SELinux habilitado no era posible leerlo en otras ubicaciones con otro contexto.

Etiquetas: ,

18 de diciembre de 2020

Obtener YAML desplegado por HELM

 

Para obtener el yaml desplegado por Helm en un cluster Kubernetes usamos el siguiente comando donde  indicaremos el nombre de la versión desplegada, que puede consultarse con el comando helm list -n NAMESPACE y el nombre del namespace si hemos desplegado en un namespace que no es default

helm get manifest RELEASE_NAME -n NAMESPACE
  
Para obtener los values que ha usado Helm en el despliegue usaríamos el comando:
 
helm get values RELEASE_NAME -n NAMESPACE 

Etiquetas: , ,

9 de septiembre de 2020

Forzar eliminación de namespace Kubernetes en estado "Terminating"

Tres formas distintas de eliminar un namespace de Kubernetes que se queda en estado Terminating al ejecutar el comando kubectl delete namespace:
 
1º Forzar eliminación del namespace:
 
NAMESPACE=mynamespace
kubectl delete namespace $NAMESPACE --force=true --grace-period=0
 
 
2º Buscar recursos asociados al namespace para eliminarlos manualmente si queda alguno:
 
NAMESPACE=mynamespace
for rsType in $(kubectl api-resources --verbs=list --namespaced -o name 2>/dev/null)
do  
    echo Resource: $rsType;  
    kubectl get --show-kind --ignore-not-found -n $NAMESPACE $rsType;  
done;
 
3º Eliminar los finalizers del namespace:
 
NAMESPACE=mynamespace
TEMP=$(mktemp)
 
kubectl get namespace $NAMESPACE -o json > $TEMP
jq 'del(.spec.finalizers[])' $TEMP
 
curl -H "Content-Type: application/json" -X PUT --data-binary @$TEMP http://127.0.0.1:8080/api/v1/namespaces/$NAMESPACE/finalize
 
wait 15
 
kubectl get namespaces
 
rm -f $TEMP

Etiquetas: ,

28 de julio de 2020

Obtener grupos en inventario de Ansible

Dos formas de obtener una lista, desde línea de comandos, de los grupos que tiene el inventario de Ansible:

ansible localhost -m debug -a 'var=groups'

ansible localhost -m debug -a 'var=groups.keys()'

Etiquetas: , ,

10 de julio de 2020

Obtener URLs de publicación de servicios Docker y K8S


Para obtener las URLs donde se publican servicios, usando Docker Enterprise:
for servicio in $(docker service ls -f label=com.docker.lb.hosts --format "{{.Name}}")
do

docker service inspect "$servicio" --format '{{ range $k, $v := .Spec.Labels }}{{ $k }}={{ $v }} {{end}}' | \
tr " " "\n" | awk -F= '/com.docker.lb.hosts/ { print $NF }'

done;

Para obtener las URLs donde se publican servicios mediante Istio Ingress en Kubernetes:
kubectl get virtualservice -A --no-headers -o custom-columns=HOSTS:.spec.hosts | sed 's/\[//; s/\]//; s/ /\n/' 

Etiquetas: , , ,

21 de mayo de 2020

Configuración de swap con zram

Para usar dispositivos zram en la configuración de swap en Fedora es tan sencillo como instalar el paquete zram y configurar el fichero /etc/zram.conf con el porcentaje de memoria que asignaremos como swap pero en otras distribuciones lo más sencillo es configurar una regla de udev para asignar la memoria que queramos, formatear el dispositivo con mkswap y configurarlo en /etc/fstab con una prioridad alta para que se use preferiblemente antes que la swap en disco.


Para estas distribuciones donde no es tan sencillo como instalar un paquete y arrancar un servicio, pongo este script donde uso 1024M de memoria para swap con algoritmo de compresión lz4:


echo "zram" > /etc/modules-load.d/zram.conf

echo "options zram num_devices=1" > /etc/modprobe.d/zram.conf

echo 'KERNEL=="zram0", ATTR{disksize}="1024M", ATTR{comp_algorithm}="lz4", \
RUN="/sbin/mkswap /dev/zram0", TAG+="systemd"' > /etc/udev/rules.d/99-zram.rules

echo "/dev/zram0 none swap defaults,pri=1000  0 0" >> /etc/fstab


Hay que tener en cuenta la ruta del comando mkswap, que en derivados de RedHat está en /sbin, y la cantidad máxima de memoria que queremos asignar como swap comprimida, en este ejemplo es 1024M. El algoritmo de compresión usado por defecto es lzo pero lz4 es más rápido al comprimir / descomprimir. Los algoritmos de compresión disponibles dependen de las opciones de compilación del kernel usado. Pueden consultarse con el comando cat /sys/block/zram0/comp_algorithm

Al reiniciar el sistema el comando zramctl debe mostrarnos el dispositivo /dev/zram0 con la memoria usada tras comprimir y lo que ocuparía sin comprimir. El comando cat /proc/swaps debe mostrar los dispositivos de swap configurados, el uso de cada uno y su prioridad. Se hará uso de dispositivos de swap por orden de prioridad de mayor a menor

Recordar que si se hace un uso intensivo de swap habrá un mayor uso de CPU al comprimir / descomprimir las páginas de memoria que entran o salen del dispositivo zram

Etiquetas: , , , ,

17 de abril de 2020

Resolución de nombres con Python y Perl desde línea de comandos


Ejemplo de resolución de nombres desde línea de comandos usando Python:

python -c "import socket; print ( socket.gethostbyname('google.com') )"


Ejemplo de resolución de nombres desde línea de comandos usando Perl:

perl -e 'use Socket; use Data::Dumper; 

    @addrs = gethostbyname("google.com") or die "No puedo resolver el nombre$!\n"; 

    @addrs = map { inet_ntoa($_) } @addrs[4 .. $#addrs]; 

    foreach my $addr (@addrs) { print "$addr\n"; }'


Esta chuleta viene bien cuando no tenemos a mano una forma rápida de resolver un nombre de equipo con un comando como dig, host, nslookup, getent, etc.

Etiquetas: ,

13 de mayo de 2019

Algunos comandos útiles de openssl


Para consultar la longitud de una clave privada RSA:

openssl rsa -in private.key -text -noout



Para ver los datos de una petición de certificado (CSR):

openssl req -text -noout -in fichero.csr


Para ver los datos de un certificado en formato x509:

openssl x509 -text -noout -in certificado.cer


Para generar un fichero .pfx a partir de un certificado en formato x509:

openssl pkcs12 -export -out fichero.pfx -inkey claveprivada.key -in certificado.cer -certfile certificadoCA.cer


Para establecer una contraseña en un fichero de clave privada ya existente
openssl rsa -aes256 -in fichero.key -out fichero.cifrado.key


Para generar una clave privada (de 4096 bits)
openssl genrsa -des3 -out clave.key 4096


Para generar una solicitud de certificado
openssl req -new -key clave.key -out solicitud.csr


Para generar una clave privada, de 2048 bits, y solicitud de certificado
openssl req -newkey rsa:2048 -keyout clave.key -out solicitud.csr


Para generar un certificado (con validez de un año)
openssl x509 -req -days 365 -in solicitud.csr -signkey clave.key -out certificado.crt


Para eliminar la contraseña de una clave privada

openssl rsa -in clave.key -out clave.key.sincontraseña


Para convertir un certificado de formato .crt / .cer / .der a .pem:
openssl x509 -inform der -in certificado.cer -out certificado.pem


Para convertir un certificado de formato .pem a .crt / .cer / .der:
openssl x509 -outform der -in certificado.pem -out certificate.cer


Para verificar la validez de un certificado respecto a la clave privada:
openssl x509 -noout -modulus -in certificado.crt| openssl md5
openssl rsa -noout -modulus -in clave.key| openssl md5


Para convertir un certificado de formato .pem a .p12 con contraseña:
openssl pkcs12 -export -out cert.p12 -in cert.pem -inkey key.pem



Más comandos en Certificado Digitales con OpenSSL aquí

Otros comandos OpenSSL para conversión de formato de certificados y uso habitual de openssl

Etiquetas: ,

3 de febrero de 2018

Chuleta para crear/eliminar una VM desde Azure CLI


Anoto aquí mi chuleta de comandos básicos que he usado en Linux para crear una máquina virtual y destruirla con Azure CLI 2.0. Incluyo algunos otros comandos útiles



Ver lista de locations:
 az account list-locations

Crear un resource group:
az group create --name RG_Prueba --location westeurope

Crear una vnet:

 az network vnet create -n vnetPrueba -g RG_Prueba --address-prefixes 10.0.0.0/16 --location westeurope --subnet-name subnetProduccion  --subnet-prefix 10.0.0.0/24 --tags 'cadena=valor';

Crear un NSG y una regla:
az network nsg create -g RG_Prueba -n MiNSG --location westeurope

az network nsg rule create -g RG_Prueba --nsg-name MiNsg -n MiNsgRule --source-address-prefix 0.0.0.0/24 --source-port-range '*' --destination-address-prefix '*' --destination-port-range 22 --access Allow --protocol Tcp --description "Prueba" --priority 100

Crear un storage account:
az storage account create --location westeurope --name sprueba --resource-group RG_Prueba --sku Standard_LRS;

Crear un availability set:

az vm availability-set create -n MiAvSet -g RG_Prueba --platform-fault-domain-count 2 --platform-update-domain-count 2



Ver lista de imágenes disponibles para crear máquinas virtuales:
az vm image list

Crear una máquina virtual:
az vm create -n MaquinaPrueba -g RG_Prueba --image "Canonical:UbuntuServer:16.04-LTS:latest" --location westeurope --size Standard_A0 --tags 'maquina=prueba' --authentication-type ssh --ssh-key-value ~/.ssh/id_rsa.pub --nsg MiNsg --private-ip-address 10.0.0.5  --vnet-name vnetPrueba --subnet subnetProduccion --availability-set MiAvSet --storage-sku Standard_LRS
NOTA: El parámetro --storage-account no se admite para managed disks del market

Parar una máquina virtual y liberar los recursos asignados a la misma:
az vm deallocate -n MaquinaPrueba -g RG_Prueba

Listar ips públicas asignadas a las máquinas virtuales en ejecución:
az vm list-ip-addresses

Eliminar un grupo de recursos sin esperar y sin pedir confirmación:
az group delete --name RG_Prueba --no-wait -y

Etiquetas: ,