الانتقال إلى المحتوى الرئيسي
يدعم ClickHouse إدارة التحكم في الوصول استنادًا إلى نموذج RBAC. كيانات الوصول في ClickHouse: يمكنك تهيئة كيانات الوصول باستخدام: نوصي باستخدام سير العمل المعتمد على SQL. تعمل طريقتا التهيئة كلتاهما في الوقت نفسه، لذا إذا كنت تستخدم ملفات تهيئة الخادم لإدارة الحسابات وحقوق الوصول، فيمكنك الانتقال بسلاسة إلى سير العمل المعتمد على SQL.
لا يمكنك إدارة كيان الوصول نفسه باستخدام طريقتَي التهيئة كلتيهما في الوقت نفسه.
إذا كنت تبحث عن إدارة مستخدمي ClickHouse Cloud console، فيُرجى الرجوع إلى هذه الصفحة
لعرض جميع المستخدمين والأدوار وملفات التعريف وما إلى ذلك، وكذلك جميع الامتيازات الممنوحة لها، استخدم عبارة SHOW ACCESS.

نظرة عامة

يوفّر خادم ClickHouse افتراضيًا حساب المستخدم default، ولا يُسمح لهذا الحساب باستخدام التحكم في الوصول وإدارة الحسابات المعتمدَين على SQL، لكنه يملك جميع الحقوق والأذونات. ويُستخدم حساب المستخدم default في كل الحالات التي لا يكون فيها اسم المستخدم محددًا، مثلًا عند تسجيل الدخول من العميل أو في الاستعلامات الموزعة. وفي معالجة الاستعلامات الموزعة، يُستخدم حساب المستخدم default إذا لم يحدّد إعداد الخادم أو العنقود الخاصيتين user and password. إذا كنت قد بدأت للتو في استخدام ClickHouse، فضع في اعتبارك السيناريو التالي:
  1. فعّل التحكم في الوصول وإدارة الحسابات المعتمدَين على SQL للمستخدم default.
  2. سجّل الدخول إلى حساب المستخدم default وأنشئ جميع المستخدمين المطلوبين. ولا تنسَ إنشاء حساب مسؤول (GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION).
  3. قيّد الأذونات للمستخدم default، وعطّل له التحكم في الوصول وإدارة الحسابات المعتمدَين على SQL.

خصائص الحل الحالي

  • يمكنك منح أذونات لقواعد البيانات والجداول حتى إن لم تكن موجودة.
  • إذا حُذف جدول، فلن تُسحب الامتيازات المرتبطة به. وهذا يعني أنه حتى إذا أنشأت لاحقًا جدولًا جديدًا بالاسم نفسه، فستظل جميع الامتيازات سارية. ولسحب الامتيازات المرتبطة بالجدول المحذوف، عليك تنفيذ الاستعلام REVOKE ALL PRIVILEGES ON db.table FROM ALL، على سبيل المثال.
  • لا توجد إعدادات لمدة صلاحية الامتيازات.

حساب مستخدم

حساب المستخدم هو كيان وصول يتيح تخويل شخص ما في ClickHouse. ويحتوي حساب المستخدم على:
  • معلومات التعريف.
  • الامتيازات التي تحدد نطاق الاستعلامات التي يمكن للمستخدم تنفيذها.
  • المضيفون المسموح لهم بالاتصال بخادم ClickHouse.
  • الأدوار المعيّنة والدور الافتراضي.
  • الإعدادات والقيود المُطبَّقة عليها افتراضيًا عند تسجيل دخول المستخدم.
  • ملفات تعريف الإعدادات المعيّنة.
يمكن منح الامتيازات لحساب مستخدم باستخدام استعلام GRANT أو من خلال تعيين الأدوار. ولسحب الامتيازات من مستخدم، يوفّر ClickHouse استعلام REVOKE. ولسرد امتيازات مستخدم، استخدم العبارة SHOW GRANTS. استعلامات الإدارة:

تطبيق الإعدادات

يمكن تهيئة الإعدادات بطرق مختلفة: لحساب مستخدم، وفي الأدوار الممنوحة له، وفي ملفات تعريف الإعدادات. عند تسجيل دخول المستخدم، إذا كان إعداد ما مهيّأً لكيانات وصول مختلفة، فستُطبَّق قيمة هذا الإعداد وقيوده على النحو التالي (من الأعلى إلى الأدنى أولوية):
  1. إعدادات حساب المستخدم.
  2. إعدادات الأدوار الافتراضية لحساب المستخدم. إذا كان إعداد ما مهيّأً في بعض الأدوار، فسيكون ترتيب تطبيق الإعداد غير محدد.
  3. الإعدادات من ملفات تعريف الإعدادات المعيّنة لمستخدم أو لأدواره الافتراضية. إذا كان إعداد ما مهيّأً في بعض ملفات التعريف، فسيكون ترتيب تطبيق الإعداد غير محدد.
  4. الإعدادات المطبقة على الخادم بأكمله افتراضيًا أو من ملف التعريف الافتراضي.

الدور

الدور هو حاوية لكيانات الوصول يمكن منحها إلى حساب مستخدم. يحتوي الدور على: استعلامات الإدارة: يمكن منح الامتيازات إلى الدور باستخدام استعلام GRANT. ولسحب الامتيازات من دور، يوفّر ClickHouse استعلام REVOKE.

سياسة الصفوف

‏سياسة الصفوف هي عامل تصفية يحدّد الصفوف المتاحة لمستخدم أو Role. وتحتوي سياسة الصفوف على عوامل تصفية لجدول معيّن، بالإضافة إلى قائمة بالأدوار و/أو المستخدمين الذين ينبغي أن تنطبق عليهم سياسة الصفوف هذه.
لا تكون سياسات الصفوف ذات جدوى إلا إذا كانت لديك صلاحية readonly فقط. فإذا كان بإمكانك تعديل table أو نسخ partitions بين tables، فإن ذلك يُلغي القيود التي تفرضها سياسات الصفوف.
استعلامات الإدارة:

ملف تعريف الإعدادات

ملف تعريف الإعدادات هو مجموعة من الإعدادات. ويحتوي على إعدادات وقيود، بالإضافة إلى قائمة بالأدوار و/أو المستخدمين الذين يُطبَّق عليهم هذا الملف. استعلامات الإدارة:

الحصة

تحدّ الحصة من استخدام الموارد. راجع الحصص. تتضمن الحصة مجموعة من الحدود لفترات زمنية معيّنة، بالإضافة إلى قائمة بالأدوار و/أو المستخدمين الذين ينبغي أن يستخدموا هذه الحصة. استعلامات الإدارة:

تمكين التحكم في الوصول وإدارة الحسابات المعتمدين على SQL

  • أنشئ دليلاً لتخزين ملفات التهيئة. يخزّن ClickHouse تهيئات كيانات التحكم في الوصول في المجلد المحدد في مَعلَمة إعداد الخادم access_control_path.
  • فعّل التحكم في الوصول وإدارة الحسابات المعتمدين على SQL لحساب مستخدم واحد على الأقل. يكون التحكم في الوصول وإدارة الحسابات المعتمدان على SQL معطّلين افتراضيًا لجميع المستخدمين. تحتاج إلى تهيئة مستخدم واحد على الأقل في ملف التهيئة users.xml، وتعيين قيم الإعدادات access_management وnamed_collection_control وshow_named_collections وshow_named_collections_secrets إلى 1.

تعريف مستخدمي SQL والأدوار

إذا كنت تستخدم ClickHouse Cloud، فيُرجى الرجوع إلى إدارة الوصول إلى Cloud.
توضح هذه المقالة أساسيات تعريف مستخدمي SQL والأدوار، وتطبيق هذه الامتيازات والأذونات على قواعد البيانات والجداول والصفوف والأعمدة.

تمكين وضع مستخدم SQL

  1. فعِّل وضع مستخدم SQL في ملف users.xml ضمن المستخدم <default>:
    <access_management>1</access_management>
    <named_collection_control>1</named_collection_control>
    <show_named_collections>1</show_named_collections>
    <show_named_collections_secrets>1</show_named_collections_secrets>
    
المستخدم default هو المستخدم الوحيد الذي يتم إنشاؤه عند إجراء تثبيت جديد، وهو أيضًا الحساب المستخدم افتراضيًا للاتصال بين العقد.في بيئة production، يُنصح بتعطيل هذا المستخدم بعد تهيئة الاتصال بين العقد باستخدام مستخدم SQL مسؤول، وبعد ضبط الاتصال بين العقد باستخدام <secret> وبيانات اعتماد العنقود و/أو بيانات اعتماد بروتوكول HTTP وبروتوكول النقل الخاصة بالاتصال بين العقد، لأن الحساب default يُستخدم لهذا الغرض.
  1. أعد تشغيل العقد لتطبيق التغييرات.
  2. شغِّل عميل ClickHouse:
    clickhouse-client --user default --password <password>
    

تعريف المستخدمين

  1. أنشئ حساب مسؤول في SQL:
    CREATE USER clickhouse_admin IDENTIFIED BY 'password';
    
  2. امنح المستخدم الجديد كامل الصلاحيات الإدارية
    GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION;
    

أذونات ALTER

تهدف هذه المقالة إلى تزويدك بفهم أوضح لكيفية تحديد الأذونات، وكيف تعمل الأذونات عند استخدام عبارات ALTER للمستخدمين ذوي الامتيازات. تنقسم عبارات ALTER إلى عدة فئات، بعضها هرمي وبعضها الآخر ليس كذلك، ويجب تحديده صراحةً. مثال على إعداد DB وtable وUSER
  1. باستخدام مستخدم Admin، أنشئ مستخدمًا نموذجيًا
CREATE USER my_user IDENTIFIED BY 'password';
  1. أنشئ قاعدة بيانات تجريبية
CREATE DATABASE my_db;
  1. أنشئ جدولًا للعينة
CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
  1. أنشئ مستخدم مسؤول تجريبيًا لمنح الامتيازات وسحبها
CREATE USER my_alter_admin IDENTIFIED BY 'password';
لمنح الأذونات أو سحبها، يجب أن يمتلك المستخدم المسؤول امتياز WITH GRANT OPTION. على سبيل المثال:
GRANT ALTER ON my_db.* WITH GRANT OPTION
لتنفيذ GRANT أو REVOKE للامتيازات، يجب أن يكون المستخدم ممتلكًا لهذه الامتيازات مسبقًا.
منح الامتيازات أو سحبها التسلسل الهرمي لـ ALTER:
├── ALTER (only for table and view)/
│   ├── ALTER TABLE/
│   │   ├── ALTER UPDATE
│   │   ├── ALTER DELETE
│   │   ├── ALTER COLUMN/
│   │   │   ├── ALTER ADD COLUMN
│   │   │   ├── ALTER DROP COLUMN
│   │   │   ├── ALTER MODIFY COLUMN
│   │   │   ├── ALTER COMMENT COLUMN
│   │   │   ├── ALTER CLEAR COLUMN
│   │   │   └── ALTER RENAME COLUMN
│   │   ├── ALTER INDEX/
│   │   │   ├── ALTER ORDER BY
│   │   │   ├── ALTER SAMPLE BY
│   │   │   ├── ALTER ADD INDEX
│   │   │   ├── ALTER DROP INDEX
│   │   │   ├── ALTER MATERIALIZE INDEX
│   │   │   └── ALTER CLEAR INDEX
│   │   ├── ALTER CONSTRAINT/
│   │   │   ├── ALTER ADD CONSTRAINT
│   │   │   └── ALTER DROP CONSTRAINT
│   │   ├── ALTER TTL/
│   │   │   └── ALTER MATERIALIZE TTL
│   │   ├── ALTER SETTINGS
│   │   ├── ALTER MOVE PARTITION
│   │   ├── ALTER FETCH PARTITION
│   │   └── ALTER FREEZE PARTITION
│   └── ALTER LIVE VIEW/
│       ├── ALTER LIVE VIEW REFRESH
│       └── ALTER LIVE VIEW MODIFY QUERY
├── ALTER DATABASE
├── ALTER USER
├── ALTER ROLE
├── ALTER QUOTA
├── ALTER [ROW] POLICY
└── ALTER [SETTINGS] PROFILE
  1. منح امتيازات ALTER لمستخدم أو دور
إن استخدام GRANT ALTER on *.* TO my_user يؤثر فقط في أوامر ALTER TABLE وALTER VIEW على المستوى الأعلى، أما عبارات ALTER الأخرى فيجب منحها أو revokeها بشكل منفصل. على سبيل المثال، منح امتياز ALTER الأساسي:
GRANT ALTER ON my_db.my_table TO my_user;
مجموعة الامتيازات الناتجة:
SHOW GRANTS FOR  my_user;
SHOW GRANTS FOR my_user

Query id: 706befbc-525e-4ec1-a1a2-ba2508cc09e3

┌─GRANTS FOR my_user───────────────────────────────────────────┐
│ GRANT ALTER TABLE, ALTER VIEW ON my_db.my_table TO my_user   │
└──────────────────────────────────────────────────────────────┘
سيؤدي ذلك إلى منح جميع الأذونات ضمن ALTER TABLE وALTER VIEW في المثال أعلاه، لكنه لن يمنح بعض أذونات ALTER الأخرى مثل ALTER ROW POLICY (ارجع إلى التسلسل الهرمي وسترى أن ALTER ROW POLICY ليس تابعًا لـ ALTER TABLE أو ALTER VIEW). ويجب منح هذه الأذونات أو إلغاؤها صراحةً. إذا كانت هناك حاجة إلى مجموعة فرعية فقط من أذونات ALTER، فيمكن منح كل إذن منها بشكل منفصل، وإذا كانت لذلك الإذن امتيازات فرعية فستُمنح تلقائيًا أيضًا. على سبيل المثال:
GRANT ALTER COLUMN ON my_db.my_table TO my_user;
تُعيَّن الامتيازات كما يلي:
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user

Query id: 47b3d03f-46ac-4385-91ec-41119010e4e2

┌─GRANTS FOR my_user────────────────────────────────┐
│ GRANT ALTER COLUMN ON default.my_table TO my_user │
└───────────────────────────────────────────────────┘

1 row in set. Elapsed: 0.004 sec.
يمنح هذا أيضاً الصلاحيات الفرعية التالية:
ALTER ADD COLUMN
ALTER DROP COLUMN
ALTER MODIFY COLUMN
ALTER COMMENT COLUMN
ALTER CLEAR COLUMN
ALTER RENAME COLUMN
  1. إلغاء امتيازات ALTER من المستخدمين والأدوار
تعمل عبارة REVOKE بطريقة مشابهة لعبارة GRANT. إذا مُنح مستخدم/دور صلاحيةً فرعية، فيمكنك إما سحب تلك الصلاحية الفرعية مباشرةً، أو سحب الصلاحية ذات المستوى الأعلى التي تنبثق منها. على سبيل المثال، إذا مُنحت للمستخدم صلاحية ALTER ADD COLUMN
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user

Query id: 61fe0fdc-1442-4cd6-b2f3-e8f2a853c739

Ok.

0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user

Query id: 27791226-a18f-46c8-b2b4-a9e64baeb683

┌─GRANTS FOR my_user──────────────────────────────────┐
│ GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user │
└─────────────────────────────────────────────────────┘
يمكن إلغاء الصلاحية بشكل منفرد:
REVOKE ALTER ADD COLUMN ON my_db.my_table FROM my_user;
أو يمكن سحبها من أيٍّ من المستويات الأعلى (سحب جميع الصلاحيات الفرعية لـ COLUMN):
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user;
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user

Query id: b882ba1b-90fb-45b9-b10f-3cda251e2ccc

Ok.

0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user

Query id: e7d341de-de65-490b-852c-fa8bb8991174

Ok.

0 rows in set. Elapsed: 0.003 sec.
إضافي يجب أن تُمنح الصلاحيات من قِبَل مستخدم يمتلك WITH GRANT OPTION والصلاحيات ذاتها في آنٍ واحد.
  1. لمنح مستخدم Admin صلاحيةً، والسماح له أيضًا بإدارة مجموعة من الصلاحيات فيما يلي مثال:
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
يمكن للمستخدم الآن منح أو سحب ALTER COLUMN وجميع الامتيازات الفرعية. الاختبار
  1. أضِف امتياز SELECT
 GRANT SELECT ON my_db.my_table TO my_user;
  1. أضِف للمستخدم امتياز إضافة عمود
GRANT ADD COLUMN ON my_db.my_table TO my_user;
  1. سجّل الدخول باستخدام المستخدم محدود الصلاحيات
clickhouse-client --user my_user --password password --port 9000 --host <your_clickhouse_host>
  1. اختبر إضافة عمود
ALTER TABLE my_db.my_table ADD COLUMN column2 String;
ALTER TABLE my_db.my_table
    ADD COLUMN `column2` String

Query id: d5d6bfa1-b80c-4d9f-8dcd-d13e7bd401a5

Ok.

0 rows in set. Elapsed: 0.010 sec.
DESCRIBE my_db.my_table;
DESCRIBE TABLE my_db.my_table

Query id: ab9cb2d0-5b1a-42e1-bc9c-c7ff351cb272

┌─name────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id      │ UInt64 │              │                    │         │                  │                │
│ column1 │ String │              │                    │         │                  │                │
│ column2 │ String │              │                    │         │                  │                │
└─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
  1. اختبر حذف عمود
ALTER TABLE my_db.my_table DROP COLUMN column2;
ALTER TABLE my_db.my_table
    DROP COLUMN column2

Query id: 50ad5f6b-f64b-4c96-8f5f-ace87cea6c47

0 rows in set. Elapsed: 0.004 sec.

Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_user: Not enough privileges. To execute this query it's necessary to have grant ALTER DROP COLUMN(column2) ON my_db.my_table. (ACCESS_DENIED)
  1. اختبار alter admin من خلال منح هذا الإذن
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
  1. سجّل الدخول باستخدام حساب المستخدم alter admin
clickhouse-client --user my_alter_admin --password password --port 9000 --host <my_clickhouse_host>
  1. امنح امتيازًا فرعيًا
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user

Query id: 1c7622fa-9df1-4c54-9fc3-f984c716aeba

Ok.
  1. اختبر منح امتياز لا يملكه مستخدم alter admin، وليس امتيازًا فرعيًا ضمن الامتيازات الممنوحة لمستخدم admin.
GRANT ALTER UPDATE ON my_db.my_table TO my_user;
GRANT ALTER UPDATE ON my_db.my_table TO my_user

Query id: 191690dc-55a6-4625-8fee-abc3d14a5545

0 rows in set. Elapsed: 0.004 sec.

Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_alter_admin: Not enough privileges. To execute this query it's necessary to have grant ALTER UPDATE ON my_db.my_table WITH GRANT OPTION. (ACCESS_DENIED)
الملخص تتبع امتيازات ALTER بنية هرمية عند استخدام ALTER مع الجداول والعروض، لكنها لا تكون كذلك مع تعليمات ALTER الأخرى. يمكن تعيين الأذونات على مستوى تفصيلي أو عبر تجميع الأذونات، كما يمكن سحبها بالطريقة نفسها. يجب أن يمتلك المستخدم الذي يمنح الامتيازات أو يسحبها WITH GRANT OPTION لكي يعيّن الامتيازات للمستخدمين، بما في ذلك المستخدم المنفّذ نفسه، ويجب أيضًا أن يكون الامتياز نفسه ممنوحًا له مسبقًا. ولا يمكن للمستخدم المنفّذ سحب امتيازاته الخاصة إذا لم يكن يمتلك بنفسه امتياز WITH GRANT OPTION.
آخر تعديل في ٢٩ يونيو ٢٠٢٦