web-dev-qa-db-ja.com

MySQLレプリケーションを使用して、DMZ)内のデータベースの読み取り専用コピーを有効にする

安全なネットワーク内のライブマスターの読み取り専用コピーであるDMZにMySQLデータベースインスタンスを設定する必要があります。

MySQLレプリケーションは、マスターから変更を「プル」するスレーブによって機能することを除いて、これには理想的なようです。これは、DMZ内のスレーブがマスターへの接続を開くことができる必要があることを意味しますが、セキュリティ担当者はこれを許可しません。

マスターからsshトンネルを設定して遊んだことがありますが、スレーブは接続を開いたままにしているようです(「SLAVESTOP」を呼び出した後でも)。つまり、トンネルは常に開いています(セキュリティ制限をやや破っています)。

Mysqldを停止する以外に、mysqlに接続を強制的にドロップする方法はありますか?

私が考えていなかった同じ目標を達成する別の方法はありますか?

マスターからスレーブへの更新はほぼリアルタイムである必要があります(つまり、数分の遅延は許容されますが、それ以上ではありません)。

3
mrowe

別のアイデア、あなたが説明したことのわずかなバリエーション:

  • マスターからトンネルを設定
  • マスターからスレーブを開始します(マスターのbinlog位置に注意してください)
  • マスターのbinlog位置に達するか超えるまでスレーブを実行します
  • 奴隷を止めろ
  • トンネルを閉じる
  • X分ごとに繰り返す

ここで重要なのは、トンネルがマスターによって作成および破棄され、更新が定期的に実行されることです。

2
Jon St. John

スレーブはマスターへの永続的な接続を開いたままにしますが、「STOPSLAVE」を発行すると接続を閉じます。

データが非常に小さく、数分の遅延に耐えられる場合は、Maatkitのmk-table-syncツールを使用して何かをスクリプト化できる可能性があります。テーブルをチェックサムし、それらを適用するために何が変更されたかを把握します。これをマスターから実行し、DMZ内のスレーブに定期的に接続できます。これは、攻撃者がDMZマシンを侵害して完全に置き換えた場合でも、セキュリティの観点からはるかに安全です。独自のソフトウェアを使用しても、データベースのスナップショット以上のアクセスは得られません。

2
MarkR

それは醜いですが、それでも-マスターであまり起こっていない場合は、定期的にマスターで実行できます[1分に1回でも]:

  • フラッシュログ; [マスターにビンロギングがあると思います。もしそうなら-これは古いログファイルを閉じ、マスターに新しいログファイルを作成するように強制します]
  • sshトンネルを使用するか、またはmysqlとbinlogコマンドを使用してdmzのスレーブで「応答」ログファイル

したがって、mysqlレプリケーションメカニズムに依存する必要はありません。

サーバーによって1分間に複数のログファイルが作成される可能性があるという事実を考慮する必要があります。

1
pQd

ここには素晴らしいモーゼルがたくさんあります。しかし、誰もがパズルのさまざまな部分を複雑にしすぎています。

mroeは言った:
...スレーブは(「SLAVESTOP」を呼び出した後でも)接続を開いたままにしているようです。つまり、トンネルは常に開いています...

1.着信SSHセッションを終了するのはスレーブmysqldの役割ではありません。 (これはnetcatとのトンネリングの動作方法に近いですが、ここはそのための場所ではないので、問題を混同しないでください。)マスターは接続を終了する必要があります。あなたは守りたいのです。スレーブ側の接続を終了したい場合は、「kill -s HUP $pid_of_the_sshd_owned_by_mysqlmaster」を呼び出します。もう一度言いますが、使用法はわかりません。

2.なぜ「SLAVE STOP」と呼ぶのですか?奴隷は奴隷です。私たちが話題になっているので...奴隷は決して自分自身を止めるべきではありません。スレーブを停止する場合は、マスターサーバー(ポイント4.を参照)または管理者が停止する必要があります。

mroeの発言:マスターからスレーブへの更新はほぼリアルタイムである必要があります(つまり、数分の遅延は許容されますが、それ以上ではありません)。

あなたはそれを両方の方法で持つことはできません。スレーブIOスレッドが実行されているか、古くなっています。

3.組み込みレプリケーションが行う「マスターのbinlog位置」について心配する必要はありません。

4.毎分切断と再接続を心がけている場合は、マスターにcronスクリプトを記述してください。次のことを行う必要があります。

  • ロックファイルをテストし、終了するか作成します。
  • ssh -N -R 3333:127.0.0.1:3306 [email protected] &のようにトンネルを作成します
  • mysql -hslave.server -e 'SLAVE START'
  • 今、あなたは選択をしなければなりません:
    1. スレーブがマスターに追いつくまで接続を維持します。次の出力で「0」をテストできます(1行、折り返しは無視してください):mysql -hslave.server -e 'show slave status\G'|awk '/Seconds_Behind_Master/{print $2}'
    2. 一定時間接続を維持します。多分あなたはこれのためにsleepでしょう。システムについて調査して、CPUを消費しないことを確認してください。
  • MySQLはドロップされた接続を適切に処理するため、これはオプションです:mysql -hslave.server -e 'SLAVE STOP'(実際、 MASTER_CONNECT_RETRY を使用する場合はSLAVE STARTはオプションです)
  • kill2番目の箇条書きからのsshクライアントのpid。

それはそれをする必要があります。これが機能する前に、スレーブを複製する準備をする必要があることに注意してください。 SLAVE STOPの発行について言及しているので、マスターからスレーブへの一貫したバックアップを取得し、CHANGE MASTERコマンドのログ位置を取得できたことを意味します。 MASTER_Host='127.0.0.1, MASTER_PORT=3333を指定する必要があることを追加します

もちろん、時間をかけて調べて詳しく説明しても問題ありません。また、説明しすぎて誰かを侮辱しないようにしています。詳細が必要な場合は、私に聞いてください。

1
Bruno Bronosky

私は過去にこれに似た何かに対処しなければなりませんでした。いくつかのオプションがあります。

  1. ssl、certs、およびIP制限を使用したmysqlレプリケーション。セットアップは簡単で、かなりうまくロックできます。サーバーへの接続は引き続き開きますが、アクセスは厳密に制御します。セキュリティ担当者にとっては十分ではないかもしれません。

  2. 他の誰かが述べたように、log-binファイルをスレーブにコピーしてから、mysqlbinlogを使用してそれらを取り込みます。私はこれを使用して、いくつかの新しい買収を企業ネットワークに移動することになりました。ただし、これは一時的な測定であり、1か月間しか使用せず、実行頻度も低くなりました。また、データがDMZサーバーに到達するまでの時間に関して遅延が発生します。

  3. Mysqlプロキシを使用して、両方のMysqlサーバーに同時に書き込みます。 http://dev.mysql.com/downloads/mysql-proxy/index.html スキーマに癖がある場合、これにはいくつかの興味深い副次的な問題がある可能性があります。欠点は、インストールして学習するための新しいツールであり、かなりベータ版です。逆に、あなたの問題のほとんどを解決します。

1
kashani