Повышаем безопасность стека web-приложений (виртуализация LAMP, шаг 2/6)

в 5:45, , рубрики: Apache, CentOS, lamp, nfs, nfsv4, nginx, Веб-разработка, Серверная оптимизация, Серверное администрирование

Linux: Настройка сервера баз данных MySQL

Перейдем ко второму практическому уроку серии и поговорим о настройке виртуального окружения выделенного сервера – подготовим  узел (VM) предназначенный для хранения и обслуживания доступа к БД MySQL/PostgreSQL.

В этой установке, мы будем использовать сервер баз данных MySQL. Все настройки этого урока будут проводится исключительно на vm04 с IP-адресом 192.168.1.13

Установка сервера MySQL

Введите следующую команду yum-менеджера, что бы установить MySQL сервера баз данных на RHEL/CentOS Linux систему:

# yum install mysql mysql-server

Настройка сервера MySQL

Отредактируем файл /etc/my.cnf:

# vi /etc/my.cnf

Убедитесь, что MySQL сервер доступен с виртуальных машин vm01 и vm02 с установленными на нем Apache+php5. Найдите раздел [mysqld] и добавте/исправьте следующие параматеры, что бы mysqld служба БД стала доступна удаленно:

# Убедитесь, что директива skip-networking закомментирована (или удалена)
# skip-networking
# Включение удаленный доступ
bind-address=192.168.1.13

Оптимизация параметров MySQL-сервера

Необходимо оптимизировать сервер MySQL, иначе он отъест весомую часть ресурсов виртуальной машины vm04. Вы можете добавить или исправить настройки следующим образом (подробнее — в руководстве по MySQL).

########################################################################
# Внимание!!!
# Параметры безопасности и производительности
# Читайте манны mysqld и my.cnf для получения подробной информации
# т.к. следующие параметры зависят от установленного оборудования и
# конкретных требований к системе
########################################################################
# Из соображений безопасности рекомендуется отключить использование
# symbolic-links
symbolic-links=0

## Идем дальше, пропуская ряд прописанных параметров, YMMV
skip-name-resolve
skip-slave-start
skip-external-locking

# ИНДИВИДУАЛЬНЫЕ КЛИЕНТСКИЕ НАСТРОЙКИ              #
# Завышенные параметры, но мои ресурсы позволяют   #
sort_buffer_size           = 2M
read_buffer_size           = 2M
binlog_cache_size          = 1M
wait_timeout               = 200
interactive_timeout        = 300
max_allowed_packet         = 12M
thread_stack               = 128K
table_cache                = 1024
myisam_sort_buffer_size    = 1M
tmp_table_size             = 12M
max_heap_table_size        = 12M

# ПРОТОКОЛИРОВАНИЕ #
log_queries_not_using_indexes  = 1
slow_query_log                 = 1
slow_query_log_file            = /var/lib/mysql/slowquery.log

# Кэши и предельные значения #
tmp_table_size                 = 12M
max_heap_table_size            = 12M
query_cache_type               = 1
query_cache_limit              = 2M
query_cache_size               = 32M
max_connections                = 500
thread_cache_size              = 50
open_files_limit               = 65535
table_definition_cache         = 4096
table_open_cache               = 1024

# MyISAM #
key_buffer_size                = 32M
myisam_recover                 = FORCE,BACKUP

# БЕЗОПАСНОСТЬ #
max_allowed_packet = 16M
max_connect_errors = 1000000

# Бинарный лог #
log_bin                        = /var/lib/mysql/mysql-bin
expire_logs_days               = 14
sync_binlog                    = 1

# InnoDB #
innodb_flush_method            = O_DIRECT
innodb_log_files_in_group      = 2
innodb_log_file_size           = 256M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table          = 1
innodb_buffer_pool_size        = 10G

Сохраним изменения и закроем файл. Перезагрузим/перезапустим  сервер MySQL:

# chkconfig mysqld on
# service mysqld start
# service mysqld reload
# service mysqld restart

Убедимся, что на TCP-порту #3306 работает mysqld:

# netstat -tulpn | grep :3306

MySQL сервера баз данных конфигурации брандмауэра

Отредактируем конфигурацию брандмауэра /etc/sysconfig/iptables:

# vi /etc/sysconfig/iptables

Убедитесь, что виртуальные машины vm01 и vm02 могут получить доступ к серверу баз данных:

## Откройте порты mysqld для web-сервера Apache и Lighttpd #
-A INPUT -m state --state NEW -s 192.168.1.10 -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -s 192.168.1.11 -m tcp -p tcp --dport 3306 -j ACCEPT

Сохраните и закройте файл. Перезапустим службу iptables:

# service iptables restart

Увеличение дисковых квот и диапазона портов сервера БД

Для нагруженных серверов СУБД следует увеличить предельное количество дескрипторов файлов (FD limits) и увеличить число доступных IP-портов

# Увеличим предельное число  дескрипторов файловой системы
fs.file-max = 50000
# Увеличим число доступных портов
net.ipv4. ip_local_port_range = 2000 65000

Активируем изменения, введя следующую sysctl-команду, изменяющую параметры ядра Linux исходя из указанных нами настроек:

# sysctl -p

Создание баз данных MySQL и учетных записей пользователей

В данном разделе приводятся основные параметры ручного создания базы данных MySQL.Для наглятности нашей задачи мы создадим базу данных MySQL и пользователя со следующими параметрами:

  • ИМЯ БД: foo
  • ИМЯ ПОЛЬЗОВАТЕЛЯ БД: bar
  • ПАРОЛЬ БД: mypassword
  • КОМУ РАЗРЕШЕН ДОСТУП К БД: localhost, vm01, vm02 со следующими IP-адресами — 192.168.1.10 и 192.168.1.11

Введите следующую команду для создания БД и требующихся пользователей:

# /usr/bin/mysql -u root -h localhost -p

Чтобы создать БД с именем foo, введите следующую команду в строке терминала mysql:

mysql > CREATE DATABASE foo;

Необходимо предоставить права доступа к этой БД пользователю MySQL с именем bar, под которым сервера приложений Apache + php5 будут подключаться к БД.

mysql > GRANT ALL ON foo.* TO bar@localhost IDENTIFIED BY 'mypassword';
mysql > GRANT ALL ON foo.* TO bar@192.168.1.10 IDENTIFIED BY 'mypassword';
mysql > GRANT ALL ON foo.* TO bar@192.168.1.11 IDENTIFIED BY 'mypassword';

Что бы выйти из консоли MySQL, введите следующую команду:

mysql > quit

Теперь можно создавать таблицы или загрузить данные, используя SQL-файл. Вы можете автоматизировать эту процедуру, написав шелл- или Perl-скрипт добавления пользователей MySQL и баз данных.

Проверьте вашу новенькую БД и пользовательские настройки с «удаленных» vm01 и vm02

Подключитесь через ssh к виртуальному узлу vm01 или узлу vm03 и введите следующую команду, чтобы проверить связь с Apache/Lighttpd web-сервером:

$ mysql -u bar -h 192.168.1.13 -p'mypassword' foo

или так:

$ mysql -u bar -h vm04 -p'mypassword' foo

PhpMyAdmin

PhpMyAdmin – известный web-интерфейс к БД MySQL. Этот серверный скрипт используется для удаленного администрирования MySQL с помощью одного лишь браузера. PhpMyAdmin может администрировать как весь сервер MySQL, так и одну базу данных. Этот пакет рекомендуется для всех новых пользователей базы данных MySQL и администраторов.

Автор: danielnewman

* - обязательные к заполнению поля