miércoles, 16 de abril de 2025

Laboratorio doméstico

https://anothermysqldba.blogspot.com/2025/04/homelab.html 

Sólo para travesura...

Existen numerosas opciones para probar MySQL y instancias de bases de datos generales.

Este es solo un ejemplo de cómo puede usar  Proxmox  para tener una configuración simple y rápida para pruebas y acceso repetibles.

Este ejemplo es una opción agradable y económica para tener un laboratorio en casa para MySQL y cualquier otra cosa que desees.

La virtualización de laboratorio en casa que elegí fue  Proxmox  y  Openmediavaul  para almacenamiento NFS extendido (no estoy 100% convencido de  Openmediavault , Debian solo podría hacerlo)

Hardware Elegí una configuración simple y compacta:

Esta virtualización también le permite tener un entorno que puede ejecutarse según sea necesario, apagarse o incluso alejarse y regresar cuando lo desee. 

También le permite clonar cada instancia para instancias adicionales y realizar pruebas si lo desea una vez configurado. 

Esta será una configuración directa muy simple en todos estos.

También puede crear dispositivos de bloque para cada directorio de datos o NFS si lo prefiere, pero todas estas serán instalaciones directas locales para demostración.

Objetivo de prueba y demostración:

  • Instalar
  • Escucha
  • Rotación de contraseñas de la bóveda

Base de Debian 

Configuré una instancia de Debian 12 con 4 GB y 4 CPU.
Luego la convertí en plantilla para poder vincular todas las demás instancias desde aquí.
Esto facilita la configuración de otras instancias y permite tener la misma base desde la que empezar.


┌──(root㉿debian12-server)-[~]
└─# uname -a
Linux debian12-server 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.129-1 (06/03/2025) x86_64 GNU/Linux

apt install unzip
cd /usr/local/src/
wget https://releases.hashicorp.com/vault/1.4.2/vault_1.4.2_linux_amd64.zip
descomprimir vault_1.4.2_linux_amd64.zip
bóveda mv /usr/bin/
setcap cap_ipc_lock=+ep /usr/bin/vault
# bóveda -v
Bóveda v1.4.2

MariaDB 11 Rolling 

vi /etc/network/interfaces
auto ens18
iface ens18 inet estático
    dirección 192.168.3.100
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# nombre de host
mariadb1.sqlhjalp.com

sudo apt-get install apt-transport-https curl
sudo mkdir -p /etc/apt/keyrings
sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
vi /etc/apt/sources.list.d/mariadb.sources

┌──(raíz㉿mariadb1)-[~]
└─# gato /etc/apt/sources.list.d/mariadb.sources
# MariaDB 11 Lista continua de repositorios - creada el 2025-04-01 15:13 UTC
# https://mariadb.org/download/
Nombre de X-Repolib: MariaDB
Tipos: deb
# deb.mariadb.org es un espejo dinámico si su espejo preferido se desconecta. Consulte https://mariadb.org/mirrorbits/ para más detalles.
# URI: https://deb.mariadb.org/11/debian
URI: https://mirror.its.dal.ca/mariadb/repo/11.rolling/debian
Suites: ratón de biblioteca
Componentes: principales
Firmado por: /etc/apt/keyrings/mariadb-keyring.pgp

┌──(raíz㉿mariadb1)-[~]
└─# apt-get update

┌──(raíz㉿mariadb1)-[~]
└─# apt-get install mariadb-server -y

┌──(raíz㉿mariadb1)-[~]
└─# mariadb
Bienvenido al monitor MariaDB. Los comandos terminan en ; o \g.
Su ID de conexión de MariaDB es 32
Versión del servidor: 11.7.2-MariaDB-deb12 distribución binaria mariadb.org

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

MariaDB [(ninguno)]>
MariaDB [(ninguno)]> salir
Adiós

┌──(raíz㉿mariadb1)-[~]
└─# systemctl detener mariadb.service

Para que quede claro, sí, con un servidor vinculado a Proxmox, puedes reiniciarlo y conservará todos tus valores y configuración.

┌──(raíz㉿mariadb1)-[~]
└─# tiempo de actividad
 10:27:29 1 min de actividad, 2 usuarios, promedio de carga: 0,15, 0,11, 0,04

┌──(raíz㉿mariadb1)-[~]
└─# mariadb
Bienvenido al monitor MariaDB. Los comandos terminan en ; o \g.
Su ID de conexión de MariaDB es 33
Versión del servidor: 11.7.2-MariaDB-deb12 distribución binaria mariadb.org

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab y otros.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

MariaDB [(ninguno)]> estado
--------------
mariadb desde 11.7.2-MariaDB, cliente 15.2 para debian-linux-gnu (x86_64) que utiliza el contenedor EditLine

ID de conexión: 33
Base de datos actual:
Usuario actual: root@localhost
SSL: El cifrado en uso es TLS_AES_256_GCM_SHA384, el certificado es correcto
Buscador actual: stdout
Usando archivo de salida: ''
Usando delimitador: ;
Servidor: MariaDB
Versión del servidor: 11.7.2-MariaDB-deb12 distribución binaria mariadb.org
Versión del protocolo: 10
Conexión: Localhost a través de socket UNIX
Conjunto de caracteres del servidor: utf8mb4
Conjunto de caracteres de la base de datos: utf8mb4
Conjunto de caracteres del cliente: utf8mb3
Conjunto de caracteres de Conn.: utf8mb3
Zócalo UNIX: /run/mysqld/mysqld.sock
Tiempo de actividad: 1 min 45 s

Hilos: 1 Preguntas: 61 Consultas lentas: 0 Aperturas: 33 Tablas abiertas: 26 Consultas por segundo promedio: 0.580
--------------

Innovación MySQL 

vi /etc/network/interfaces
auto ens18
iface ens18 inet estático
    dirección 192.168.3.101
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4


# apt install gnupg -y
# cd /usr/local/src/
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
# dpkg -i mysql-apt-config_0.8.33-1_all.deb

│¿Qué versión de servidor deseas recibir? │
  MySQL-8.0  
  mysql-innovation <-- Elegí esto
  MySQL-8.4-lts    
  clúster mysql-8.0   
  innovación del clúster MySQL    
  clúster mysql-8.4-lts    
  Ninguno

 ¿Qué producto MySQL desea configurar?                                                                                                                           
 Servidor y clúster MySQL (actualmente seleccionado: mysql-innovation)
 Conectores MySQL (actualmente seleccionado: habilitado)
 De acuerdo

# apt-get update
# apt-get install mysql-server -y

─# mysql -u root -p
Introducir contraseña:
Bienvenido al monitor MySQL. Los comandos terminan en ; o \g.
Su ID de conexión MySQL es 9
Versión del servidor: 9.2.0 MySQL Community Server - GPL

Copyright (c) 2000, 2025, Oracle y/o sus filiales.

Oracle es una marca registrada de Oracle Corporation y/o sus
afiliados. Otros nombres pueden ser marcas comerciales de sus respectivos
propietarios.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

mysql> estado
--------------
MySQL versión 9.2.0 para Linux en x86_64 (Servidor comunitario MySQL - GPL)

ID de conexión: 9
Base de datos actual:
Usuario actual: root@localhost
SSL: No en uso
Buscador actual: stdout
Usando archivo de salida: ''
Usando delimitador: ;
Versión del servidor: 9.2.0 MySQL Community Server - GPL
Versión del protocolo: 10
Conexión: Localhost a través de socket UNIX
Conjunto de caracteres del servidor: utf8mb4
Conjunto de caracteres de la base de datos: utf8mb4
Conjunto de caracteres del cliente: utf8mb4
Conjunto de caracteres de Conn.: utf8mb4
Zócalo UNIX: /var/run/mysqld/mysqld.sock
Datos binarios como: Hexadecimal
Tiempo de actividad: 47 segundos

Hilos: 2 Preguntas: 6 Consultas lentas: 0 Aperturas: 119 Tablas vaciadas: 3 Tablas abiertas: 38 Consultas por segundo promedio: 0,127

Clúster NDB de innovación de MySQL 

gato /etc/red/interfaces
auto ens18
iface ens18 inet estático
    dirección 192.168.3.102
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

auto ens18
iface ens18 inet estático
    dirección 192.168.3.103
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

auto ens18
iface ens18 inet estático
    dirección 192.168.3.103
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# apt install gnupg -y
# cd /usr/local/src/
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
# dpkg -i mysql-apt-config_0.8.33-1_all.deb

│¿Qué versión de servidor deseas recibir?                                                                                                                            
 MySQL-8.0  
 innovación en MySQL     
 MySQL-8.4-lts        
 clúster mysql-8.0       
 mysql-cluster-innovation <-- Elegí esto    
 clúster mysql-8.4-lts   
 Ninguno

 ¿Qué producto MySQL desea configurar?                                                                             
  Servidor y clúster MySQL (actualmente seleccionado: mysql-cluster-innovation)  
  Conectores MySQL (actualmente seleccionado: habilitado)     
  De acuerdo

# apt-get update
# apt-get install mysql-cluster-community-server -y
# apt-get install mysql-cluster-community-management-server <-- podemos elegir más tarde cuál usar
# apt-get install mysql-cluster-community-data-node -y

# vi /etc/mysql/conf.d/mysql.cnf

[mysqld]
# Opciones para el proceso mysqld:
ndbcluster # ejecuta el motor de almacenamiento NDB

[clúster mysql]
# Opciones para procesos de clúster NDB:
ndb-connectstring=192.168.3.102 # ubicación del servidor de administración

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini
[ndbd predeterminado]
# Opciones que afectan a los procesos ndbd en todos los nodos de datos:
NoOfReplicas=2 # Número de réplicas de fragmentos
DataMemory=98M # Cuánta memoria asignar para el almacenamiento de datos

[ndb_mgmd]
#Opciones del proceso de gestión:
HostName=192.168.3.102 # Nombre de host o dirección IP del nodo de administración
DataDir=/var/lib/mysql-cluster # Directorio para los archivos de registro del nodo de administración

[ndbd]
# Opciones para el nodo de datos "A":
                                # (una sección [ndbd] por nodo de datos)
HostName=192.168.3.103 # Nombre de host o dirección IP
NodeId=2 # ID de nodo para este nodo de datos
DataDir=/var/lib/mysql/data # Directorio para los archivos de datos de este nodo de datos

[ndbd]
# Opciones para el nodo de datos "B":
HostName=192.168.3.104 # Nombre de host o dirección IP
NodeId=3 # ID de nodo para este nodo de datos
DataDir=/var/lib/mysql/data # Directorio para los archivos de datos de este nodo de datos

[mysqld]
# Opciones del nodo SQL:
HostName=192.168.3.102 # Nombre de host o dirección IP
                                # (se pueden agregar conexiones mysqld adicionales)
                                # especificado para este nodo para varios
                                # propósitos como ejecutar ndb_restore)


┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini
Servidor de administración de clústeres MySQL mysql-9.2.0 ndb-9.2.0
ADVERTENCIA: --ndb-connectstring se ignora cuando mgmd se inicia con -f o config-file.

┌──(root㉿ndb2)-[/var/lib/mysql-cluster]
└─# ndbd
2025-04-01 11:53:11 [ndbd] INFO: Ángel conectado a '192.168.3.102:1186'
2025-04-01 11:53:12 [ndbd] INFO -- Ángel asignó nodeid: 2

┌──(root㉿ndb3)-[/var/lib/mysql-cluster]
└─# ndbd
2025-04-01 11:53:19 [ndbd] INFO: Ángel conectado a '192.168.3.102:1186'
2025-04-01 11:53:20 [ndbd] INFO -- Ángel asignó nodeid: 3


┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# ndb_mgm
-- Clúster NDB -- Cliente de administración --
ndb_mgm> mostrar
Conectado al servidor de administración en el puerto 1186 192.168.3.102 (usando texto sin cifrar)
Configuración del clúster
---------------------
[ndbd(NDB)] 2 nodo(s)
id=2 @192.168.3.103 (mysql-9.2.0 ndb-9.2.0, Grupo de nodos: 0, *)
id=3 @192.168.3.104 (mysql-9.2.0 ndb-9.2.0, Grupo de nodos: 0)

[ndb_mgmd(MGM)] 1 nodo(s)
id=1 @192.168.3.102 (mysql-9.2.0 ndb-9.2.0)

[mysqld(API)] 1 nodo(s)
id=4 (no conectado, aceptando conexión desde 192.168.3.102)

┌──(root㉿ndb1)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "seleccionar @@nombredehost"
Introducir contraseña:
+-------------------+
| @@nombredehost |
+-------------------+
| ndb1.sqlhjalp.com |
+-------------------+

┌──(root㉿ndb2)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "seleccionar @@nombredehost"
Introducir contraseña:
+-------------------+
| @@nombredehost |
+-------------------+
| ndb2.sqlhjalp.com |
+-------------------+

┌──(root㉿ndb3)-[/var/lib/mysql-cluster]
└─# mysql -u root -p -e "seleccionar @@nombredehost"
Introducir contraseña:
+-------------------+
| @@nombredehost |
+-------------------+
| ndb3.sqlhjalp.com |
+-------------------+

Servidor Percona 

# gato /etc/red/interfaces
 
auto ens18
iface ens18 inet estático
    dirección 192.168.3.105
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# apt install curl gnupg gnupg2 lsb-release -y
# cd /usr/local/src/
# curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
# dpkg -i percona-release_latest.generic_all.deb
# percona-release habilitar-solo ps-84-lts lanzamiento
# percona-release habilitar la liberación de herramientas
# apt install percona-server-server

┌──(root㉿ps1)-[/usr/local/src]
└─# ps -ef |grep mysql
MySQL 5832 1 0 11:58? 00:00:03 /usr/sbin/mysqld
raíz 5924 501 0 12:04 pts/1 00:00:00 grep --color=auto mysql

┌──(root㉿ps1)-[/usr/local/src]
└─# mysql -u root -p
Introducir contraseña:
Bienvenido al monitor MySQL. Los comandos terminan en ; o \g.
Su ID de conexión MySQL es 9
Versión del servidor: 8.4.4-4 Percona Server (GPL), versión '4', revisión '844fde07'

Copyright (c) 2009-2025 Percona LLC y/o sus afiliados
Copyright (c) 2000, 2025, Oracle y/o sus filiales.

Oracle es una marca registrada de Oracle Corporation y/o sus
afiliados. Otros nombres pueden ser marcas comerciales de sus respectivos
propietarios.

Escriba 'help;' o '\h' para obtener ayuda. Escriba '\c' para borrar la instrucción de entrada actual.

Clúster Percona 

# gato /etc/red/interfaces
iface ens18 inet estático
    dirección 192.168.3.106
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

iface ens18 inet estático
    dirección 192.168.3.106
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

iface ens18 inet estático
    dirección 192.168.3.106
    máscara de red 255.255.255.0
    puerta de enlace 192.168.3.1
    servidores de nombres dns 8.8.8.8 8.8.4.4

# apt install curl gnupg gnupg2 lsb-release -y
# cd /usr/local/src/
# curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
# dpkg -i percona-release_latest.generic_all.deb
# actualización apta
# configuración de percona-release pxc80
# apt install -y percona-xtradb-cluster

 
gato /etc/my.cnf
[cliente]
socket=/var/run/mysqld/mysqld.sock

[copia de seguridad adicional]
límite de archivos abiertos = 1000000

[mysqld]
id del servidor=1
directorio de datos=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
error de registro=/var/log/mysql/error.log
archivo pid=/var/run/mysqld/mysqld.pid
ruta-de-registro-segura=/var/lib/archivos-mysql/
# El período de expiración del registro binario es de 604800 segundos, lo que equivale a 7 días.
binlog_expire_logs_segundos=604800

userstat = 1

 └─# cat /etc/my.cnf | grep cifrar
pxc-encrypt-cluster-traffic = DESACTIVADO
 
┌──(raíz㉿pxc1)-[/]
└─# cat /etc/my.cnf | grep dirección
dirección_del_clúster_wsrep = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Dirección IP del nodo
dirección_del_nodo_wsrep=192.168.3.106

┌──(raíz㉿pxc1)-[/etc/mysql/conf.d]
└─# systemctl start mysql@bootstrap

mysql> muestra el estado como 'wsrep_c%';
+------------------------------+--------------------------------------+
| Nombre_de_variable | Valor |
+------------------------------+--------------------------------------+
| wsrep_cert_deps_distance | 0 |
|wsrep_commit_oooe | 0 |
|wsrep_commit_oool | 0 |
| ventana de confirmación wsrep | 0 |
| tamaño del índice del certificado wsrep | 0 |
| recuento de cubos de certificados wsrep | 1 |
| wsrep_causal_reads | 0 |
| intervalo_cert_wsrep | 0 |
| peso_del_clúster_wsrep | 1 |
| wsrep_cluster_capacidades | |
| id de configuración del clúster wsrep | 1 |
| tamaño del clúster wsrep | 1 |
| uuid del estado del clúster wsrep | 71a6ebf4-0f20-11f0-b4eb-0a0f463a7185 |
| wsrep_cluster_status | Primario |
| wsrep_connected | ENCENDIDO |
+------------------------------+--------------------------------------+
15 filas en conjunto (0,00 segundos)

┌──(raíz㉿pxc2)-[/etc.]
└─# cat /etc/my.cnf | grep dirección
dirección_del_clúster_wsrep = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Dirección IP del nodo
dirección_del_nodo_wsrep=192.168.3.107

┌──(raíz㉿pxc2)-[/var/lib/mysql]
└─# rm -Rf *

┌──(raíz㉿pxc2)-[/var/lib/mysql]
└─# ls -tla
total 8
drwxr-x--- 2 mysql mysql 4096 1 de abril 13:36 .
drwxr-xr-x 26 raíz raíz 4096 1 abr 12:34 ..

┌──(raíz㉿pxc2)-[/var/lib/mysql]
└─# systemctl iniciar mysql

┌──(raíz㉿pxc2)-[/etc.]
└─# cat /etc/my.cnf | grep dirección
dirección_del_clúster_wsrep = gcomm://192.168.3.106,192.168.3.107,192.168.3.108
# Dirección IP del nodo
dirección_del_nodo_wsrep=192.168.3.107
 ┌──(raíz㉿pxc3)-[/var/lib/mysql]
└─# rm -Rf *

┌──(raíz㉿pxc3)-[/var/lib/mysql]
└─# systemctl iniciar mysql


mysql> muestra el estado como 'wsrep_c%';
+------------------------------+--------------------------------------+
| Nombre_de_variable | Valor |
+------------------------------+--------------------------------------+
| wsrep_cert_deps_distance | 0 |
|wsrep_commit_oooe | 0 |
|wsrep_commit_oool | 0 |
| ventana de confirmación wsrep | 0 |
| tamaño del índice del certificado wsrep | 0 |
| recuento de cubos de certificados wsrep | 1 |
| wsrep_causal_reads | 0 |
| intervalo_cert_wsrep | 0 |
| peso_del_clúster_wsrep | 3 |
| wsrep_cluster_capacidades | |
| id de configuración del clúster wsrep | 3 |
| tamaño del clúster wsrep | 3 |
| uuid del estado del clúster wsrep | 71a6ebf4-0f20-11f0-b4eb-0a0f463a7185 |
| wsrep_cluster_status | Primario |
| wsrep_connected | ENCENDIDO |
+------------------------------+--------------------------------------+
15 filas en conjunto (0,00 segundos)

Configurar exportadores MySQL y Prometheus 

por cada máquina...

apt install -y prometheus-mysqld-exporter
 
CREAR USUARIO SI NO EXISTE 'prometheus'@'localhost' IDENTIFICADO POR '<PASSWORDHERE>'; 
mysql> mostrar concesiones para 'prometheus'@'localhost'; +------------------------------------------------------------------------------+ | Subvenciones para prometheus@localhost | +------------------------------------------------------------------------------+ | CONCEDER SELECCIONAR, PROCESAR, REPLICACIÓN CLIENTE EN *.* A `prometheus`@`localhost` | +------------------------------------------------------------------------------+ 1 fila en el conjunto (0,00 s) ┌──(raíz㉿pxc1)-[~] └─# ls -ltr /etc/mysql/debian.cnf -rw-r--r-- 1 root root 50 1 de abril 16:52 /etc/mysql/debian.cnf # vi /etc/default/prometheus-mysqld-exporter systemctl reiniciar prometheus-mysqld-exporter.service # systemctl reiniciar prometheus-mysqld-exporter.service

Servidor Prometeo 

raíz@prometheus:/etc/prometheus# vi prometheus.yml


  - nombre_trabajo: mysqld-exporter
    configuraciones estáticas:
      - objetivos:
          - 'mysql1.sqlhjalp.com:9104'
          - 'mariadb1.sqlhjalp.com:9104'
          - 'ps1.sqlhjalp.com:9104'
          - 'pxc1.sqlhjalp.com:9104'
          - 'pxc2.sqlhjalp.com:9104'
          - 'pxc3.sqlhjalp.com:9104'
          - 'ndb1.sqlhjalp.com:9104'
          - 'ndb2.sqlhjalp.com:9104'
          - 'ndb3.sqlhjalp.com:9104'
        etiquetas:
          país: EE. UU.
          db_env: 'inicio'
          entorno: "demo"
          Linux: Debian
          nodouse: servidor


mysql_up{entorno="demo"}

Valor del elemento
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="mariadb1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="mysql1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ndb1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ndb2.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ndb3.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="ps1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="pxc1.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="pxc2.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1
mysql_up{país="EE. UU.", db_env="inicio", entorno="demo", instancia="pxc3.sqlhjalp.com:9104", trabajo="mysqld-exporter", linux="debian", nodeuse="servidor"} 1

Configuración de la cuenta de Vault 

mysql>CREAR ROL SI NO EXISTE vaultaccess;
mysql> CONCEDER SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR, CREAR, ELIMINAR, RECARGAR, PROCESAR, ARCHIVO, REFERENCIAS, ÍNDICE, ALTERAR, MOSTRAR BASES DE DATOS, SUPER, CREAR TABLAS TEMPORALES, BLOQUEAR TABLAS, EJECUTAR, CREAR VISTA, MOSTRAR VISTA, CREAR USUARIO, EVENTO, DISPARADOR, CREAR ESPACIO DE TABLA, CREAR ROL, ELIMINAR ROL EN *.* A `vaultaccess`@`%` CON OPCIÓN DE CONCESIÓN;
 
CREAR USUARIO `vaultadmin`@`%` IDENTIFICADO POR '<PASSWORDHERE>' ROL PREDETERMINADO `vaultaccess`@`%` NO REQUIERE CONTRASEÑA NINGUNA CADUCIDAD DE CONTRASEÑA DESBLOQUEAR CUENTA PREDETERMINADA HISTORIAL DE CONTRASEÑAS INTERVALO DE REUTILIZACIÓN DE CONTRASEÑAS PREDETERMINADA CONTRASEÑA PREDETERMINADA REQUIERE ACTUAL PREDETERMINADA ;
mysql> mostrar concesiones para vaultadmin;

CREAR ROL SI NO EXISTE SOLO LECTURA;
CONCEDER SELECCIONAR, EJECUTAR EN *.* A `SOLO LECTURA`@`%` ;

Mariadb

MariaDB [(none)]> CREAR USUARIO `vaultadmin`@`%` IDENTIFICADO POR '<PASSWORDHERE>'; 
MariaDB [(none)]> CONCEDER SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR, CREAR, ELIMINAR, RECARGAR, PROCESAR, ARCHIVO, REFERENCIAS, ÍNDICE, ALTERAR, MOSTRAR BASES DE DATOS, SUPER, CREAR TABLAS TEMPORALES, BLOQUEAR TABLAS, EJECUTAR, CREAR VISTA, MOSTRAR VISTA, CREAR USUARIO, EVENTO, DISPARADOR, CREAR ESPACIO DE TABLA EN *.* A `vaultadmin`@`%` CON OPCIÓN DE CONCESIÓN;

Motor de base de datos Vault: se repite por instancia de base de datos 

bóveda escribir base de datos/config/MYSQL plugin_name=mysql-database-plugin connection_url="{{nombre de usuario}}:{{contraseña}}@tcp(mysql1.sqlhjalp.com:3306)/" roles_permitidos="mi-rol" nombre_de_usuario="vaultadmin" contraseña="<CONTRASEÑA>"
bóveda lee base de datos/configuración/MYSQL Valor clave --- ----- roles permitidos [] detalles_de_conexión map[backend:base_de_datos url_de_conexión:{{nombre_de_usuario}}:{{contraseña}}@tcp(mysql1.sqlhjalp.com:3306)/ duración_máxima_de_conexión:0s conexiones_máximas_inactivas:0 conexiones_máximas_abiertas:4 nombre_de_usuario:vaultadmin] deshabilitar_rotación_automatizada falso política de contraseñas n/a nombre_del_complemento complemento-de-base-de-datos-mysql plugin_version n/a declaraciones de rotación de credenciales raíz [] período de rotación 0 s horario de rotación n/a ventana de rotación 0 rotación de importación de rol estático de salto falso verificar_conexión verdadero base de datos de lectura de bóveda/roles/DEMOREADONLY Valor clave --- ----- creation_statements [CREAR USUARIO '{{name}}'@'%' IDENTIFICADO POR '{{password}}'; CONCEDER SELECCIONAR *.* A '{{name}}'@'%';] tipo_de_credencial contraseña nombre_base_datos MYSQL valor predeterminado_ttl 1h máx. ttl 24 h renovar_declaraciones [] declaraciones_de_revocación [ELIMINAR USUARIO SI EXISTE '{{nombre}}'@'%';] declaraciones_de_reversión []

Ejemplo de usuario dinámico de Vault 

base de datos de lectura de bóveda/creds/DEMOREADONLY
Valor clave
--- -----
base de datos de id de arrendamiento/creds/DEMOREADONLY/1SACMdnTGXseMewbA6ek1T42
duración del arrendamiento 1h
arrendamiento_renovable verdadero
contraseña -piWu8YfOFxUkAqR347a
nombre de usuario v-contraseña-k-DEMOREADON-HFRYaNGE


mysql> mostrar concesiones para 'v-userpass-k-DEMOREADON-HFRYaNGE'@'%';
+------------------------------------------------------------------------+
| Subvenciones para v-userpass-k-DEMOREADON-HFRYaNGE@% |
+------------------------------------------------------------------------+
| CONCEDER SELECCIONAR EN *.* A `v-userpass-k-DEMOREADON-HFRYaANGE`@`%` |
+------------------------------------------------------------------------+
1 fila en el conjunto (0,00 s)

Además..... 

POSTGRESQL

https://docs.vultr.com/how-to-install-postgresql-on-debian-12

# apt install -y postgresql-common
# /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# actualización apta
# política de apt-cache postgresql
# apt install postgresql -y
# systemctl iniciar postgresql
# estado del sistema postgresql
# sudo -u postgres psqlsudo -u postgres psql
# postgres=# ALTERAR ROL postgres CON CONTRASEÑA CIFRADA '<contraseña>';
ALTERAR ROL
#

Base de datos Oracle XE 


wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
wget https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm

# yum install ./oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm ./oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm

# /etc/init.d/oracle-xe-21c configurar

$ exportar ORACLE_SID=XE
$ exportar ORAENV_ASK=NO
$ . /opt/oracle/producto/21c/dbhomeXE/bin/oraenv

ORACLE_HOME = [] ? /opt/oracle/producto/21c/dbhomeXE
La base de Oracle se ha establecido en /opt/oracle


[root@localhost ~]# echo $ORACLE_HOME
/opt/oracle/producto/21c/dbhomeXE
[root@localhost ~]# cd $ORACLE_HOME
[root@localhost dbhomeXE]# pwd
/opt/oracle/producto/21c/dbhomeXE

[root@localhost dbhomeXE]# cd bin

[root@localhost bin]# sqlplus /nolog

SQL*Plus: Versión 21.0.0.0.0 - Producción el jueves 3 de abril de 2025 a las 10:35:15
Versión 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle. Todos los derechos reservados.

SQL>

SQL> CONECTAR SYS COMO SYSDBA
Introducir contraseña:
Conectado.
SQL>

SQL> establecer tamaño de línea 1500
SQL> seleccione nombre de usuario, estado_de_cuenta de DBA_USERS;

NOMBRE DE USUARIO ESTADO DE LA CUENTA
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------
SISTEMA ABIERTO
SISTEMA ABIERTO
XS$NULL BLOQUEADO
OJVMSYS BLOQUEADO
LBACSYS BLOQUEADO
BLOQUEADO FUERA
DBSNMP BLOQUEADO
APPQOSSYS BLOQUEADO
DBSFWUSER BLOQUEADO
GGSYS BLOQUEADO
ANÓNIMO BLOQUEADO
 
SQL> SALIR
Desconectado de Oracle Database 21c Express Edition versión 21.0.0.0.0 - Producción
Versión 21.3.0.0.0

SQLSERVER 

# curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo
# yum install -y mssql-server
# /opt/mssql/bin/mssql-conf configuración
# estado del sistema mssql-server

curl https://packages.microsoft.com/config/rhel/8/prod.repo | sudo tee /etc/yum.repos.d/mssql-release.repo

# yum install -y mssql-tools18 unixODBC-devel

# yum check-update
# yum update mssql-tools18

echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
fuente ~/.bash_profile

# /opt/mssql/bin/mssql-conf establecer-contraseña-sa
Introduzca la contraseña de administrador del sistema SQL Server:
Confirme la contraseña del administrador del sistema SQL Server:
Configurando SQL Server...

# sqlcmd -S localhost -No -U sa

# sqlcmd -S localhost -No -U sa
Contraseña:
1> CREAR BASE DE DATOS TestDB;
2> SELECCIONAR Nombre DE sys.databases;
3> IR
Nombre
--------------------------------------------------------------------------------------------------------------------------------
maestro
base de datos temporal
modelo
base de datos de datos de masas
Base de datos de pruebas

(5 filas afectadas)


USO TestDB;

CREAR TABLA dbo.Inventario
(
    id INT, nombre NVARCHAR (50), cantidad INT, CLAVE PRIMARIA (id)
);
Dios mío

INSERTAR EN dbo.Inventory VALORES (1, 'banana', 150);
INSERTAR EN dbo.Inventory VALORES (2, 'naranja', 154);

IR


SELECCIONAR * DE dbo.Inventario DONDE cantidad > 152;
IR

1> SELECCIONAR * DE dbo.Inventario;
2> IR
id nombre cantidad
----------- -------------------------------------------------- -----------
          1 plátano 150
          2 naranjas 154

MONGODB - PERCONA

https://docs.percona.com/percona-server-for-mongodb/8.0/install/apt.html

# apt install -y gnupg2 gnupg curl
# wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
# dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
# percona-release --help | grep psmdb
psmdb36 psmdb40 psmdb42 psmdb44 psmdb60 psmdb50 psmdb70 psmdb80 psmdb40
psmdb60pro psmdb70pro
psmdb-70-pro psmdb-60-pro
psmdb-36 psmdb-40 psmdb-42 psmdb-44 psmdb-60 psmdb-50 psmdb-70 psmdb-80 psmdb40
psmdb-60-pro psmdb-70-pro
psmdb-70-pro psmdb-60-pro

# percona-release habilita la versión psmdb-80
# actualización apta
# apt install percona-server-mongodb
# apt-cache madison percona-server-mongodb
# ls -ltr /etc/mongod.conf
-rw-r--r-- 1 root root 1403 11 feb 23:56 /etc/mongod.conf

# vi /etc/systemd/system/enable-transparent-huge-pages.service
# cat /etc/systemd/system/enable-transparent-huge-pages.service
[Unidad]
Descripción=Habilitar páginas enormes transparentes (THP)
Dependencias predeterminadas=no
Después de=sysinit.target local-fs.target
Antes=mongod.service

[Servicio]
Tipo=one-shot
ExecStart=/bin/sh -c 'echo siempre | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'

[Instalar]
WantedBy=objetivo básico

# systemctl daemon-reload
# systemctl start habilitar páginas transparentes enormes
# cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
[siempre] madvise nunca
siempre aplazar [aplazar+madvise] madvise nunca
0
1

# systemctl enable habilitar páginas grandes transparentes
# ls -lr /var/lib/mongodb/
total 0


# systemctl iniciar mongod
# estado del control del sistema mongod
#mongosh
ID de registro actual de Mongosh: 67ed4eb0cd874b942d98ebcf
Conectándose a: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.2
MongoNetworkError: conexión ECONNREFUSED 127.0.0.1:27017

MONGODB

https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-debian/

 
# apt-get install gnupg curl
# curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
  --dearmor
# echo "deb [ firmado por = /usr/share/keyrings/mongodb-server-8.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
# apt-get update
# apt-get install -y mongodb-org
# systemctl daemon-reload
# ulimit -c ilimitado
# ulimit -n 64000
# ulimit -f ilimitado
# ulimit -t ilimitado
# ulimit -l ilimitado
# ulimit -m ilimitado
# ulimit -u 64000
# ulimit -a
tiempo real sin bloqueo (microsegundos, -R) ilimitado
tamaño del archivo principal (bloques, -c) ilimitado
tamaño del segmento de datos (kbytes, -d) ilimitado
prioridad de programación (-e) 0
tamaño de archivo (bloques, -f) ilimitado
señales pendientes (-i) 15471
memoria bloqueada máxima (kbytes, -l) ilimitada
tamaño máximo de memoria (kbytes, -m) ilimitado
archivos abiertos (-n) 64000
tamaño de la tubería (512 bytes, -p) 8
Colas de mensajes POSIX (bytes, -q) 819200
prioridad en tiempo real (-r) 0
tamaño de pila (kbytes, -s) 8192
tiempo de CPU (segundos, -t) ilimitado
máximo de procesos de usuario (-u) 64000
memoria virtual (kbytes, -v) ilimitada
bloqueos de archivos (-x) ilimitados

# systemctl iniciar mongod

# wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
# dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
# percona-release --help | grep psmdb
psmdb36 psmdb40 psmdb42 psmdb44 psmdb60 psmdb50 psmdb70 psmdb80 psmdb40
psmdb60pro psmdb70pro
psmdb-70-pro psmdb-60-pro
psmdb-36 psmdb-40 psmdb-42 psmdb-44 psmdb-60 psmdb-50 psmdb-70 psmdb-80 psmdb40
psmdb-60-pro psmdb-70-pro
psmdb-70-pro psmdb-60-pro

# percona-release habilita la versión psmdb-80
# actualización apta
# apt install percona-server-mongodb
# apt-cache madison percona-server-mongodb
# ls -ltr /etc/mongod.conf
-rw-r--r-- 1 root root 1403 11 feb 23:56 /etc/mongod.conf

# vi /etc/systemd/system/enable-transparent-huge-pages.service
# cat /etc/systemd/system/enable-transparent-huge-pages.service
[Unidad]
Descripción=Habilitar páginas enormes transparentes (THP)
Dependencias predeterminadas=no
Después de=sysinit.target local-fs.target
Antes=mongod.service

[Servicio]
Tipo=one-shot
ExecStart=/bin/sh -c 'echo siempre | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'

[Instalar]
WantedBy=objetivo básico

# systemctl daemon-reload
# systemctl start habilitar páginas transparentes enormes
# cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
[siempre] madvise nunca
siempre aplazar [aplazar+madvise] madvise nunca
0
1

# systemctl enable habilitar páginas grandes transparentes
# ls -lr /var/lib/mongodb/
total 0


# systemctl iniciar mongod
# estado del control del sistema mongod
#mongosh
ID de registro actual de Mongosh: 67ed4eb0cd874b942d98ebcf
Conectándose a: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.2
MongoNetworkError: conexión ECONNREFUSED 127.0.0.1:27017


CASANDRA

https://docs.vultr.com/how-to-install-apache-cassandra-on-debian-12

# actualización apta
# gato /etc/apt/source.list
deb https://deb.debian.org/debian bookworm principal firmware no libre
deb http://deb.debian.org/debian bookworm-updates principal
deb http://deb.debian.org/debian-security bookworm-security principal
deb http://deb.debian.org/debian inestable principal no libre contribuciones

# actualización apta
# apt install curl
# apt install openjdk-17-jdk
# java --versión
openjdk 17.0.14 21/01/2025
Entorno de ejecución de OpenJDK (compilación 17.0.14+7-Debian-1deb12u1)
Máquina virtual de servidor OpenJDK de 64 bits (compilación 17.0.14+7-Debian-1deb12u1, modo mixto, uso compartido)

# echo "deb [firmado por=/etc/apt/keyrings/apache-cassandra.asc] https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
# curl -o /etc/apt/keyrings/apache-cassandra.asc https://downloads.apache.org/cassandra/KEYS
# actualización apta
# apt install cassandra

# ls -lr /etc/cassandra/cassandra.yaml
-rw-r--r-- 1 raíz raíz 91468 27 ene 07:28 /etc/cassandra/cassandra.yaml

# vi /etc/cassandra/cassandra.yaml
# systemctl reiniciar cassandra

# ls -lr /var/log/cassandra/
total 0

# estado del control del sistema cassandra
# estado de nodetool
nodetool: No se pudo conectar a '127.0.0.1:7199' - ConnectException: 'Conexión rechazada'.

# cqlsh -u cassandra -p cassandra

Advertencia: usar una contraseña en la interfaz de la línea de comandos puede ser inseguro.
Recomendación: utilice el archivo de credenciales para proporcionar la contraseña de forma segura.

Error de conexión: ('No se puede conectar a ningún servidor', {'127.0.0.1:9042': ConnectionRefusedError(111, "Se intentó conectar a [('127.0.0.1', 9042)]. Último error: Conexión rechazada")})


domingo, 25 de febrero de 2024

Cifrado MariaDB (datos en reposo)

A continuación se muestra un ejemplo sencillo que muestra un par de opciones para el cifrado MariaDB. 

Tienes que considerar lo que quieres cifrar. La comunicación de datos (datos en tránsito) o los datos en la instancia (datos en reposo). 

Esta publicación se centrará en la opción de datos en reposo utilizando un nodo de nivel gratuito de AWS que se ejecuta en Amazon Linux. Usaré la base de datos mundial en 2 instancias diferentes para mostrar la actualización de las tablas actuales con cifrado, así como las nuevas tablas de carga que se cifrarán automáticamente. 


Primero, comenzaremos con las instalaciones... rápidas y sencillas solo para esta demostración. 

# yum -y install mariadb105-server
# vi /etc/my.cnf.d/mariadb-server.cnf
# cat  /etc/my.cnf.d/mariadb-server.cnf | grep server_id 
server_id=100

# cat  /etc/my.cnf.d/mariadb-server.cnf | grep server_id
server_id=200
# systemctl start mariadb.service
# mysql
MariaDB [(none)]> status
--------------
mysql  Ver 15.1 Distrib 10.5.23-MariaDB, for Linux (x86_64) using  EditLine wrapper
Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.5.23-MariaDB MariaDB Server
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db     characterset: latin1
Client characterset: utf8
Conn.  characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 27 sec
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+


Cargaremos la base de datos mundial en la instancia server_id 100. 


# mysql < world.sql
# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.5.23-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| world              |
+--------------------+
4 rows in set (0.000 sec)
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)  


Ahora podemos ver que actualmente ambas instancias no utilizan cifrado. 


MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
Empty set (0.000 sec)

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
Empty set (0.000 sec)


Ahora, en ambos sistemas, configuraré claves aleatorias y las cifraré. 

#  mkdir /etc/mysql/

#  mkdir /etc/mysql/encryption/
# (echo -n "1;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile
# (echo -n "2;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile
#  (echo -n "100;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile

# cat /etc/mysql/encryption/keyfile
1;466139b487d5735b536a10502b0607d2b96dfa58a7f95ce4847d98ef585af8b5
2;a0f533c2e459dc64e0aeb1f0f8c9dfb496571e71001ca60fac35c8bbc6361096
100;4b4bfd61af39d57e068385cf1a023bdfc5972ed414a24167067ca5256fc314e6

# cat /etc/mysql/encryption/keyfile
1;f8b1b250d3bf7159e2abd15be146367415a80d3781bbcf7d96b26640d7efdc8a
2;c7eaccedd0ef561f0c08d461abfd651947230b08c71aec67c6064bbedb6408ec
100;90475521b6eb6be3c1ec02770f3e8f80b34130f37d25c89b51cf10ec6a7c5bb6

openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key
openssl enc -aes-256-cbc -md sha1    -pass file:/etc/mysql/encryption/keyfile.key    -in /etc/mysql/encryption/keyfile    -out /etc/mysql/encryption/keyfile.enc

 ls -ltr /etc/mysql/encryption/
total 12
-rw-r--r--. 1 root root 203 Feb 24 23:39 keyfile
-rw-r--r--. 1 root root 257 Feb 24 23:40 keyfile.key
-rw-r--r--. 1 root root 224 Feb 24 23:41 keyfile.enc


Ahora podemos configurar el archivo cnf para habilitar el complemento y las opciones de cifrado. 


# vi /etc/my.cnf.d/mariadb-server.cnf
[mariadb]
## File Key Management
plugin_load_add = file_key_management
loose_file_key_management_filename = /etc/mysql/encryption/keyfile
loose_file_key_management_filename = /etc/mysql/encryption/keyfile.enc
loose_file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key
loose_file_key_management_encryption_algorithm = AES_CBC

## InnoDB/XtraDB Encryption Setup
innodb_encrypt_log = ON
innodb_encrypt_temporary_tables=ON
innodb_encryption_threads=4
innodb_encrypt_tables=ON
innodb_default_encryption_key_id=1

## Aria Encryption Setup
aria_encrypt_tables = ON

## Temp & Log Encryption
encrypt-tmp-disk-tables = 1
encrypt-tmp-files = 1
encrypt_binlog = ON

Reinicie MariaDB para que podamos verificar el estado actual. 

systemctl restart mariadb.service
mysql
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| world/city                 |                 1 |              1 |
| world/country              |                 1 |              1 |
| world/countrylanguage      |                 1 |              1 |
+----------------------------+-------------------+----------------+
8 rows in set (0.000 sec)

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
+----------------------------+-------------------+----------------+
5 rows in set (0.000 sec)


Cargue también los datos mundiales en la instancia server_id 200. 

# mysql < world.sql
# mysql 
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
| world/city                 |                 1 |              1 |
| world/country              |                 1 |              1 |
| world/countrylanguage      |                 1 |              1 |
+----------------------------+-------------------+----------------+
8 rows in set (0.000 sec)


Según information_schema.INNODB_TABLESPACES_ENCRYPTION ahora estamos encriptados. Sin embargo, no lo mostramos a nivel de esquema. Si bien dicen que está cifrado si aparece en la  tabla INNODB_TABLESPACES_ENCRYPTION, prefiero estar seguro y verlo en la tabla y en el esquema. 


MariaDB [(none)]> show create table world.city\G

*************************** 1. row ***************************
       Table: city
Create Table: CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.001 sec)


Hasta este punto, puede ver que ambas instancias se han contabilizado en el  esquema INNODB_TABLESPACES_ENCRYPTION después del reinicio o la carga del esquema y los datos. 

Entonces... algunas modificaciones en la tabla ayudarán aquí... 

MariaDB [world]> ALTER TABLE city ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.074 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [world]> ALTER TABLE country ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.031 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [world]> ALTER TABLE countrylanguage  ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.033 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [world]> show create table city\G
*************************** 1. row ***************************
       Table: city
Create Table: CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci `ENCRYPTED`=Yes `ENCRYPTION_KEY_ID`=1
1 row in set (0.000 sec)


Esto es simple, etc. hasta ahora... ahora necesitamos habilitar binlogs y verificar más. 

vi /etc/my.cnf.d/mariadb-server.cnf
log_bin=demo

cat /etc/my.cnf.d/mariadb-server.cnf | grep log_bin
log_bin=demo

# systemctl restart mariadb.service

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
            File: demo.000001
        Position: 363
    Binlog_Do_DB:
Binlog_Ignore_DB:

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
            File: demo.000001
        Position: 363
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.000 sec)


Comprobando a través de un vistazo a los binlogs.... 


mariadb-binlog--base64-output=DECODE-ROWS --verbose  demo.000001

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#240225  0:06:06 server id 100  end_log_pos 256 CRC32 0x04ce3741  Start: binlog v 4, server v 10.5.23-MariaDB-log created 240225  0:06:06 at startup

# Warning: this binlog is either in use or was not closed properly.

ROLLBACK/*!*/;

# at 256

# Encryption scheme: 1, key_version: 1, nonce: eb7991b210f3f4d2f7f21537

# The rest of the binlog is encrypted!

ERROR: Error in Log_event::read_log_event(): 'Event decryption failure', data_len: 2400465656, event_type: 240

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;


Es bueno ver que dice que ahora se está cifrando. 


MariaDB [world]> create table city2 like city;
Query OK, 0 rows affected (0.013 sec)

MariaDB [world]> insert into city2 select * from city;
Query OK, 4079 rows affected (0.078 sec)
Records: 4079  Duplicates: 0  Warnings: 0

MariaDB [world]> show create table city2\G
*************************** 1. row ***************************
       Table: city2
Create Table: CREATE TABLE `city2` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci `ENCRYPTED`=Yes `ENCRYPTION_KEY_ID`=1
1 row in set (0.000 sec)


Quiero ver estas transacciones en el binlog... ¿cómo? Puedes usar mariadb_binlog junto con --read-from-remote-server para poder ver los datos en los registros...


mariadb-binlog  --base64-output=DECODE-ROWS --verbose --read-from-remote-server   demo.000001 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240225  0:06:06 server id 100  end_log_pos 256 CRC32 0x04ce3741  Start: binlog v 4, server v 10.5.23-MariaDB-log created 240225  0:06:06 at startup
ROLLBACK/*!*/;
# at 256
#240225  0:06:06 server id 100  end_log_pos 296 CRC32 0x0c89f3bb  Ignorable
# Ignorable event type 164 (Start_encryption)
# at 296
#240225  0:06:06 server id 100  end_log_pos 325 CRC32 0x535776a2  Gtid list []
# at 325
#240225  0:06:06 server id 100  end_log_pos 363 CRC32 0x2ac4a61b  Binlog checkpoint demo.000001
# at 363
#240225  0:09:40 server id 100  end_log_pos 405 CRC32 0x93e10dc4  GTID 0-100-1 ddl
/*!100101 SET @@session.skip_parallel_replication=0*//*!*/;
/*!100001 SET @@session.gtid_domain_id=0*//*!*/;
/*!100001 SET @@session.server_id=100*//*!*/;
/*!100001 SET @@session.gtid_seq_no=1*//*!*/;
# at 405
#240225  0:09:40 server id 100  end_log_pos 501 CRC32 0x39269040  Query thread_id=5 exec_time=0 error_code=0
use `world`/*!*/;
SET TIMESTAMP=1708819780/*!*/;
SET @@session.pseudo_thread_id=5/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1, @@session.sql_if_exists=0, @@session.explicit_defaults_
for_timestamp=0/*!*/;
SET @@session.sql_mode=1411383296/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=utf8,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table city2 like city
/*!*/;
# at 501
#240225  0:09:49 server id 100  end_log_pos 543 CRC32 0xde82b753  GTID 0-100-2 trans
/*!100001 SET @@session.gtid_seq_no=2*//*!*/;
START TRANSACTION
/*!*/;
# at 543
# at 602
#240225  0:09:49 server id 100  end_log_pos 602 CRC32 0x05bbb9e6  Annotate_rows:
#Q> insert into city2 select * from city
#240225  0:09:49 server id 100  end_log_pos 661 CRC32 0x9e0b4e0d  Table_map: `world`.`city2` mapped to number 21
# at 661


Con suerte, esto al menos puede ayudarte a empezar... 


Recursos :

https://mariadb.com/kb/en/securing-mariadb-encryption/  

jueves, 12 de noviembre de 2020

Usando su archivo FRM para obtener Schema y luego importar archivos idb ..

Este es un tema que, en general, nunca debería tener que hacer ... ¿Por qué? Porque creó las copias de seguridad correctamente ... Ha probado y sabe que las copias de seguridad funcionan, por lo que puede restaurar esas copias de seguridad y obtener su esquema perdido y los datos relacionados ... 

Sin embargo, esa instancia en la oficina de la esquina ... nunca llegaste a configurar ... no es tan importante ... simplemente se bloqueó y ahora te das cuenta de how lo usas realmente ... 

No todo está perdido ..  

MySQL lanzó sus utilidades de MySQL hace un tiempo y desde entonces ha sido reemplazado por MySQL Shell.  

mysqlfrm sigue siendo muy útil cuando se necesita extraer el esquema de un archivo FRM en un comando rápido y simple y es una instalación simple. 

mysqlfrm --diagnostic city.frm
# WARNING: Cannot generate character set or collation names without the --server option. # CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for city.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:

CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(160) DEFAULT NULL,
  `CountryCode` char(12) NOT NULL,
  `District` char(80) NOT NULL,
  `Population` int(11) NOT NULL,
PRIMARY KEY `PRIMARY` (`ID`),
KEY `CountryCode` (`CountryCode`),
KEY `popkey` (`Population`)
) ENGINE=InnoDB;

#...done.


Entonces, ahora que tiene el esquema que perdió ... reconstruya la base de datos o la tabla. Por el bien del ejemplo, diré que acabamos de perder los datos de la ciudad de la base de datos mundial. 

$ cp  ciudad.ibd  / tmp /  

$ cp city.ibd /tmp/
mysql> LOCK TABLES city WRITE;
mysql> ALTER TABLE city DISCARD TABLESPACE;

cp city.ibd /edb/local/mysql/data/rundeck/
chown tmdba:dba /edb/local/mysql/data/rundeck/city.ibd

mysql> ALTER TABLE city IMPORT TABLESPACE;
mysql> UNLOCK TABLES;
mysql> SELECT COUNT(*) FROM city;


lunes, 21 de septiembre de 2020

MySQL mysql_config_editor y esperar

 Esta es solo una nota para ayudar a cualquiera que desee utilizar el comando mysql_config_editor en sus herramientas de automatización. 

mysql_config_editor no acepta un argumento de contraseña, por lo que las herramientas de automatización pueden haber establecido antes su contraseña en el archivo .my.cnf al intentar usar mysql_config_editor fallan. 

Es posible y bastante simple, aunque con la herramienta de espera. 

 yum -y install expect  

también funciona para apt-get. 


Entonces, en este ejemplo, mostraré una versión simple del script bash. 

Primero ... mi ruta de acceso no funciona ... 

mysql --login-path=local

ERROR 1045 (28000): Access denied for user


Establecer esto con esperar 

Ejecutarías esto a través de tu script bash.  

expect <<EOD

spawn mysql_config_editor set --login-path=local --host=localhost --user=root --password 

expect "password"

send  -- "<PASSWORD>\r"

interact

EOD


Ahora funciona ...

mysql --login-path=local

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1002