it-swarm.asia

كيفية منح امتياز سوبر للمستخدم؟

لقد قمت بإنشاء مستخدم ومنح امتيازات للمستخدم 1.

`grant all privileges on db1.* to [email protected]'%' with grant option;

أستخدم منضدة mysql لاستيراد مقالب إلى قاعدة بياناتي. أثناء استيراد مقالب لقاعدة البيانات db1 ، يحدث خطأ يفيد ذلك

ERROR 1227 (42000) at line 49: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

في هذا التفريغ ، يتم استيراد جميع الجداول بنجاح ولكن يحدث الخطأ أثناء استيراد الإجراءات إلى قاعدة البيانات. هل هناك أي خطأ في الامتياز الذي منحته للمستخدم 1؟ من فضلك النصيحة.

46
delete my account

بالمعنى الصحيح سياسيا ، ما طلبته للتو هو مستحيل. لماذا ا ؟

امتياز SUPER هو امتياز عام ، وليس امتيازًا على مستوى قاعدة البيانات.

عندما قمت بإنشاء المستخدم مع

grant all privileges on db1.* to [email protected]'%' with grant option;

ملأتم الجدول mysql.user مع المستخدم = user1 والمضيف = '٪'. تم تعيين كافة الأعمدة الأخرى (الامتيازات العامة) افتراضيًا على "N". أحد هذه الأعمدة هو Super_priv. هنا الجدول:

mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
| password_expired       | enum('N','Y')                     | NO   |     | N       |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
43 rows in set (0.00 sec)

mysql>

Super_priv يظهر مباشرة بعد Show_db_priv.

تم الحصول على امتيازات مستوى قاعدة البيانات في mysql.db. هاهو:

mysql> desc mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
| Drop_priv             | enum('N','Y') | NO   |     | N       |       |
| Grant_priv            | enum('N','Y') | NO   |     | N       |       |
| References_priv       | enum('N','Y') | NO   |     | N       |       |
| Index_priv            | enum('N','Y') | NO   |     | N       |       |
| Alter_priv            | enum('N','Y') | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y') | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y') | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y') | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
| Event_priv            | enum('N','Y') | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.00 sec)

mysql>

لاحظ أن Super_priv غير موجود في mysql.db.

لتصور هذا بعبارات SQL البحتة ، قم بتسجيل الدخول باسم user1 وتشغيل SHOW GRANTS; سيكون الناتج خطين:

هناك محاولة اختراق يمكنك تجربتها ولكني عادةً لا أوصي بها.

الخطوة 01) قم بتسجيل الدخول إلى mysql على أنه root @ localhost (يجب أن يحتوي على جميع الحروف الخاصة)

الخطوة 02) قم بتشغيل هذا الاستعلام

UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND Host='%';

الخطوة 03) قم بتشغيل هذا الاستعلام

FLUSH PRIVILEGES;

يجب أن تعمل من الناحية النظرية. بعد ذلك ، قد يعمل user1 (لا أقدم أية ضمانات).

تحديث 2014-12-19 15:24 EST

ميتافانيل سألت للتو

شرح عظيم ، شكرا. ومع ذلك ، إذا كنت لا توصي بهذه الطريقة لحل المشكلة ، فما هي الطريقة الأخرى الأفضل لجلب مستخدم هذا Super_priv ؟؟ شكر! - ميتافانيل

نظرًا لأن المستخدم الذي لديه حق الوصول إلى قاعدة البيانات فقط لا يمكن أن يكون لديه SUPER ، فإن الشيء الوحيد الذي يمكن للمرء فعله هو تغيير DEFINER يدويًا في التفريغ. ستكون الفكرة الأساسية هي mysqldump الإجراءات وحدها إلى ملف نصي. ثم قم بتحرير المحدد إلى [email protected]'%'. بعد ذلك ، يجب أن تكون قادرًا على إعادة التحميل.

الشيء نفسه لوجهات النظر

37
RolandoMySQLDBA

كان لي نفس المشكلة بالضبط. ما فعلته هو:

GRANT SUPER ON *.* TO [email protected]

وتم حل المشكلة.

CAVEAT: هل هناك أي خطر في منح امتيازات فائقة للمستخدم؟

25
carla

قد يكون خطأ "تم رفض الوصول" أثناء عملية الاستيراد بسبب عدم تطابق الامتيازات بين المحددات بين قاعدة البيانات التي تم تصديرها وقاعدة البيانات التي سيتم استيرادها. واجهت نفس الموقف والأمر أدناه يعمل بشكل جيد بالنسبة لي لاستيراد قاعدة البيانات بنجاح.

cat db1.sql | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user1 -p db1
1
Muniraj