class

Beryl::Apply::MariadbSecure

Inherits Beryl::Apply::Primitive < Reference < Object

Primitive mariadb-secure : durcit un MariaDB fraîchement installé — l'équivalent automatisé et idempotent de mysql_secure_installation :

  • skip-networking (plus d'écoute TCP, socket Unix seul) ;
  • mot de passe root (SANS casser l'auth unix_socket de l'OS-root, pour que beryl puisse rejouer via le socket) ;
  • suppression des users anonymes et de la base test.

Le mot de passe vient du COFFRE (ENV) — jamais dans la recette ni en argv (SQL passé par fichier 0600, pas via -e).

- mariadb-secure:
    root_password_env: MARIADB_ROOT_PASSWORD
    socket: /var/run/mysql/mysql.sock   # optionnel
    conf_path: /usr/local/etc/mysql/conf.d/zz-beryl-hardening.cnf  # optionnel
    service: mysql-server               # optionnel (restart si conf posée)

Idempotence : état lu en LECTURE SEULE par le socket (OS-root), comparé ici — rien de secret n'est envoyé au serveur pour cette vérification :

  • ligne root@localhost de mysql.global_priv (JSON) : unix_socket présent ET empreinte mysql_native_password du mot de passe du coffre (calculée localement) ;
  • aucun user anonyme, pas de base test ;
  • skip-networking dans conf_path. Tout est déjà en place → Skipped (sinon « applied » à chaque passage, et les service-restart: { if_changed: true } qui suivent relançaient).

Constants

DEFAULT_CONF = "/usr/local/etc/mysql/conf.d/zz-beryl-hardening.cnf"
DEFAULT_SOCKET = "/var/run/mysql/mysql.sock"
TMP_SQL = "/tmp/beryl-mariadb-secure.sql"

Class methods

build_sql(password : String) : String

SQL de durcissement. unix_socket OR mysql_native_password PRÉSERVE l'accès OS-root par socket (donc les re-runs beryl marchent) tout en posant un mot de passe. Pur, exposé pour test. Le mot de passe est échappé pour SQL (' doublée).

Users anonymes : TOUS, quel que soit l'hôte. L'installation en crée aussi un au nom de la machine (''@'too', vu le 8 nov. 2026), que ''@'localhost' / ''@'%' seuls laissaient en place. Bloc anonyme MariaDB (WHILE … EXECUTE IMMEDIATE), d'où le DELIMITER du client : un à la fois, relu à chaque tour, plutôt qu'un curseur sur la table que chaque DROP USER modifie (un échec lève une erreur : pas de boucle infinie).

Source
hardened?(output : String, password : String) : Bool

Vrai si la sortie de state_query décrit un MariaDB déjà durci avec ce mot de passe. L'ordre des méthodes dans le JSON (auth_or) varie selon les versions : on cherche seulement leur présence. Pur.

Source
native_hash(password : String) : String

Empreinte mysql_native_password (= PASSWORD() de MariaDB) : * + SHA1(SHA1(mdp)) en hexadécimal majuscule. Pure.

Source
state_query(socket : String) : String

Lecture de l'état (une valeur par ligne, mysql -N -B) : JSON Priv de root@localhost, nombre d'users anonymes, présence de la base test.

Source

Instance methods

apply(shell : Shell, params : Hash(String, YAML::Any), dry_run : Bool, context : Context) : StepResult

params est le hash brut du step YAML (ex: {"packages" => [...]}), déjà interpolé par l'Executor. context porte les infos dérivées du host (cf. Context).

Source
name

Nom kebab-case utilisé comme clé de step dans les recettes (« pkg-install », « service-enable », …).

Source