---
# System prepended metadata

title: Configuración MySQL e instalación phpMyAdmin

---

[toc]
# Configuración MySQL e instalación phpMyAdmin
<p style="text-align: justify;">
Vamos a configurar MySQL para nuestro servidor de correo, creando una base de datos segura y estructuras necesarias para gestionar dominios, usuarios y alias. También instalaremos y securizaremos phpMyAdmin para administrar la base de datos desde un navegador.

## Proteger MySQL
Aseguramos la instalación de MySQL ejecutando:
    
    sudo mysql_secure_installation
    
Sigue las instrucciones:

* Cambia la contraseña del usuario root.
* Elimina usuarios anónimos (Remove anonymous users? → Yes).
* Deshabilita el acceso remoto de root (Disallow root login remotely? → Yes).
* Elimina la base de datos de prueba (Remove test database and access to it? → Yes).
* Recarga los privilegios (Reload privilege tables now? → Yes).

## Crear la Base de Datos y Usuario:
Accede a MySQL:
    
    mysql -u root -p
<p style="text-align: justify;">   
Ejecuta los siguientes comandos para crear la base de datos y un usuario seguro:
    
    CREATE DATABASE mailserver;
    CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'tu_contraseña_segura';
    GRANT ALL PRIVILEGES ON mailserver.* TO 'mailuser'@'localhost';
    FLUSH PRIVILEGES;
    EXIT;
    
Verifica que el usuario tenga acceso:
    
    mysql -u mailuser -p -h localhost
    SHOW DATABASES;
    USE mailserver;

## Crear Tablas para Dominios, Usuarios y Alias
<p style="text-align: justify;">
Dentro de MySQL, crea las tablas necesarias para gestionar correos:

### Tabla de Dominios
    CREATE TABLE virtual_domains (
      id INT(11) NOT NULL AUTO_INCREMENT,
      name VARCHAR(50) NOT NULL,
      active BOOLEAN NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

### Tabla de Usuarios
    CREATE TABLE virtual_users (
      id INT(11) NOT NULL AUTO_INCREMENT,
      domain_id INT(11) NOT NULL,
      password VARCHAR(206) NOT NULL,
      email VARCHAR(100) NOT NULL,
      quota VARCHAR(10) NOT NULL,
      active BOOLEAN NOT NULL,
      PRIMARY KEY (id),
      UNIQUE KEY email (email),
      FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
### Tabla de Alias
    CREATE TABLE virtual_aliases (
      id INT(11) NOT NULL AUTO_INCREMENT,
      domain_id INT(11) NOT NULL,
      source VARCHAR(100) NOT NULL,
      destination VARCHAR(100) NOT NULL,
      active BOOLEAN NOT NULL,
      PRIMARY KEY (id),
      FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
###  Agregar Datos de Prueba
#### Agregar Dominios
    INSERT INTO virtual_domains
      (id ,name , active)
    VALUES
      (1, 'domain.com', true),
      (2, 'hostname.ccuellar.test', true),
      (3, 'hostname', true),
      (4, 'localhost.ccuellar.test', true),
      (5, 'ccuellar.test', true);
    
#### Crear Usuarios
Usa contraseñas cifradas en MD5:
    
    INSERT INTO mailserver.virtual_users
      (id, domain_id, password, email,quota,active)
    VALUES
    (1, 5, MD5('secretpasswd'), 'email1@ccuellar.test',0, true),
    (2, 5, MD5('admin123'), 'admin@ccuellar.test',0, true),
    (3, 5, MD5('carlapass'), 'carla@ccuellar.test',0,  true),
    (4, 5, MD5('testpass'), 'user1@ccuellar.test',0, true),
    (5, 5, MD5('securepwd'), 'user2@ccuellar.test',0, true),
    (6, 5, MD5('postmaster'), 'postmaster@ccuellar.test',0, true);
    
## Instalar phpMyAdmin
    
Instala phpMyAdmin y sus dependencias:
    
    sudo apt update
    sudo apt install php libapache2-mod-php php-mysql php-opcache php-apcu php-mbstring
    sudo apt install phpmyadmin  
    
Durante la instalación:

* Selecciona Apache2 como servidor web.
* Usa dbconfig-common para configurar la base de datos.
* Configura una contraseña segura para phpMyAdmin.
    
Habilita las extensiones necesarias:
    
    sudo phpenmod mbstring
    sudo systemctl restart apache2
    
## Securizar phpMyAdmin
    
Autenticación Adicional:
Edita el archivo de configuración de Apache:
    
    sudo vi /etc/apache2/conf-available/phpmyadmin.conf
    
Asegúrate de que incluya:
    
    <Directory /usr/share/phpmyadmin>
    AllowOverride All
    ...
    </Directory>

Crea un archivo .htaccess para autenticación básica:
    
    sudo vi /usr/share/phpmyadmin/.htaccess
    
Añade:
    
    AuthType Basic
    AuthName "Acceso Restringido"
    AuthUserFile /etc/phpmyadmin/.htpasswd
    Require valid-user
    
Crea el archivo de contraseñas:
    
    sudo htpasswd -c /etc/phpmyadmin/.htpasswd admin
    
Reinicia Apache:
    
    sudo systemctl restart apache2
    
## Configurar Certificado SSL
Genera un certificado autofirmado:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout /etc/ssl/private/phpmyadmin.key \
      -out /etc/ssl/certs/phpmyadmin.crt
    
    sudo cp /etc/ssl/certs/phpmyadmin.crt /usr/local/share/ca-certificates/

    sudo update-ca-certificates


Configura un VirtualHost para HTTPS:
    
    sudo vi /etc/apache2/sites-available/phpmyadmin.conf

Añade:
    
    <VirtualHost *:443>
        ServerName phpmyadmin.ccuellar.test
        DocumentRoot /usr/share/phpmyadmin
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/phpmyadmin.crt
        SSLCertificateKeyFile /etc/ssl/private/phpmyadmin.key
    </VirtualHost>
    
Habilita el sitio y reinicia Apache:
    
    sudo a2ensite phpmyadmin.conf
    sudo systemctl restart apache2
    
## Agregar el subdominio a DNS bind9
<p style="text-align: justify;">
Para agregar el subdominio phpmyadmin.ccuellar.test, debemos modificar la zona directa en el archivo /etc/bind/db.ccuellar.test y añadimos:
    
    phpmyadmin    IN    A    10.24.153.2

Zona inversa:
    
    2   IN    PTR    phpmyadmin.ccuellar.test.

Incrementamos el número serial y reiniciamos el servicio bind9. Ahora podremos usar phpmyadmin.ccuellar.test.
    
## Verificar Todo:
    
Accede a phpMyAdmin desde el navegador:
    
    https://phpmyadmin.ccuellar.test
    
Usa las credenciales de autenticación básica y las de MySQL.

Con estos pasos, tendrás una base de datos MySQL segura y phpMyAdmin accesible de forma segura.
    
🤗
    
---
    
## [Índice de secciones aquí](https://hackmd.io/@ccuellar/rJ73y6FpJe)

## [👈Anterior sección](https://hackmd.io/@ccuellar/r1NBq0F61l) 😄 [Siguiente sección 👉](https://hackmd.io/@ccuellar/SkKQiAY61g)
