Допустим, у меня есть сервер с базой данных SQL где-то на другом конце планеты. Безопасно ли устанавливать соединение через Интернет? например с MySQL Workbench.
Я спрашиваю, потому что слышал, что соединения с серверами, особенно с использованием указанного программного обеспечения, по умолчанию не зашифрованы. Если я использую SSL для каждого удаленного подключения, какие риски останутся? Является ли открытый порт MySQL угрозой безопасности сам по себе?
Справочное руководство по MySQL содержит Глава 6 о безопасности.
Во-первых, вы не должны разрешать подключения из любого места через Интернет, а только с известных доверенных хостов. Хотя у пользователя также есть список разрешенных хостов, 6.1.1 Рекомендации по безопасности предлагает сделать это на уровне брандмауэра, прежде чем хосты даже подключатся к вашему серверу MySQL (порт по умолчанию 3306
). Это увеличивает безопасность, поскольку также предотвращает использование любых потенциальных эксплойтов.
Если вам действительно нужно прямое соединение между вашим локальным Workbench и удаленным сервером MySQL, Использовать безопасные соединения. Но есть и другие способы защитить соединение с вашим SQL-сервером. Учитывая усилия, необходимые для контроля доступа и защиты SQL-соединения с OpenSSL, они намного практичнее:
Используйте туннель SSH, и вы можете подключить свой сервер MySQL так же, как и Workbench. Этот пример связывает локальный порт 13306
и туннельные подключения к localhost:3306
на удаленной стороне:
ssh -L 13306:localhost:3306 user@sql.example.com
Используйте VPN и разрешайте соединения только из внутренней сети VPN.
С помощью обоих этих подходов вы можете привязать MySQL к localhost
только; это самый безопасный вариант.
Чтобы ответить на ваш вопрос: Нет, это небезопасно.
Просто чтобы назвать некоторые проблемы безопасности:
1: Вход в систему. Данные для входа передаются через Интернет в виде открытого текста, которого вы НЕ хотите, очевидно :)
2: SQL-запросы. Ваши запросы, которые вы отправляете (и их ответы), снова отправляются в виде обычного текста, вы НЕ хотите, так как эти данные можно легко подделать.
Кроме того, получение результатов запроса в виде простого текста, который может содержать конфиденциальную информацию, - это совсем другая проблема. В случае личных файлов в некоторых странах вас могут даже привлечь к ответственности за пренебрежение / игнорирование правил безопасности для личных данных.
3: Порт SQL, открытый в Интернете, всегда является дополнительным вектором атаки для потенциального злоумышленника. Подумайте об эксплойтах удаленного сервера mysql и т. Д.
Я суммировал шаги, которые вам нужно выполнить, предполагая, что вы запускаете сервер mysql в Linux:
На mysql-сервере сгенерируйте сертификат mysql ssl:
Передайте закрытый ключ CA ca:
openssl genrsa 4096 > ca-key.pem
Сгенерируйте сертификат, используя ранее созданный ключ (ответьте на вопросы по умолчанию):
openssl req -sha256 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
Затем создайте новый закрытый ключ для сервера mysql (опять же, вопросы по умолчанию):
openssl req -sha256 -newkey rsa:4096 -days 730 -nodes -keyout server-key.pem > server-req.pem
Экспорт закрытого ключа:
openssl rsa -in server-key.pem -out server-key.pem
Создать сертификат сервера:
openssl x509 -sha256 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Теперь в вашем my.cnf (расположенном в /etc/mysql/my.cnf) отредактируйте раздел mysqld и добавьте следующее:
ssl-ca = / etc / mysql / ca-cert.pem ssl-cert = / etc / mysql / server-cert.pem ssl-key = / etc / mysql / server-key.pem
перезапустите службу mysql:
service mysql restart
Теперь у вас есть сервер mysql, работающий с сертификатами сервера, затем мы добавим пользователей с определенного адреса (если возможно, с вашего удаленного статического IP-адреса), поэтому в консоли mysql выполните следующее:
GRANT ALL PRIVILEGES ON 'database'.* TO 'yourremotelogin'@'your.remote.ip.xxx' IDENTIFIED BY 'password' REQUIRE SSL;
FLUSH PRIVILEGES;
Итак, теперь у нас есть сервер SSL mysql, который принимает удаленные соединения через SSL с вашего конкретного IP-адреса, но нам все еще нужно сгенерировать сертификаты клиентов:
Итак, все еще на сервере mysql выполните следующее:
openssl req -sha256 -newkey rsa:4096 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha256 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Теперь скопируйте файлы ca-cert.pem, client-key.pem и client-cert.pem на удаленный компьютер, где находится ваша рабочая среда mysql.
В рабочей среде mysql откройте Управление подключением к серверу и отредактируйте существующее подключение к вашему серверу. На вкладке подключения выберите дополнительную вкладку SSL и выберите «использовать SSL требуется».
В полях ниже выберите ca-cert.pem для файла SSL CA, cielnt-cert.pem для файла SSL CERT и client-key.pem для файла ключей SSL.
Теперь, если вы попытаетесь подключиться, вам все равно будет предложено ввести пароль (который вы определили ранее), но он через SSL :)
Надеюсь, это ответ, который вы искали.