MySQL セキュリティ ガイド
著者:
Yanzi
MySQL システム管理者として、あなたは MySQL データベース システムのデータ セキュリティと整合性を維持する責任があります。この記事では、安全な MySQL システムの構築方法を中心に、内部システムと外部ネットワークの両方の観点からガイドを提供します。
この記事では、主に次のセキュリティ関連の問題について検討します:
セキュリティはなぜ重要ですか?どのような攻撃から防御する必要がありますか?
サーバーが直面するリスク (内部セキュリティ)、それにどう対処するか?
クライアントがサーバーに接続するリスク (外部セキュリティ)、それにどう対処するか?
MySQL 管理者は、正しく許可されたユーザーのみがこれらのデータ レコードにアクセスできるように、データベース コンテンツのセキュリティを確保する責任があります。これには、データベース システムの内部セキュリティと外部セキュリティが関係します。
内部セキュリティは、ファイル システム レベルの問題、つまり、サーバー ホスト上のアカウント (正規のアカウントまたは盗難されたアカウント) を持つユーザーによる MySQL データ ディレクトリ (DATADIR) の攻撃の防止に関係します。データ ディレクトリの内容が過剰に許可されているため、誰もがそれらのデータベース テーブルに対応するファイルを簡単に置き換えることができる場合、ネットワーク経由でのクライアント アクセスを制御する認証テーブルが正しく設定されていることを確認しても意味がありません。
外部セキュリティは、ネットワークを介して外部からサーバーに接続するクライアントの問題、つまり、ネットワークを介したサーバーへの接続から来る攻撃から MySQL サーバーを保護することに関係します。 MySQL グラント テーブル (グラント) を設定する必要があります。
テーブル)、有効なユーザー名とパスワードが提供されない限り、サーバー管理データベースの内容にアクセスすることを禁止します。
以下では、MySQL の 2 段階のセキュリティを実現するためのファイル システムと認可テーブル mysql の設定方法を詳しく紹介します。
1. 内部セキュリティ - データ ディレクトリ アクセスのセキュリティを確保します
MySQL サーバーは、MySQL データベース内の認証テーブルを通じて柔軟な権限システムを提供します。これらのテーブルの内容を設定して、データベースへのクライアント アクセスを許可または拒否できます。これにより、ホスト上の他のユーザーがデータベースの内容に直接アクセスできる場合でも、不正なネットワーク アクセスによる攻撃を防ぐことができます。データ ディレクトリでは、ネットワーク経由のデータベース アクセスに適切なセキュリティを確立しても、MySQL サーバーが実行されているホスト マシンにログインしているユーザーが自分だけであることがわかっていて、他のユーザーがログインしている可能性を考慮する必要がない限り役に立ちません。このマシン上でデータ ディレクトリへのアクセスを取得します。
保護すべきものは次のとおりです:
データベース ファイル。サーバー管理データベースのプライバシーを維持したいのは明らかです。データベース所有者は通常、データベース コンテンツのセキュリティについて、たとえ望んでいない場合でも考慮する必要があり、不十分なデータ ディレクトリ セキュリティを通じてデータベース コンテンツを公開するのではなく、データベース コンテンツを公開することを検討する必要があります。
ログファイル。一般ログと変更ログにはクエリ テキストが含まれるため、安全に保管する必要があります。ログ ファイルにアクセスできる人は誰でも、データベース上で実行される操作を監視できます。
より重要に考慮すべきログファイルのセキュリティはGRANTやSETなど
PASSWord などのクエリもログに記録され、通常、更新ログにはパスワードを含む機密クエリのテキストが含まれます (MySQL はパスワード暗号化を使用しますが、パスワードが設定されるまではその後の接続確立には適用されません。パスワードを設定するプロセスはGRANT または SET のように設計されています
PASSWORD およびその他のクエリ。これらのクエリはログ ファイルにプレーン テキストで記録されます。攻撃者がファイルへの読み取りアクセスを取得した場合、ログ ファイルに対して grep を実行するだけで GRANT や PASSWORD などの単語を検索し、機密情報を発見することができます。
明らかに、サーバー ホスト上の他のユーザーにデータベース ディレクトリ ファイルへの書き込み権限を与えたくないのは、状態ファイルやデータベース テーブル ファイルが上書きされる可能性があるためですが、読み取り権限も危険です。データベース テーブル ファイルが読み取れる場合、そのファイルを盗んで MySQL 自体にアクセスしてテーブルの内容をプレーン テキストで表示するのは面倒です。なぜでしょうか。次のことを行う必要があるためです:
独自の「特別な」MySQL サーバーをサーバー ホストにインストールしますが、公式サーバー バージョンとは異なるポート、ソケット、データ ディレクトリを使用します。
mysql_install_db を実行してデータ ディレクトリを初期化し、MySQL の役割を与えます
root ユーザーはサーバーにアクセスできるため、サーバー アクセス メカニズムを完全に制御でき、テスト データベースも作成されます。
盗みたいテーブルファイルに対応するテーブルファイルを、サーバーのデータベースディレクトリ下のtestディレクトリにコピーします。
サーバーを起動します。データベーステーブルには自由にアクセスできます。SHOW TABLES FROM
test は盗まれたテーブルのコピーがあることを示し、SELECT * はそれらのいずれかの内容全体を示します。
本当に悪意がある場合は、サーバー上の匿名ユーザーにアクセス許可を公開して、誰でもどこからでもサーバーに接続してテスト データベースにアクセスできるようにします。これで、盗まれたデータベーステーブルが公開されました。
逆の視点で考えてみて、あなたは他人にこうしてもらいたいですか?もちろん違います! lsを実行するとデータベースにログインできます。
-l コマンドは、データベースに安全でないファイルやディレクトリが含まれているかどうかを判断します。 「グループ」および「その他のユーザー」権限が設定されているファイルとディレクトリを探します。以下は、安全でないデータ ディレクトリの部分的なリストです:
%
ls -l
合計 10148
drwxrwxr-x 11 mysqladm ホイール 1024 5 月 8 日 12:20
.
drwxr-xr-x 22 ルートホイール 512 5 月 8 日 13:31
..
drwx------ 2 mysqladm mysqlgrp 512 4月16日 15:57
menagerie
drwxrwxr-x 2 mysqladm ホイール 512 1月25日 20:40
mysql
drwxrwxr-x 7 mysqladm ホイール 512 1998 年 8 月 31 日
sql-bench
drwxrwxr-x 2 mysqladm ホイール 1536 5 月 6 日 06:11
テスト
drwx------ 2 mysqladm mysqlgrp 1024 5月8日 18:43
tmp
....
ご覧のとおり、一部のデータベースには正しい権限がありますが、その他のデータベースには正しい権限がありません。この例の状況は、一定期間後の結果です。新しいバージョンよりも権限設定の制限が緩い古いサーバーでは、より制限の少ない権限が設定されます (より制限の厳しいディレクトリ menageria と tmp の日付はどちらも新しいものであることに注意してください)。 MySQL の現在のバージョンでは、サーバーを実行しているユーザーのみがこれらのファイルを読み取ることができます。
サーバーユーザーのみがアクセスできるようにこれらの権限を修正しましょう。主な保護ツールは、ファイルとディレクトリの所有権とモードを設定するために UNIX ファイル システム自体によって提供されるツールから得られます。私たちがしなければならないことは次のとおりです:
ディレクトリに移動します
%
CD
DATADIR
データ ディレクトリ内のすべてのファイルの所有権を、サーバーの実行に使用されるアカウントが所有するように設定します (この手順を実行するには root である必要があります)。この記事では、アカウントのユーザー名とグループ名として mysqladm と mysqlgrp を使用します。次のコマンドのいずれかを使用して所有者を変更できます:
#
chown mysqladm.mysqlgrp .
# find . -follow -type d -print chown |
mysqladm.mysqlgrp
データ ディレクトリとデータベース ディレクトリのモードを設定して、mysqladm のみが読み取れるようにします。これにより、他のユーザーがデータベース ディレクトリの内容にアクセスできなくなります。次のコマンドのいずれかを使用して、root または mysqladm として実行できます。
%
chmod -R go-rwx .
% find . -follow -type d -print chmod |
go-rwx
data ディレクトリの内容の所有者とモードは mysqladm に設定されます。ここで、データベース ディレクトリにアクセスできる唯一のユーザー (root を除く) が mysqladm ユーザーとして常にサーバーを実行していることを確認する必要があります。
これらの設定を完了すると、データ ディレクトリのアクセス許可は次のようになります:
% ls -l
total
10148
drwxrwx--- 11 mysqladm mysqlgrp 1024 5 月 8 日 12:20
.
drwxr-xr-x 22 ルート ホイール 512 5 月 8 日 13:31
..
drwx------ 2 mysqladm mysqlgrp 512 4月16日 15:57
menagerie
drwx------ 2 mysqladm mysqlgrp 512 1月25日 20:40
mysql
drwx-----7 mysqladm mysqlgrp 512 1998 年 8 月 31 日
sql-bench
drwx------ 2 mysqladm mysqlgrp 1536 5 月 6 日 06:11
テスト
drwx------ 2 mysqladm mysqlgrp 1024 5月8日 18:43
tmp
....
2. 外部セキュリティ - ネットワーク アクセスのセキュリティの確保
MySQL のセキュリティ システムは非常に柔軟で、さまざまな方法でユーザーの権限を設定できます。通常、これは標準 SQL GRANT および REVOKE ステートメントを使用して実行できます。これらのステートメントは、クライアント アクセスを制御する付与テーブルを変更します。ただし、サポートされていない古いバージョンの MySQL (3.22.11 より前) が使用できない可能性があります。これらのステートメントは機能しません)、またはユーザー権限が希望どおりに機能しないことがわかります。この状況では、MySQL 認可テーブルの構造と、サーバーがそれらを使用してアクセス許可を決定する方法を理解しておくと、認可テーブルを直接変更することによってユーザー許可を追加、削除、または変更できるようになります。権限の問題を診断するときにこれらのテーブルを検査できます。
ユーザー アカウントの管理方法については、「MySQL ユーザー管理」を参照してください。 GRANT および REVOKE ステートメントの詳細については、「MySQL リファレンス マニュアル」を参照してください。
2.1
MySQL 認可テーブルの構造と内容
ネットワーク経由でサーバーに接続されているクライアントによる MySQL データベースへのアクセスは、認可テーブルの内容によって制御されます。これらのテーブルは mysql データベース内にあり、MySQL の最初のインストール (mysql_install_db スクリプトの実行) 中に初期化されます。 user、db、host、tables_priv、columns_priv の 5 つの認可テーブルがあります。
表1
ユーザー、DB、およびホストの認可テーブル構造
アクセス範囲列
user db host
Host Host Host
User Db
DB
パスワード ユーザー
データベース/テーブル権限列
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Delete_priv 削除_priv 削除_priv
Drop_priv Drop_priv Drop_priv
Index_priv Index_priv Index_priv
Insert_priv Insert_priv Insert_priv
References_priv References_priv
References_priv
Select_priv Select_priv Select_priv
Update_priv
Update_priv Update_priv
File_priv Grant_priv Grant_priv
Grant_priv
Process_priv
Reload_priv
Shutdown_priv
表 2 tables_priv と columns_priv の所有権テーブルの構造
アクセス範囲の列
tables_priv columns_priv
ホスト ホスト
Db Db
ユーザー ユーザー
Table_name Table_name
Column_name
権限列
Table_priv Column_priv
認可テーブルの内容は、次の目的に役立ちます:
ユーザー テーブル
ユーザー テーブルには、サーバーに接続できるユーザーとそのパスワードがリストされ、ユーザーがどのようなグローバル (スーパーユーザー) 権限を持っているかが指定されます。ユーザーテーブルで有効になっている権限はすべてグローバル権限であり、すべてのデータベースに適用されます。たとえば、DELETE 権限を有効にすると、ここにリストされているユーザーは任意のテーブルからレコードを削除できるため、これを行う前に慎重に検討してください。
db テーブル
db テーブルにはデータベースがリストされ、ユーザーはデータベースにアクセスする権限を持ちます。ここで指定した権限は、データベース内のすべてのテーブルに適用されます。
ホスト テーブル
ホスト テーブルは、データベースに対する特定のホストのアクセス権をより適切なレベルで制御するために、db テーブルと組み合わせて使用されます。これは、db を単独で使用するよりも優れている場合があります。このテーブルは GRANT および REVOKE ステートメントの影響を受けないため、まったく使用していないことがわかるかもしれません。
tables_priv table
tables_priv テーブルは、テーブルレベルの権限を指定します。ここで指定した権限は、テーブルのすべての列に適用されます。
columns_priv テーブル
columns_priv テーブルは列レベルの権限を指定します。ここで指定した権限は、テーブルの特定の列に適用されます。
「GRANT を使用しないユーザーの設定」セクションでは、これらのテーブルを変更するために GRANT ステートメントがどのように機能するか、また認可テーブルを直接変更することで同じ効果を達成する方法について説明します。 MySQL の
tables_priv テーブルと columns_priv テーブル
バージョン 3.22.11 で導入されました (GRANT ステートメントと同時に)。古いバージョンの MySQL を使用している場合、mysql データベースには user、db、および host テーブルのみが含まれます。古いバージョンから 3.22.11 以降にアップグレードし、tables_priv テーブルと columns_priv テーブルがない場合は、mysql_fix_privileges_tables スクリプトを実行して作成します。
MySQL には rows_priv テーブルがありません。これは、レコードレベルの権限を提供していないため、テーブル内の特定の列値を含む行にユーザーを制限することができません。この機能が本当に必要な場合は、アプリケーション プログラミングを使用して提供する必要があります。推奨されるレコードレベルのロックを実行したい場合は、GET_LOCK() 関数を使用して実行できます。
権限テーブルには、権限がいつ適用されるかを決定するスコープ列と、どの権限が付与されるかを決定する権限列の 2 種類の列が含まれています。
2.1.1
認可テーブルのスコープ列
認可テーブルのスコープ列は、テーブル内の権限がいつ適用されるかを指定します。認可テーブルの各エントリには、特定のホストからの特定のユーザーの接続にいつ権限を適用するかを指定するためのユーザー列とホスト列が含まれています。他のテーブルには追加の範囲列が含まれています。たとえば、権限が適用されるデータベースを示す Db 列を含む db テーブルなどです。同様に、tables_priv テーブルと columns_priv テーブルには、データベース内の特定のテーブルまたはテーブルの特定の列に範囲を狭める範囲フィールドが含まれています。
2.1.2
認可テーブルの権限列
認可テーブルには、スコープ列で指定されたユーザーが持つ権限を示す権限列も含まれています。 MySQL でサポートされる権限を次の表に示します。この表では、GRANT ステートメントの権限名が使用されています。 user、db、および host テーブル内のほとんどの権限列名の場合、GRANT ステートメント内の名前の間には明らかな関連性があります。たとえば、Select_priv は SELECT 権限に対応します。
上記は MySQL セキュリティ ガイド (1) (再版) の内容です。その他の関連記事については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。