2

user@host と mysql.db テーブルの表示許可の違いを発見しました。どうしてこれなの?

どうすればこれを解決できますか? セキュリティが心配です。

mysql.users のユーザーに対して show grants を実行しました。mysql.users では、ユーザーは user@xxx.xxx.xxx.xx であり、show grants を実行すると GRANT USAGE TO user@xxx.xxx.xxx.xx と表示されます

このユーザーもデータベースにアクセスできるように見えるので、これは私を心配させました。

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     |
+----------+------------+------------+
4

1 に答える 1

2

心配しないで。

このmysql.user表は、すべてのデータベースに対する特定のグローバル特権を軽減します。

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

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

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

コメントに基づく例を次に示します

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

GRANT USAGEを使用すると、認証に関係するMD5パスワードを知ることができます(パスワードが空白でない場合)。advdbは任意のIPアドレスからログインでき、advertproデータベースにのみアクセスできることに注意してください。

他のプロセスに属するプロセスも含め、プロセスリスト内のすべてのプロセスをユーザーに表示させない限り、ユーザーはPROCESS特権を必要としません。

ユーザーに読み取り専用のmysqlインスタンスへの書き込み、レプリケーションの開始と停止、バイナリログのザップなどを行わせない限り、ユーザーはSUPER権限を必要としません。

OSコマンドラインユーザーであるmysqladminクライアントプログラムからmysqlをシャットダウンする必要がない限り、ユーザーはSHUTDOWN権限を必要としません。

探しているprivをコピーするには、

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

OK、それをハックしましょう:

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

これはそれが必要です!!!

MySQL GrantsをSQLにダンプするには、次のことができます。pt-show-grantspt-show-grants を使用してmysqlGrantsを移植する方がはるかに優れています。

これがpt-show-grantsが行うことの私の個人的なエミュレーションです

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
于 2012-02-08T22:23:31.700 に答える