MySQL インストールプロセスの一環として、付与テーブルを含む mysql
データベースを設定します。
Windows 配布は事前に初期化された付与テーブルを含みます。
Unix では、mysql_install_db プログラムが付与テーブルに移入します。一部のインストール方法ではこのプログラムは自動的に実行されます。その他では、手動でそれを実行する必要があります。詳細については、セクション2.10.1「Unix 類似システムでのインストール後の手順」を参照してください。
mysql.user
付与テーブルは、初期 MySQL ユーザーアカウントとそのアクセス権限を定義します。
-
いくつかのアカウントはユーザー名が
root
です。これらは、すべての権限を持ち、どのようなことも可能なスーパーユーザーアカウントです。root
アカウントの初期パスワードは空です。そのため、だれでもパスワードなしでroot
として MySQL Server に接続して、すべての権限を付与されることができます。Windows では、ローカルホストからの接続のみを許可する
root
アカウントが作成されます。ホスト名localhost
、IP アドレス127.0.0.1
、または IPv6 アドレス::1
を指定することで接続できます。ユーザーが、インストール中に「Enable root access from remote machines」オプションを選択した場合は、Windows インストーラは、に荷のホストからの接続を許可する別のroot
アカウントを作成します。Unix では、各
root
アカウントはローカルホストからの接続を許可します。ホスト名localhost
、IP アドレス127.0.0.1
、または IPv6 アドレス::1
、あるいは実際のホスト名または IP アドレスを指定することで接続できます。
ホスト
127.0.0.1
への接続を試みると、通常localhost
アカウントに解決します。ただし、サーバーが--skip-name-resolve
オプションを使用して稼働されている場合は、これは失敗します。そのため、その場合には127.0.0.1
アカウントが便利です。::1
アカウントは IPv6 接続に使用されます。 -
一部のアカウントは匿名ユーザー用です。これらは空のユーザー名を持ちます。匿名のアカウントにはパスワードがないため、だれでもそのアカウントを使用して MySQL サーバーに接続できます。
Windows では、ローカルホストからの接続を許可する匿名アカウントが 1 つあります。
localhost
のホスト名を指定することで接続できます。Unix では、各匿名アカウントはローカルホストからの接続を許可します。アカウントの 1 つのホスト名
localhost
を指定するか、その他のアカウントの実際のホスト名または IP アドレスを指定することで接続できます。
mysql.user
テーブルにどのアカウントが存在するか、それらのパスワードが空かどうかを表示するには、次のステートメントを使用します。
mysql> SELECT User, Host, Password FROM mysql.user;
+------+--------------------+----------+
| User | Host | Password |
+------+--------------------+----------+
| root | localhost | |
| root | myhost.example.com | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | myhost.example.com | |
+------+--------------------+----------+
この出力は、いくつかの root
アカウントと匿名ユーザーアカウントがあり、いずれにもパスワードがないことを示しています。使用しているシステムでは出力が異なる場合がありますが、空のパスワードのアカウントが存在するということは、何らかの対処をするまで MySQL インストールが保護されていないということを意味します。
それぞれの MySQL
root
アカウントにパスワードを割り当てるべきです。クライアントが匿名ユーザーとしてパスワードなしで接続することを防ぐには、それぞれの匿名のアカウントにパスワードを割り当てるか、あるいはそれらのアカウントを削除するとよいでしょう。
さらに、mysql.db
テーブルにはすべてのアカウントが test
データベースおよび test_
で始まる名前を持つその他のデータベースにアクセスすることを許可する行が含まれます。これは、デフォルトの匿名アカウントのように、そうでなければ特別な権限を持たないアカウントにも当てはまります。これはテスト用には便利ですが、本番サーバーでは推奨されません。データベースへのアクセスを、その目的のために明示的に許可を付与されたアカウントのみに制限する場合は、管理者は mysql.db
テーブルのこれらの行を削除するとよいでしょう。
次の手順では、初期 MySQL アカウントにパスワードを設定する方法を、最初に root
アカウント、次に匿名アカウントの順で説明します。この手順では、匿名アクセスをまったく許可しない場合に、匿名アカウントを削除する方法にも触れ、データベースをテストするための寛容なアクセスを削除する方法も説明します。例の中の newpwd
は使用するパスワードに置き換えてください。host_name
はサーバーのホスト名に置き換えます。この名前は、前述の SELECT
ステートメントの出力から判断できます。示された出力では、host_name
は myhost.example.com
です。
パスワード設定の詳細は、セクション6.3.5「アカウントパスワードの割り当て」を参照してください。root
パスワードを設定したあとでそれを忘れた場合は、セクションB.5.4.1「root のパスワードをリセットする方法」を参照してください。
追加のセットアップやテストを実行する間、パスワードを指定する必要を避けるために、パスワードの設定を遅らせたい場合があります。しかし、インストールを本番用に使用する前にはそれらを忘れずに設定してください。
追加のアカウントをセットアップするには、セクション6.3.2「ユーザーアカウントの追加」を参照してください。
root アカウントのパスワードの割り当て
root
アカウントのパスワードは、いくつかの方法でセットできます。次の説明では 3 種類の方法を示します。
SET PASSWORD
ステートメントを使用するUPDATE
ステートメントを使用するmysqladmin コマンド行のクライアントプログラムを使用する
SET PASSWORD
を使用してパスワードを割り当てるには、サーバーに root
として接続し、SET PASSWORD
ステートメントを、mysql.user
テーブルにリストされている各 root
アカウントに対して発行します。PASSWORD()
関数を使用してパスワードを忘れずに暗号化します。
Windows では、次のようにします。
shell> mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'::1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'%' = PASSWORD('newpwd');
mysql.user
テーブルに、ホスト値が %
である root
アカウントがない場合は、最後のステートメントは不要です。
Unix では、次のようにします。
shell> mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'::1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'host_name' = PASSWORD('newpwd');
UPDATE
を使用して mysql.user
テーブルを直接変更することで、すべての root
アカウントにパスワードを割り当てる単独のステートメントを使用することもできます。この方法はどのプラットフォームでも機能します。
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
-> WHERE User = 'root';
mysql> FLUSH PRIVILEGES;
FLUSH
ステートメントにより、サーバーが付与テーブルを再度読み取ります。それがないと、パスワードの変更はサーバーを再起動するまでサーバーには認識されません。
パスワードを root
アカウントに mysqladmin を使用して割り当てるには、次のコマンドを実行します。
shell> mysqladmin -u root password "newpwd"
shell> mysqladmin -u root -h host_name password "newpwd"
これらのコマンドは Windows および Unix の両方に該当します。パスワードを囲む二重引用符は必ずしも常に必要なわけではありませんが、パスワードにスペースその他のコマンドインタプリタにとって特殊な文字が含まれる場合は使用するべきです。
mysqladmin を使用して root
アカウントのパスワードを設定する方法は、'root'@'127.0.0.1'
or 'root'@'::1'
アカウントでは機能しません。前述の SET PASSWORD
の方法を使用します。
root
の設定後は、root
としてサーバーに接続するたびに適切なパスワードを提供する必要があります。たとえば、mysqladmin でサーバーをシャットダウンするには、次のコマンドを使用します。
shell> mysqladmin -u root -p shutdown
Enter password: (enter root password here)
匿名アカウントのパスワードの割り当て
次の手順の mysql コマンドは、前述の手順を使用して root
のパスワードを設定し、サーバーへの接続時にそのパスワードを指定しなければならないことを前提として、-p
オプションを含んでいます。
匿名アカウントにパスワードを割り当てるには、サーバーに root
として接続してから、SET PASSWORD
または UPDATE
を使用します。PASSWORD()
関数を使用してパスワードを忘れずに暗号化します。
Windows で SET PASSWORD
を使用するには、次のようにします。
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
Unix で SET PASSWORD
を使用するには、次のようにします。
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR ''@'host_name' = PASSWORD('newpwd');
単独の UPDATE
ステートメントで匿名ユーザーアカウントのパスワードを設定するには、次のようにします (任意のプラットフォームで)。
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
-> WHERE User = '';
mysql> FLUSH PRIVILEGES;
FLUSH
ステートメントにより、サーバーが付与テーブルを再度読み取ります。それがないと、パスワードの変更はサーバーを再起動するまでサーバーには認識されません。
匿名アカウントの削除
匿名アカウントにパスワードを割り当てるのではなく、削除する場合は、Windows では次のようにします。
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DROP USER ''@'localhost';
Unix では、次のように匿名アカウントを削除します。
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DROP USER ''@'localhost';
mysql> DROP USER ''@'host_name';
テストデータベースのセキュリティー設定
デフォルトでは、mysql.db
テーブルには任意のユーザーによる test
データベースおよび test_
で始まる名前を持つその他のデータベースへのアクセスを許可する行が含まれます。(これらの行は空の User
カラム値を持ち、アクセスチェックのために任意のユーザー名に一致します。)これは、そうでなければ何の権限も持たないアカウントでさえも、このようなデータベースを使用できることを意味します。テストデータベースへの任意のユーザーによるアクセスを削除する場合は、次のようにします。
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';
mysql> FLUSH PRIVILEGES;
FLUSH
ステートメントにより、サーバーが付与テーブルを再度読み取ります。それがないと、権限の変更はサーバーを再起動するまでサーバーには認識されません。
前述の変更により、グローバルデータベース権限、または test
データベース用に明示的に付与された権限を持つユーザーのみがそれを使用できます。ただし、データベースがまったく不要である場合は、ドロップします。
mysql> DROP DATABASE test;
Windows では、MySQL Installer (セクション2.3.3「MySQL Installer を使用した MySQL の Microsoft Windows へのインストール」を参照してください) でのインストール中に、このセクションで説明した手順を実行することもできます。すべてのプラットフォームで、MySQL 配布には、MySQL インストールをセキュアにするプロセスの大部分を自動化するコマンド行ユーティリティー mysql_secure_installation が含まれます。また、MySQL Workbench はすべてのプラットフォームで使用可能で、ユーザーアカウントの管理機能も提供します (第26章「MySQL Workbench」を参照してください)。