Saltar al contenido

Usando Create React App v2 y TypeScript

marzo 4, 2020

 

Introducción

Hay muchas implementaciones del lenguaje base de datos SQL disponibles en Linux y sistemas Unix. MySQL y MariaDB son dos opciones populares para el despliegue de bases de datos relacionales en entornos de servidores.

Sin embargo, al igual que la mayoría del software, estas herramientas pueden ser pasivos de seguridad si están configurados de forma incorrecta. Este tutorial le guiará a través de algunos pasos básicos que usted puede tomar para proteger sus bases de datos MariaDB o MySQL, y asegurarse de que no son una puerta abierta en su VPS.

En aras de la simplicidad y de la ilustración, vamos a utilizar el servidor MySQL en una instancia VPS de Ubuntu 12.04. Sin embargo, estas técnicas se pueden aplicar a otras distribuciones de Linux y se pueden utilizar con MariaDB también.

Configuración inicial

MySQL le da una oportunidad de tomar el primer paso hacia la seguridad durante la instalación. Se solicitará que configure una contraseña de root.

sudo apt-get install mysql-server ?????????????????????????? Configuring mysql-server-5.5 ???????????????????????????
? While not mandatory, it is highly recommended that you set a password for the ?
? MySQL administrative "root" user. ?
? ?
? If this field is left blank, the password will not be changed. ?
? ?
? New password for the MySQL "root" user: ?
? ?
? _______________________________________________________________________________ ?
? ?
? ?
? ?
???????????????????????????????????????????????????????????????????????????????????

Siempre se puede configurar la contraseña de root en un momento posterior, pero no hay ninguna razón para omitir este paso, por lo que debe garantizar su cuenta de administrador desde el principio.

Una vez completada la instalación, se debe ejecutar un par de guiones incluidos. En primer lugar, vamos a utilizar el script «mysql_install_db» para crear una estructura de directorios para nuestras bases de datos.

sudo mysql_install_db

A continuación, ejecuta el script llamado «mysql_secure_installation». Esto nos guiará a través de algunos procedimientos que eliminen algunos valores por defecto que son peligrosos para su uso en un entorno de producción.

sudo mysql_secure_installation

En primer lugar, se le pedirá la contraseña de root se configura durante la instalación. Inmediatamente después, se le pedirá una serie de preguntas, comenzando por si desea cambiar la contraseña de root.

Esta es otra oportunidad para cambiar su contraseña a algo seguro si no lo ha hecho ya.

Debe responder «Y» (Sí) a todas las preguntas restantes.

Esto eliminará la posibilidad de que cualquiera pueda iniciar sesión en MySQL por defecto, deshabilitar el registro en forma remota con la cuenta de administrador, eliminar algunas bases de datos de prueba que son inseguros, y actualizar la instancia de MySQL corriendo para reflejar estos cambios. Consideraciones de seguridad

El tema de asegurar MySQL (y casi cualquier otro sistema) general es que debería permitirse el acceso sólo cuando sea absolutamente necesario. Su seguridad de datos a veces se reduce a un equilibrio entre la comodidad y la seguridad.

En esta guía, vamos a inclinarse del lado de la seguridad, aunque su uso específico del software de base de datos que puede llevar a elegir una de estas opciones.

de seguridad a través del archivo my.cnf

El archivo de configuración principal de MySQL es un archivo llamado «my.cnf» que se encuentra en el directorio «/ etc / mysql /» en Ubuntu y el «etc / /» en el directorio algunos otros VPS.

Vamos a cambiar algunos ajustes en este archivo para bloquear nuestra instancia de MySQL.

Abrir el archivo con privilegios de root. Cambiar la ruta del directorio según sea necesario si usted está siguiendo este tutorial en un sistema diferente:

sudo nano /etc/mysql/my.cnf

El primer ajuste que debemos comprobar es el «bind-dirección de» establecer dentro de la sección «[mysqld]». Este ajuste se debe establecer en su dispositivo de red de bucle local, que es «127.0.0.1».

bind-address = 127.0.0.1

Esto garantiza que MySQL no está aceptando conexiones desde cualquier lugar excepto en la máquina local.

Si necesita acceder a esta base de datos desde otra máquina, considere la posibilidad de conexión a través de SSH para hacer su consulta de base de datos y la administración local y enviar los resultados a través del túnel SSH.

El siguiente hoyo vamos a parchear es una función que permite el acceso al sistema de archivos subyacente desde el interior de MySQL. Esto puede tener implicaciones graves de seguridad y debe ser apagado a menos que sea absolutamente lo necesite.

En la misma sección del archivo, vamos a añadir una directiva para deshabilitar esta capacidad de cargar archivos locales:

local-infile=0

esto va a desactivar la carga de archivos del sistema de archivos para los usuarios sin privilegios de nivel de archivo en la base de datos.

Si tenemos espacio suficiente y no están operando una base de datos enorme, puede ser útil para registrar información adicional para mantener un ojo sobre las actividades sospechosas.

registro en exceso puede crear un impacto en el rendimiento, así que esto es algo que hay que sopesar cuidadosamente.

Puede establecer la variable de registro dentro de la misma sección «[mysqld]» que hemos ido añadiendo a.

log=/var/log/mysql-logfile

Asegúrese de que el registro de MySQL, registro de errores, y el directorio de registro de MySQL no son legibles por todos:

sudo ls -l /var/log/mysql* -rw-r----- 1 mysql adm 0 Jul 23 18:06 /var/log/mysql.err
-rw-r----- 1 mysql adm 0 Jul 23 18:06 /var/log/mysql.log

/var/log/mysql:
total 28
-rw-rw---- 1 mysql adm 20694 Jul 23 19:17 error.log

sujeción de MySQL desde dentro

Hay una serie de pasos que puede tomar durante el uso de MySQL para mejorar la seguridad.

Nos será la introducción de los comandos en esta sección en la interfaz de línea de MySQL, por lo que necesitamos para iniciar sesión.

mysql -u root -p

Se le pedirá la contraseña de root que ha configurado anteriormente.

sujeción de contraseñas y Host Asociaciones

En primer lugar, asegurarse de que no hay ningún usuario sin una contraseña o una asociación anfitriona en MySQL:

SELECT User,Host,Password FROM mysql.user; +------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user | % | |
| root | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root | ::1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Como se puede ver, en nuestro ejemplo configurado, el usuario «demo de usuario» tiene sin contraseña y es válido independientemente de lo que es acogida en. Esto es muy inseguro.

Nos puede establecer una contraseña para el usuario con este comando. Cambio «newpassword» para reflejar la contraseña que desea asignar.

UPDATE mysql.user SET Password=PASSWORD('newPassWord') WHERE User="demo-user";

Si comprobamos la mesa usuario nuevo, veremos que el usuario de demostración tiene ahora una contraseña:

SELECT User,Host,Password FROM mysql.user; +------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user | % | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 |
| root | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root | ::1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Si nos fijamos en el campo «Host», se verá que todavía tenemos un «%», lo cual es un comodín que significa cualquier host. Esto no es lo que queremos. Vamos a cambio de que para ser «localhost»:

UPDATE mysql.user SET Host='localhost' WHERE User="demo-user";

Si comprobamos una vez más, podemos ver que la tabla de usuario tiene ahora los campos correspondientes establecidos.

SELECT User,Host,Password FROM mysql.user;

Si nuestra tabla contiene ningún usuario en blanco (que no debería en este punto, ya que nos encontramos «mysql_secure_installation», pero vamos a cubrir este de todos modos), que debe eliminarlos.

Para hacer esto, podemos utilizar la siguiente llamada a eliminar usuarios en blanco de la tabla de acceso:

DELETE FROM mysql.user WHERE User="";

Después de que termine de modificar la tabla de usuario, tenemos que introducir el siguiente comando para aplicar los nuevos permisos:

FLUSH PRIVILEGES;

Ejecución los usuarios de aplicación específica

similares a la práctica de los procesos dentro de Linux corriendo como un usuario aislado, beneficios de MySQL a partir del mismo tipo de aislamiento.

cada aplicación que utiliza MySQL debe tener su propio usuario que sólo se ha limitado privilegios y sólo tiene acceso a las bases de datos que necesita para funcionar.

Cuando configuramos una nueva aplicación para utilizar MySQL, que debe crear las bases de datos necesarias en dicha solicitud:

create database testDB; Query OK, 1 row affected (0.00 sec)

A continuación, se debe crear un usuario para administrar la base de datos, y asignarle sólo los privilegios que necesita. Esto varía según la aplicación, y algunos de los usos que necesite privilegios más abiertos que otros.

Para crear un nuevo usuario, utilice el siguiente comando:

CREATE USER 'demo-user'@'localhost' IDENTIFIED BY 'password';

Podemos conceder a los nuevos privilegios de usuario en la nueva tabla con el siguiente comando. Ver el tutorial sobre cómo crear un nuevo usuario y permisos de permisos en MySQL para obtener más información sobre los privilegios específicos:

GRANT SELECT,UPDATE,DELETE ON testDB.* TO 'demo-user'@'localhost';

A modo de ejemplo, si posteriormente hay que revocar los privilegios de actualización de la cuenta, se podría utilizar el siguiente comando:

REVOKE UPDATE ON testDB.* FROM 'demo-user'@'localhost';

Si necesitamos todos los privilegios en una cierta base de datos, podemos especificar que con lo siguiente:

GRANT ALL ON testDB.* TO 'demo-user'@'localhost';

Para mostrar los privilegios actuales de un usuario, lo primero que hay que poner en práctica los privilegios que hemos especificado con el comando «privilegios ras». Entonces, podemos consultar lo que le otorga un usuario tiene: privilegios ras

FLUSH PRIVILEGES;
show grants for 'demo-user'@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for demo-user@localhost |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demo-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, UPDATE, DELETE ON `testDB`.* TO 'demo-user'@'localhost' |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Siempre cuando se producen cambios de toma de acabados.

Cambiar el usuario root

Un paso adicional que es posible que desee tomar es cambiar el nombre de usuario raíz. Si un atacante está intentando acceder a la entrada de la raíz de MySQL, que tendrá que realizar el paso adicional de encontrar el nombre de usuario.

La conexión de la raíz se puede cambiar con el comando siguiente:

rename user 'root'@'localhost' to 'newAdminUser'@'localhost';

podemos ver el cambio mediante el uso de la misma consulta que hemos estado usando para la base de datos del usuario:

select user,host,password from mysql.user;

Una vez más, hay que eliminar los privilegios para que estos cambios ocurren :

FLUSH PRIVILEGES;

Recuerde que usted tendrá que iniciar sesión en MySQL como el nombre de usuario que acaba de crear a partir de ahora cuando se desea realizar tareas administrativas:

mysql -u newAdminUser -p

Conclusión

Aunque esto no es de ninguna manera una lista exhaustiva de las prácticas de seguridad de MySQL y MariaDB , hay que darle una buena introducción a los tipos de decisiones que tienen que hacer cuando se asegura a sus bases de datos.

Más información sobre la configuración y la seguridad se puede encontrar en los sitios web de MySQL y MariaDB, así como en sus respectivas páginas de manual. Las aplicaciones que decide su uso también pueden ofrecer consejos de seguridad.