sql >> データベース >  >> RDS >> MariaDB

ClusterControlとProxySQLでSQLファイアウォールを簡単に

    このブログ投稿のタイトルを読むと、いくつかの疑問が生じる可能性があります。 SQLファイアウォール-それは何ですか?それは何をするためのものか?そもそもなぜそのようなものが必要なのですか?ええと、特定のクエリをブロックする機能は、特定の状況で役立つ可能性があります。データベースサーバーの前でProxySQLを使用する場合、プロキシは送信されているすべてのSQLステートメントを検査できます。 ProxySQLには高度なルールエンジンがあり、許可、ブロック、オンザフライでの再書き込み、または特定のデータベースサーバーへのルーティングが行われるクエリに一致させることができます。いくつかの例を見てみましょう。

    開発者が本番データに対してクエリをテストするために使用する専用のスレーブがあります。開発者がその特定のホストにのみ接続し、SELECTクエリのみを実行できるようにする必要があります。

    別のケースとして、スキーマ変更を実行している人との事故が多すぎて、ALTERステートメントを実行できるユーザーを制限したいとします。

    最後に、ユーザーが事前定義されたホワイトリストに登録された一連のクエリのみを実行できるというパラノイドアプローチについて考えてみましょう。

    私たちの環境では、マスターと2つのスレーブを使用したレプリケーションセットアップがあります。

    データベースの前に、キープアライブが仮想IPを管理する3つのProxySQLノードがあります。また、ProxySQLクラスターも構成されているため(この前のブログで説明されているように)、3つのProxySQLノードすべてで構成またはクエリルールを3回変更することを心配する必要はありません。クエリルールの場合、単純な読み取り/書き込み分割が設定されます:

    広範なクエリルールメカニズムを備えたProxySQLが、これら3つのケースすべてで目標を達成するのにどのように役立つかを見てみましょう。

    単一のホストグループへのユーザーアクセスのロック

    開発者が利用できる専用のスレーブ-これは珍しいことではありません。開発者が本番データにアクセスできる限り(たとえば、コンプライアンス上の理由で許可されていない場合は、ProxySQLチュートリアルで説明されているデータマスキングが役立つ場合があります)、これは実際のデータに対するクエリのテストと最適化に役立ちますセットする。スキーマの変更の一部を実行する前に、データを検証することも役立つ場合があります。たとえば、一意のインデックスを追加する前に、私の列は本当に一意ですか?

    ProxySQLを使用すると、アクセスを制限するのはかなり簡単です。手始めに、ホストグループ30に、開発者がアクセスできるスレーブが含まれていると仮定します。

    開発者がそのスレーブにアクセスするために使用するユーザーが必要です。すでにProxySQLにある場合は、それで問題ありません。そうでない場合は、ProxySQLにインポートするか(MySQLで作成されているがProxySQLでは作成されていない場合)、両方の場所で作成する必要があります(新しいユーザーを作成する場合)。最後のオプションで、新しいユーザーを作成しましょう。

    MySQLとProxySQLの両方で制限された権限を持つ新しいユーザーを作成しましょう。これをクエリルールで使用して、開発者からのトラフィックを識別します。

    このクエリルールでは、dev_testユーザーによって実行されるすべてのクエリをホストグループ30にリダイレクトします。このルールをアクティブにし、最後に解析する必要があるため、「適用」を有効にしました。また、このクエリを通常の読み取り/書き込み分割設定の外部で実行するため、RuleIDを最初の既存のルールのIDよりも小さくなるように構成しました。

    ご覧のとおり、ユーザー名を使用しましたが、他のオプションもあります。

    どの開発ホストがトラフィックをデータベースに送信するかを予測できる場合(たとえば、開発者がデータベースに到達する前に特定のプロキシを使用できるようにすることができます)、「クライアントアドレス」オプションを使用して、それによって実行されるクエリを照合することもできます。単一のホストを作成し、それらを正しいホストグループにリダイレクトします。

    ユーザーによる特定のクエリの実行を禁止する

    ここで、特定のコマンドの実行を特定のユーザーに制限したい場合を考えてみましょう。これは、適切な人がスキーマの変更など、パフォーマンスに影響を与えるクエリの一部を実行できるようにするために便利です。 ALTERは、この例で使用するクエリになります。手始めに、スキーマの変更を実行できる新しいユーザーを追加しましょう。これを「admin_user」と呼びます。次に、必要なクエリルールを作成する必要があります。

    クエリに一致する「。*ALTERTABLE。*」正規表現を使用するクエリルールを作成します。このクエリルールは、他の読み取り/書き込み分割ルールの前に実行する必要があります。ルールID20を割り当てました。このクエリルールがトリガーされた場合にクライアントに返されるエラーメッセージを定義します。完了したら、別のクエリルールに進みます。

    ここでは、同じ正規表現を使用してクエリをキャッチしていますが、エラーテキストは定義していません(つまり、クエリはエラーを返しません)。また、実行を許可するユーザー(この場合はadmin_user)も定義します。このクエリは前のクエリの前にチェックされていることを確認するため、19という低いルールIDを割り当てました。

    これらの2つのクエリルールを設定したら、それらがどのように機能するかをテストできます。アプリケーションユーザーとしてログインし、ALTERTABLEクエリを実行してみましょう。

    [email protected]:~# mysql -P6033 -usbtest -ppass -h10.0.0.111
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 43160
    Server version: 5.5.30 (ProxySQL)
    
    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> use sbtest;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> alter table sbtest1 add index (pad);
    ERROR 1148 (42000): You are not allowed to execute ALTER
    mysql> ^DBye

    予想どおり、このクエリを実行できず、エラーメッセージが表示されました。 「admin_user」を使用して接続してみましょう:

    [email protected]:~# mysql -P6033 -uadmin_user -ppass -h10.0.0.111
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 43180
    Server version: 5.5.30 (ProxySQL)
    
    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> use sbtest;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> alter table sbtest1 add index (pad);
    Query OK, 0 rows affected (0.99 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    「admin_user」を使用してログインしたときに、なんとかALTERを実行できました。これは、任命された人だけがデータベースでスキーマの変更を実行できるようにするための非常に簡単な方法です。

    許可されたクエリのホワイトリストの作成

    最後に、事前定義されたクエリのみを実行できる、厳密にロックされた環境について考えてみましょう。 ProxySQLは、このようなセットアップを実装するために簡単に利用できます。

    まず、必要なものを実装する前に、既存のクエリルールをすべて削除する必要があります。次に、すべてのクエリをブロックするキャッチオールクエリルールを作成する必要があります。

    残りの作業は、許可されているすべてのクエリのクエリルールを作成することです。クエリごとに1つのルールを実行できます。または、たとえばSELECTが常に実行可能である場合は、正規表現を使用できます。覚えておく必要があるのは、ルールIDをこのキャッチオールルールのルールIDよりも小さくする必要があることと、クエリが最終的に「適用」を有効にしてルールにヒットするようにすることだけです。

    このブログ投稿で、ClusterControlとProxySQLを利用してセキュリティを向上させ、データベースのコンプライアンスを確保する方法についての洞察が得られたことを願っています。


    1. PL/SQLストアドプロシージャでコンマ区切りの文字列を分割する

    2. 単一のMySQLクエリで条件が異なる複数のカウント

    3. SQL RANK()とROW_NUMBER()

    4. 再帰SQLクエリを作成することは可能ですか?