| « PHP Screwを使ってPHPスクリプトを暗号化してみた | 入り組んだテーブルを書いてみようと思ったが… » |
mysqlのrootユーザについての補足
mysqlでは、同名のユーザでも、接続元が違えば、別ユーザとして扱われます。
例えば、先日のjail内にインストールしたmysqlサーバの場合で言うと、UNIXソケット用(通常、/tmp/mysql.sockでのMySQLクライアントのデフォルトの接続)の
- root@localhost
と、自己に振り当てられたIPアドレス用の
- root@'ホスト名'
という2つのrootユーザが作成されますが、それぞれは独立したユーザです。
mysql> SELECT User, Host FROM mysql.user; +----------+--------------+ | User | Host | +----------+--------------+ | | 192.168.0.20 | | root | 192.168.0.20 | | | localhost | | root | localhost | | wikiuser | 192.168.0.21 | +----------+--------------+ 5 rows in set (0.01 sec)
(なお、IPアドレスの部分は各自のホスト名に置き換えて読んで下さい)
前回は、それぞれのrootユーザにパスワードを設定して認証を設けました。でも、管理者権限のあるユーザが2つも存在するのは気持ち悪いと言う方もいるでしょう。ここでは、前回作成したmysqlにおけるrootユーザを一つにまとめる方法について、書いています。
Follow up:
データベース初期化前
初めて、databases/mysql41-serverをインストールし、最初に、
# /usr/local/etc/rc.d/mysql-server.sh start
を実行した際、
/usr/local/bin/mysql_install_db
が呼び出されて、データベースが初期化されます。
このコマンドスクリプトを最初に実行する前、
# hostname localhost
を実行して、一時的にサーバのホスト名を、localhostというホスト名に置き換えれば、別々なrootユーザの作成を防ぐ事が出来ます。
ただし、この場合、
ERROR: 1062 Duplicate entry 'localhost-root' for key 1 ERROR: 1062 Duplicate entry 'localhost-' for key 1
とデータベース初期化の際にエラーが表示されます。これは本来、
- root@'ホスト名'
が挿入されるべき箇所に、重複して
- root@localhost
が挿入されるからです。これは意図した動作でもあるので無視して構いません。
なお、データベースを初期化した後は、ホスト名は従来のものに戻して下さい。
jail内でホスト名が変更できない場合
標準では、jail環境内でもroot権限のユーザは、該当jail内のホスト名を変更する事が出来ます。しかし、ホスト環境側で、
security.jail.set_hostname_allowed: 0
が設定されていると、変更できません。
この場合、ホスト側で、
# sysctl security.jail.set_hostname_allowed=1
を実行した後、jail側でホスト名を変更してください(当然、この場合であれば、作業を終えた後、当該MIB変数を0に戻します)。
後から削除する場合
既にユーザが存在する場合は、通常通りデータベースから削除します(なお、以下の作業は全て、UNIXドメインのソケットからの接続です)。
mysql> SELECT User, Host FROM mysql.user; +----------+--------------+ | User | Host | +----------+--------------+ | | 192.168.0.20 | | root | 192.168.0.20 | | | localhost | | root | localhost | | wikiuser | 192.168.0.21 | +----------+--------------+ 5 rows in set (0.01 sec)
最初に権限を確認し、
mysql> SHOW GRANTS FOR root@192.168.0.20; +-------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@192.168.0.20 | +-------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0.20' IDENTIFIED BY PASSWORD '*3D385AFF23793C4C99FA8D22C5B9A823BD181A4F' WITH GRANT OPTION | +-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.02 sec)
全権限を取り上げます。
mysql> REVOKE ALL ON *.* FROM root@192.168.0.20 Query OK, 0 rows affected (0.01 sec)
再度確認すると、
mysql> SHOW GRANTS FOR root@192.168.0.20; +----------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@192.168.0.20 | +----------------------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'root'@'192.168.0.20' IDENTIFIED BY PASSWORD '*3D385AFF23793C4C99FA8D22C5B9A823BD181A4F' WITH GRANT OPTION | +----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
とUSAGE権限だけになっているので、
mysql> DELETE FROM mysql.user WHERE USER LIKE 'root' -> AND HOST LIKE '192.168.0.20';
mysql> FLUSH PRIVILEGES;
を実行し、該当ユーザを削除して、テーブルを同期します。
以上で、
mysql> SELECT User, Host FROM mysql.user; +----------+--------------+ | User | Host | +----------+--------------+ | | 192.168.0.20 | | | localhost | | root | localhost | | wikiuser | 192.168.0.21 | +----------+--------------+ 4 rows in set (0.01 sec)
のように削除されました。
なお、ホスト名も目障りだと言う場合は、
mysql> DELETE FROM mysql.user WHERE HOST LIKE '192.168.0.20';
を実行すると良いでしょう。
Trackback address for this post
Trackback URL (right click and copy shortcut/link location)
Feedback awaiting moderation
This post has 28 feedbacks awaiting moderation...