« 【MySQL】データベースの作成・名前の変更・削除・一覧【コマンドプロンプト】 | トップページ | 【MySQL】テーブルとフィールドを作ってみる【コマンドプロンプト】 »

2010年9月 6日 (月)

【MySQL】ユーザー関連初期設定(作成・削除とかとか)【コマンドプロンプト】

rootユーザーのパスワードは設定したが、その他のユーザーは未設定なので、とりあえずそれらのユーザーの設定をする。
でもって、インストール時にユーザー名とパスワードが空のユーザーが作成されるらしい。
セキュリティ上宜しくないので削除する。

useコマンドでデータベースを指定する。

何の作業をするにしても、どのデータベースを使うか指定しないとダメ。
(MySQLが「どのデータベースさわるんだよ!」って困るので)

ユーザー名やパスワードを管理してるデータベースはmysqlなので、useコマンドを使ってデータベースを指定する。
ユーザー関連のデータはデータベースmysqlのuserテーブルにあるので、データベースmysqlを使うよーと指定する。

mysql > use mysql; ←データベース「mysql」を使う
Databases changed ←データベースが変わりました
コマンドの終わりには ; (セミコロン)を入れる

コマンドの終わりには必ず ; (セミコロン)を入れる。コマンドの終わりですよって印。
例えば下のように入れ忘れてエラーが出たりするのは、1行目から3行目までが1つのコマンドだと認識されて、「そんなコマンドねーよ」状態な訳だ。

mysql> use mysql ←;入れ忘れる 
    ->              ←なにも起こらないよ?なんで
    -> use mysql;         ←もう一度入力し直した(今度は;入れたよー)

もしセミコロン入力を忘れて -> が出ても、その後に ; を入れたらおk

mysql> use mysql ←;入れ忘れる 
    ->      ←入れ忘れた!
    -> ; ←ここで入れても大丈夫

あと、入力を間違えまくっても ¥c で抜けれるみたい。
( /c と書いてたけど、/c では抜けれませんでした。
MACの/はたいていwindowsでは¥になる事多し)

コマンドは大文字と小文字は区別しない。データベースやテーブル名はOSに依存するみたい。
windowsはファイルやフォルダ名で大文字小文字の区別しない→MySQLでもテーブル名とか区別しない。
区別するOSならテ−ブル名とかも区別するらしい。

ユーザー一覧を表示する

現在のユーザーとホストの一覧で、削除するユーザーを確認しておく。

mysql > select user, host from mysql.user; ←ユーザーとホスト一覧を表示
+---------+-----------+
| User      | Host     | 
+---------+-----------+
| aaa       | localhost | 
| root      | localhost | 
+---------+-----------+

こんな感じで一覧が出る。
aaaとroot、2つのユーザーが設定されている。

selectコマンドは、select以降に書かれた内容を検索し表示してくれるコマンドのようで、今回入力したコマンドは

select [フィールド] from [データベース].[テーブル];

という形式で、データベース[mysql]の[user]テーブルにある[userとhost]フィールドを探して表示しろ、って事だと思う。
(複数のフィールドがある場合は , で区切るみたい)

ユーザーを削除する

とりあえず削除すべきは、パスワードが設定されていないユーザーと、匿名ユーザー。どっちも簡単にデータベースにアクセスできてしまうユーザーなので削除しておいた方が良いです。

パスワードを設定していないユーザーを削除する
delete from user where password='';

userテーブルからパスワードが空白のものを抽出して削除するって事。

whereはコマンドじゃなくてオプションで、where以降に検索や抽出する条件を指定する。
deleteコマンドは、そんまんま削除、from userはuserテーブルから、where password=''; はパスワードが空白のものを抽出ってこと

成功するとこんなメッセージが。

Query OK, 1 row affected(0.05sec)

useコマンドでデータベースを指定してないと、ここでエラーが出ますorz

匿名ユーザーの削除

自分はそうならなかったけど、ユーザー一覧を表示させた時に、ユーザーフィールドが空のユーザーがある場合があって、匿名ユーザーというそうです。

+---------+-----------+
| User    | Host      | 
+---------+-----------+
|             | localhost | 
| root    | localhost | 
+---------+-----------+

匿名ユーザーがあるとユーザー認証を求められた時、適当にユーザー名入れても「そんなユーザーいないから、とりあえず匿名ユーザーに割り当てとくね」と余計な事をしてくれるらしい。セキュリティ的に宜しくなさげ。とにかく削除しておいた方が吉

上のパスワードが空のユーザーを削除した時と同じコマンドで、where以降の抽出条件を変えればok

匿名ユーザーはユーザー名も、パスワードも設定されていないユーザーの事のらしい。
(一覧で表示させると、ユーザー名もパスワードも空白になってるユーザー)
なので、パスワードを設定していないユーザーを削除した時点で、匿名ユーザーは削除されていると思われ。

delete from user where host='';
削除できてるか確認
+---------+-----------+
| User      | Host     | 
+---------+-----------+
| root      | localhost | 
+---------+-----------+

再度ユーザー一覧を表示させるとユーザーがrootだけになってる。

ユーザーの作成

パスワードが空のユーザー削除が成功したらrootユーザーしか残らないので、普段使いのユーザーを作る。

rootは多分、特別なユーザーなので普段は使わない方が良いと思う。調べてないけど。
rootって何でも出来そうな感じだし。出来すぎて間違って余計な事しそうだし。

手順的には

  1. criate user文でユーザーを作る
  2. grant文でユーザーに権限を与える

て感じ。

create userで新規ユーザーを作る
create user [ユーザ名] identified by '[パスワード]';

例えば、ユーザー名test、パスワードをabc123というユーザーを作成して成功すると、下記のように表示される。

mysql> create user test identified BY 'abc123';
Query OK, 0 rows affected (0.00 sec)

+---------+-----------+
| User      | Host     | 
+---------+-----------+
| test       |  ‰         | 
| root      | localhost | 
+---------+-----------+

ここで select user, host from mysql.user; でユーザー一覧を表示させると、作成したユーザーとrootユーザが表示される。

これ以降、例文ではユーザー名 test パスワード abc123 を使う。

updateでホストを変更する

作成したユーザーのホストが ‰ (パーセント)となっているのでそれを修正する。

MySQLでは ‰ はワイルドカードになる。
ホストに ‰ が設定されていると、どのホストでも繋げれる=誰でもアクセスできちゃうって事で、セキュリティ上宜しくないので変更する。

update mysql.user set host='[変更後のホスト名]' where host='[現在のホスト名]';

updateはレコードの内容を変更するコマンド。

mysql> update mysql.user set host='localhost' where host=' ‰ ';
Query OK, 0 rows affected (0.02 sec)

データベースmysqlのuserテーブルにある[host]フィールドの中で、値が ‰ のものの値をlocalhostに変更しろって事ですな。
これで ‰ からlocalhostに変わる。

が、条件を where host=' ‰ ' としているので、ホスト名が ‰ のユーザーは一括でlocalhostに変換されてしまいます。
今回のように、セキュリティ上%はまずいって時はいいけど、とあるホストAからホストBに変更する時にこの構文を使うと、ホストAのままでよかったユーザーまで変更されてしまう。
ユーザー毎に変更する場合は、条件をユーザー名に変えればおk

update mysql.user set host='[変更後のホスト名]' where user='[変更したいユーザー名]';

mysql> update mysql.user set host='localhost' where user=' test ';
Query OK, 0 rows affected (0.02 sec)

データベースmysqlのuserテーブルにある[user]フィールドの中で、値が test のものの[host]フィールドの値をlocalhostに変更しろって事です。
ややこしいな。
でもまあ、コマンドの文章見てたらなんとなくわかるよね。

+---------+-----------+
| User      | Host     | 
+---------+-----------+
| test      | localhost | 
| root      | localhost | 
+---------+-----------+

ここで select user, host from mysql.user; でユーザー一覧を表示させると、ホストが変更されている。

mysql host名変更/mindia

grantを使って、作成したユーザーの権限を設定する

作成したユーザーでログインし直して、新しく作ったデータベースをuseで指定してもエラーが出る(はず)
これは権限を与えられてないから、そのデータベースには何も出来ないって事。

試しにshow databases;でデータベース一覧を表示させると、rootでログインしてた時とは違うデータベース一覧が出た。
useでその中のデータベース名を指定してみたが、エラーでました。

とにかくrootでログインした状態で、作成したユーザーに権限を与えてみる。

grant [権限の種類] on [データベース名].[テーブル名] to [ユーザ名]@[ホスト名] identified by '[パスワード]';

[権限の種類]は作成したユーザーにどこまでの作業をさせるかによって変わる。
4.4.1. GRANT および REVOKE の構文/MySQL のページにまとまってるので参照の事。

データベースをまだ作ってない場合は【MySQL】ユーザー関連初期設定(作成・削除とかとか)【コマンドプロンプト】 の記事参照。

とりあえず、権限はallでつくる(rootの代わりに使うので、基本なんでも出来るようにしておく事にする)

mysql> grant all on test_db.* to test@localhost identified by 'abc123';

成功したら、okほにゃららsecと出ます。

文中の ∗ はワイルドカードで、(test_db内の)全テーブルって事。
権限を与えたいテーブル名が分かってるなら、普通にテーブル名にする。

testユーザーでログインし直して、show databases; と入力すると、データベース一覧にtest_dbが増えてる。
use tast_db;と入力すると Database changed と出る。
これでtestユーザーでtest_dbに色々出来るようになった。

MySQLでは「create user」という操作がなく(?)、「grant」構文がそのまま「create user」の機能も併せ持っている MySQLにユーザを追加する/PHPのテクメモ
との事。create userでユーザー作らずとも、grantでユーザーを作成し、同時に権限も付与できるって事?
よく分からん。

MySQLデータベースサーバーのセットアップ /自宅サーバーで行こう
MySQLについて 弐/IKEUCHI Atsushi Home Page
MySQLのWHEREオプション/2php
ユーザーの作成/DBOnline
なんで root でrpm をbuildしてはだめなのですか?/okyuu.com
MySQL: ユーザの追加とパスワード、権限の付加 - GRANT文/Yukun's Blog
[MySQLウォッチ]第26回 知らないではすまされない,MySQLのセキュリティ設定/IT Pro
MySQLの匿名ユーザについて/ Climb ( www.climb.co.jp ) IT Square

|

« 【MySQL】データベースの作成・名前の変更・削除・一覧【コマンドプロンプト】 | トップページ | 【MySQL】テーブルとフィールドを作ってみる【コマンドプロンプト】 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 【MySQL】ユーザー関連初期設定(作成・削除とかとか)【コマンドプロンプト】:

« 【MySQL】データベースの作成・名前の変更・削除・一覧【コマンドプロンプト】 | トップページ | 【MySQL】テーブルとフィールドを作ってみる【コマンドプロンプト】 »