MYSQLインストール直後のアカウント初期設定

基本的ですが、MYSQLサービスはrootでは動かさない。
MYSQLサーバー用 専用アカウントの作成

[mysql@colinux local]$ /etc/init.d/mysql.server start
Starting MySQL… SUCCESS!
[mysql@colinux local]$ ps -ef | grep mysql
root 2649 2623 0 12:17 tty1 00:00:00 su - mysql
mysql 2658 2649 0 12:17 tty1 00:00:00 -bash
mysql 2693 1 0 12:18 tty1 00:00:00 /bin/sh ./bin/mysqld_safe
--datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/colinux.pid
mysql 2821 2693 9 12:18 tty1 00:00:02 /usr/local/mysql/bin/mysqld
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
--log-error=/usr/local/mysql/data/colinux.err
--pid-file=/usr/local/mysql/data/colinux.pid
--socket=/tmp/mysql.sock --port=3306
mysql 2836 2658 0 12:18 tty1 00:00:00 ps -ef
mysql 2837 2658 0 12:18 tty1 00:00:00 grep mysql

[mysql@colinux local]$

—————– my.cnf ———————
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
user = mysql
skip-locking
key_buffer = 16K

mysqlインストール初期状態でまずはパスワードを設定して不要なアカウントを削除

[mysql@colinux local]$ mysql -u root mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.30-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> update user set password = PASSWORD('password2009')
-> where user ='root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0

mysql> delete from user where user = 'root' and host ='%';
Query OK, 0 rows affected (0.01 sec)

mysql> delete from user where user ='';
Query OK, 0 rows affected (0.00 sec)

mysql> delete from db where user ='';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql>

init_secure

パスワードの付いていないアカウントがないかダブルチェック

mysql> select user,host,password from user
-> where user = '' or password = '';
Empty set (0.00 sec)

mysql>

今後の為に、パスワードの付いてないアカウントが作成されないように制限する


mysql> select @@global.sql_mode;
+-------------------+
| @@global.sql_mode |
+-------------------+
| |
+-------------------+
1 row in set (0.00 sec)

mysql> set global sql_mode = 'NO_AUTO_CREATE_USER';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.sql_mode;
+---------------------+
| @@global.sql_mode |
+---------------------+
| NO_AUTO_CREATE_USER |
+---------------------+
1 row in set (0.00 sec)

mysql>

no_auto_create_user

[mysql@colinux local]$ mysql -u root mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.30-log MySQL Community Server (GPL)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> select @@global.sql_mode;
+---------------------+
| @@global.sql_mode |
+---------------------+
| NO_AUTO_CREATE_USER |
+---------------------+
1 row in set (0.00 sec)

mysql> GRANT select,insert,update,delete on DB001.* to 'no_password_user';
ERROR 1133 (42000): Can't find any matching row in the user table
mysql>

上記の”NO_AUTO_CREATE_USER”モードはMYSQLサーバーを再起動したら消えます。

mysql> select @@global.sql_mode;
+-------------------+
| @@global.sql_mode |
+-------------------+
| |
+-------------------+
1 row in set (0.01 sec)

mysql>

そこでmy.cnfに”sql_mode”の設定を行い再起動しても設定が消えないようにします。

—————————————————————–
抜粋
—————————————————————–
[mysqld]
port = 3306
socket = /tmp/mysql.sock
user = mysql
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
default-character-set=utf8
sql_mode =”NO_AUTO_CREATE_USER”
—————————————————————–

上記の設定を行い、mysqlを再起動すればパスワードの無いユーザーは
作成出来なくなります。後はルールとして周知すればOK。

sql_mode


    ユーザー作成と削除


mysql> grant usage on DB001.* to 'test_user';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;
+-------------+-----------+
| user | host |
+-------------+-----------+
| test_user | % |
| variable | % |
| root | 127.0.0.1 |
| root | colinux |
| admin | localhost |
| root | localhost |
| super_admin | localhost |
+-------------+-----------+
7 rows in set (0.00 sec)

mysql> drop user 'test_user';
Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> select user,host from mysql.user;
+-------------+-----------+
| user | host |
+-------------+-----------+
| variable | % |
| root | 127.0.0.1 |
| root | colinux |
| admin | localhost |
| root | localhost |
| super_admin | localhost |
+-------------+-----------+
6 rows in set (0.00 sec)

mysql>

    パスワードを付けて再度、ユーザーを作成。

mysql> grant usage on DB001.* to 'test_user' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;
+-------------+-----------+
| user | host |
+-------------+-----------+
| test_user | % |
| variable | % |
| root | 127.0.0.1 |
| root | colinux |
| admin | localhost |
| root | localhost |
| super_admin | localhost |
+-------------+-----------+
7 rows in set (0.00 sec)

mysql>

    ユーザーに追加で権限を割り振る

mysql> grant select on DB001.* to 'test_user';
Query OK, 0 rows affected (0.00 sec)

mysql> grant insert on DB001.* to 'test_user';
Query OK, 0 rows affected (0.01 sec)

    ユーザー作成スクリプトを確認して権限の確認

mysql> show grants for 'test_user';
+----------------------------------------------------------------------------------------------------------+
| Grants for test_user@% |
+----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, INSERT ON `DB001`.* TO 'test_user'@'%' |
+----------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

追記:その他の例


mysql> show grants for 'admin'@'localhost';
+--------------------------------------------------------------------------------------------------------------+
| Grants for admin@localhost |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*3210C0C06DEE12SD1618BB00005TGCA2EC9C1A77' |
| GRANT ALL PRIVILEGES ON `DB02`.* TO 'admin'@'localhost' |
+--------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

    =========================================================
    作成したユーザーから付与した権限をなくす。
    =========================================================

    付与した権限を一つ一つ剥奪する。


mysql> show grants for 'test_user'\G
*************************** 1. row ***************************
Grants for test_user@%: GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASS
WORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'
*************************** 2. row ***************************
Grants for test_user@%: GRANT SELECT, INSERT ON `DB001`.* TO 'test_user'@'%'
2 rows in set (0.00 sec)

mysql> revoke insert on DB001.* from 'test_user';
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for 'test_user'\G
*************************** 1. row ***************************
Grants for test_user@%: GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASS
WORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'
*************************** 2. row ***************************
Grants for test_user@%: GRANT SELECT ON `DB001`.* TO 'test_user'@'%'
2 rows in set (0.00 sec)

mysql>

mysql> revoke all privileges,grant option from 'test_user';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test_user'\G
*************************** 1. row ***************************
Grants for test_user@%: GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASS
WORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'
1 row in set (0.01 sec)

mysql>

    上記のように、revoke all privileges,grant optionしても接続権限は消えていない。
    接続権限、「SHOW VARIABLES」、「SHOW STATUS」、「SHOW DATABASE」
    なども利用できる。

    mysql> show databases;
    +——————–+
    | Database |
    +——————–+
    | information_schema |
    +——————–+
    1 row in set (0.01 sec)

    mysql>
    全ての権限をrevokeするには、以下のようにdrop userして法が良いかと思う。


mysql> drop user 'test_user';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test_user'\G
ERROR 1141 (42000): There is no such grant defined for user 'test_user' on host
'%'
mysql> show grants for 'test_user'\G

revoke

警告:もし新しいユーザを作成して IDENTIFIED BY 条項を指定しないと、そのユーザは
パスワードを持ちません。これはとても不安定です。しかし、新規ユーザに空ではない
パスワードを提供する為に IDENTIFIED BY が与えられない限り、GRANT が新規ユーザ
を作成するのを防ぐ為に NO_AUTO_CREATE_USER SQL モード
有効にする事ができます。

showroot