Apuntes de BD para DAW, DAM y ASIR
José Juan Sánchez Hernández
Curso 2023/2024
root
root
(Método 1)root
(Método 2
--skip-grant-tables
)Un Sistema de Gestión de Bases de Datos Relacionales (SGBDRs) es un programa que nos permite crear, actualizar y administrar una base de datos relacional. La mayoría de los sistemas de gestión de bases de datos relacionales utilizan SQL para acceder a la base de datos.
Hay que tener en cuenta que pueden existir diferencias en la sintaxis SQL utilizada por los distintos SGBDRs.
Los SGBDRs más usados actualmente son:
Vamos a crear una máquina virtual en VirtualBox con la última versión de Ubuntu Server donde vamos a instalar todo el software necesario para realizar nuestras primeras prácticas con el sistema gestor de bases de datos MySQL.
Tenga en cuenta que la tarjeta de red de la máquina virtual tiene que estar configurada en modo adaptador puente, que debemos asignarle una dirección IP estática manualmente y que tenemos que configurar la máquina para que use el proxy que tenemos en clase.
La configuración de las interfaces de red se encuentra en el
directorio /etc/netplan
. En este directorio encontraremos
un archivo de configuración con extensión .yaml
.
Los archivos de configuración de las interfaces de red utilizados en las versiones de Ubuntu 18.04 y 20.04, tienen los siguientes nombres:
50-cloud-init.yaml
00-installer-config.yaml
Si nuestro archivo de configuración se llama
00-installer-config.yaml
deberíamos editarlo para añadir
nuestra configuración de red.
sudo nano /etc/netplan/00-installer-config.yaml
El archivo deberá tener un contenido similar al este:
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
enp0s3:
addresses: []
dhcp4: true
version: 2
Ahora deberemos añadir nuestra configuración de red. Tenga en cuenta que en los archivos YAML no está permitido el uso de caracteres de tabulación para indentar, para indentar sólo podemos usar espacios en blanco.
A continuación se muestra un ejemplo de cómo sería la configuración de red para una máquina con la dirección IP 192.168.21.101.
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
enp0s3:
addresses: [192.168.21.101/24]
gateway4: 192.168.21.99
nameservers:
addresses: [8.8.8.8,8.8.4.4]
dhcp4: no
version: 2
Tenga en cuenta que en su caso tendrá que sustituir la dirección IP 192.168.21.101 por la dirección IP que le haya asignado el profesor.
Una vez hecho esto aplicamos la nueva configuración de red.
sudo netplan apply
Este paso sólo será necesario realizarlo si hemos instalado una versión anterior a la 18.04.
Para configurar la interfaz de red manualmente lo haremos editando el
archivo /etc/network/interfaces
.
sudo nano /etc/network/interfaces
Configuramos la interfaz con los siguientes parámetros, teniendo en cuenta que en su caso tendrá que sustituir la dirección IP 192.168.21.101 por la dirección IP que le haya asignado el profesor.
auto enp0s3
iface enp0s3 inet static
address 192.168.21.101
netmask 255.255.255.0
gateway 192.168.21.99
dns-nameservers 8.8.8.8 8.8.4.4
Reiniciamos el servicio de red:
sudo /etc/init.d/networking restart
También podemos desactivar la interfaz
enp0s3
y volver a activarla para que se
apliquen los cambios de la nueva configuración a esa interfaz de
red.
sudo ifdown enp0s3
sudo ifup enp0s3
Este paso sólo será necesario realizarlo si estamos haciendo uso del proxy del aula.
Para poder tener conexión a Internet en nuestra máquina virtual
tenemos que configurarla para que use el proxy que tenemos en el aula.
Para esto editamos el archivo /etc/environment
:
sudo nano /etc/environment
Y añadimos las siguientes variables de entorno al final del archivo:
http_proxy=http://192.168.21.99:3128
https_proxy=https://192.168.21.99:3128
En primer lugar actualizamos la lista de paquetes del repositorio:
sudo apt-get update
Realizamos la instalación de mysql-server
:
sudo apt-get install mysql-server
root
Una vez que hemos instalado MySQL Server en nuestro sistema vamos a
acceder a la consola de MySQL. En primer lugar vamos a iniciar una
sesión como root
:
Una vez que hemos iniciado una sesión como root
vamos a
iniciar la consola de MySQL también como root
sin necesidad
de indicarle ningún password (no es necesario usar el modificador
-p
).
Una vez hecho esto ya tendríamos acceso a la consola de MySQL como
root
.
root
(Método 1)En primer lugar accedemos a la consola de MySQL como
root
y seleccionamos la base de datos
mysql.
Vamos a revisar los usuarios que existen en MySQL y qué método tienen establecido para autenticar.
SELECT User, Host, plugin FROM user;
+------------------+-----------+-----------------------+
| User | Host | plugin |
+------------------+-----------+-----------------------+
| root | localhost | auth_socket |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| debian-sys-maint | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)
Podemos ver que para el usuario root@localhost
el método
de autenticación es auth_socket
. Esto quiere decir que el
usuario root
usará las mismas credenciales que tiene en el
sistema operativo.
Si queremos cambiar la contraseña de root
tendremos que
cambiar el método de autenticación a mysql_native_password
o caching_sha2_password
. Tendrá que sustituir
nueva_contraseña
por la contraseña que desee.
Opción mysql_native_password
(Antigua)
Opción caching_sha2_password
(Nueva)
La
documentación oficial de MySQL indica que la nueva opción
caching_sha2_password
es más segura que la antigua opción
mysql_native_password
y que por lo tanto es la opción
recomendada.
Después habrá que ejecutar el siguiente comando para que las actualizaciones realizadas tengan efecto.
root
(Método 2
--skip-grant-tables
)Otra opción para modificar la contraseña del usuario
root
en MySQL es iniciar el servicio con la opción
--skip-grant-tables
, que permite que cualquier usuario se
pueda conectar sin necesidad de realizar el proceso de
autenticación.
En primer lugar detenemos el servicio de MySQL.
sudo systemctl stop mysql
Como vamos a iniciar el proceso de MySQL de forma manual vamos a
necesitar crear de forma manual el directorio
/var/run/mysqld
y asignarle que el propietario de este
directorio es mysql
del grupo mysql
.
sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld
Una vez que hemos detenido el servicio de MySQL, lo volvemos a
iniciar pero haciendo uso del comando que está en la ruta
/usr/sbin/mysqld
y pasándole como parámetro la opción
--skip-grant-tables
que permite conectarnos sin contraseña
y con todos los privilegios. Esta opción deshabilita la gestión de
usuarios y por lo tanto, no es posible utilizar sentencias como
ALTER USER
y SET PASSWORD
. Al utilizar la
opción --skip-grant-tables
se habilita automáticamente la
opción --skip-networking
para desactivar las conexiones
remotas como mecanismo de seguridad. Observe que hemos añadido
&
al final del comando para que el proceso se ejecute
en segundo plano.
sudo /usr/sbin/mysqld --skip-grant-tables &
Podemos comprobar que le proceso se está ejectuando de forma correcta
haciendo un listado de todos los procesos que están en ejecución con
ps aux
y buscando en la lista el nombre del proceso con
grep mysqld
.
ps aux | grep mysqld
Una vez que hemos comprobado que el proceso está en ejecución,
podemos conectarnos al servidor de MySQL. No es necesario indicar ningún
usuario ni contraseña, nos conectaremos automáticamente con todos los
privilegios como root
.
mysql
Ahora tendremos que indicarle al servidor que tiene que recargar las
tablas encargadas de la autenticación de los usuarios para poder activar
la gestión de usuarios. Recuerda que la opción
--skip-grant-tables
deshabilita esta funcionalidad.
Modificamos la contraseña del usuario ‘root’@‘localhost’,
reemplazando nueva_contraseña
por la contraseña que
queramos asignar.
Salimos del cliente de MySQL.
exit;
Detenemos el proceso mysqld
.
sudo pkill mysqld
Reiniciamos el servicio de MySQL.
sudo systemctl start mysql
Edita el siguiente archivo de configuración:
Busca la directiva de configuración bind-address
dentro
del bloque de [mysqld]
:
[mysqld]
bind-address = 127.0.0.1
En la configuración por defecto, MySQL sólo permite conexiones desde localhost (127.0.0.1). Habrá que modificar este valor por la dirección IP de la máquina donde se está ejecutando el servicio de MySQL.
[mysqld]
bind-address = IP_SERVIDOR_MYSQL
Si nuestra máquina dispone más de una interfaz de red podemos poner la dirección IP 0.0.0.0 para permitir que se puedan conectar a MySQL desde cualquiera de las interfaces de red disponibles.
[mysqld]
bind-address = 0.0.0.0
Una vez hecho esto tenemos que reiniciar el servicio de MySQL:
Los usuarios de MySQL se almacenan en la tabla
mysql.user
. La clave primaria de esta tabla está formada
por los valores user
y host
, de modo que cada
fila vendrá identificada por un nombre de usuario y el host desde el que
puede conectarse.
La siguiente consulta nos devuelve el listado de usuarios que tenemos en MySQL y desde qué interfaz de red del servidor MySQL pueden conectarse:
En nuestra caso la consulta anterior devuelve el siguiente resultado:
+------------------+--------------+
| user | host |
+------------------+--------------+
| root | localhost |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+--------------+
Todos los usuarios que existen actualmente en la base de datos sólo
pueden conectarse desde la propia máquina donde está instalado MySQL
Server (localhost
).
El siguiente diagrama muestra un ejemplo de dos usuarios que se están
conectando a una máquina con MySQL Server. El usuario
root@localhost
es un usuario que sólo puede conectarse
desde la máquina local y el usuario root@'%'
es un usuario
que se puede conectar desde una máquina remota.
Veamos cómo podemos crear un nuevo usuario que pueda conectarse desde una máquina remota.
Ahora tenemos que asignar privilegios al usuario de MySQL que vamos a utilizar para conectarnos desde una máquina remota.
En primer lugar nos conectamos a la consola de MySQL Server con el
usuario root
desde la misma máquina.
Una vez que hemos conectado con MySQL Server vamos a crear un usuario
que pueda conectarse desde cualquier máquina. Recuerde que los usuarios
en MySQL están identificados por un nombre de usuario y un host, en este
caso vamos a utilizar el comodín %
como el host, para
indicar que este usuario se puede conectar desde cualquier dirección
IP.
La sentencia SQL para realizar esta acción sería la siguiente:
mysql> GRANT ALL PRIVILEGES ON DATABASE.* to USERNAME@'%' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;
Tenga en cuenta que tendrá que reemplazar los valores
DATABASE
, USERNAME
y
IP-SERVIDOR-HTTP
por los valores que necesite.
Por ejemplo, si queremos crear un usuario root
que se
puede conectar desde cualquier máquina, que tiene privilegios sobre
todas las bases de datos que existen y cuya contraseña es
root
tendríamos que ejecutar la siguiente sentencia
SQL:
Una vez hecho esto comprobamos cuál es la lista de usuarios que existen actualmente en MySQl y desde qué host pueden conectarse:
En nuestra caso la consulta anterior devuelve el siguiente resultado:
+------------------+--------------+
| user | host |
+------------------+--------------+
| root | % |
| root | localhost |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+--------------+
También podemos consultar qué permisos específicos tiene un
determinado usuario. La siguiente consulta nos devuelve los permisos que
tiene el usuario root
:
+------------------------------------------------+
| Grants for root@% |
+------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' |
+------------------------------------------------+
A partir de la versión 8.0 de MySQL no es posible crear un
usuario con la sentencia GRANT
de SQL. Por lo tanto, sólo
usaremos GRANT para aquellos usuarios que ya han sido creados
previamente. Puede encontrar más
información en la documentación oficial.
En este caso tendremos que crear un usuario con la sentencia
CREATE USER
y luego asignarle los privilegios que queramos
con la sentencia GRANT
.
Paso 1. Creación de un usuario
Donde el valor de IP_MÁQUINA_CLIENTE
indica que el
usuario nombre_usuario
sólo podrá conectarse al servidor de
MySQL desde esa dirección IP. Los valores que podemos utilizar para
IP_MÁQUINA_CLIENTE
son los siguientes:
localhost
: No permitimos conexiones remotas, sólo se
permiten conexiones dentro de la misma máquina.%
: Este comodín indica que permitimos conexiones desde
cualquier máquina.Tenga en cuenta que tendrá que reemplazar los valores
nombre_usuario
, contraseña
y
IP_MÁQUINA_CLIENTE
por los valores que necesite.
Paso 2. Asignación de privilegios
Una vez que hemos creado el usuario le asignamos los privilegios que
sean necesarios sobre la base de datos de la aplicación. En este caso le
vamos a asignar todos los privilegios con
ALL PRIVILEGES
.
Tenga en cuenta que tendrá que reemplazar los valores
base_de_datos
, nombre_usuario
y
IP_MÁQUINA_CLIENTE
por los valores que necesite.
Los diferentes tipos de permisos que podemos aplicar son los siguientes:
ALL PRIVILEGES
: permite a un usuario de MySQL acceder a
todas las bases de datos asignadas en el sistema.CREATE
: permite crear nuevas tablas o bases de
datos.DROP
: permite eliminar tablas o bases de datosDELETE
: permite eliminar registros de tablas.INSERT
: permite insertar registros en tablas.SELECT
: permite leer registros en las tablas.UPDATE
: permite actualizar registros seleccionados en
tablas.GRANT OPTION
: permite asignar privilegios a otros
usuarios.Paso 3. Actualizamos las tablas de privilegios
Para que los cambios que hemos realizado sobre los privilegios de los usuarios se apliquen de forma inmediata, tendremos que ejecutar el siguiente comando.
Ejemplo
Por ejemplo, si queremos crear un usuario root
con
contraseña root
, que se puede conectar desde cualquier
máquina, que tiene privilegios sobre todas las bases de datos que
existen y cuya contraseña es root
tendríamos que ejecutar
la siguiente sentencia SQL:
CREATE USER 'root'@'%' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
Ahora vamos a comprobar que podemos conectarnos con MySQL desde la
máquina donde está corriendo el servicio de Apache HTTP. Podemos
comprobarlo conectando con el shell de mysql
:
O haciendo un telnet al puerto donde está corriendo el servicio de MySQL:
Si no podemos conectarnos a MySQL revisaremos que el servicio está activo y que no tenemos ningún firewall que nos esté filtrando el puerto del servicio donde se ejecuta MySQL.
systemctl
sudo systemctl start mysql
sudo systemctl stop mysql
sudo systemctl restart mysql
sudo systemctl status mysql
/etc/init.d/mysql
sudo /etc/init.d/mysql start
sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql restart
sudo /etc/init.d/mysql reload
sudo /etc/init.d/mysql force-reload
sudo /etc/init.d/mysql status
/etc/mysql/mysql.cnf
También podemos encontrar archivos de configuración en los directorios:
/etc/mysql/conf.d/
/etc/mysql/mysql.conf.d/
/var/log/mysql/error.log
Para conectarnos a un MySQL que se está ejecutando en nuestra máquina
local (localhost
). Con el parámetro -u
indicamos el nombre del usuario con el que queremos conectar y con el
parámetro -p
nos pedirá el password
del
usuario.
Para conectarnos a un MySQL remoto que se está ejecutando en otra
máquina, utilizamos el parámetro -h
con la IP de la máquina
donde nos queremos conectar.
Cuando hayamos conectado nos aparecerá la siguiente consola de comandos SQL.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
exit
quit
Desde la consola de Linux:
Desde la consola de MySQL:
ALL PRIVILEGES
: permite a un usuario de MySQL acceder a
todas las bases de datos asignadas en el sistema.CREATE
: permite crear nuevas tablas o bases de
datos.DROP
: permite eliminar tablas o bases de datosDELETE
: permite eliminar registros de tablas.INSERT
: permite insertar registros en tablas.SELECT
: permite leer registros en las tablas.UPDATE
: permite actualizar registros seleccionados en
tablas.GRANT OPTION
: permite remover privilegios de
usuariosHabrá que reemplazar nombre_usuario y contraseña por los datos del nuevo usuario que desea crear:
Una vez que hemos creado el usuario hay que asignarle permisos para que pueda acceder a la/s base/s de datos que queramos.
Por ejemplo:
En este comando, los asteriscos indican que estamos aplicando el
permiso ALL PRIVILEGES
al usuario
nombre_usuario
para todas las tablas de cada una de las
bases de datos. bases de datos y tablas.
Después de este comando habrá que ejecutar el siguiente comando para refrescar todos los privilegios a los usuarios.
Los usuarios de MySQL se almacenan en la tabla
mysql.user
. La clave primaria de esta tabla está formada
por los valores user
y host
, de modo que cada
fila vendrá identificada por un nombre de usuario y el host desde el que
puede conectarse.
La siguiente consulta nos devuelve el listado de usuarios que tenemos en MySQL y desde qué host pueden conectarse:
En nuestra caso la consulta anterior devuelve el siguiente resultado:
+------------------+--------------+
| user | host |
+------------------+--------------+
| root | % |
| root | localhost |
| debian-sys-maint | localhost |
| phpmyadmin | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+--------------+
También podemos consultar qué permisos específicos tiene un
determinado usuario. La siguiente consulta nos devuelve los permisos que
tiene el usuario root
:
+------------------------------------------------+
| Grants for root@% |
+------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' |
+------------------------------------------------+
Esta
página forma parte del curso
Bases de Datos de
José Juan Sánchez Hernández y
su contenido se distribuye bajo una
licencia
Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0
Internacional.