MySQL — это полностью сетевая кроссплатформенная система реляционных баз данных и распределенная система управления базами данных с архитектурой клиент/сервер. MySQL — это полностью сетевая кроссплатформенная система реляционных баз данных и распределенная система управления базами данных с архитектурой клиент/сервер. Его преимущества заключаются в мощных функциях, простоте использования, удобном управлении, высокой скорости работы, высокой безопасности и надежности. Пользователи могут использовать множество языков для написания программ для доступа к базе данных MySQL, особенно в сочетании с PHP. золотая комбинация и широко используется.
Поскольку MySQL является многоплатформенной базой данных, ее конфигурацию по умолчанию следует считать применимой в различных ситуациях, поэтому дальнейшее усиление безопасности должно осуществляться в нашей собственной среде использования. Как системный администратор MySQL, мы несем ответственность за поддержание безопасности и целостности данных системы базы данных MySQL.
Настройка безопасности базы данных MySQL должна начинаться с двух аспектов: внутренней безопасности системы и безопасности внешней сети. Кроме того, мы также кратко представим некоторые проблемы и советы, на которые следует обратить внимание при программировании.
Внутренняя безопасность системы
Во-первых, давайте кратко представим структуру каталогов базы данных MySQL. После установки MySQL каталог данных и база данных будут инициализированы после запуска сценария mysql_db_install. Если для установки мы используем пакет исходного кода MySQL, а каталог установки — /usr/local/mysql, то каталогом данных обычно будет /usr/local/mysql/var. Система баз данных состоит из ряда баз данных, каждая из которых содержит ряд таблиц базы данных. MySQL использует имя базы данных для создания каталога базы данных в каталоге данных. Каждая таблица базы данных использует имя таблицы базы данных в качестве имени файла, а в каталог базы данных помещаются три файла с расширениями MYD, MYI и frm.
Таблица авторизации MySQL обеспечивает гибкое управление разрешениями на доступ к базе данных, но если у локального пользователя есть права на чтение файла библиотеки, злоумышленнику нужно только упаковать и скопировать каталог базы данных, а затем скопировать его в свой собственный каталог данных. Получить доступ к украденному. базы данных. Поэтому безопасность хоста, на котором расположен MySQL, является наиболее важным вопросом. Если хост не защищен и не контролируется злоумышленниками, то о безопасности MySQL не может быть и речи. Второе — это безопасность каталога данных и файлов данных, что связано с настройками разрешений.
Судя по некоторым старым бинарным версиям основного сайта MySQL, атрибут каталога данных в версии 3.21.xx равен 775, что очень опасно, любой локальный пользователь может прочитать каталог данных, поэтому файл базы данных очень небезопасен. Атрибут каталога данных в версии 3.22.xx — 770. Этот атрибут также несколько опасен. Локальные пользователи в одной группе могут как читать, так и писать, поэтому файлы данных небезопасны. Атрибут каталога данных в версии 3.23.xx равен 700, что лучше. Только пользователь, запускающий базу данных, может читать и записывать файл базы данных, обеспечивая безопасность локальных файлов данных.
Если пользователь, запускающий базу данных MySQL, — mysql, то следующие каталоги и файлы безопасны. Обратите внимание на каталог данных и следующие атрибуты:
оболочка>ls -l /usr/local/mysql
всего 40
drwxrwxr-x 2 root root 4096 27 февраля 20:07 bin
drwxrwxr-x 3 root root 4096 27 февраля 20:07 включить
drwxrwxr-x 2 root root 4096 27 фев 20:07 информация
drwxrwxr-x 3 root root 4096 27 февраля 20:07 lib
drwxrwxr-x 2 root root 4096 27 февраля 20:07 libexec
drwxrwxr-x 3 root root 4096 27 февраля 20:07 человек
drwxrwxr-x 6 root root 4096 27 февраля 20:07 mysql-test
drwxrwxr-x 3 root root 4096 27 фев 20:07 поделиться
drwxrwxr-x 7 root root 4096 27 февраля 20:07 sql-bench
drwx------ 4 mysql mysql 4096 27 февраля 20:07 вар
оболочка>ls -l /usr/local/mysql/var
всего 8
drwx------ 2 mysql mysql 4096 27 февраля 20:08 mysql
drwx------ 2 mysql mysql 4096 27 фев. 20:08 тест
оболочка>ls -l /usr/local/mysql/var/mysql
всего 104
-rw------- 1 mysql mysql 0 27 фев. 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 27 февраля 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 27 февраля 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 27 февраля 20:08 db.MYD
-rw------- 1 mysql mysql 3072 27 февраля 20:08 db.MYI
-rw------- 1 mysql mysql 8982 27 фев. 20:08 db.frm
-rw------- 1 mysql mysql 0 27 фев. 20:08 func.MYD
-rw------- 1 mysql mysql 1024 27 февраля 20:08 func.MYI
-rw------- 1 mysql mysql 8641 27 фев. 20:08 func.frm
-rw------- 1 mysql mysql 0 27 фев. 20:08 хост.MYD
-rw------- 1 mysql mysql 1024 27 февраля 20:08 хост.MYI
-rw------- 1 mysql mysql 8958 27 фев. 20:08 host.frm
-rw------- 1 mysql mysql 0 27 фев. 20:08 table_priv.MYD
-rw------- 1 mysql mysql 1024 27 февраля 20:08 table_priv.MYI
-rw------- 1 mysql mysql 8877 27 фев. 20:08 table_priv.frm
-rw------- 1 mysql mysql 428 27 фев. 20:08 user.MYD
-rw------- 1 mysql mysql 2048 27 февраля 20:08 user.MYI
-rw------- 1 mysql mysql 9148 27 фев. 20:08 user.frm
Если владельцы и атрибуты этих файлов не такие, используйте следующие две команды, чтобы исправить это:
оболочка>chown -R mysql.mysql /usr/local/mysql/var
оболочка>chmod -R go-rwx /usr/local/mysql/var
Использование пользователя root для запуска удаленных служб всегда было табу безопасности, поскольку в случае возникновения проблемы с программой службы удаленный злоумышленник с большой вероятностью получит полный контроль над хостом. В MySQL внесены незначительные изменения по сравнению с версией 3.23.15. По умолчанию служба должна быть запущена пользователем MySQL после установки, а запуск пользователя root не разрешен. Если для запуска вам необходимо использовать пользователя root, необходимо добавить параметр --user=root (./safe_mysqld --user=root &). Поскольку в MySQL есть операторы SQL LOAD DATA INFILE и SELECT... INTO OUTFILE, если пользователь root запускает сервер MySQL, то пользователь базы данных имеет разрешение на запись, как и пользователь root. Однако MySQL все еще имеет некоторые ограничения. Например, LOAD DATA INFILE может читать только глобально читаемые файлы, а SELECT... INTO OUTFILE не может перезаписывать существующие файлы.
Локальные файлы журналов нельзя игнорировать, включая журналы оболочки и собственные журналы MySQL. Для удобства при локальном входе в систему или резервном копировании базы данных некоторые пользователи иногда напрямую включают пароль базы данных в параметры командной строки, например:
оболочка>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
оболочка>/usr/local/mysql/bin/mysql -uroot -ptest
Эти команды будут записаны оболочкой в файл истории. Например, bash запишет файл .bash_history в каталог пользователя. Если эти файлы будут случайно прочитаны, пароль базы данных будет раскрыт. Команды SQL, выполняемые после входа пользователя в базу данных, также будут записаны MySQL в файле .mysql_history в каталоге пользователя. Если пользователь базы данных изменит пароль базы данных с помощью операторов SQL, он также будет передан через файл .mysql_history. Поэтому нам не следует добавлять пароль непосредственно после -p во время входа в оболочку и резервного копирования, а следует вводить пароль базы данных после запроса.
Кроме того, на всякий случай мы не должны позволять этим двум файлам записывать наши операции.
оболочка>rm .bash_history .mysql_history
оболочка>ln -s /dev/null .bash_history
оболочка>ln -s /dev/null .mysql_history
Эти две команды связывают эти два файла с /dev/null, поэтому наши операции не будут записываться в эти два файла.
Безопасность внешней сети
После установки базы данных MySQL таблица пользователей на платформе Unix выглядит следующим образом:
mysql> использовать MySQL;
База данных изменена
mysql> выберите Хост,Пользователь,Пароль,Select_priv,Grant_priv от пользователя;
+-----------+------+----------+-------------+----- -------+
| Хост | Пользователь | Select_priv |
+-----------+------+----------+-------------+----- -------+
| локальный | корень |
| красный | корень |
| локальный |
| рыжая |
+-----------+------+----------+-------------+----- -------+
4 ряда в наборе (0,00 сек)
Таблица пользователей на платформе Windows выглядит следующим образом:
mysql> использовать MySQL;
База данных изменена
mysql> выберите Хост,Пользователь,Пароль,Select_priv,Grant_priv от пользователя;
+-----------+------+----------+-------------+----- -------+
| Хост | Пользователь | Select_priv |
+-----------+------+----------+-------------+----- -------+
| локальный | корень |
| % | корень |
| локальный хост |
| % |
+-----------+------+----------+-------------+----- -------+
4 ряда в наборе (0,00 сек)
Давайте сначала посмотрим на таблицу пользователей на платформе Unix. Среди них redhat — это просто имя моей тестовой машины, поэтому фактически MySQL на платформе Unix по умолчанию позволяет этой машине подключаться к базе данных только этой машине. Однако пароль пользователя root по умолчанию пуст, поэтому главным приоритетом является добавление пароля для пользователя root. Существует три способа добавить пароль пользователю базы данных:
1) Используйте команду mysqladmin в командной строке, чтобы изменить пароль пользователя root:
оболочка>mysqladmin -uroot проверка пароля
Таким образом, пароль пользователя root базы данных MySQL меняется на test. (тест — это всего лишь пример, пароль, который мы на самом деле используем, не должен использовать такой простой пароль, который легко угадать)
2) Используйте установку пароля, чтобы изменить пароль:
mysql> установить пароль для root@localhost=password('test' );
В это время пароль пользователя root меняется на тестовый.
3) Непосредственно измените пароль пользователя root таблицы пользователей:
mysql> использовать MySQL;
mysql> обновить набор пользователей: пароль=пароль('test'), где user='root';
mysql> сбросить привилегии;
Таким образом, пароль пользователя root базы данных MySQL также был изменен на тестовый. Последняя команда, сброс привилегий, означает принудительное обновление таблицы авторизации памяти. В противном случае пароль в кеше все равно будет использоваться. В это время нелегальные пользователи также могут войти в систему с пользователем root и пустым паролем до сервера MySQL. перезапускается.
Мы также видим анонимного пользователя, чей пользователь пуст. Хотя у него нет разрешений на платформе Unix, мы должны удалить его по соображениям безопасности:
mysql> удалить пользователя, где user='';