MySQL
MySQLは、オープンソースのリレーショナルデータベース管理システムです。このガイドでは、MySQLサーバーを保護および監査する方法について説明します。この名前は、共同創設者のMichaelWideniusの娘の名前である「My」とStructuredQueryLanguageの略語である「SQL」を組み合わせたものです。
始める前に
-
「はじめに」および「サーバーの保護」ガイドに従っていることを確認してください。 Linodeのホスト名が設定されていることを確認してください。
Linodeのホスト名を確認してください。最初のコマンドは短いホスト名を表示し、2番目のコマンドは完全修飾ドメイン名(FQDN)を表示する必要があります。
hostname hostname -f
注 Webサイトにドメイン名を登録している場合は、LAMPスタックをインストールする予定のLinodeサーバーにドメインを追加します。ドメイン名を登録していない場合は、 example.com
を置き換えてください 次の手順でLinodeサーバーのIPアドレスを使用します。 -
システムを更新します:
sudo yum update
注 このガイドは、root以外のユーザーを対象としています。昇格された特権を必要とするコマンドには、接頭辞として sudo
が付けられます 。sudo
に慣れていない場合 コマンドを使用すると、ユーザーとグループのガイドを確認できます。 -
MySQLを保護および監査するには、
を参照してください。MySQL Server
を備えたLinuxサーバーが必要です。 実行中のサービス。 MySQLのインストールについては、MySQLのインストール注 このガイドの手順はUbuntu18.04に基づいていますが、パッケージ名とパッケージマネージャーを除いて、すべての手順は配布に依存しません。
セキュアMySQLインストーラーの使用
mysql-serverパッケージには、mysql_secure_installation
というユーティリティが事前に構成されています。 これは、匿名ユーザーを削除し、必要なパスワード強度ポリシーを指定できるようにすることで、MySQLサーバーの安全な開始点を設定するために使用されます。
mysql_secure_installation
Unixシステムで利用可能なシェルスクリプトであり、次のことを可能にすることでMySQLのインストールを保護できます。
- ルートアカウントのパスワードを設定する
- ローカルホストの外部からアクセスできるルートアカウントを削除します
- 匿名ユーザーアカウントを削除する
- デフォルトで匿名ユーザーがアクセスできるテストデータベースを削除します
mysql-serverをインストールした直後にこのユーティリティを実行してセキュリティプロセスを開始します。
-
次のコマンドを実行して、ユーティリティを起動します。
sudo mysql_secure_installation
-
セットアッププロセスが開始され、ユーティリティは、パスワードのテストとセキュリティの向上に使用されるパスワード検証プラグインを有効にするかどうかを指定するように求めます。この機能を有効にすることをお勧めします。
Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD plugin? Press y|Y for Yes, any other key for No: y
-
パスワードプラグインを有効にした後、目的のパスワードの強度のレベルに基づいてパスワード検証ポリシーを指定します。
There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 Please set the password for root here. New password: Re-enter new password: Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
-
匿名ユーザーを削除します。攻撃者は匿名ユーザーを利用してデータベースサーバーにアクセスできるため、これは重要なセキュリティオプションです。
By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
-
ルートログインをリモートで無効にします。これは、攻撃者がMySQLサーバーに対してルートとしてリモート認証したり、パスワードブルートフォース攻撃を実行したりするのを防ぐため、非常に重要なセキュリティ構成です。リモート認証を完全に無効にすることもできます。その方法については、次のセクションで説明します。
Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
-
mysql-serverのインストールプロセス中に作成されたテストデータベースを削除します。このデータベースはテスト目的で作成されます。グッドプラクティスとして、このデータベースを削除することをお勧めします。
By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
-
特権テーブルをリロードして、すべての変更が適用され、有効になっていることを確認します。
これで、作業するための安全な基盤ができました。次のセクションで、デフォルトのルートを変更する手順を見つけてください。 ユーザー名とパスワード。Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done!
「root」ユーザーの変更
デフォルトでは、MySQLサーバーにはsuperuser/admin
が事前定義されています データベースとデータベースユーザーのすべての特権と機能にアクセスできるアカウント。この比類のない制御とアクセスを考えると、攻撃者は通常、データベースとデータベースユーザーに完全なアクセスを提供する可能性があるため、MySQLサーバー上のrootアカウントを標的にするため、rootアカウントをロックダウンして保護することが重要です。
「root」ユーザーを保護するための最初のステップは、ユーザー名をroot
から変更することです。 よりゆるぎない何かに、目的は、ルートユーザー名を推測しにくくすること、または攻撃者を総当たり攻撃することです。その後、root
を変更することもお勧めします グッドプラクティスとして定期的にアカウントのパスワード。
-
次のコマンドを使用してMySQLサーバーにログインします。
sudo mysql -u root
-
次のクエリを実行して、「root」アカウントのユーザー名を変更します。
rename user 'root'@'localhost' to '<new-username>'@'localhost';
-
root
を変更します 強力で推測しにくいものへのアカウントパスワード、パスワードジェネレータを使用することをお勧めします。安全なインストールプロセス中にパスワード検証プラグインを有効にした場合は、強度の観点からポリシー要件を満たすパスワードを提供する必要があります。ALTER USER 'example_username'@'localhost' IDENTIFIED BY '<new-password>';
-
次のコマンドを実行して、特権テーブルを再ロードし、すべての変更が保存されてアクティブ化されていることを確認します。
flush privileges;
-
root
かどうかを確認するには ユーザー名とパスワードが変更されたら、次のクエリを実行します:use mysql; select user,host,authentication_string from mysql.user;
これにより、mysqlデータベースに保存されているユーザーテーブルが表示され、行われた変更が反映されます。
+------------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+------------------+-----------+-------------------------------------------+
| example_user | localhost | *A2550B00C6DF81DACE33551E8293462F6CAE33DA |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *241DC5A20F017D55EE82E46E7996784ED4A5CD8A |
+------------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
新しいユーザーの作成
優れたセキュリティ慣行は、職務または役割による分離の概念です。これは、データベースを使用するすべてのデータベースまたはアプリケーションについて、その特定のデータベースに対するCRUD権限を持つ新しいユーザーを作成することを意味します。これにより、いつでも1人のユーザーだけが一度に1つのデータベースにアクセスでき、ユーザーは他のデータベースにアクセスできなくなります。
-
Test
を作成します データベース、MYSQL内で次のクエリを実行する:create database Test;
-
このテストデータベースの管理を担当するユーザーを作成します。
CREATE USER '<username>'@'localhost' IDENTIFIED BY '<password>';
-
Test
のユーザーに適切なCRUD権限を割り当てます データベース:GRANT SELECT,UPDATE,DELETE ON Test.* TO '<username>'@'localhost';
-
これらの権限は
Test
にのみ適用されることに注意してください。 データベース(phpMyAdmin
などのアプリケーションのユーザーを作成する場合) 、ユーザーにroot
を提供する必要があります 権限。 -
特定のユーザーを削除する場合は、次のクエリを実行します。
drop user '<username>'@'localhost';
-
次のクエリを実行して、特権テーブルをリロードし、加えられた変更が適用されてアクティブ化されていることを確認します。
flush privileges;
カスタムMySQL構成
これで、追加のセキュリティ構成オプションを提供するMySQLの安全なカスタム構成をセットアップできます。
-
グローバルMySQL構成ファイルは
/etc/mysql/my.cnf
にあります 、すべてのカスタムグローバル構成は構成ファイルで設定されます。 -
mysqld(MySQLデーモン)のカスタム構成を指定する必要があります。イメージに表示されるオプションはカスタムセキュリティ構成です。
-
カスタム構成を追加した後、
mysql
を再起動する必要があります すべての変更が確実に適用されるようにするサービス。systemctl restart mysql
MySQLセキュリティの監査
MySATと呼ばれるツールを使用して、MySQLサーバーのセキュリティを監査できるようになりました。 MySATは、データベース構成とセキュリティポリシーを分析するために、いくつかのテストを実行します。 MySATは、MySQLデータベースのセキュリティを評価して向上させるのに役立ちます。MySATは単純なSQLスクリプトであり、理解しやすく、保守も簡単です。 MySATの結果はHTML形式で出力されます。
-
次のコマンドを実行して、MySATGithubリポジトリのクローンを作成します。
git clone https://github.com/meob/MySAT.git
-
ディレクトリのクローンを作成したら、MySATディレクトリに移動します。ここで
mysat.sql
ファイルが検索され、MySQLサーバーと組み合わせて使用され、結果がMySAT.htm
に出力されます。 ファイル。 -
次のコマンドを実行して、セキュリティを監査します。
mysql --user=<root-user> -p<password> --skip-column-names -f < mysat.sql > MySAT.htm
-
示されているように、MySATは必要なテストを実行するためにMySQLへのルートアクセスを必要とします。コマンドを実行した後、MySAT.htmファイルが生成され、MySAT.htmファイルと
mysat.css
をコピーします。 ファイルをApacheまたはNGINXサーバーに送信するか、scp
を使用してローカルにダウンロードします 、監査の結果を分析できるようにします。 -
結果は読みやすく理解しやすい形式でフォーマットされ、構成がチェックされ、結果は現在の構成とそれがmysqlサーバーのセキュリティにどのように影響するかに基づいて色分けされます。たとえば、失敗した構成チェックはオレンジ色で色分けされ、合格したチェックは緑色で色分けされます。
-
監査レポートは、変更または変更する必要のある構成を明らかにし、MySQLサーバーの全体的なセキュリティのトップレベルの全体像を示します。