Укрепление MySQL для вашего сайта WordPress

Опубликовано: 2023-01-18

WordPress, самая популярная CMS, работает на MySQL, самой популярной базе данных. Потратив некоторое время на то, чтобы ваша установка MySQL и установка конфигурации базы данных WordPress были адекватно защищены от распространенных векторов атак, вы можете снизить риски. Это особенно верно, если вы сами управляете своим сервером MySQL.

Стоит отметить, что многие установки WordPress используют MariaDB, которая является ответвлением MySQL. Поскольку оба работают очень похоже, мы будем использовать MySQL для обозначения как MySQL, так и MariaDB. Независимо от того, какую разновидность RDMS вы используете, усиление защиты MySQL может помочь вам свести к минимуму риски атак со стороны хакеров. Однако это не заменяет другие меры безопасности, такие как установка брандмауэра веб-приложений, обеспечение наличия последних версий плагинов, тем и WordPress, а также усиление защиты WordPress.

Внимание , эта статья предназначена для MySQL 8.0, работающей в Linux (Ubuntu). Хотя концепции будут перенесены на другие операционные системы и версии MySQL/MariaDB, команды и пути к файлам, используемые в этих примерах, могут отличаться. Прежде чем вносить какие-либо изменения в производственную систему, настоятельно рекомендуется протестировать любые изменения в тестовой или предварительной среде.

В этой статье, которая в первую очередь предназначена для тех, кто управляет собственным MYSQL, мы предлагаем несколько советов и руководств по обеспечению безопасности MySQL. Тем не менее, обширный список лучших практик, представленных в этой статье, стоит прочитать всем, кто управляет веб-сайтами WordPress. Защита вашего сервера MySQL является важным шагом в поддержании безопасности WordPress и защите от различных типов атак с использованием грубой силы, внедрения вредоносных программ и других типов атак.

Оглавление

  • Рассмотрите возможность использования базы данных как услуги (DBaaS).
  • Поддерживайте MySQL в актуальном состоянии
  • Запустите MySQL на выделенной машине
  • Привязать MySQL к IP-адресу
  • Ограничьте использование веб-инструментов с графическим интерфейсом
  • Запустите демон MySQL, используя выделенного пользователя
  • Используйте скрипт mysql_secure_installation
  • Создайте выделенного пользователя базы данных WordPress
  • Убедитесь, что local_infile отключен
  • Отключить историю команд MySQL
  • Убедитесь, что mysqld не запущен с аргументом –skip-grant-tables.
  • Сделайте резервную копию вашей базы данных
    • Делайте частые резервные копии
    • Часто проверяйте целостность ваших резервных копий
    • Надежно храните резервные копии
  • Включение и принудительное использование TLS-соединений
    • Изменить префикс таблицы
    • Как внедрить изменения
    • Обеспечение безопасности вашего WordPress

Рассмотрите возможность использования базы данных как услуги (DBaaS)

База данных как услуга стоит рассмотреть, если вы не размещаете WordPress на управляемом плане. Он заменяет традиционную модель локальной установки MySQL службой, к которой вы подключаетесь. Это может подойти для вашего варианта использования, если вы используете свой сайт WordPress с хостинг-провайдером, который предлагает услуги управляемой базы данных. Доступные варианты обычно включают Amazon RDS, MySQL, управляемый DigitalOcean, и MySQL, управляемый Linode). На первый взгляд, эти услуги могут быть дороже, чем запуск MySQL самостоятельно. Тем не менее, они выполняют всю тяжелую работу по запуску баз данных производственного уровня. Большинство услуг включают предустановки передовых методов безопасности, текущие исправления безопасности и техническое обслуживание, а также резервное копирование.

Использование базы данных как услуги (DBaaS) — один из лучших вариантов с точки зрения безопасности и надежности. Хотя это не является обязательным, это все же полезно. Однако, если вы хотите управлять MySQL самостоятельно, ниже приводится набор советов по усилению защиты, о которых следует помнить.

Поддерживайте MySQL в актуальном состоянии

Так же, как важно убедиться, что вы используете последнюю версию WordPress, важно поддерживать MySQL в актуальном состоянии. Как и для большинства других программ, периодически выпускаются обновления для сервера MySQL. Эти обновления устраняют ошибки, устраняют уязвимости и предоставляют новые функции. Вы должны поддерживать MySQL в актуальном состоянии с помощью последних исправлений безопасности, чтобы снизить риски запуска программного обеспечения с известными уязвимостями. Имейте в виду, что после обновления вам потребуется перезапустить «демон mysql». Это процесс, который может потребовать некоторого времени простоя. Как всегда, планируйте заранее.

Запустите MySQL на выделенной машине

Многие установки WordPress запускают MySQL, PHP и веб-сервер (например, Nginx или Apache HTTP Server) на одном компьютере. Это не оптимально — как с точки зрения производительности, так и с точки зрения безопасности. В идеале MySQL должен работать на выделенном сервере, чтобы уменьшить радиус поражения атаки. Если злоумышленнику удастся скомпрометировать и повысить привилегии на веб-сервере, этому злоумышленнику будет намного сложнее двигаться в боковом направлении, а также скомпрометировать сервер MySQL.

Привязать MySQL к IP-адресу

Вы можете настроить MySQL для приема соединений TCP/IP только с определенного интерфейса IPv4 или IPv6. Все, что вам нужно сделать, это установить параметр конфигурации bind-address на определенный IP-адрес. Это обеспечивает дополнительные элементы управления и ограничения на то, как клиентские приложения (в нашем случае WordPress) могут подключаться к MySQL. По умолчанию для этого параметра установлено значение *, что означает, что готовая к использованию MySQL будет прослушивать все интерфейсы.

Если не настроено прослушивание определенного IP-адреса, все IP-адреса могут использоваться для подключения к MySQL. Этот параметр особенно важно установить, если вы используете MySQL на том же компьютере, что и веб-сервер, который вы открываете для Интернета (в этом случае вы должны установить адрес привязки на 127.0.0.1, чтобы MySQL прослушивал только на локальном хосте) .

Например, если вы хотите, чтобы сервер MySQL принимал соединения только с определенным адресом IPv4, вы можете добавить запись, подобную приведенному ниже примеру. Вы должны указать это в группе параметров [mysqld] в файле конфигурации вашего сервера /etc/mysql/mysql.conf.d/mysqld.cnf.

адрес привязки = 192.168.0.24

Обратите внимание, что после того, как вы установите это, вам нужно будет перенастроить WordPress для подключения к базе данных с использованием этого IP-адреса (если он уже не делает это), так как подключения по другим адресам серверов не будут разрешены.

Ограничьте использование веб-инструментов с графическим интерфейсом

Многие установки WordPress включают веб-интерфейсные графические инструменты управления. Общие примеры включают Cpanel, phpMyAdmin или Adminer. Эти инструменты упрощают управление MySQL и другими аспектами базовой инфраструктуры. Хотя графический веб-интерфейс может помочь вам управлять базами данных MySQL, эти интерфейсы могут увеличить поверхность атаки, добавив еще один вектор. Кроме того, существует риск того, что они будут обнаружены и использованы злоумышленниками для выполнения деструктивных или злонамеренных SQL-запросов к вашей базе данных. Атаки могут даже привести к полному захвату вашего сайта WordPress.

Единственный безопасный сервер — это тот, который выключен и отсоединен от сети, однако риском можно управлять. Удаление некритических систем — один из вариантов; однако их также можно заблокировать и ограничить, чтобы минимизировать риск.

Доступ к этим инструментам можно ограничить различными способами. Вы можете установить phpMyAdmin для WordPress удаленно, тем самым сводя к минимуму риск для веб-сервера. В качестве альтернативы вы также можете рассмотреть возможность использования таких инструментов, как MySQL Workbench или Beekeeper Studio, на вашем локальном компьютере и подключения к серверу базы данных через туннель SSH.

Запустите демон MySQL, используя выделенного пользователя

Как и в случае с другими службами, работающими на сервере, вы можете запустить демон MySQL под выделенным пользователем. Когда вы запускаете MySQL с использованием выделенного пользователя, вы можете точно определить, какие разрешения этому пользователю предоставляются в системе. Запуск MySQL под выделенным пользователем также следует принципу наименьших привилегий, поскольку это уменьшает радиус поражения уязвимости MySQL. Это также уменьшает возможность использования неправильной конфигурации, поскольку ограниченный пользователь не сможет получить доступ к ресурсам, не связанным с MySQL (таким как конфигурации операционной системы и секреты).

Хорошая новость заключается в том, что при установке через менеджеры пакетов (например, apt или yum) этот шаг выполняется автоматически при установке MySQL. Быстрый способ проверить, работает ли MySQL под выделенным пользователем, — запустить следующее на машине, на которой работает демон MySQL.

пс-эф | egrep "^mysql.*$"

Если MySQL работает с использованием выделенного пользователя, вы должны ожидать, что будет возвращена хотя бы одна строка из вывода ps.

Используйте скрипт mysql_secure_installation

Пакет mysql-server поставляется с утилитой сценария оболочки, которая называется mysql_secure_installation. Вы можете использовать этот скрипт, чтобы настроить безопасную отправную точку для сервера MySQL. Таким образом, вы должны запустить его после новой установки MySQL. Эта утилита поможет вам:

  • Установите пароль для учетных записей root
  • Удалите корневые учетные записи, доступные из-за пределов локального хоста.
  • Удалить анонимные учетные записи пользователей
  • Удалите тестовую базу данных (к которой по умолчанию могут получить доступ анонимные пользователи)

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

sudo mysql_secure_installation

Как только процесс установки начнется, вам будет предложено несколько подсказок с вопросом, хотите ли вы включить плагин проверки пароля , который используется для проверки надежности паролей, которые вы выбираете для пользователей MySQL. Рекомендуется включить этот плагин.

После включения плагина проверки пароля скрипт попросит вас указать политику проверки пароля. Здесь вы должны выбрать политику надежных паролей. Впоследствии вам будет предложено сбросить пароль пользователя root.

Далее скрипт предложит вам удалить анонимных пользователей MySQL. Это важно, чтобы уменьшить вероятность того, что злоумышленники получат доступ к серверу базы данных, используя анонимного пользователя MySQL.

В следующем запросе вас спросят, хотите ли вы отключить вход в систему с использованием пользователя root при удаленной аутентификации на сервере MySQL. Удаленная аутентификация с использованием пользователя root опасна и редко требуется. Вместо этого вы должны либо использовать SSH для подключения к MySQL и использовать клиент MySQL на сервере для аутентификации в качестве пользователя root, либо, что предпочтительнее, использовать туннель SSH для перенаправления удаленного порта MySQL на ваш локальный компьютер и подключения с использованием локального клиента.

Далее вас попросят удалить базы данных по умолчанию (если они существуют), с которыми поставляется MySQL. Это рекомендуемая практика для производственных серверов MySQL.

Удалить базу данных по умолчанию

Наконец, вас спросят, хотите ли вы перезагрузить таблицы привилегий, чтобы все примененные изменения вступили в силу.

Создайте выделенного пользователя базы данных WordPress

Лучшие практики безопасности диктуют разделение пользователей и привилегий по обязанностям или ролям. Это означает, что каждое приложение, которое использует базу данных, должно иметь своего собственного выделенного пользователя с минимальным количеством разрешений базы данных MySQL, необходимых для выполнения его работы. Таким образом, вы гарантируете, что привилегии пользователя не превышают требуемых.

Эта практика должна распространяться на развертывание нескольких веб-сайтов WordPress — каждый веб-сайт WordPress должен иметь свою собственную выделенную базу данных и пользователя MySQL. Это гарантирует, что в любой момент времени только один пользователь имеет доступ к одной базе данных, и пользователи не могут получить доступ к другим базам данных, что позволяет избежать несанкционированного доступа и утечки данных.

Следующий оператор SQL (замените <host> и <password> и <database> в соответствии с вашими потребностями) можно использовать для создания выделенного пользователя для вашего веб-сайта WordPress и предоставления привилегий для обычного использования. Имейте в виду, что некоторым плагинам, темам и обновлениям WordPress иногда могут потребоваться дополнительные привилегии для правильной работы (дополнительную информацию см. в официальном руководстве WordPress по этому вопросу).

Убедитесь, что local_infile отключен

Оператор LOAD DATA позволяет загружать файлы данных в таблицы базы данных. При определенных условиях этим можно злоупотреблять для чтения файлов с сервера MySQL. Таким образом, если у вас нет конкретного варианта использования этого на вашем сайте WordPress, вам следует отключить эту функцию.

Если MySQL и веб-сервер работают на одном компьютере, это может позволить злоумышленнику использовать оператор LOAD DATA LOCAL для чтения произвольных файлов, к которым у процесса веб-сервера есть доступ для чтения. Это предполагает, что злоумышленник может выполнять произвольные операторы SQL против MySQL. Это может быть в случае уязвимости SQL-инъекции или установки вредоносного плагина WordPress. Это еще одна причина разделять веб-сервер и сервер базы данных.

По умолчанию local_infile отключен в MySQL 8.0 (раньше он был включен по умолчанию в более ранних версиях MySQL). Чтобы запретить серверу MySQL принимать операторы LOAD DATA LOCAL, убедитесь, что демон mysqld запущен с отключенным local_infile.

Отключить историю команд MySQL

В Linux операторы журналов клиента MySQL, выполняемые в интерактивном режиме, сохраняются в файле истории (обычно расположенном в $HOME/.mysql_history). История команд MySQL в идеале должна быть отключена, так как это снижает вероятность раскрытия конфиденциальной информации, такой как пароли, ключи шифрования или другие секреты.

Чтобы убедиться, что файлы .mysql_history не существуют в системе, выполните следующие команды:

найти /home -имя «.mysql_history»
найти /root -имя «.mysql_history»

Если приведенные выше команды возвращают какие-либо выходные данные, удалите все файлы .mysql_history. Кроме того, вы можете установить $HOME/.mysql_history в качестве символической ссылки на /dev/null следующим образом:

ln -s /dev/null $HOME/.mysql_history

Убедитесь, что mysqld не запущен с аргументом –skip-grant-tables.

Если корневой пароль MySQL будет утерян, хотя это и не является предпочтительным методом, некоторые администраторы MySQL могут прибегнуть к настройке MySQL для запуска с аргументом –skip-grant-tables. При запуске MySQL с этим параметром он не будет проверять свои таблицы привилегий, когда клиент подключается или выполняет запрос, фактически позволяя любому и в любом месте (при условии, что они могут получить доступ к базе данных по сети) делать что-либо на сервере базы данных.

Чтобы убедиться, что –skip-grant-tables не включен, откройте файл конфигурации вашего сервера /etc/mysql/mysql.conf.d/mysqld.cnf и найдите skip-grant-tables. Значение должно быть либо не задано, либо задано значение skip-grant-tables = FALSE.

Сделайте резервную копию вашей базы данных

Резервное копирование базы данных WordPress абсолютно необходимо для быстрого восстановления после аварии или атаки. Несмотря на то, что существует множество способов резервного копирования вашей базы данных WordPress — от плагинов и сервисов резервного копирования WordPress до собственных скриптов, которые периодически создают дамп базы данных — ниже приведены несколько важных советов, которые следует учитывать.

Делайте частые резервные копии

Делать регулярные резервные копии довольно очевидно и не требует пояснений — чем чаще вы делаете резервные копии базы данных, тем легче будет восстановиться после инцидента с потерей данных. Хотя частота резервного копирования будет зависеть от типа сайта WordPress, который вы используете, как правило, ежедневное резервное копирование хорошо подходит для большинства случаев использования.

Часто проверяйте целостность ваших резервных копий

Ваши резервные копии полезны только в том случае, если они работают. и вы, вероятно, предпочли бы не узнавать об этом, пока вы находитесь в центре инцидента, пытаясь восстановить данные. Простое решение этой проблемы — часто проверять, действительно ли ваши резервные копии работают, время от времени выполняя тестовое восстановление. Хороший способ сделать это — установить событие календаря каждые несколько месяцев, чтобы пройти процедуру восстановления, чтобы убедиться, что ваши резервные копии по-прежнему работают должным образом. Кроме того, рекомендуется документировать этапы восстановления базы данных — чем меньше догадок при реагировании на инцидент, тем лучше.

Надежно храните резервные копии

Никогда не храните резервные копии вашего сайта WordPress на вашем веб-сервере или сервере базы данных (особенно на вашем веб-сервере). Резервные копии — отличное место для злоумышленников, чтобы погрузиться в мусор. Настоятельно рекомендуется хранить резервные копии в безопасном удаленном месте. Если вы делаете периодические дампы базы данных, рассмотрите возможность хранения дампов базы данных в службе хранилища объектов. Это могут быть Amazon S3, Cloudflare R2, DigitalOcean Spaces, Linode Object Storage и т. д. Этот путь может стать отличным и экономичным способом хранения резервных копий базы данных. Однако будьте особенно осторожны, чтобы не сделать общедоступным сегмент хранилища, который вы используете.

Включение и принудительное использование TLS-соединений

Если вы не используете MySQL на том же компьютере, что и ваш веб-сервер (что, как мы уже говорили выше, не является идеальной практикой безопасности), настоятельно рекомендуется шифровать данные между WordPress и MySQL, используя безопасность транспортного уровня (сертификат TLS). ранее назывался Secure Socket Layer (SSL-сертификат).

По умолчанию, когда вы устанавливаете MySQL, он автоматически генерирует для вас самозаверяющий сертификат. Вы можете проверить это, выполнив следующее (в качестве альтернативы вы можете использовать сценарий mysql_ssl_rsa_setup для создания новых сертификатов).

Вам нужно будет скопировать ca.pem из приведенного выше списка (например, через SCP) на сервер, на котором работает ваш сайт WordPress. После того как вы загрузите файл ca.pem на свой сервер WordPress, вам нужно будет переместить сертификат в хранилище доверенных сертификатов операционной системы и обновить хранилище доверенных сертификатов следующим образом.

Обратите внимание: имя файла сертификата ЦС должно заканчиваться расширением .crt (например, mysql-ca.crt является допустимым, но mysql-ca.pem.crt или mysql-ca.pem недопустимы).

sudo mv ca.pem /usr/local/share/ca-certificates/mysql-ca.crt
sudo update-ca-сертификаты

Затем вам нужно настроить WordPress для использования TLS при подключении к MySQL, добавив следующее в ваш файл wp-config.php вашей установки WordPress.

определить('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Как только вы обновите wp-config.php, WordPress инициирует подключение к вашему серверу MySQL с использованием TLS.

Затем рекомендуется установить TLS-подключения к вашему серверу MySQL с помощью системной переменной require_secure_transport, добавив следующее в файл /etc/mysql/mysql.conf.d/mysqld.cnf.

require_secure_transport = ВКЛ.

Наконец, перезапустите MySQL, чтобы изменения вступили в силу.

systemctl перезапустить mysql

Изменить префикс таблицы

По умолчанию все таблицы WordPress создаются с префиксом «wp_». Это может облегчить злоумышленникам выполнение определенных атак, таких как внедрение SQL, поскольку они будут знать имена таблиц базы данных. Хотя это само по себе не защитит вас, это простое упражнение, рекомендуемое многими как лучшая практика безопасности WordPress.

Вы можете изменить префикс базы данных во время процесса установки или в любой момент после него, хотя последний вариант немного сложнее. В любом случае, вы можете найти онлайн-руководства по изменению префикса базы данных WordPress.

Как внедрить изменения

Надеюсь, эта статья предоставила вам обзор усиления безопасности MySQL в контексте работы веб-сайта WordPress. Несмотря на то, что в безопасности веб-сайтов нет серебряных пуль, при определенных усилиях многоуровневый, многоуровневый подход к безопасности значительно усложнит атаку на ваш веб-сайт для злоумышленников.
Хотя в этом руководстве представлен ряд методов повышения безопасности для MySQL, MySQL — это всего лишь один из компонентов экосистемы WordPress. Таким образом, вы также должны учитывать другие аспекты безопасности WordPress, описанные в нашем руководстве по усилению безопасности WordPress. Это, в сочетании с проверенными мерами безопасности, такими как двухфакторная аутентификация WordPress, поможет вам обеспечить максимальную безопасность.

Если вам кажется, что вам нужно многое понять, помните, что вы можете (и, вероятно, должны) применять различные методы закаливания, описанные в этом руководстве, постепенно.

Обеспечение безопасности вашего WordPress

Имейте в виду, что злоумышленники часто преследуют слабые цели, поскольку им не нужно прилагать столько усилий для использования слабозащищенных веб-сайтов. Быть на шаг впереди в плане безопасности следующего веб-сайта WordPress делает вас менее привлекательной мишенью.