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

MySQLまたはMariaDBデータベースをSQLインジェクションから保護する方法:パート1

    セキュリティは、適切に設計されたデータベース環境の最も重要な要素の1つです。 SQLインジェクションで使用される攻撃ベクトルは、おそらく最も人気のあるものが多数あります。アプリケーションコードで防御のレイヤーを設計できますが、データベースレイヤーで何ができるでしょうか。今日は、ProxySQLを使用してMySQLの上にSQLファイアウォールを簡単に実装できることを示したいと思います。このブログの第2部では、データベースへのアクセスを許可するクエリのホワイトリストを作成する方法について説明します。

    まず、ProxySQLをデプロイします。これを行う最も簡単な方法は、ClusterControlを使用することです。数回クリックするだけで、クラスターにデプロイできます。

    デプロイする場所を定義し、クラスター内の既存のホストを選択できますまたは、IPまたはホスト名を書き留めます。管理ユーザーと監視ユーザーの資格情報を設定します。

    次に、ProxySQLで使用する新しいユーザーをデータベースに作成できますまたは、既存のものの1つをインポートできます。また、ProxySQLに含めるデータベースノードを定義する必要があります。暗黙のトランザクションを使用するかどうかに答えて、ProxySQLを展開する準備ができているかどうかを確認します。数分で、入力に基づいて構成が準備されたProxySQLを使用できるようになります。

    セキュリティが問題であるため、ProxySQLに不適切なクエリの処理方法を指示できるようにしたいと考えています。 ProxySQLが通過するトラフィックを処理する方法を管理するコアメカニズムであるクエリルールを見てみましょう。クエリルールのリストは次のようになります。

    これらは最小のID以降に適用されます。

    特定のユーザーに対してSELECTクエリのみを許可するクエリルールを作成してみましょう:

    ルールリストの先頭にクエリルールを追加します。 SELECT以外のものと一致させます(Negate Match Patternが有効になっていることに注意してください)。クエリルールは、ユーザー名が「devuser」の場合にのみ使用されます。すべての条件が一致すると、「エラーメッセージ」フィールドのようにエラーが表示されます。

    [email protected]:~# mysql -u devuser -h 10.0.0.144 -P6033 -ppass
    
    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 3024
    
    Server version: 5.5.30 (ProxySQL)
    
    
    
    Copyright (c) 2009-2019 Percona LLC and/or its affiliates
    
    Copyright (c) 2000, 2019, 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> create schema myschema;
    
    ERROR 1148 (42000): The query is not allowed
    
    mysql> SELECT 1;
    
    +---+
    
    | 1 |
    
    +---+
    
    | 1 |
    
    +---+
    
    1 row in set (0.01 sec)
    
    
    
    mysql> SELECT * FROM sbtest.sbtest1 LIMIT 1\G
    
    *************************** 1. row ***************************
    
     id: 1
    
      k: 503019
    
      c: 18034632456-32298647298-82351096178-60420120042-90070228681-93395382793-96740777141-18710455882-88896678134-41810932745
    
    pad: 43683718329-48150560094-43449649167-51455516141-06448225399
    
    1 row in set (0.00 sec)

    別の例として、今回はボビーテーブルの状況に関連する事故の防止に努めます。

    このクエリルールを設定すると、「学生」テーブルは作成されません。ボビーに落とされる:

    mysql> use school;
    
    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> INSERT INTO students VALUES (1, 'Robert');DROP TABLE students;--
    
    Query OK, 1 row affected (0.01 sec)
    
    
    
    ERROR 1148 (42000): Only superuser can execute DROP TABLE;

    ご覧のとおり、ボビーは「学生」テーブルを削除できませんでした。彼はテーブルにうまく挿入されただけです。


    1. Javaでデータベースリスナーを作成するにはどうすればよいですか?

    2. PostgreSQLタイムスタンプタイプでタイムゾーンを保持する

    3. データ分析とデータサイエンス:違いは何ですか?

    4. current_timeがPostgreSQLでどのように機能するか