MySQL は、完全にネットワーク化されたクロスプラットフォームのリレーショナル データベース システムであり、クライアント/サーバー アーキテクチャを備えた分散データベース管理システムです。 MySQL は、完全にネットワーク化されたクロスプラットフォームのリレーショナル データベース システムであり、クライアント/サーバー アーキテクチャを備えた分散データベース管理システムです。強力な機能、使いやすさ、便利な管理、高速な実行速度、強力なセキュリティと信頼性という利点があり、ユーザーは多くの言語を使用して MySQL データベースにアクセスするプログラムを作成でき、特に PHP と組み合わせた場合に便利です。黄金の組み合わせで広く使用されています。
MySQL はマルチプラットフォームデータベースであるため、デフォルト設定はさまざまな状況に適用できるように考慮する必要があるため、独自の使用環境でさらなるセキュリティ強化を行う必要があります。 MySQL システム管理者として、私たちは MySQL データベース システムのデータ セキュリティと整合性を維持する責任があります。
MySQL データベースのセキュリティ構成は、内部システム セキュリティと外部ネットワーク セキュリティの 2 つの側面から開始する必要があります。また、プログラミング時に注意すべきいくつかの問題とヒントも簡単に紹介します。
システム内部セキュリティ
まず、MySQL データベースのディレクトリ構造を簡単に紹介します。 MySQL のインストール後、mysql_db_install スクリプトの実行後にデータ ディレクトリとデータベースが初期化されます。 MySQL ソース コード パッケージを使用してインストールし、インストール ディレクトリが /usr/local/mysql である場合、データ ディレクトリは通常 /usr/local/mysql/var になります。データベース システムは一連のデータベースで構成され、各データベースには一連のデータベース テーブルが含まれます。 MySQL はデータベース名を使用してデータ ディレクトリにデータベース ディレクトリを作成し、各データベース テーブルはデータベース テーブル名をファイル名として使用し、拡張子 MYD、MYI、および frm を持つ 3 つのファイルがデータベース ディレクトリに配置されます。
MySQL の認証テーブルはデータベース アクセスに対する柔軟な権限制御を提供しますが、ローカル ユーザーがライブラリ ファイルへの読み取り権限を持っている場合、攻撃者はデータベース ディレクトリをパッケージ化してコピーし、それを自分のデータ ディレクトリにコピーするだけで、盗まれたデータ ディレクトリにアクセスできます。データベース。したがって、MySQL が配置されているホストのセキュリティが最も重要な問題になります。ホストが安全でなく、攻撃者によって制御されていない場合、MySQL のセキュリティについて議論することはできません。 2 つ目は、データ ディレクトリとデータ ファイルのセキュリティ、つまりアクセス許可の設定の問題です。
MySQL メイン サイトの古いバイナリ リリースから判断すると、バージョン 3.21.xx のデータ ディレクトリの属性は 775 であり、ローカル ユーザーであれば誰でもデータ ディレクトリを読み取ることができるため、データベース ファイルは非常に危険です。バージョン 3.22.xx のデータ ディレクトリの属性は 770 です。この属性も、同じグループ内のローカル ユーザーは読み取りと書き込みの両方ができるため、データ ファイルは安全ではありません。バージョン 3.23.xx のデータ ディレクトリの属性は 700 であり、データベースを起動したユーザーのみがデータベース ファイルを読み書きできるため、ローカル データ ファイルのセキュリティが確保されます。
MySQL データベースを起動するユーザーが mysql の場合、次のディレクトリとファイルは安全です。データ ディレクトリと次の属性に注意してください。
シェル>ls -l /usr/local/mysql
合計40
drwxrwxr-x 2 ルート ルート 4096 2 月 27 日 20:07 ビン
drwxrwxr-x 3 ルート ルート 4096 2 月 27 日 20:07 を含む
drwxrwxr-x 2 ルート ルート 4096 2 月 27 日 20:07 情報
drwxrwxr-x 3 ルート ルート 4096 2 月 27 日 20:07 ライブラリ
drwxrwxr-x 2 ルート ルート 4096 2 月 27 日 20:07 libexec
drwxrwxr-x 3 ルート ルート 4096 2月27日 20:07 男
drwxrwxr-x 6 ルート ルート 4096 2月 27 日 20:07 mysql-test
drwxrwxr-x 3 ルート ルート 4096 2月27日 20:07 シェア
drwxrwxr-x 7 ルート root 4096 2月27日 20:07 sql-bench
drwx------ 4 mysql mysql 4096 2月27日 20:07 var
シェル>ls -l /usr/local/mysql/var
合計8
drwx------ 2 mysql mysql 4096 2月27日 20:08 mysql
drwx------ 2 mysql mysql 4096 2月27日 20:08 テスト
シェル>ls -l /usr/local/mysql/var/mysql
合計104
-rw------ 1 mysql mysql 0 2月27日 20:08 columns_priv.MYD
-rw------ 1 mysql mysql 1024 2月27日 20:08 columns_priv.MYI
-rw------ 1 mysql mysql 8778 2月27日 20:08 columns_priv.frm
-rw------ 1 mysql mysql 302 2月27日 20:08 db.MYD
-rw------ 1 mysql mysql 3072 2月27日 20:08 db.MYI
-rw------ 1 mysql mysql 8982 2月27日 20:08 db.frm
-rw------ 1 mysql mysql 0 2月27日 20:08 func.MYD
-rw------ 1 mysql mysql 1024 2月27日 20:08 func.MYI
-rw------ 1 mysql mysql 8641 2月27日 20:08 func.frm
-rw------ 1 mysql mysql 0 2月27日 20:08 host.MYD
-rw------ 1 mysql mysql 1024 2月27日 20:08 host.MYI
-rw------ 1 mysql mysql 8958 2月27日 20:08 host.frm
-rw------ 1 mysql mysql 0 2月27日 20:08 tables_priv.MYD
-rw------ 1 mysql mysql 1024 2月27日 20:08 tables_priv.MYI
-rw------ 1 mysql mysql 8877 2月27日 20:08 tables_priv.frm
-rw------ 1 mysql mysql 428 2月27日 20:08 user.MYD
-rw------ 1 mysql mysql 2048 2月 27 20:08 user.MYI
-rw------ 1 mysql mysql 9148 2月27日 20:08 user.frm
これらのファイルの所有者と属性がこのようでない場合は、次の 2 つのコマンドを使用して修正してください。
シェル>chown -R mysql.mysql /usr/local/mysql/var
シェル>chmod -R go-rwx /usr/local/mysql/var
root ユーザーを使用してリモート サービスを開始することは、常にセキュリティ上のタブーでした。サービス プログラムに問題がある場合、リモートの攻撃者がホストの完全な制御を取得する可能性が非常に高いためです。 MySQL はバージョン 3.23.15 以降、マイナーな変更を加えています。デフォルトでは、サービスはインストール後に mysql ユーザーによって開始される必要があり、root ユーザーによる開始は許可されません。 root ユーザーを使用して起動する必要がある場合は、--user=root パラメーター (./safe_mysqld --user=root &) を追加する必要があります。 MySQL には LOAD DATA INFILE と SELECT... INTO OUTFILE という SQL ステートメントがあるため、root ユーザーが MySQL サーバーを起動すると、データベース ユーザーは root ユーザーの書き込み権限を持ちます。ただし、MySQL には依然としていくつかの制限があります。たとえば、LOAD DATA INFILE はグローバルに読み取り可能なファイルのみを読み取ることができ、SELECT... INTO OUTFILE は既存のファイルを上書きできません。
シェル ログや MySQL 自体のログなど、ローカル ログ ファイルは無視できません。ローカルでログインするときやデータベースをバックアップするときに便利なように、一部のユーザーは次のようにコマンド ライン パラメータにデータベース パスワードを直接含めることがあります。
シェル>/usr/local/mysql/bin/mysqldump -uroot -ptest テスト>test.sql
シェル>/usr/local/mysql/bin/mysql -uroot -ptest
これらのコマンドはシェルによって履歴ファイルに記録されます。たとえば、bash はユーザー ディレクトリに .bash_history ファイルを書き込みます。これらのファイルが誤って読み取られると、データベースのパスワードが漏洩します。ユーザーがデータベースにログインした後に実行された SQL コマンドも、MySQL によってユーザー ディレクトリの .mysql_history ファイルに記録されます。データベース ユーザーが SQL ステートメントを使用してデータベース パスワードを変更すると、そのパスワードも .mysql_history ファイルを通じて漏洩します。したがって、シェルのログインおよびバックアップ中に -p の直後にパスワードを追加するのではなく、プロンプトの後にデータベースのパスワードを入力する必要があります。
また、念のため、これら 2 つのファイルに操作を記録させないでください。
シェル>rm .bash_history .mysql_history
シェル>ln -s /dev/null .bash_history
シェル>ln -s /dev/null .mysql_history
これら 2 つのコマンドは、これら 2 つのファイルを /dev/null にリンクするため、操作はこれら 2 つのファイルには記録されません。
外部ネットワークセキュリティ
MySQL データベースがインストールされると、Unix プラットフォーム上のユーザー テーブルは次のようになります。
mysql> mysql を使用します。
データベースが変更されました
mysql> ユーザーからホスト、ユーザー、パスワード、Select_priv、Grant_priv を選択します。
+-----------+------+----------+---------------+----- -------+
| ホストのパスワード |
+-----------+------+----------+---------------+----- -------+
| ローカルホスト |
| レッドハット |
| ローカルホスト |
| レッドハット |
+-----------+------+----------+---------------+----- -------+
4 行セット (0.00 秒)
Windows プラットフォームのユーザー テーブルは次のようになります。
mysql> mysql を使用します。
データベースが変更されました
mysql> ユーザーからホスト、ユーザー、パスワード、Select_priv、Grant_priv を選択します。
+-----------+------+----------+---------------+----- -------+
| ホストのパスワード |
+-----------+------+----------+---------------+----- -------+
| ローカルホスト |
| % Y |
| ローカルホスト |
| | | |
+-----------+------+----------+---------------+----- -------+
4 行セット (0.00 秒)
まず、Unix プラットフォームのユーザー テーブルを見てみましょう。このうち、redhat は私のテスト マシンのマシン名にすぎません。実際、Unix プラットフォーム上の MySQL では、デフォルトでこのマシンのみがデータベースに接続できます。ただし、デフォルトの root ユーザーのパスワードは空であるため、root ユーザーにパスワードを追加することが最優先事項です。データベース ユーザーにパスワードを追加するには、次の 3 つの方法があります。
1) シェル プロンプトで mysqladmin コマンドを使用して、root ユーザーのパスワードを変更します。
シェル>mysqladmin -uroot パスワードテスト
このようにして、MySQL データベースの root ユーザーのパスワードが test に変更されます。 (テストは一例であり、実際に使用するパスワードはそのような推測されやすい弱いパスワードを使用してはなりません)
2) セットパスワードを使用してパスワードを変更します。
mysql> root@localhost=password('test' ); のパスワードを設定します。
このとき、rootユーザーのパスワードをtestに変更します。
3) ユーザー テーブルの root ユーザー パスワードを直接変更します。
mysql> mysql を使用します。
mysql> update user set password=password('test') where user='root';
mysql> フラッシュ権限;
このようにして、MySQL データベースの root ユーザーのパスワードもテスト用に変更されました。最後のコマンドであるフラッシュ権限は、メモリ許可テーブルを強制的に更新することを意味します。それ以外の場合、この時点では、不正なユーザーは MySQL サーバーにアクセスするまで root ユーザーと空のパスワードを使用してログインすることもできます。が再開される。
ユーザーが空の匿名ユーザーも表示されますが、Unix プラットフォームでは権限がありませんが、セキュリティ上の理由から削除する必要があります。
mysql> user = ''; のユーザーから削除します。