序章

LinuxおよびUnixライクなシステムで利用可能なSQLデータベース言語の多くの実装があります。 MySQLとMariaDBは、サーバー環境にリレーショナルデータベースをデプロイするための2つの一般的なオプションです。

ただし、ほとんどのソフトウェアと同様に、これらのツールは、正しく構成されていない場合、セキュリティ上の問題になる可能性があります。 このチュートリアルでは、MariaDBまたはMySQLデータベースを保護し、それらがVPSへの扉を開いていないことを確認するために実行できるいくつかの基本的な手順について説明します。

わかりやすく説明するために、Ubuntu12.04VPSインスタンスでMySQLサーバーを使用します。 ただし、これらの手法は他のLinuxディストリビューションにも適用でき、MariaDBでも使用できます。

初期設定

MySQLは、インストール中にセキュリティに向けた最初の一歩を踏み出す機会を提供します。 ルートパスワードの設定を求められます。

sudo apt-get install mysql-server
 ?????????????????????????? Configuring mysql-server-5.5 ???????????????????????????
 ? While not mandatory, it is highly recommended that you set a password for the   ? 
 ? MySQL administrative "root" user.                                               ? 
 ?                                                                                 ? 
 ? If this field is left blank, the password will not be changed.                  ? 
 ?                                                                                 ? 
 ? New password for the MySQL "root" user:                                         ? 
 ?                                                                                 ? 
 ? _______________________________________________________________________________ ? 
 ?                                                                                 ? 
 ?                                                                             ? 
 ?                                                                                 ? 
 ???????????????????????????????????????????????????????????????????????????????????

後でいつでもrootパスワードを設定できますが、この手順をスキップする理由はないため、最初から管理者アカウントを保護する必要があります。

インストールが完了したら、含まれているいくつかのスクリプトを実行する必要があります。 まず、「mysql_install_db」スクリプトを使用して、データベースのディレクトリレイアウトを作成します。

sudo mysql_install_db

次に、「mysql_secure_installation」というスクリプトを実行します。 これにより、実稼働環境で使用するのが危険なデフォルトを削除するいくつかの手順をガイドします。

sudo mysql_secure_installation

最初に、インストール中に設定したrootパスワードの入力を求められます。 直後に、rootパスワードを変更するかどうかから始まる一連の質問が表示されます。

まだ行っていない場合、これはパスワードを安全なものに変更するもう1つの機会です。

残りのすべての質問に「Y」(はい)と答える必要があります。

これにより、デフォルトで誰でもMySQLにログインできなくなり、管理者アカウントを使用してリモートでログインできなくなり、安全でないテストデータベースが削除され、実行中のMySQLインスタンスが更新されてこれらの変更が反映されます。

セキュリティに関する考慮事項

MySQL(および他のほとんどすべてのシステム)を保護するという包括的なテーマは、絶対に必要な場合にのみアクセスを許可する必要があるということです。 データの安全性は、利便性とセキュリティのバランスにつながる場合があります。

このガイドでは、セキュリティの側面に傾倒しますが、データベースソフトウェアの特定の使用法により、これらのオプションから選択することができます。

My.cnfファイルによるセキュリティ

MySQLのメイン構成ファイルは、Ubuntuの「/ etc /mysql/」ディレクトリと他のVPSの「/etc/」ディレクトリにある「my.cnf」というファイルです。

このファイルのいくつかの設定を変更して、MySQLインスタンスをロックダウンします。

root権限でファイルを開きます。 別のシステムでこのチュートリアルを実行している場合は、必要に応じてディレクトリパスを変更します。

sudo nano /etc/mysql/my.cnf

最初に確認する必要がある設定は、「[mysqld]」セクション内の「bind-address」設定です。 この設定は、ローカルループバックネットワークデバイス(「127.0.0.1」)に設定する必要があります。

bind-address = 127.0.0.1

これにより、MySQLがローカルマシン以外の場所からの接続を受け入れないようになります。

別のマシンからこのデータベースにアクセスする必要がある場合は、SSHを介して接続し、データベースのクエリと管理をローカルで実行し、結果をsshトンネルを介して送信することを検討してください。

次にパッチを当てる穴は、MySQL内から基盤となるファイルシステムにアクセスできるようにする関数です。 これはセキュリティに深刻な影響を与える可能性があるため、どうしても必要な場合を除いて、シャットオフする必要があります。

ファイルの同じセクションに、ローカルファイルをロードするこの機能を無効にするディレクティブを追加します。

local-infile=0

これにより、データベースへのファイルレベルの権限を持たないユーザーのファイルシステムからのファイルのロードが無効になります。

十分なスペースがあり、巨大なデータベースを運用していない場合は、疑わしいアクティビティを監視するために追加情報をログに記録すると役立つ場合があります。

ロギングが多すぎるとパフォーマンスが低下する可能性があるため、これは慎重に検討する必要があります。

追加したのと同じ「[mysqld]」セクション内でログ変数を設定できます。

log=/var/log/mysql-logfile

MySQLログ、エラーログ、およびmysqlログディレクトリが誰でも読み取れないことを確認してください。

sudo ls -l /var/log/mysql*
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.err
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.log

/var/log/mysql:
total 28
-rw-rw---- 1 mysql adm 20694 Jul 23 19:17 error.log

MySQLを内部から保護する

MySQLを使用してセキュリティを向上させる際に実行できる手順はいくつかあります。

このセクションのコマンドをMySQLプロンプトインターフェイスに入力するので、ログインする必要があります。

mysql -u root -p

以前に設定したrootパスワードの入力を求められます。

パスワードとホストの関連付けの保護

まず、MySQLにパスワードまたはホストの関連付けがないユーザーがいないことを確認します。

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         |                                           |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

ご覧のとおり、この設定例では、ユーザー「demo-user」にはパスワードがなく、使用しているホストに関係なく有効です。 これは非常に安全ではありません。

このコマンドでユーザーのパスワードを設定できます。 「newPassWord」を変更して、割り当てたいパスワードを反映させます。

UPDATE mysql.user SET Password=PASSWORD('newPassWord') WHERE User="demo-user";

Userテーブルをもう一度確認すると、デモユーザーがパスワードを持っていることがわかります。

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

「ホスト」フィールドを見ると、「%」がまだ残っていることがわかります。これは、任意のホストを意味するワイルドカードです。 これは私たちが望んでいることではありません。 これを「localhost」に変更しましょう。

UPDATE mysql.user SET Host='localhost' WHERE User="demo-user";

もう一度確認すると、Userテーブルに適切なフィールドが設定されていることがわかります。

SELECT User,Host,Password FROM mysql.user;

テーブルに空白のユーザーが含まれている場合(「mysql_secure_installation」を実行したため、この時点では必要ありませんが、とにかくこれをカバーします)、それらを削除する必要があります。

これを行うには、次の呼び出しを使用して、アクセステーブルから空白のユーザーを削除します。

DELETE FROM mysql.user WHERE User="";

Userテーブルの変更が完了したら、次のコマンドを入力して新しい権限を実装する必要があります。

FLUSH PRIVILEGES;

アプリケーション固有のユーザーの実装

Linux内で分離されたユーザーとしてプロセスを実行する方法と同様に、MySQLも同じ種類の分離の恩恵を受けます。

MySQLを使用する各アプリケーションには、制限された権限のみを持ち、実行する必要のあるデータベースにのみアクセスできる独自のユーザーが必要です。

MySQLを使用するように新しいアプリケーションを構成するときは、そのアプリケーションに必要なデータベースを作成する必要があります。

create database testDB;
Query OK, 1 row affected (0.00 sec)

次に、そのデータベースを管理するユーザーを作成し、必要な権限のみを割り当てる必要があります。 これはアプリケーションによって異なり、一部の用途では他の用途よりも多くのオープン権限が必要です。

新しいユーザーを作成するには、次のコマンドを使用します。

CREATE USER 'demo-user'@'localhost' IDENTIFIED BY 'password';

次のコマンドを使用して、新しいテーブルに対する新しいユーザー権限を付与できます。 特定の権限の詳細については、新しいユーザーを作成してMySQLで権限を付与する方法に関するチュートリアルを参照してください。

GRANT SELECT,UPDATE,DELETE ON testDB.* TO 'demo-user'@'localhost';

たとえば、後でアカウントから更新権限を取り消す必要がある場合は、次のコマンドを使用できます。

REVOKE UPDATE ON testDB.* FROM 'demo-user'@'localhost';

特定のデータベースに対するすべての特権が必要な場合は、次のように指定できます。

GRANT ALL ON testDB.* TO 'demo-user'@'localhost';

ユーザーの現在の特権を表示するには、最初に「flushprivileges」コマンドを使用して指定した特権を実装する必要があります。 次に、ユーザーが何を付与するかを照会できます。

FLUSH PRIVILEGES;
show grants for 'demo-user'@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for demo-user@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demo-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, UPDATE, DELETE ON `testDB`.* TO 'demo-user'@'localhost'                                            |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

変更が終了したら、必ず特権をフラッシュしてください。

ルートユーザーの変更

実行する可能性のある追加の手順の1つは、rootログイン名を変更することです。 攻撃者がルートMySQLログインにアクセスしようとしている場合、ユーザー名を見つける追加の手順を実行する必要があります。

ルートログインは、次のコマンドで変更できます。

rename user 'root'@'localhost' to 'newAdminUser'@'localhost';

ユーザーデータベースに使用していたのと同じクエリを使用して、変更を確認できます。

select user,host,password from mysql.user;

繰り返しますが、これらの変更を行うには、特権をフラッシュする必要があります。

FLUSH PRIVILEGES;

管理タスクを実行する場合は、今後、新しく作成されたユーザー名としてMySQLにログインする必要があることに注意してください。

mysql -u newAdminUser -p

結論

これはMySQLとMariaDBのセキュリティ慣行の完全なリストではありませんが、データベースを保護するときに行う必要のある決定の種類についての良い入門書になるはずです。

構成とセキュリティの詳細については、MySQLとMariaDBのWebサイト、およびそれぞれのマニュアルページを参照してください。 使用することを選択したアプリケーションは、セキュリティに関するアドバイスも提供する場合があります。

ジャスティン・エリングウッド