MySQLの運営
MySQL のセキュリティ

 MySQLサーバに接続するときは、パスワードを使用すべきだ。パスワード以外の全ての情報はテキストで転送されるので、覗き見される恐れがある。
 より安全にしたい場合、 ssh (http://www.cs.hut.fi/ssh) をインストールする。これを使用すれば、MySQL サーバーと MySQL クライアント間の TCP/IP コネクションは全て暗号化される。

MySQL システムを安全にするための注意点
* 全ての MySQL ユーザにパスワードを使用する
* mysqld を実行している Unix ユーザだけが読み込み/書き込み可能
* process 特権を全てのユーザに与えない(この許可がある人は誰でも mysqladmin processlist コマンドで実行されているクエリーの中身を見ることができる)。
* file を全てのユーザに与えない(ユーザがこの特権を持つ場合、mysqld デーモンを実行している Unix ユーザーの権限で、ファイルシステム内のどこにでもファイルを書き込むことができる)。
* DNS を信用しない場合、特権テーブル内にはホスト名の代わりに IP を使用すべきだ。mysqld への --secure オプションは原理上はホスト名を安全にする。どんな場合でも、ホスト名へのワイルドカードの使用については、注意深くすべきだ。

MySQLの安全な起動法

MySQL デーモンを Unix の root ユーザーで実行しないように。 mysqld は任意のユーザで実行できる。MySQL を動作させるユーザーは以下のようにするといい。
* login を許可しない (shell や passwd を与えない)
* wheel や root group にしない
* 全く新しく作成した group に属する

MySQLサーバの起動

# mysqld -u mysqluser [オプション] &

※mysqld を 他の Unix ユーザーで起動したとしても、 MySQL の user テーブルの root ユーザーの名前を変更する必要はありません。

セキュリティに影響するmysqlオプション
--secure
gethostbyname() から返される ip がオリジナルのホスト名に戻せるかどうかをチェックする。これは、外の誰かが他のホストを真似てアクセスを得ることを難しくなる。
--skip-grant-tables
特権システムを全く使用しない。これは全員に全てのデータベースへの 完全なアクセス を与える。
--skip-name-resolve
ホスト名を解析しない。特権テーブル中の全ての Host項目は IP 番号か localhost でなければならない。
--skip-networking
ネットワーク (TCP/IP) 経由の接続を許可しない。mysqld への全ての接続は、 Unix ソケットで行われる。



データベースの管理---管理者パスワードの設定
MySQLへのインストールが済むと、自動的に root ユーザが作成されている。初期状態の root はパスワードが設定されていないから、度胸試しをしたいならともかく、まずはパスワードを設定したほうがいいよ。

root のパスワード設定
rootでmysqlにログイン

# mysql -u root mysql

パスワードを設定
ログインが済んだら、SET PASSWORD 構文でパスワードの設定だ。

mysql> SET PASSWORD FOR root=PASSWORD('new_password');

mysqladminで root のパスワード設定

コマンドラインでも、mysqladmin コマンドを使ってパスワードを設定することができる。

# mysqladmin -u root password new_password
# mysqladmin reload

mysqladminを使ってパスワードを設定する場合、設定後にmysqladminのreloadコマンドを実行する必要がある。忘れちゃだめだよ!
------------------------------------------------------------------------
MySQLへの接続
MySQL ユーザ名とパスワードMySQL によって使用されるユーザー名とパスワードの使用のされ方と、 UNIX, Windows で使用される方法とは、いくつか異なる点がある。
* MySQL データベースのアクセス認証に使用するユーザー名・パスワードは、UNIX・Windows のログインユーザのものとは別だ。でも、ログイン時にユーザ名が指定されていないときは、現在のログインしているユーザ名をMySQLのユーザー名としてログインを試みてくれる(-uスイッチで変更できます)。

・ユーザー名は 16文字まで(英数半角)使用可。
・MySQL は Unix のログインパスワードとは全く違う、独自の暗号化されたパスワードだけを使用する。

MySQL サーバーに接続
MySQLクライアントプログラムは、共通の決まった引数を持つ。接続したいホスト名、接続ユーザー名、そしてパスワードだ。

# mysql [-h host_name] [-u user_name] [-pyour_pass]

mysql コマンドはコマンドラインに引数がなければ接続にデフォルト値が使われる。デフォルトのホスト名は localhost、ユーザー名はUNIXのログイン名だ。

Unix のログインユーザーが root の場合、以下のコマンドはどれも同じ意味になる。

# mysql -h localhost -u root
# mysql -h localhost
# mysql -u root
# mysql
------------------------------------------------------------------------
パスワード設定後のMySQLへの接続
パスワードプロンプトを返すクライアントプログラムを実行する。下記のように -p オプションを使用する。

# mysql -u user_name -p
Enter password: ********

設定ファイルにパスワードを書いておくこともできる。そうすることにより、毎回毎回コマンドラインに引数を与えなくてすむようになる。まず、自分のホームディレクトリに「.my.cnf」を作り、そのファイルの中の [client] セクションに接続用のパラメターを記述する。

[client]
host=host_name
user=user_name
password=your_pass

「.my.cnf」ファイルはグループやその他のユーザーが読み書きできないようにしよう。ファイルのパーミッションは 400 か 600 が最適。
------------------------------------------------------------------------
MySQLの運営 --- 新しいユーザ権限を MySQL へ追加

ユーザーは2つの違った方法で追加できる。 GRANT 構文を使用して行う方法と、 MySQL の許可テーブルを直接操作する方法だ。

GRANTでの新規にユーザー登録

・MySQLにログイン
> mysql -u root mysql

・spadminユーザの作成
mysql> GRANT ALL PRIVILEGES ON *.*
TO spadmin@localhost
BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.*
TO spadmin@"%"
BY 'something' WITH GRANT OPTION;

・adminユーザの作成
mysql> GRANT RELOAD,PROCESS ON *.*
TO admin@localhost;

・guestユーザの作成
mysql> GRANT USAGE ON *.*
TO guest@localhost;

これら GRANT 構文では3つの新しいユーザを作る
spadmin
どこからでもサーバーに接続できる完全なスーパーユーザ。padmin@localhost と spadmin@"%" の両方に GRANT 構文を発行しなくてはならない事に注意。もし localhost からの許可をした登録がないと、localhost から接続した時、 mysql_install_db が自動で作成した localhost への匿名ユーザーが優先される。
admin
localhost からパスワードなしで接続できるが、reload, process の使用だけが許される。データベースへのアクセスは許可されていない。しかしこれは後でテーブル GRANT 構文を発行すれば、個々のデータベースへのアクセス権限が設定できる。
guest
パスワードなしで localhost からのみ接続できるユーザー。グローバルな権限は全て 'N' に設定される。USAGEは権限無しユーザーの設定を許可する事になる。

ユーザーの許可を GRANT 構文で定義する

以下は、localhost, server.domain, whitehouse.gov から接続が可能な custom ユーザーの追加する例だ。
custom ユーザーは db1 データーベースには localhost からの接続のみを許可され、 db2 データベースには other.com からのみ接続が許可され、 db3 データベースには全てのホストから接続できる。 custom ユーザーは、 stupid というパスワードを全てのホストで使用する。

> mysql -u root mysql

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON db1.*
TO custom@localhost
IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON db2.*
TO custom@other.com
IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON db3.*
TO custom@'%'
IDENTIFIED BY 'stupid';

任意のドメインに属する全てのマシンに接続を許可

mysql> GRANT ...
ON *.*
TO user@"%.domain.co.jp"
IDENTIFIED BY 'mypasswd';

xmysqladmin、mysql_webadmin、そして xmysql を使っても権限テーブルへの値の挿入/変更/更新ができる。これらのユーティリティは MySQL Contrib directory にある。
------------------------------------------------------------------------
パスワードの設定法

INSERT か UPDATE で空ではないパスワードを設定する場合、暗号化するために PASSWORD() 関数を使用する。これは user テーブルはプレーンテキストでなく、暗号化されたパスワードであることを要求しているからだ。

SET PASSWORD 構文を使用する

mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('mypasswd');

GRANT ... IDENTIFIED BY 構文や mysqladmin password コマンドでパスワードを設定した場合は、PASSWORD() 関数は必要ない。両方とも、自動的にパスワードを暗号化する。

------------------------------------------------------------------------