b.l0g.jp     About     Archive     Feed

MySQL ユーザのホストをワイルドカードで指定してもlocalhostは含まれない

MySQLをインストールしたので、とりあえずワイルドカードでホスト名を指定してテスト用のユーザを作成。


mysql> show databases;
  
+-------+
  
| Database |
  
+-------+
  
| information_schema |
  
| hoge |
  
| mysql |
  
| performance_schema |
  
| test |
  
+-------+
  
5 rows in set (0.00 sec)

mysql> grant select on hoge.* to testuser@'%' identified by 'password';
  
Query OK, 0 rows affected (0.07 sec)

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

mysql> quit

この状態で、MySQLがインストールされているサーバ自体からそのままtestuserでログインしようとすると、アクセスが拒否される。


testserver$ mysql -utestuser -p
  
Enter password:
  
ERROR 1045 (28000): Access denied for user 'testuser'@'localhost' (using password: YES)

しかし、他のサーバからアクセスしてみると、接続は成功して、hogeデータベースへのアクセスもできる。


anotherserver$ mysql -utestuser -p -h testserver hoge
  
Enter password:
  
Welcome to the MySQL monitor. Commands end with ; or \g.
  
Your MySQL connection id is 8
  
Server version: 5.5.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
  
affiliates. Other names may be trademarks of their respective
  
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
  
+-------+
  
| Database |
  
+-------+
  
| information_schema |
  
| hoge |
  
| test |
  
+-------+
  
3 rows in set (0.00 sec)

「testuser@’%’」の「%」はワイルドカードなので、localhostも含めた全てのホストを指すものかと思ったら、どうやらそれは間違いのようだ。

調べてみたところ、以下のような仕組み。

4.8.2 MySQL への新規ユーザの追加

http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html

monty というユーザ名と some_pass というパスワードのアカウントが 2つ存在します。どちらもフル権限を持つスーパーユーザのアカウントです。’monty’@’localhost’) というアカウントは、ローカル ホストから接続するときにだけ使用できます。一方の ‘monty’@’%’ というアカウントは、どのホストからでも接続できます。注意: monty というアカウントは両方とも、monty としてどこからでも接続できる必要があります。この localhost でアカウントを持っていない場合、monty でローカル ホストから接続したときに、mysql_install_db で作成している localhost のエントリで、匿名ユーザのアカウントとして優先になります。つまり、 monty が匿名ユーザとして扱われます。この理由は、’monty’@’%’ よりも、匿名ユーザの方が具体的な Host カラム値にあるため、匿名の方が、user テーブルのソート順で先にきます。. (user テーブルのソートに関しては、項4.7.5. 「アクセス制御の段階 1: 接続確認」 を参照してください。)

分かったような、わからないような。参照先を見てみるとより詳しい説明がある。

4.7.5. アクセス制御の段階 1: 接続確認

http://dev.mysql.com/doc/refman/5.1/ja/connection-access.html

長いので引用は避けるが、MySQLがuserテーブルに書かれた情報をどのようにソートして使用しているかが影響しているようだ。上のページの説明によると、以下の順でソートを行っている。

  1. 最も具体的なホスト名(つまり、%のように明示的でない指定は後回し)
  2. 最も具体的なユーザ名

つまり、はじめの方に出てきたユーザのテーブルは、実際には以下のように並んでいることになる。


+----+----+
  
| host | user |
  
+----+----+
  
| localhost | root |
  
| localhost | |
  
| 127.0.0.1 | root |
  
| % | testuser |
  
+----+----+

ログイン時のユーザ名とホスト名の組み合わせは、このようにソートしたテーブルを上から順に検索していき、最初に一致したもので認証が行われる。

ここで、「testuser」というユーザがlocalhostからアクセスしてくると、2行目の「localhostの匿名ユーザ(userが空白 = 匿名ユーザ)」に先に一致してしまうのである。

この裏付けに、パスワードなしでtestuserでログインできるようにしてみると、確かに実際には匿名ユーザとしてログインしてしまっていることがわかる。


$ mysql -utestuser

mysql> select current_user();
  
+------+
  
| current_user() |
  
+------+
  
| @localhost |
  
+------+
  
1 row in set (0.00 sec)

従って、「testuser@localhost」としてログインしたいなら、明示的に


mysql> grant select on hoge.* to testuser@'localhost' identified by 'password';

とも実行して、「localhostのtestuser」を作成する必要がある。

注 : セキュリティ上、ホストを「%」でワイルドカード指定するのはよろしくないので、やらないようにしましょう(汗)

MySQLでテーブルの行数を数える

テーブル内の行数を数えるのに一番簡単なのは、

  
select count(*) from 'テーブル名';
  

と実行することだが、これだと最悪そのテーブルを総なめすることになる。

こういう時はinformation schemaから情報を引く。information_schema.tablesテーブルのtable_rowsカラムが行数。

  
mysql> select table\_schema, table\_name, table\_rows from information\_schema.tables
      
-> where table_schema = 'hoge';
  
+-------+-------------+----+
  
| table\_schema | table\_name | table_rows |
  
+-------+-------------+----+
  
| hoge | wp\_FollowMe\_Links | 2 |
  
| hoge | wp_commentmeta | 180 |
  
| hoge | wp_comments | 60 |
  
| hoge | wp_ktaisession | 0 |
  
| hoge | wp_links | 7 |
  
| hoge | wp_options | 236 |
  
| hoge | wp_postmeta | 509 |
  
| hoge | wp_posts | 323 |
  
| hoge | wp\_term\_relationships | 39 |
  
| hoge | wp\_term\_taxonomy | 9 |
  
| hoge | wp_terms | 9 |
  
| hoge | wp_usermeta | 31 |
  
| hoge | wp_users | 2 |
  
+-------+-------------+----+
  

showを使っても行数を引くことができるが、showの性質上表示させるカラムなどを細かく指定できず使いづらいこともあるので、information_schemaを引く方が好き。

  
show table status;
  

なおこれらのコマンドで引ける行数は、MyISAMなどのストレージエンジンでは正確な値だが、InnoDBの場合は概算値となる。なので、InnoDBの場合はselect count(*)するしかない。

Ubuntu Server 11.04マシンでUSB無線LANアダプタを使う

少し前に自宅で色々と検証したりするために、HP ML110 G6を買い、Ubuntu Server 11.04をインストールした。自宅は通信費節約のため、固定回線を引かず、外出時もそのまま使えるようにUQ WiMAXの回線を契約し、Aterm WM3500Rという無線LANルータを使っている。このため、ML110を無線LAN接続する必要がある。

近くのビックカメラで、安くて小さいUSB無線LANアダプタとしてプラネックスのGW-USNano2-Mを買ってきて、無線LANルータ経由でインターネットに接続するまでのメモ。

Ubuntu DesktopならGUIツールであれこれできるが、Serverなので全部CLIで。

ドライバパッケージをダウンロード

GW-USNano2-?(MやG)は、RealtekのRTL8192CUという無線LANチップを使っているようなので、これに対応したドライバをダウンロード。Realtekのダウンロードページを開き、以下のようにリンクをたどる

  1. Communications Network ICs
  2. Wireless LAN ICs
  3. WLAN NIC
  4. IEEE 802.11b/g/n Single-Chip
  5. Software
  6. RTL8192CUにチェックし、goボタン
  7. 「Linux driver for Kernel 2.6.38(and earlier)」から、RTL8192CU_linux_v3.1.2590.20110922.zipをダウンロード

ドライバのインストール

パッケージを展開し、コンパイル、インストール

  
$ unzip RTL8192CU\_linux\_v3.1.2590.20110922.zip
  
$ cd RTL8192CU\_8188CUS\_8188CE-VAU\_linux\_v3.1.2590.20110922/
  
$ sudo sh install.sh
  

※ Ubuntu Serverをインストールした直後は、makeやgccがインストールされないので、事前にsudo apt-get install make gccしておく。

インストールされたら、ドライバモジュールがロードされていることを確認

  
$ lsmod
  
Module Size Used by
  
nls_utf8 12557 0
  
isofs 40283 0
  
vesafb 13761 1
  
8192cu 508081 0 ← ロードされている
  
lp 17789 0
  
parport 46458 1 lp
  
usbhid 46956 0
  
hid 91020 1 usbhid
  
tg3 141750 0
  

無線LAN設定

WPA認証情報をファイルに書き込む。SSIDとキーは使用している無線LANアクセスポイントのものに置き換える。

  
$ wpa\_passphrase \[SSID\] \[キー\] > wpa\_supplicant.conf
  
$ sudo mv wpa\_supplicant.conf /etc/wpa\_supplicant/
  
$ sudo chown root:root /etc/wpa\_supplicant/wpa\_supplicant.conf
  

認証の設定を/etc/network/interfaceに設定を書き込む。DHCPを使用する場合の例。3行目のSSIDは上と同じく置き換えること。

  
auto wlan0
  
iface wlan0 inet dhcp
  
wpa-essid [SSID]
  
wpa-conf /etc/wpa\_supplicant/wpa\_supplicant.conf
  

マシンを再起動

  
$ sudo reboot
  

再起動後、wlan0というインタフェースができており、ネットワークに接続できればOK。iwconfigコマンドで無線インタフェースの状態を確認できる。

  
lo no wireless extensions.

eth0 no wireless extensions.

wlan0 IEEE 802.11bgn ESSID:"aterm-xxxxxx-g" Nickname:"<WIFI@REALTEK>"
            
Mode:Managed Frequency:2.412 GHz Access Point: xx:xx:xx:xx:xx:xx
            
Bit Rate:150 Mb/s Sensitivity:0/0
            
Retry:off RTS thr:off Fragment thr:off
            
Power Management:off
            
Link Quality=47/100 Signal level=47/100 Noise level=0/100
            
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
            
Tx excessive retries:0 Invalid misc:0 Missed beacon:0