mariadb в chroot дает доступ, запрещенный для пользователя 'root'@'localhost', даже если пароль установлен


У меня есть скрипт, который запускает mariadb в chroot, это qemu-arm-static rooberrypi chroot, но я не думаю, что это должно сильно измениться.

Сценарий устанавливает и затем устанавливает пароль для пользователя root mariadb, затем пытается создать базу данных как пользователь 'pi', используя установленный пароль.

Вот сценарий:

apt-get install -y mariadb-server
mysqld_safe &
echo "waiting for sql server to go online"
sleep 10

mysql -u root <<-EOF
UPDATE mysql.user SET Password=PASSWORD('root') WEHRE User='root';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.db WHERE Db='test' OR Db='test_%';
FLUSH PRIVILEGES;
EOF

mysql --user=root -e "select user, host, password, plugin, authentication_string from mysql.user where user='root';"
mysql --user=root -e "show grants for 'root'@'localhost';"

mysqladmin shutdown
sleep 10
mysqld_safe &
echo "waiting for sql server to go online"
sleep 10
su pi -c 'mysql --user=root --password=root -e "CREATE DATABASE dbname;"'
mysqladmin shutdown

Вот вывод:

update-alternatives: using /usr/bin/xterm to provide /usr/bin/x-terminal-emulator (x-terminal-emulator) in auto mode
update-alternatives: using /usr/bin/lxterm to provide /usr/bin/x-terminal-emulator (x-terminal-emulator) in auto mode
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for systemd (232-25+deb9u2) ...
W: chown to _apt:root of directory /var/cache/apt/archives/partial failed - SetupAPTPartialDirectory (1: Operation not permitted)
W: Not using locking for nfs mounted lock file /var/cache/apt/archives/lock
+ echo 'waiting for sql server to go online'
waiting for sql server to go online
+ sleep 10
+ mysqld_safe
180628 08:27:53 mysqld_safe Logging to syslog.
180628 08:27:54 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
+ mysql -u root
+ mysql --user=root -e 'select user, host, password, plugin, authentication_string from mysql.user where user='\''root'\'';'
user    host    password        plugin  authentication_string
root    localhost       *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B       unix_socket
+ mysql --user=root -e 'show grants for '\''root'\''@'\''localhost'\'';'
Grants for root@localhost
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION
GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION
+ mysqladmin shutdown
+ sleep 10
+ echo 'waiting for sql server to go online'
waiting for sql server to go online
+ sleep 10
+ mysqld_safe
180628 08:28:18 mysqld_safe Logging to syslog.
180628 08:28:18 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
+ su pi -c 'mysql --user=root --password=root -e "CREATE DATABASE dbname;"'
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Бег mysql как root всегда работает и не запрашивает пароль.

Я вижу, что хэш пароля изменяется, если я изменяю пароль с "root" на что-то другое, но я все еще получаю "доступ запрещен", нужно ли что-то еще сделать, чтобы root мог войти?

1 ответ

Решение

Итак, проблема в том, что, как я понял, благодаря каналу #maria IRC, системы Debian (и, возможно, другие системы posix) имеют подключаемый модуль аутентификации, называемый unix_socket. Этот плагин не позволяет получить доступ к пользователю root с паролем. Итак, вы можете создать другого пользователя и предоставить ему все права, которые есть у root (или те разрешения, которые вы хотите).

Это делает приведенный выше скрипт таким образом, который теперь является частью модуля установки CustomPiOS mysql:

# Mysql user (not root, because root is only accessible from command-line)
MYSQL_USER=pi
MYSQL_USER_PASSWORD=raspberry

apt-get install -y mariadb-server

mysqld_safe &

echo "waiting for sql server to go online"
sleep 10

mysql --user=root -e "CREATE USER '"${MYSQL_USER}"'@'localhost' IDENTIFIED BY '${MYSQL_USER_PASSWORD}';"
mysql --user=root -e "GRANT ALL PRIVILEGES ON  *.* to 'pi'@'localhost' WITH GRANT OPTION;"

# Debug
# mysql --user=root -e "select user, host, password, plugin, authentication_string from mysql.user;"
# mysql --user=root -e "show grants for '"${MYSQL_USER}"'@'localhost';"

mysqladmin shutdown

# Example to create a new DB
# mysqld_safe &
# echo "waiting for sql server to go online"
# sleep 10
# su pi -c 'mysql --user=pi --password=raspberry -e "CREATE DATABASE dbname;"'
# mysqladmin shutdown

echo "Done installing mysql"
Другие вопросы по тегам