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

MariaDBサーバーデータベース暗号化の基本

    暗号化は、データを可能な限り安全に保つための最も重要なセキュリティ機能の1つです。処理するデータによっては、必ずしも必須ではありませんが、少なくとも組織のセキュリティの向上と見なす必要があります。実際には、データの盗難や不正アクセスを回避することをお勧めします。

    このブログでは、2つの基本的なタイプの暗号化と、MariaDBサーバーでの暗号化の構成方法について説明します。

    データ暗号化とは何ですか?

    データ暗号化には、保存時と転送中の2つの基本的なタイプがあります。それらの意味を見てみましょう。

    保存データの暗号化

    システムに保存されているデータは、保存データと呼ばれます。このデータの暗号化は、アルゴリズムを使用してテキストまたはコードを読み取り不能に変換することで構成されます。暗号化されたデータをデコードするには、暗号化キーが必要です。

    データベース全体の暗号化は、パフォーマンスに深刻な影響を与える可能性があるため、注意して行う必要があります。したがって、個々のフィールドまたはテーブルのみを暗号化することをお勧めします。

    保存データを暗号化することで、ハードドライブの物理的な盗難や不正なファイルストレージアクセスからデータを保護します。この暗号化は、特にファイルシステムに財務データまたは健康データが保存されている場合は、データセキュリティ規制にも準拠しています。

    転送中のデータの暗号化

    トランザクション間で転送または移動されるデータは、データ転送中と呼ばれます。 Webページの閲覧中にサーバーとクライアント間を移動するデータは、この種のデータの良い例です。

    常に移動しているため、データが宛先に到達する前にデータの盗難や改ざんを防ぐために、適切な暗号化で保護する必要があります。

    転送中のデータを保護する理想的な状況は、データを移動する前に暗号化し、最終的な宛先に到達したときにのみ復号化することです。

    MariaDB保存データの暗号化

    テーブルとテーブルスペースの暗号化は10.1バージョンからMariaDBに追加され、XtraDB、InnoDB、Ariaストレージエンジン、およびバイナリログの暗号化をサポートしています。

    暗号化にはさまざまな方法を選択できます:

      すべてのテーブル 個々のテーブル 個々のテーブルを除くすべて

    ドキュメントによると、暗号化を使用すると約3〜5%のオーバーヘッドが発生するため、本番環境での問題を回避するために、暗号化にストレスを与えてどのように応答するかを確認するためのテスト環境を用意することが重要です。

    MariaDBで保存データの暗号化を構成する方法

    MariaDBデータベースの既存の「city」テーブルを確認しましょう:

    $ strings city.ibd |head
    
    infimum
    
    supremum
    
    infimum
    
    supremum
    
    3ABW
    
    3KHM
    
    infimum
    
    supremum
    
    Kabul                              AFGKabol
    
    Qandahar                           AFGQandahar

    ご覧のとおり、たとえば、strings Linuxコマンドを使用すると、問題なくそこからデータを読み取ることができます。それでは、暗号化する方法を見てみましょう。

    openssl randコマンドを使用して暗号化キーを生成します:

    $ mkdir -p /etc/mysql/encryption
    
    $ for i in {1..4}; do openssl rand -hex 32 >> /etc/mysql/encryption/keyfile;  done;
    生成されたファイル/etc/ mysql / encoding / keyfileを編集し、暗号化されたテーブルを作成するときに参照されるキーIDを追加します。形式は次のとおりです。

    <encryption_key_id1>;<hex-encoded_encryption_key1>
    
    <encryption_key_id2>;<hex-encoded_encryption_key2>

    次のようにsedlinuxコマンドを使用して編集できます:

    $ for i in {1..4}; do sed -i -e "$i s/^/$i;/" keyfile; done

    したがって、ファイルは次のようになります。

    $ cat /etc/mysql/encryption/keyfile
    
    1;f237fe72e16206c0b0f6f43c3b3f4accc242564d77f5fe17bb621de388c193af
    
    2;0c0819a10fb366a5ea657a71759ee6a950ae8f25a5ba7400a91f59b63683edc5
    
    3;ac9ea3a839596dbf52492d9ab6b180bf11a35f44995b2ed752c370d920a10169
    
    4;72afc936e16a8df05cf994c7902e588de0d11ca7301f9715d00930aa7d5ff8ab

    ここで、前に見たのと同様のopensslコマンドを使用してランダムパスワードを生成します。

    $ openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key

    次の手順に進む前に、キーファイルの暗号化に関する次の詳細を知っておくことが重要です。

    • MariaDBが現在キーファイルを暗号化するためにサポートしている唯一のアルゴリズムは、Advanced Encryption Standard(AES)のCipher Block Chaining(CBC)モードです。
    • 暗号化キーのサイズは、128ビット、192ビット、または256ビットにすることができます。
    • 暗号化キーは、暗号化パスワードのSHA-1ハッシュから作成されます。
    • 暗号化パスワードの最大長は256文字です。

    ここで、openssl encコマンドを使用してキーファイルを暗号化するには、次のコマンドを実行します。

    $ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/encryption/keyfile.key -in /etc/mysql/encryption/keyfile -out /etc/mysql/encryption/keyfile.enc

    最後に、my.cnf構成ファイル(RedHatベースのOSでは/etc/またはDebianベースのOSでは/etc/ mysql /にあります)に次のパラメーターを追加する必要があります。

    [mysqld]
    
    …
    
    #################### DATABASE ENCRYPTION ####################
    
    plugin_load_add = file_key_management
    
    file_key_management_filename = /etc/mysql/encryption/keyfile.enc
    
    file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key
    
    file_key_management_encryption_algorithm = aes_cbc
    
    encrypt_binlog = 1
    
    
    
    innodb_encrypt_tables = ON
    
    innodb_encrypt_log = ON
    
    innodb_encryption_threads = 4
    
    innodb_encryption_rotate_key_age = 0 
    
    …

    そして、MariaDBサービスを再起動して変更を加えます:

    $ systemctl restart mariadb

    この時点で、すべてが暗号化機能を使用する準備ができています。前に示したのと同じテーブル「city」を暗号化してみましょう。このためには、ALTER TABLEステートメントを使用してENCRYPTEDパラメーターをYESに設定する必要があります:

    MariaDB [world]> ALTER TABLE city ENCRYPTED=YES;
    
    Query OK, 0 rows affected (0.483 sec)
    
    Records: 0  Duplicates: 0  Warnings: 0

    これで、ファイルシステムから直接テーブルにアクセスしようとすると、次のように表示されます。

    $ strings city.ibd |head
    
    PU%O
    
    !ybN)b
    
    9,{9WB4
    
    T3uG:
    
    ?oiN
    
    ,35sz
    
    8g)Q
    
    o(o
    
    q_A1
    
    k=-w

    ご覧のとおり、テーブルは読み取れません。 MySQLコマンドにENCRYPTION_KEY_ID=パラメータを追加して暗号化キーIDを指定することもできます。ここで、は以前に作成したキーファイルのID番号です。

    my.cnf構成ファイルでinnodb_encrypt_tablesパラメーターをONに設定すると、新しいテーブルはデフォルトで暗号化されます。

    MariaDB転送中データの暗号化

    MariaDBを使用すると、以前はSecure Socket LayerまたはSSLと呼ばれていたトランスポート層セキュリティプロトコル(TLS)を使用して、サーバーとクライアント間の転送中のデータを暗号化できます。

    まず、MariaDBサーバーがTLSサポートでコンパイルされていることを確認する必要があります。これを確認するには、次のSHOWGLOBALVARIABLESステートメントを実行します。

    MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'version_ssl_library';
    
    +---------------------+----------------------------+
    
    | Variable_name       | Value                      |
    
    +---------------------+----------------------------+
    
    | version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |
    
    +---------------------+----------------------------+
    
    1 row in set (0.001 sec)

    そして、SHOW VARIABLESステートメントを使用して、現在使用されていないかどうかを確認します。

    MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
    
    +---------------------+----------------------------+
    
    | Variable_name       | Value                      |
    
    +---------------------+----------------------------+
    
    | have_openssl        | YES                        |
    
    | have_ssl            | DISABLED                   |
    
    | ssl_ca              |                            |
    
    | ssl_capath          |                            |
    
    | ssl_cert            |                            |
    
    | ssl_cipher          |                            |
    
    | ssl_crl             |                            |
    
    | ssl_crlpath         |                            |
    
    | ssl_key             |                            |
    
    | version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |
    
    +---------------------+----------------------------+
    
    10 rows in set (0.001 sec)

    status MariaDBコマンドを使用してSSLステータスを確認することもできます:

    MariaDB [(none)]> status
    
    --------------
    
    mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
    
    Connection id: 22
    
    Current database:
    
    Current user: [email protected]
    
    SSL: Not in use
    
    Current pager: stdout
    
    Using outfile: ''
    
    Using delimiter: ;
    
    Server: MariaDB
    
    Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution
    
    Protocol version: 10
    
    Connection: Localhost via UNIX socket
    
    Server characterset: latin1
    
    Db     characterset: latin1
    
    Client characterset: utf8
    
    Conn.  characterset: utf8
    
    UNIX socket: /var/lib/mysql/mysql.sock
    
    Uptime: 4 hours 28 min 25 sec
    
    Threads: 11  Questions: 111668  Slow queries: 0  Opens: 92  Flush tables: 1  Open tables: 85  Queries per second avg: 6.933
    
    --------------

    MariaDBで転送中データの暗号化を構成する方法

    すべての証明書を保存するcertsディレクトリを作成しましょう:

    $ mkdir -p /etc/mysql/certs

    次に、接続を暗号化するように構成されるCA証明書を生成しましょう:

    $ openssl genrsa 2048 > ca-key.pem
    
    $ openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem

    この最後のコマンドでは、次の情報を入力するように求められます。

    Country Name (2 letter code) [AU]:
    
    State or Province Name (full name) [Some-State]:
    
    Locality Name (eg, city) []:
    
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    
    Organizational Unit Name (eg, section) []:
    
    Common Name (e.g. server FQDN or YOUR name) []:
    
    Email Address []:

    次に、サーバー証明書を生成する必要があります:

    $ openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem

    このコマンドでは、以前と同じ情報に加えて、オプションの証明書パスワードを入力するように求められます。

    $ openssl rsa -in server-key.pem -out server-key.pem
    
    $ openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

    最後に、クライアント証明書を生成する必要があります:

    $ openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem

    これにより、情報とオプションの証明書パスワードを入力するよう求められます。

    $ openssl rsa -in client-key.pem -out client-key.pem
    
    $ openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

    証明書ごとに異なる共通名を使用していることを確認してください。使用していないと、機能せず、次のようなメッセージが表示されます。

    ERROR 2026 (HY000): SSL connection error: self signed certificate

    現時点では、次のようになります。

    $ ls /etc/mysql/certs/
    
    ca-cert.pem  ca-key.pem  client-cert.pem  client-key.pem  client-req.pem  server-cert.pem  server-key.pem  server-req.pem

    そして、次のコマンドを使用して証明書を検証できます:

    $ openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
    
    server-cert.pem: OK
    
    client-cert.pem: OK

    では、my.cnf構成ファイル(RedHatベースのOSでは/ etc /、DebianベースのOSでは/ etc / mysql /にあります)で構成しましょう:

    [mysqld]
    
    ssl_ca=/etc/mysql/certs/ca-cert.pem
    
    ssl_cert=/etc/mysql/certs/server-cert.pem
    
    ssl_key=/etc/mysql/certs/server-key.pem
    
    
    
    [client-mariadb]
    
    ssl_ca =/etc/mysql/certs/ca-cert.pem
    
    ssl_cert=/etc/mysql/certs/client-cert.pem
    
    ssl_key=/etc/mysql/certs/client-key.pem

    対応するセクション(mysqldおよびclient-mariadb)の下に追加していることを確認してください。

    証明書の所有者を変更し、データベースサービスを再起動します:

    $ chown mysql.mysql /etc/mysql/certs/
    
    $ systemctl restart mariadb

    この後、SHOW VARIABLESの出力を見ると、次のようになっているはずです。

    MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
    
    +---------------------+----------------------------------+
    
    | Variable_name       | Value                            |
    
    +---------------------+----------------------------------+
    
    | have_openssl        | YES                              |
    
    | have_ssl            | YES                              |
    
    | ssl_ca              | /etc/mysql/certs/ca-cert.pem     |
    
    | ssl_capath          |                                  |
    
    | ssl_cert            | /etc/mysql/certs/server-cert.pem |
    
    | ssl_cipher          |                                  |
    
    | ssl_crl             |                                  |
    
    | ssl_crlpath         |                                  |
    
    | ssl_key             | /etc/mysql/certs/server-key.pem  |
    
    | version_ssl_library | OpenSSL 1.1.1  11 Sep 2018       |
    
    +---------------------+----------------------------------+
    
    10 rows in set (0.001 sec)

    それでは、それを使用するためのREQUIRESSSLパラメーターを持つユーザーを作成しましょう:

    MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 's9s'@'%' IDENTIFIED BY 'root123' REQUIRE SSL;
    
    Query OK, 0 rows affected (0.005 sec)

    このユーザーを使用してデータベースにアクセスし、statusコマンドを確認すると、SSLが使用中であることがわかります。

    MariaDB [(none)]> status
    
    --------------
    
    mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
    
    Connection id: 15
    
    Current database:
    
    Current user: [email protected]
    
    SSL: Cipher in use is TLS_AES_256_GCM_SHA384
    
    Current pager: stdout
    
    Using outfile: ''
    
    Using delimiter: ;
    
    Server: MariaDB
    
    Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution
    
    Protocol version: 10
    
    Connection: 127.0.0.1 via TCP/IP
    
    Server characterset: latin1
    
    Db     characterset: latin1
    
    Client characterset: utf8
    
    Conn.  characterset: utf8
    
    TCP port: 3306
    
    Uptime: 16 sec
    
    Threads: 11  Questions: 136  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 8.500
    
    --------------

    ClusterControlでSSL暗号化を有効にする方法

    MariaDBデータベースでSSLを有効にする別の方法、さらに簡単な方法は、ClusterControlを使用することです。 ClusterControlがインストールされており、それを使用してMariaDBデータベースを管理していることを前提としているため、ClusterControl->MariaDBクラスターの選択->セキュリティ->SSL暗号化->有効に移動します。

    これで、MariaDBデータベースでSSL暗号化が有効になります手作業なしで。

    MariaDBでの保存時の暗号化の制限

    MariaDBの保存時の暗号化に関連して、考慮すべきいくつかの制限があります。

    • メタデータ(.frmファイルなど)とクライアントに送信されるデータは暗号化されません。
    • 特に
        データを復号化する方法を知っているのは、MariaDBサーバーだけです。
      • mysqlbinlogは、-read-from-remote-serverが使用されている場合にのみ暗号化されたバイナリログを読み取ることができます。
      • Percona XtraBackupは、暗号化されたInnoDBを使用するインスタンスをバックアップできません。ただし、Mariabackupは暗号化されたインスタンスをバックアップできます。
    • ディスクベースのGaleragcacheは、コミュニティバージョンのMariaDB Serverでは暗号化されていませんが、このファイルはMariaDB EnterpriseServer10.4で暗号化されています。
    • Auditプラグインは暗号化された出力を作成できません。それをsyslogに送信し、代わりにそこで保護を構成します。
    • ファイルベースの一般的なクエリログと低速のクエリログは暗号化できません。
    • Ariaログは暗号化されていません。これは、一時的でないAriaテーブルにのみ影響します。
    • MariaDBエラーログは暗号化されていません。エラーログには、クラッシュ、アサーションの失敗、デバッグを支援するためにInnoDB / XtraDBがモニター出力をログに書き込む場合など、クエリテキストとデータが含まれる場合があります。必要に応じてsyslogに送信することもできます。
    結論

    転送中のデータを保護することは、保存中のデータを保護することと同じくらい重要です。組織で必須ではない場合でも、データを回避するのに役立つため、適用を検討する必要があります。盗難または不正アクセス。

    MariaDBには、前述の手順に従って実装する非常に簡単な方法がありますが、ClusterControlを使用するとさらに簡単になります。


    1. 主キーのUUIDまたはSEQUENCE?

    2. SQLite3をMySQLに移行する簡単な方法は?

    3. Oracleにはフィルタリングされたインデックスの概念がありますか?

    4. SQLの欠落データテーブルにCreatedByとCreatedOnを挿入します