Пошаговые руководства, шпаргалки, полезные ссылки...
БлогФорумАвторы
Полезные Online-сервисы
Перечень Бесплатного ПО
Подписка на RSS-канал
Как я понял, многие администраторы веб-серверов вместе с серверной службой MySQL предпочитают разворачивать веб-утилиту phpMyAdmin для более комфортной работы с базами данных MySQL. Однако исходя из принципа «разумно необходимого минимума», сопряжённого с соображениями о повышении уровня безопасности веб-сервера в целом, я полагаю, что можно прожить и без этого инструмента. К тому же количество операций по администрированию БД MySQL в нашем случае сведено к такой величине, при которой все действия запросто могут быть выполнены с помощью консольного клиента mysql-client при условии удалённого доступа к консоли нашего веб-сервера через SSH.
Установим сервер MySQL и консольный клиент для управления базами данных:
sudo apt-get update sudo apt-get install mysql-server mysql-client
В процессе установки мы получим запрос на установление пароля для root-пользователя mysql. Не путайте этого пользователя с root-пользователем Linux и, соответственно назначайте пароль отличный от системного root-a.
После ввода пароля нас попросят ввести его ещё раз, чтобы исключить возможность опечаток/ошибок.
Сразу после завершения процесса установки нам необходимо задействовать минимально безопасный режим работы сервера mysql. Для этого запустим специальный инструмент, входящий в состав поставки mysql:
sudo mysql_secure_installation
Запущенный скрипт задаст нам ряд вопросов, на которые нужно будет правильно ответить для повышения безопасности сервера mysql. На первый запрос введём ранее заданный нами пароль root-пользователя mysql:
Enter current password for root (enter for none): OK, successfully used password, moving on...
На вопрос о смене пароля можно отказаться, так как ранее мы уже задали root-пароль:
You already have a root password set, so you can safely answer 'n'. Change the root password? [Y/n] n ... skipping.
На вопрос об отключении анонимного пользователя отвечаем утвердительно:
Remove anonymous users? [Y/n] Y ... Success!
На вопрос об отключении удалённого доступа root-пользователя к mysql отвечаем утвердительно:
Disallow root login remotely? [Y/n] Y ... Success!
Соглашаемся с удалением тестовой БД. Это может быть важно, учитывая факты изложенные в некоторых источниках, например в заметке Debian.pro - mysql-server в Ubuntu, база test. Решето.
Remove test database and access to it? [Y/n] Y - Dropping test database... ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist ... Failed! Not critical, keep moving... - Removing privileges on test database... ... Success!
Как видим, в нашей инсталляции тестоввая БД отсутсвует в конфигурации по умолчанию.
В конце работы скрипта соглашаемся с применением параметров безопасности:
Reload privilege tables now? [Y/n] Y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL!
Подключимся клиентом к серверу и посмотрим его статус. Выполним команду подключения от имени root-пользователя mysql:
mysql -u root -p
Будет запрошен пароль root, введём его и попадём в приглашение командной строки mysql-клиента для работы с сервером:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 36 Server version: 5.5.47-0ubuntu0.14.04.1 (Ubuntu) Copyright (c) 2000, 2015, 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>
Введём команду вывода информации о состоянии сервера mysql:
mysql> status
Получим ответ отсервера:
-------------- mysql Ver 14.14 Distrib 5.5.47, for debian-linux-gnu (x86_64) using readline 6.3 Connection id: 62 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.5.47-0ubuntu0.14.04.1 (Ubuntu) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 20 min 53 sec
Как видно из предыдущего ответа mysql-сервера, для сервера и для вновь создаваемых БД по умолчанию установлена кодировка latin1. Изменим это значение на utf-8, добавив соответсвующие параметры в главный конфигурационный файл mysql-сервера: /etc/mysql/my.cnf
sudo nano /etc/mysql/my.cnf
Приведу выдержки с параметрами в некоорых секциях, на которые нужно обратить внимание и которые нужно изменить или добавить:
[client] # Изменим кодировку по умолчанию для клиентских подключений на utf-8 default-character-set = utf8 [mysqld] # По умолчанию mysql не принимает tcp соединения т.к. прослушивает только 127.0.0.1 bind-address = 127.0.0.1 # Изменим кодировку по умолчанию для сервера # и вновь создаваемых баз с дефолтной latin1 на utf-8 # skip-character-set-client-handshake character-set-server = utf8 init-connect='SET NAMES utf8' collation-server=utf8_general_ci [mysqldump] # Изменим кодировку по умолчанию для утилиты резервного копирования на utf-8 default-character-set = utf8
Остальные параметры файла my.cnf в большинстве случаев можно оставить в значениях по умолчанию.
Для вступления изменений в силу перезагрузим службу mysql:
sudo service mysql restart
Для того, чтобы каждый раз не вводить учётные данные для подключения к mysql-серверу при работе с mysql-клиентом, можно создать пользовательский файл настроек .my.cnf в домашнем каталоге пользователя. В нашем случае это будет полезно сделать ещё и для того, чтобы там же указать учётные данные для утилиты mysqldump, которую в перспективе мы будем вызывать из скриптов резервного копирования. Это позволит нам лишний раз «не светить» учётные данные пользователя mysql в скриптах. Самое главное при создании файла .my.cnf правильно настроить права доступа к нему, чтобы не скомпрметировать хранимые в нём учётные данные. Так как наши скрипты резервного копирования в перспективе будут выполняться от имени root-пользователя Linux, то и размещать файл .my.cnf мы будем в его домашней папке «/root/»
sudo touch /root/.my.cnf sudo chown root:root /root/.my.cnf sudo chmod 600 /root/.my.cnf
Наполним файл содержимым:
[mysql] user = root password = 'MyStr#ngMySQLpaSSw0rD' [mysqldump] user = root password = 'MyStr#ngMySQLpaSSw0rD'
Созраняем файл и проверяем подключение к mysql предварительно переключившись в режим суперпользователя:
sudo su- sudo mysql
Если mysql не запросил у нас учётные данные, значит их передача из файла .my.cnf работает.
Проверим возможность работы связки MySQL и PHP. Для этого создадим временный php-скрипт с каким-нибудь «диким» именем, например kJzfgdf5klhG2.php, в корне любого из наших сайтов nginx:
sudo nano /var/www/html/blog/kJzfgdf5klhG2.php
Наполним скрипт вызовом php-функций для подключения к mysql с явным указанием учётных данных mysql-сервера:
<?php $link = mysqli_connect('localhost','root','MyStr#ngMySQLpaSSw0rD'); if(!$link) die('Connection error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); echo 'OK... ' . mysqli_get_host_info($link) . "\n"; mysqli_close($link); ?>
Перейдем веб-браузером по адресу http://blog.mydomain.ru/kJHfgdf5klhHJ2.php
Если в результате в браузере увидим текст «OK… Localhost via UNIX socket», то можно считать что связка MySQL и PHP работает.
После проведения теста обязательно сразу удалим тестовый скрипт, чтобы избежать риска утечки учётных данных
sudo rm /var/www/html/blog/kJzfgdf5klhG2.php
Создадим новые пустные базы данных для наших сайтов. При созданиии будем придерживаться простой схемы разграничения доступа: 1 пользователь mysql = 1 база данных = 1 сайт
Подключимся к mysql
$ sudo su - # mysql
Создадим новую базу данных для первого сайта (блога Wordpress):
mysql> CREATE DATABASE `blog-db`; Query OK, 1 row affected (0.00 sec)
Создадим нового пользователя mysql:
mysql> CREATE USER 'blog-usr'@'localhost' IDENTIFIED BY 'MySQLdbBlogPaSSw0rD'; Query OK, 0 rows affected (0.00 sec)
Выдадим пользователю полные права на доступ к базе:
mysql> GRANT ALL ON `blog-db`.* TO 'blog-usr'@'localhost'; Query OK, 0 rows affected (0.00 sec)
По аналогии создадим пустые базы данных для всех сайтов, которым нужен будет доступ к mysql.
Этого достаточно, чтобы в последствии залить дамп (резервную копию данных из *.sql файла) в созданную БД и подключить к скриптам сайта. Эти процедуры будут рассмотрены в следующих частях руковоства.
Ubuntu.ru Wiki - MySQL
Автор первичной редакции: Алексей Максимов Время публикации: 29.03.2016 22:03