2012-02-08 5 views
1

user @ hostとmysql.dbテーブルのshow grantの違いを発見しました。どうしてこれなの?MySQL Show Grantsはmysql.dbとinfo_schema.schema_privilegesと異なります

どうすれば解決できますか?私たちはセキュリティが心配です。

私はmysql.usersのユーザーに対してショーグラントを実行しました。 mysql.usersではユーザは[email protected]であり、私がshow grantを実行すると、それは[email protected]に与えられます。

このユーザも私のことを心配していますデータベースにアクセスできます。

mysql.dbとinformation_schema.schema_privilegesを見ると、そのユーザーと同じユーザーがxxx.xxx。%のホストでそのデータベースにフルアクセスできることがわかります。

何がありますか?

編集 - 深い説明:

show grants for 'myuser'@'xxx.xxx.xxx.xxx'; 

それが返されます:

GRANT USAGE ON *.* TO 'myuser'@'xxx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxxx' 

私が実行している場合:

select host,db,user from mysql.db where user='myuser'; 

私が取得ここ

は、私が持っているものです。

+----------+------------+------------+ 
| host  | db   | user  | 
+----------+------------+------------+ 
|xxx.xxx.% | somedb  | myuser  | 
+----------+------------+------------+ 
+0

私の答えを更新しないものをPT-ショー助成金の私の個人的なエミュレーションです! – RolandoMySQLDBA

答えて

3

心配はいりません。

mysql.userテーブルは、すべてのデータベースの特定のグローバル特権を緩和します。

ユーザーが特定のデータベースに限定されている場合、mysql.dbテーブルにはデータベース固有の権限のみが表示されます。データベースに限定されたユーザーは、SUPER、PROCESS、SHUTDOWN、およびこれらのような権限は必要ありません。

グローバル権限を持つユーザーを作成して(つまり、ユーザーをmysql.userに配置する)、グローバル権限を取り消すことはできません。 REVOKEコマンドでこの操作を実行しようとすると、元のY値がすべての列にあり、同じユーザーがmysql.dbで、データベース固有の特権でY値を持つユーザーがmysql.userに表示されます。

完全にユーザーを削除し、より低い特権で新しいユーザーを作成する必要があります。ここで

は、GRANT USAGEのは、単にあなたが(パスワードが空白でない場合)、MD5のパスワードが認証に関与しているかを知ることができますコメント

mysql> show grants for [email protected]'%'; 
+-----------------------------------------------------------------------------+ 
| Grants for [email protected]%               | 
+-----------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'advdb'@'%' IDENTIFIED BY PASSWORD '................' | 
| GRANT ALL PRIVILEGES ON `advertpro`.* TO 'advdb'@'%'      | 
+-----------------------------------------------------------------------------+ 

に基づく一例です。 advdbは任意のIPアドレスからログインし、advertproデータベースにのみアクセスできます。

ユーザーは、プロセスリスト内のすべてのプロセス(他のプロセスに属しているプロセスも含む)を表示する場合を除き、PROCESS特権は必要ありません。

ユーザーは、読み取り専用のmysqlインスタンスへの書き込み、レプリケーションの開始と停止、バイナリログのzapやこれらのようなものを作成しない限り、SUPER特権は必要ありません。

ユーザは、OSコマンドラインユーザのmysqladminクライアントプログラムからmysqlをシャットダウンする場合を除き、SHUTDOWN特権は必要ありません。あなたが探しているPRIVをコピーするには

  • SHOW GRANTS FOR 'user'@'xxx.xxx.xxx.%';
  • コピー出力テキストファイルへ
  • 編集セミコロンを追加
  • をxxx.xxx.xxx.xxするホスト
  • 他のサーバーに貼り付けます。

OK let's h ack:

UPDATE mysql.db 
    SET host='xxx.xxx.xxx.xxx' 
    WHERE user='myuser' 
    AND host='xxx.xxx.%' 
    AND db='somedb'; 
FLUSH PRIVILEGES; 

これはすべきです!

SQLでMySQL Grantsをダンプするには、pt-show-grants pt-show-grantsを使用してmysqlグラントを移植する方がはるかに優れています。ここで

mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql 
+0

はい、しかし、私の質問は、 "表示許可"は、 "許可使用"を表示し、ユーザーはデータベースに対してすべての特権を持っているわけではありません。* – Alienz

+0

これは、特定のデータベースに限定されたユーザーに対しては正しいです。 – RolandoMySQLDBA

+0

GRANT USAGEとDB privの2つの行が表示されます – RolandoMySQLDBA

関連する問題