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

MySQLを保護する方法:パート2

    MySQLのセキュリティに関する前回の投稿では、MySQLインスタンスをより安全にするために使用できるさまざまなオプションについて説明しました。それらには以下が含まれます:

      一般的なMySQLセキュリティ対策;
    • MySQLでのアクセスの制御;
    • MySQLでのユーザーの作成、変更、および削除;
    • MySQLのユーザーとの間で特権を付与および取り消す;
    • MySQLのユーザーに割り当てられている特権を確認します。

    この投稿では、次のような残りのオプションについて詳しく説明します。

    • MySQLのアカウントカテゴリ;
    • MySQLの役割;
    • MySQLで予約されたアカウント;
    • MySQLでのパスワード管理;
    • MySQLでのアカウントのロック;
    • MySQLが提供するセキュリティプラグイン;
    • MySQLバックアップの保護。

    繰り返しになりますが、私たちはあなたが知る必要のあるすべてを完全に網羅するわけではありませんが、あなた自身の研究を行うための良い出発点を提供するよう努めます。

    MySQLのアカウントカテゴリ

    アカウントカテゴリは、MySQL 8、特にMySQL8.0.16で導入されました。その核心は次のとおりです。

    • 通常のユーザーとシステムユーザーの2つのアカウントカテゴリがあります。
    • 通常のユーザーは、SYSTEM_USER特権を持たないユーザーです。システムユーザーは、SYSTEM_USER特権を持っているユーザーです。
    • 通常のユーザーは通常のアカウントを変更できます-そのようなユーザーはシステムアカウントを変更できません;
    • システムユーザーは、システムアカウントと通常のアカウントの両方を変更できます。
    • 通常のアカウントは、通常のユーザーとシステムユーザーの両方が変更できます。
    • システムアカウントはシステムユーザーのみが変更できます。

    MySQLのアカウントカテゴリをセキュリティ面で利用するには、SYSTEM_USER権限がアカウントの操作や、アカウント内のセッションやステートメントの強制終了などに影響することに注意してください。MySQLのこの概念により、特定の変更を次のように制限できます。したがって、特定のアカウントはMySQLをより安全にします。アカウントカテゴリを使用して、通常のアカウントによる操作からシステムアカウントを保護することもできます。そのためには、通常のアカウントにmysqlスキーマ変更権限を付与しないでください。

    アカウントにSYSTEM_USER権限を付与するには、作成したアカウントで次のクエリを使用します。

    GRANT SYSTEM_USER ON *.* TO system_user;
    MySQLの役割

    MySQLでは、ロールは特権のコレクションです。 MySQLでユーザーアカウントに役割を付与するときは、その役割に関連付けられているすべての特権を付与します。ロールは、CREATEROLEステートメントを使用して作成できます。

    CREATE ROLE ‘role_1’, ‘role_2’;

    役割名は、ユーザー部分とホスト部分で構成されます。ユーザー部分を空白にすることはできません。指定されていない場合、ホスト部分はデフォルトで「%」になります。

    ロールを作成したら、それらに特権を割り当てる必要があります。特権は、GRANTステートメントを使用して割り当てることができます:

    • demo_database。*のすべてを「demo_user」に付与します。 demo_databaseというデータベースのdemo_userというユーザーにすべての権限を付与します。
    • GRANT INSERT、SELECT、UPDATE、DELETE ONdatabase。*TO‘demo_user’; demo_databaseというデータベースのdemo_userというユーザーにINSERT、SELECT、UPDATE、およびDELETEの権限を付与します。
    • demo_database。*のSELECTを「demo_user」に付与します。 demo_databaseというデータベースのdemo_userというユーザーにSELECT権限を付与します。

    個々のユーザーに役割を割り当てるには、次の構文を使用します:

    GRANT ‘role_name’ TO ‘user_name’@’localhost’;

    個々のユーザーに複数の役割を割り当てるには、次の構文を使用します。

    GRANT ‘role_1’, ‘role_2’ TO ‘user_name’@’localhost’;

    同時に複数のユーザーに役割を割り当てるには、次の構文を使用します。

    GRANT ‘role_name’ TO ‘user1’@’localhost’, ‘user2’@’localhost’;

    ロールは、セキュリティインシデントの防止に役立ちます。攻撃者が、あまり特権のないユーザーのパスワードを、ユーザーがロールに関して非常に「強力」であると誤って知っている場合、アプリケーション(およびデータベース)が非常によく保存されます。

    MySQLの予約済みアカウント

    予約済みアカウントに関しては、MySQLがデータディレクトリの初期化中にアカウントを作成することに注意してください。 MySQLで予約されていると見なす必要のあるアカウントがいくつかあります:

    • ‘root’ @’localhost’-このアカウントはスーパーユーザーアカウントであり、すべてのMySQLデータベースに対して神のような特権を持っています(任意のMySQLデータベースに対して任意の操作を実行できます)。高度な特権を持つアカウントが公開されないように、rootユーザーの名前を変更することもできます。アカウントの名前を変更するには、次のクエリを実行します。
    RENAME USER ‘root’@’localhost’ TO ‘username’@’localhost’;
    • 必ずFLUSHPRIVILEGESを発行してください。変更を有効にするためにアカウントの名前を変更した後のステートメント。
    • ‘mysql.sys’ @’localhost’-このアカウントは、sysスキーマのビュー、プロシージャ、および関数の定義者として使用されるシステムユーザーです。ルートアカウントの名前が変更された場合に発生する可能性のある問題を回避するために、MySQL5.7.9で追加されました。
    • ‘mysql.session’ @’localhost’-このアカウントは、サーバーにアクセスするためにプラグインによって内部的に使用されます。

    この場合、セキュリティ面であまり行うことはできませんが、rootアカウントには神のような特権があるため、MySQLデータベース全体で任意の操作を実行でき、注意が必要です。アカウントにアクセスするための特権を誰に付与するかを決定するとき。また、他のMySQLアカウントが何に使用されるかを覚えておいてください。

    MySQLでのパスワード管理

    MySQLはパスワード管理機能もサポートしています。それらのいくつかは次のとおりです。

      パスワードを定期的に期限切れにする機能; パスワードの再利用を回避する機能; パスワードを生成する機能; 使用中のパスワードが強力かどうかを確認する機能。 ログイン試行の失敗が多すぎるとユーザーを一時的にロックアウトする機能。

    次に、これらのオプションについてさらに詳しく見ていきます。

    パスワードを手動で期限切れにするには、次のようにALTERUSERステートメントを使用します。

    ALTER USER ‘user’@’localhost’ PASSWORD EXPIRE;

    グローバルポリシーを設定するには、default_password_lifetimeパラメーターが含まれるようにmy.cnfファイルを変更します。パラメータは[mysqld]セクションの下で定義できます(次の例では、パスワードの有効期間を3か月(90日)に設定します):

    default_password_lifetime=90

    パスワードの有効期限が切れないようにする場合は、パラメータdefault_password_litetimeを0に設定します。
    特定のユーザーのパスワードの有効期限を設定することもできます。 demo_userというユーザーのパスワードの有効期限の間隔を設定する場合は、次の例を使用できます。

    ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE INTERVAL 90 DAY;

    パスワードの有効期限を無効にするには:

    ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE NEVER;

    グローバルパスワードの有効期限ポリシーをリセットするには:

    ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE DEFAULT;

    パスワードの再利用制限では、パスワードの再利用は許可されていません。この機能を利用するには、password_history変数とpassword_reuse_interval変数を使用してください。これらの変数は、以下の例を参照してmy.cnfに配置するか、実行時に以下のステートメントの前にSETPERSISTを追加して設定できます。

    365日以降に以前に使用された5つのパスワードの再利用を禁止するには、次を使用します。

    password_history=5
    password_reuse_interval=365

    再利用を許可する前に最低5回のパスワード変更を要求するには:

    ALTER USER ‘demo_user’@’localhost’ PASSWORD HISTORY 5;

    ユーザーを作成するときにも同じことができます。ALTERUSERをCREATEUSERに置き換えてください。

    ユーザーの作成時にランダムなパスワードを生成するには、次のコマンドを実行します。

    CREATE USER [email protected] IDENTIFIED BY RANDOM PASSWORD;

    ユーザーのパスワードをランダムに生成されたものに変更するには:

    SET PASSWORD FOR [email protected] TO RANDOM;

    ランダムなパスワードが下に表示されます。

    デフォルトのランダムパスワードの長さは20文字であることに注意してください。長さは、5〜255の範囲のgenerated_random_password_length変数によって制御できます。

    使用されたパスワードが強力かどうかを確認するには、VALIDATE_PASSWORD_STRENGTH変数を使用できます。この関数は0から100までの数値を表示し、0が最も弱く、100が最も強くなります。
    SELECT VALIDATE_PASSWORD_STRENGTH('password');

    MySQLでのアカウントのロック

    MySQL 8.0.19には、ユーザーアカウントを一時的にロックする機能も導入されました。これは、変数FAILED_LOGIN_ATTEMPTSおよびPASSWORD_LOCK_TIMEを使用して実行できます。

    ユーザーの作成時にアカウントのロックを有効にするには、次のコマンドを実行します。

    CREATE USER ‘demo_user’@’localhost’ IDENTIFIED BY ‘password’ FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 5;

    FAILED_LOGIN_ATTEMPTSの後の値は、アカウントがロックされた試行の失敗回数を指定し、PASSWORD_LOCK_TIMEの後の値は、アカウントのロック時間を日数で指定します。 PASSWORD_LOCK_TIMEをUNBOUNDEDとして指定することにより、アカウントのロックが解除されるまで終了しない値を指定することもできます。

    MySQLが提供するセキュリティプラグイン

    MySQLには、セキュリティ機能をさらに強化できるプラグインもいくつか用意されています。 MySQLが提供するもの:

      認証プラグイン; 接続制御プラグイン; パスワード検証プラグイン; 監査プラグイン; ファイアウォールプラグイン;

    これらのプラグインは、セキュリティ面でさまざまな目的に使用できます。

    認証プラグイン

    認証プラグインを使用すると、ユーザーはMySQLで使用可能な複数のプラグイン可能な認証方法から選択できます。これらは、CREATEUSERまたはALTERUSERステートメントと一緒に使用できます。次に例を示します:

    CREATE USER ‘user_1’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;

    このクエリは、ネイティブパスワードハッシュ方式を使用して認証を実装します。

    接続制御プラグイン

    接続制御プラグインは、接続試行が特定の数を超えると、接続試行に対するサーバーの応答の遅延を増加させる可能性があります。潜在的なブルートフォース攻撃を阻止できます。このプラグインライブラリはバージョン5.7.17でMySQLに導入され、my.cnfを介して、または実行時にプラグインをサーバーにロードすることでMySQLに追加できます。
    プラグインをmy.cnfに追加するには、[mysqld]の下に次の行を追加します:

    plugin-load-add=connection_control.so

    ファイルを変更した後、変更を保存してMySQLを再起動します。
    実行時にプラグインをサーバーにロードするには、次のコマンドを実行します。

    INSTALL PLUGIN CONNECTION_CONTROL SONAME ‘connection_control.so’;
    INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME ‘connection_control.so’;

    必要に応じて、.soサフィックスを調整します。すべてを正しく完了した場合、CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTSテーブルには、失敗した接続の試行がすべて含まれているはずです。

    パスワード検証プラグイン

    パスワード検証プラグインを使用すると、適切に使用すれば、ユーザーはより強力なパスワードを使用できます。パスワード検証プラグインは、my.cnfを介して、または実行時にプラグインをサーバーにロードすることによってインストールできます。 my.cnfを介してプラグインをインストールするには、[mysqld]の下に次の行を追加してから、サーバーを再起動します。

    plugin-load-add=validate_password.so

    実行時にプラグインをロードするには、次のステートメントを実行します。

    INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;

    実行時にプラグインをロードし、プラグインが削除されないようにするには、validate-password=FORCE_PLUS_PERMANENTをmy.cnfに追加します。

    プラグインが初期化されていない場合にサーバーが実行されないようにするには、値がFORCEまたはFORCE_PLUS_PERMANENTの--validate-passwordオプションを使用します。

    パスワード強度ポリシーも変更できます。そのためには、validate_password_policy値をLOW、MEDIUM、またはSTRONGに変更します。 LOWの値はパスワードの長さのみをチェックし、MEDIUMポリシーはいくつかの条件を追加し、STRONGポリシーは、4文字以上で構成されるパスワードサブストリングがvalidate_password_dictionary_file変数を変更することで指定できる辞書ファイル内の単語と一致してはならないという条件を追加します。

    キーリングプラグイン

    キーリングプラグインを使用すると、サーバーコンポーネントとプラグインで機密情報を安全に保存して取得できます。プラグインをMySQLにロードするには、[mysqld]の下に以下を追加します。

    early-plugin-load=keyring_file.so

    キーリングボールトファイルを指定するには、以下を追加します(keyring_vault_config変数は構成ファイルを指している必要があります):

    loose-keyring_vault_config=”/var/lib/mysql_keyring/keyring_vault.conf”

    キーリングファイルには、ボールトサーバーアドレスを定義するvault_url変数、キーリングボールトがキーを格納するマウントポイント名を定義するsecret_mount_point変数、および必要なトークンが含まれている必要があります。ボールトサーバーによって定義されます。オプションで、vault_ca変数を定義することもできます(ボールトの証明書の署名に使用されるCA証明書を指す必要があります)。

    変更を有効にするために、サーバーを再起動します。

    プラグインの監査

    監査プラグインは、MySQLサーバーで実行されるアクティビティの監視、ロギング、およびブロックを有効にすることができます。 MySQL Enterprise Auditをインストールするには、MySQLインスタンスの共有ディレクトリにあるスクリプトを実行します(MySQLインスタンスのパスワードをターミナルに入力しないでください。my.cnfを使用してください):

    mysql < /path/to/audit_log_filter_linux_install.sql

    実行時にプラグインが削除されないようにすることもできます。[mysqld]セクションに以下を追加してください:

    audit_log=FORCE_PLUS_PERMANENT

    サーバーを再起動して、変更を適用します。ルールベースのログにはデフォルトで監査可能なイベントがログに記録されないことに注意してください。すべてをログに記録するには、フィルターを作成します。

    SELECT audit_log_filter_set_filter(‘log_filter’, ‘{ “filter”: { “log”: true } }’);

    次に、アカウントに割り当てます:

    SELECT audit_log_filter_set_user(‘%’, ‘log_filter’);

    監査プラグインはMySQLEnterpriseEditionでのみ使用可能であることに注意してください;

    ファイアウォールプラグイン

    ファイアウォールプラグインを使用すると、ユーザーは特定のパターンに基づいて特定のSQLステートメントの実行を許可または拒否できます。 MySQL EnterpriseFirewallはMySQL5.6.24で導入されました-不正なアクティビティを監視、警告、ブロックすることでデータを保護できます:SQLインジェクション攻撃をブロックし、脅威を監視し、疑わしいトラフィックをブロックし、侵入を検出することができますデータベース。ファイアウォールは、ブロックされたステートメントをログに記録することもできます。それらを検査したり、承認および拒否されたステートメントのリアルタイムのカウントを監視したりすることもできます。

    MySQL Enterprise Firewallをインストールするには、WindowsにMySQLサーバーをインストールするときに有効にするだけです。また、MySQL Workbench 6.3.4を使用して、インストール、無効化、またはアンインストールすることもできます。 MySQLインストールの共有ディレクトリでスクリプトを実行することにより、ファイアウォールを手動でインストールすることもできます。ファイアウォールを有効にするには、[mysqld]の下に次の行を追加し、サーバーを再起動します。

    mysql_firewall_mode=ON

    ファイアウォールは、実行時に有効にすることもできます:

    SET GLOBAL mysql_firewall_mode = ON;

    または、ファイアウォールを永続化するには(つまり、後続のサーバーを再起動するたびにファイアウォールを再度有効にする必要はありません):

    SET PERSIST mysql_firewall_mode = ON;

    次に、ファイアウォールを管理するすべてのアカウントにFIREWALL_ADMIN特権を付与し、独自のファイアウォールルールにのみアクセスする必要があるすべてのアカウントにFIREWALL_USER特権を付与します。また、mysqlデータベース内のファイアウォールのストアドプロシージャに対するEXECUTE権限を付与します。ファイアウォールが機能するためには、プロファイルをファイアウォールに登録し、データベースが実行できる許可されたステートメントを知るようにファイアウォールをトレーニングし、その後、着信ステートメントを設定されたホワイトリストと照合するようにファイアウォールに指示します。各プロファイルには、操作モード(OFF、RECORDING、PROTECTING、またはDETECTING)があります。 OFFはプロファイルを無効にし、RECORDINGはファイアウォールをトレーニングし、PROTECTINGはステートメントの実行を許可または拒否し、DETECTINGは侵入の試みを検出します(ただしブロックしません)。指定したプロファイルのルールは、その値をRESETに設定することでリセットできます。 OFFは、プロファイルを無効にします。モードを設定するには、次のクエリを使用します。ここで、nameはプロファイル名、OFFは操作モードです。

    CALL mysql.sp_set_firewall_mode(name, ‘OFF’);

    ファイアウォールプラグインは、MySQLEnterpriseEditionでのみ使用できます。

    MySQLバックアップの保護

    MySQLバックアップに関する限り、いくつかのオプションがあります。

    • mysqldumpを使用している場合は、ユーザー名とパスワードをmy.cnfに保存し、そのようにmysqldumpを呼び出すことができます(次のコマンドは、すべてのデータベースをファイル/home/backup.sqlにダンプします)。
    $ mysqldump --defaults-extra-file=/var/lib/my.cnf --single-transaction --all-databases > /home/backup.sql
    • ユーザー名とパスワードをmy.cnf内に保存することで、ターミナル内にパスワードを書き込む必要がなくなります。ダンプの実行中にコマンドをps axで確認できるため、このようなバックアップを取る方法の方が安全です。コマンド。
    • また、強力なセキュリティを念頭に置いてバックアップを圧縮および暗号化できるPOSIX準拠のラッパースクリプトであるmysqldump-secureの使用を検討することもできます。 。

    • バックアップは、OpenSSLを使用して暗号化できます。バックアップを取得してから、次のコマンドで暗号化します。

      $ openssl enc -aes-256-cbc -salt -in backup.tar.gz -out backup.tar.gz.enc -k password

      上記のコマンドは、現在のディレクトリに新しい暗号化ファイルbackup.tar.gz.encを作成します。ファイルは選択したパスワードで暗号化されます(パスワードを希望のパスワードに置き換えてください)。次のコマンドを実行することにより、ファイルを後で復号化できます。

      $ openssl aes-256-cbc -d -in backup.tar.gz.enc -out backup.tar.gz -k password

      パスワードを自分のパスワードに置き換えます。

    • mysqldumpには、バックアップを暗号化する別のオプションがあります(次の例でもgzipで圧縮されます):

      $ mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k password > backup.xb.enc

      パスワードを目的のパスワードに置き換えます。

    • mariabackupまたはxtrabackupを使用してバックアップを暗号化することもできます。 MariaDBドキュメントの例を次に示します。

      $ mariabackup --user=root --backup --stream=xbstream  | openssl  enc -aes-256-cbc -k password > backup.xb.enc

      パスワードを目的のパスワードに置き換えます。

    • バックアップはClusterControlを使用して暗号化することもできます-暗号化オプションが特定のバックアップに対して有効になっている場合、ClusterControlはAES-256CBCを使用してバックアップを暗号化します(暗号化はバックアップノードで発生します)。バックアップがコントローラーノードに保存されている場合、バックアップファイルはsocatまたはnetcatを使用して暗号化された形式でストリーミングされます。圧縮が有効になっている場合、ClusterControlは最初にバックアップを圧縮し、その後、暗号化します。暗号化キーが存在しない場合は自動的に生成され、CMON構成内のbackup_encryption_keyオプションに保存されます。このキーはエンコードされているため、最初にデコードする必要があることに注意してください。これを行うには、次のコマンドを実行します。

      $ cat /etc/cmon.d/cmon_ClusterID.cnf | grep ^backup_encryption_key | cut -d"'" -f2 | base64 -d > keyfile.key

      コマンドはbackup_encryption_keyを読み取り、その値をバイナリ出力にデコードします。キーファイルは、次のようにバックアップを復号化するために使用できます。

      $ cat backup.aes256 | openssl enc -d -aes-256-cbc -pass file:/path/to/keyfile.key > backup_file.xbstream.gz

      その他の例については、ClusterControlのドキュメントを確認してください。

    結論

    MySQLのセキュリティに関するこれらの投稿では、MySQLインスタンスのセキュリティを強化する必要があると感じた場合に役立つ可能性のあるいくつかのセキュリティ対策について説明しました。すべてを網羅しているわけではありませんが、MySQLインストールのセキュリティを強化する際には、これらのポイントが出発点として適していると考えています。これらの投稿から何をするかを考え、独自の調査を行い、状況に最も適したセキュリティ対策を適用してください。


    1. MongoクラスターをSSLで保護する

    2. MySQL8.0でrootユーザーにすべての権限を付与する方法

    3. Oracleで2番目に大きい最小値を選択します

    4. INNERJOINでCROSSAPPLYを使用する必要があるのはいつですか?