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


STEP① MYSQLを停止させる。

[root@colinux ~]# /etc/init.d/mysql.server stop
Shutting down MySQL.. SUCCESS!
[root@colinux ~]#

STEP② GRANTテーブルをSKIPして、外部ユーザーが接続して来ないようにネットワークもSKIPして起動

[root@colinux ~]# mysqld --skip-grant-tables --skip-networking &
[1] 2643
[root@colinux ~]# 090405 9:39:59 [Warning] option 'thread_stack': unsigned value  65536 adjusted to 131072
090405 9:40:00 InnoDB: Started; log sequence number 0 303628
090405 9:40:00 [Note] mysqld: ready for connections.
Version: '5.1.30-log' socket: '/tmp/mysql.sock' port: 0 MySQL Community Server (GPL)

[root@colinux ~]#

STEP③ mysqlコマンドで接続する。(GRANTテーブルは読み込んでいないのでパスワード不要)

[root@colinux ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.30-log MySQL Community Server (GPL)

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

mysql>

skip_grant_tables

STEP④ パスワードをリセット

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| DATABASE |
| DB01 |
| DB02 |
| TEST |
| client_test_db |
| mysql |
+--------------------+
7 rows in set (0.09 sec)

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

mysql>

mysql> exit
Bye
[root@colinux ~]#

STEP⑤ MYSQLをシャットダウンして通常起動させる。

[root@colinux ~]# mysqladmin shutdown
090405 9:51:48 [Note] mysqld: Normal shutdown

090405 9:51:48 InnoDB: Starting shutdown...
090405 9:51:49 InnoDB: Shutdown completed; log sequence number 0 303628
090405 9:51:49 [Note] mysqld: Shutdown complete

[1]+ Done mysqld --skip-grant-tables --skip-networking
[root@colinux ~]#

※ メモリー内のgrantテーブルをflushしていないので、パスワードは不要。

[root@colinux ~]# /etc/init.d/mysql.server start
Starting MySQL.. SUCCESS!

STEP⑥ DB接続の確認。

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

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

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| DATABASE |
| DB01 |
| DB02 |
| TEST |
| client_test_db |
| mysql |
+--------------------+
7 rows in set (0.00 sec)

mysql>

STEP⑦ もしkillコマンドでDBをシャットダウンした場合 (オプション:メンテ時間が許せば。。。。)

━ エラーログの確認
━ mysqlcheckでデータベースの確認

[root@colinux ~]# mysqlcheck -u root -p --all-databases

[hup]
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.servers OK
mysql.slow_log
Error : You can’t use locks with log tables.
status : OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
mysql.user_info OK
[root@colinux ~]#

mysqlcheck

================================
メモ (パスワード変更方法)
================================

1: パスワード関数

mysql> set password for 'hatena'@'%' = PASSWORD('password-change');
Query OK, 0 rows affected (0.00 sec)

2: GRANTコマンド

mysql> GRANT USAGE ON *.* TO 'hatena'@'%' IDENTIFIED BY 'Password-Change';
Query OK, 0 rows affected (0.00 sec)



mysql> create user 'super_admin'@'localhost' identified by 'super-password';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to 'super_admin'@'localhost'
-> with grant option;
Query OK, 0 rows affected (0.00 sec)

account

上記のコマンドをひとつにまとめてユーザー作成する事の方が自分は多いです。


mysql> grant all privileges on *.* to 'super_admin'@'localhost' identified by 'super-password' with grant option;

account2

※セキュリティ上rootは残しておきたくない管理者の方は、管理者アカウントを別名で作成したら
rootアカウントも不要なアカウントと同時に削除しても良いかもしれません。


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

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

———————-
MEMO (DEFAULT ROOT権限確認)
———————-


mysql> show grants for 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*G41ECFBE2002DDE5224F2B6F5C6CD2D3D3DDDC35' WITH GRANT OPTION
1 row in set (0.00 sec)