Назад | Перейти на главную страницу

Использование репликации MySQL для включения копии базы данных только для чтения в DMZ

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

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

Я играл с настройкой туннелей ssh ​​от ведущего устройства, но ведомый, кажется, держит соединение открытым (даже после вызова «SLAVE STOP»), что означает, что туннель всегда открыт (в некоторой степени нарушая ограничение безопасности).

Есть ли способ заставить mysql разорвать соединение, кроме остановки mysqld?

Есть ли другой способ достичь той же цели, о которой я не думал?

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

Подчиненное устройство поддерживает постоянное соединение с главным, но закрывает его, когда вы выдаете команду «STOP SLAVE».

Если ваши данные очень малы и вы можете выдержать задержку в несколько минут, вы потенциально можете написать сценарий с помощью инструмента mk-table-sync от Maatkit, который выполняет эту работу. Он рассчитает контрольную сумму ваших таблиц и выяснит, что изменилось для их применения. Вы можете запускать это с ведущего устройства и периодически подключаться к ведомому устройству в DMZ, что будет намного безопаснее с точки зрения безопасности - даже если злоумышленник скомпрометирует компьютер DMZ и полностью заменит его своим собственным программным обеспечением, он все равно получить не больше доступа, чем снимок базы данных.

Еще одна идея, небольшое изменение того, что вы описали:

  • Настроить туннель от мастера
  • Запустить ведомое устройство от мастера (обратите внимание на положение ведущего в бинлоге)
  • Запускать ведомый, пока не будет достигнута или превышена позиция бинлога ведущего
  • Остановить раба
  • Закрыть туннель
  • Повторять каждые x минут

Ключевым моментом здесь является то, что туннель создается и уничтожается мастером, обновления запускаются периодически.

Здесь много отличных закусок. Однако все слишком усложняют разные части головоломки.

Мро сказал:
... подчиненный, кажется, держит соединение открытым (даже после вызова "SLAVE STOP"), что означает, что туннель всегда открыт ...

1. Это не роль подчиненного mysqld - завершать входящий сеанс SSH. (Это ближе к тому, как работает туннелирование с помощью netcat, но здесь не место для этого, поэтому давайте не будем путать проблему.) Мастер должен разорвать соединение, потому что [a] оно было инициировано [b] оно было внутри сети вы хотите защитить. Если вы хотите прервать соединение для вызова ведомой стороны "kill -s HUP $pid_of_the_sshd_owned_by_mysqlmaster". Повторюсь, не вижу смысла.

2. Зачем тебе звонить "SLAVE STOP"? Подчиненное устройство является подчиненным. Раз уж мы обсуждаем эту тему ... Подчиненное устройство никогда не должно останавливаться. Если подчиненное устройство будет остановлено, главный сервер (см. Пункт 4.) или это должен сделать администратор.

Мро сказал: Обновления от главного устройства к подчиненному должны происходить в режиме, близком к реальному (т.е. допустима задержка в пару минут, но не более).

Вы не можете получить и то, и другое. У вас либо запущен подчиненный поток ввода-вывода, либо он устарел.

3. Не беспокойтесь о «позиции ведущего в бинарном журнале», это то, что делает встроенная репликация.

4. Если вы действительно настроены на отключение и повторное подключение каждую минуту, напишите cron-скрипт на мастере. Он должен сделать следующее:

  • Проверьте файл блокировки и либо выйдите, либо создайте его.
  • Создайте свой туннель вот так ssh -N -R 3333:127.0.0.1:3306 mysqlmaster@slave.server &
  • mysql -hslave.server -e 'SLAVE START'
  • Теперь вам предстоит сделать выбор:
    1. Оставайтесь на связи, пока ведомый не догнал ведущего. Вы можете проверить '0' в выводе следующего (одна строка, игнорировать перенос): mysql -hslave.server -e 'show slave status\G'|awk '/Seconds_Behind_Master/{print $2}'
    2. Оставайтесь на связи определенное количество времени. Может ты бы sleep для этого. Изучите свою систему, чтобы убедиться, что она не потребляет процессор.
  • MySQL изящно обрабатывает сброшенные соединения, поэтому это необязательно: mysql -hslave.server -e 'SLAVE STOP' (на самом деле, SLAVE START не является обязательным, если вы используете MASTER_CONNECT_RETRY)
  • kill pid клиента ssh из 2-й пули.

Это должно сработать. Теперь имейте в виду, что вы должны подготовить ведомое устройство к репликации, прежде чем это сработает. Поскольку вы упомянули о выпуске SLAVE STOP, Я буду понимать, что это означает, что вы смогли получить согласованную резервную копию от главного устройства к подчиненному и получить позицию журнала для CHANGE MASTER команда. Я просто добавлю, что вам нужно указать MASTER_HOST='127.0.0.1, MASTER_PORT=3333

Очевидно, у меня нет проблем с поиском времени и подробными объяснениями. Я также стараюсь никого не оскорблять, слишком много объясняя. Если хотите подробностей, просто спросите меня.

Мне приходилось иметь дело с чем-то похожим в прошлом. У вас есть несколько вариантов.

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

  2. Как уже упоминал кто-то другой, скопируйте файлы log-bin на ведомое устройство, а затем используйте mysqlbinlog для их приема. В конечном итоге я использовал это, чтобы переместить несколько новых приобретений в корпоративную сеть. Однако это была временная мера, и мы использовали ее только в течение месяца и запускали ее нечасто. Также у вас будет задержка относительно того, как скоро данные попадут на сервер DMZ.

  3. Используйте прокси-сервер Mysql для одновременной записи на оба сервера Mysql. http://dev.mysql.com/downloads/mysql-proxy/index.html Это может иметь некоторые интересные побочные проблемы, если в вашей схеме есть причуды. Обратной стороной является новый инструмент для установки и изучения, а также довольно бета-версия. С другой стороны, решает большинство ваших проблем.

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

  • ПРОМЫВКА ЖУРНАЛОВ; [я предполагаю, что у вас есть ведение журнала на мастере. если это так - это закроет старый файл журнала и заставит мастер создать новый файл журнала]
  • используя ssh-туннель или просто файл журнала ответа команды mysql и binlog на ведомом устройстве в dmz

так что вам не нужно полагаться на механизм репликации mysql.

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