Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

استعلامات شائعة لإدارة الوصول

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

المستخدم المسؤول

تتضمن خدمات ClickHouse Cloud مستخدمًا مسؤولًا باسم default يُنشأ عند إنشاء الخدمة. وتُحدَّد كلمة المرور عند إنشاء الخدمة، ويمكن لمستخدمي ClickHouse Cloud الذين لديهم دور Admin إعادة تعيينها.

عند إضافة مستخدمين إضافيين لـ SQL إلى خدمة ClickHouse Cloud الخاصة بك، فسيحتاجون إلى اسم مستخدم وكلمة مرور لـ SQL. وإذا أردت منحهم امتيازات بمستوى إداري، فعيّن للمستخدمين الجدد الدور default_role. على سبيل المثال، لإضافة المستخدم clickhouse_admin:

CREATE USER IF NOT EXISTS clickhouse_admin
IDENTIFIED WITH sha256_password BY 'P!@ssword42!';
GRANT default_role TO clickhouse_admin;

المصادقة بدون كلمة مرور

يتوفر دوران في SQL Console: sql_console_admin بأذونات مطابقة لـ default_role، وsql_console_read_only بأذونات للقراءة فقط.

يُسنَد الدور sql_console_admin إلى مستخدمي Admin افتراضيًا، لذا لا يتغير شيء بالنسبة إليهم. ومع ذلك، يتيح الدور sql_console_read_only منح المستخدمين غير المشرفين حق وصول للقراءة فقط أو حق وصول كامل إلى أي مثيل. ويجب على مستخدم Admin تهيئة هذا الوصول. ويمكن تعديل الأدوار باستخدام الأمرين GRANT وREVOKE لتلائم متطلبات كل مثيل بشكل أفضل، كما ستُحفَظ أي تعديلات تُجرى على هذه الأدوار.

التحكم الدقيق في الوصول

يمكن أيضًا تهيئة وظيفة التحكم في الوصول هذه يدويًا بدقة على مستوى كل مستخدم. قبل إسناد أدوار sql_console_* الجديدة إلى المستخدمين، يجب إنشاء أدوار قاعدة البيانات الخاصة بمستخدمي SQL Console التي تطابق مساحة الاسم sql-console-role:<email>. على سبيل المثال:

CREATE ROLE OR REPLACE sql-console-role:<email>;
GRANT <some grants> TO sql-console-role:<email>;

عند اكتشاف دور مطابق، سيُسنَد إلى المستخدم بدلًا من الأدوار الافتراضية الجاهزة. يتيح ذلك إعدادات أكثر تعقيدًا للتحكم في الوصول، مثل إنشاء أدوار مثل sql_console_sa_role وsql_console_pm_role، ومنحها لمستخدمين محددين. على سبيل المثال:

CREATE ROLE OR REPLACE sql_console_sa_role;
GRANT <whatever level of access> TO sql_console_sa_role;
CREATE ROLE OR REPLACE sql_console_pm_role;
GRANT <whatever level of access> TO sql_console_pm_role;
CREATE ROLE OR REPLACE `sql-console-role:christoph@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:jake@clickhouse.com`;
CREATE ROLE OR REPLACE `sql-console-role:zach@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:christoph@clickhouse.com`;
GRANT sql_console_sa_role to `sql-console-role:jake@clickhouse.com`;
GRANT sql_console_pm_role to `sql-console-role:zach@clickhouse.com`;

اختبر امتيازات المسؤول

سجّل الخروج من المستخدم default ثم سجّل الدخول مرة أخرى باستخدام المستخدم clickhouse_admin.

يجب أن ينجح كل ما يلي:

SHOW GRANTS FOR clickhouse_admin;
CREATE DATABASE db1
CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc');
SELECT * FROM db1.table1;
DROP TABLE db1.table1;
DROP DATABASE db1;

المستخدمون غير المشرفين

يجب أن يمتلك المستخدمون الامتيازات اللازمة، وألا يكونوا جميعًا من مستخدمي مسؤول. ويعرض باقي هذا المستند سيناريوهات توضيحية والأدوار المطلوبة.

التحضير

أنشئ الجداول والمستخدمين التالية لاستخدامها في الأمثلة.

إنشاء قاعدة بيانات وجدول وصفوف تجريبية

إنشاء قاعدة بيانات اختبار

CREATE DATABASE db1;

إنشاء جدول

CREATE TABLE db1.table1 (
   id UInt64,
   column1 String,
   column2 String
)
ENGINE MergeTree
ORDER BY id;

إدراج صفوف تجريبية في الجدول

INSERT INTO db1.table1
   (id, column1, column2)
VALUES
   (1, 'A', 'abc'),
   (2, 'A', 'def'),
   (3, 'B', 'abc'),
   (4, 'B', 'def');

التحقق من الجدول

استعلامsql
SELECT *
FROM db1.table1
الاستجابةresponse
Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49

┌─id─┬─column1─┬─column2─┐
│  1 │ A       │ abc     │
│  2 │ A       │ def     │
│  3 │ B       │ abc     │
│  4 │ B       │ def     │
└────┴─────────┴─────────┘

[object Object]

أنشئ مستخدمًا عاديًا سيُستخدم لتوضيح تقييد الوصول إلى أعمدة معيّنة:

CREATE USER column_user IDENTIFIED BY 'password';

[object Object]

أنشئ مستخدمًا عاديًا سيُستخدم لتوضيح تقييد الوصول إلى الصفوف ذات القيم المعيّنة:

CREATE USER row_user IDENTIFIED BY 'password';

إنشاء الأدوار

باستخدام هذه المجموعة من الأمثلة:

  • سيتم إنشاء أدوار لامتيازات مختلفة، مثل الأعمدة والصفوف
  • سيتم منح الامتيازات لهذه الأدوار
  • سيتم إسناد المستخدمين إلى كل دور

تُستخدم الأدوار لتحديد مجموعات من المستخدمين ذوي امتيازات معيّنة، بدلًا من إدارة كل مستخدم على حدة.

[object Object]

CREATE ROLE column1_users;

[object Object]

GRANT SELECT(id, column1) ON db1.table1 TO column1_users;

[object Object]

GRANT column1_users TO column_user;

[object Object]

CREATE ROLE A_rows_users;

[object Object]

GRANT A_rows_users TO row_user;

[object Object]

CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users;

اضبط امتيازات قاعدة البيانات والجدول

GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users;

امنح أذونات صريحة للأدوار الأخرى حتى تظل قادرة على الوصول إلى جميع الصفوف

CREATE ROW POLICY allow_other_users_filter 
ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users;

التحقق

اختبار امتيازات الدور باستخدام مستخدم مقيّد بالأعمدة

[object Object]

clickhouse-client --user clickhouse_admin --password password

تحقّق من إمكانية الوصول إلى قاعدة البيانات والجدول وجميع الصفوف باستخدام المستخدم المسؤول.

SELECT *
FROM db1.table1
Query id: f5e906ea-10c6-45b0-b649-36334902d31d

┌─id─┬─column1─┬─column2─┐
│  1 │ A       │ abc     │
│  2 │ A       │ def     │
│  3 │ B       │ abc     │
│  4 │ B       │ def     │
└────┴─────────┴─────────┘

[object Object]

clickhouse-client --user column_user --password password

[object Object]

SELECT *
FROM db1.table1
Query id: 5576f4eb-7450-435c-a2d6-d6b49b7c4a23

0 rows in set. Elapsed: 0.006 sec.

Received exception from server (version 22.3.2):
Code: 497. DB::Exception: Received from localhost:9000. 
DB::Exception: column_user: Not enough privileges. 
To execute this query it's necessary to have grant 
SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)

[object Object]

SELECT
    id,
    column1
FROM db1.table1
Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9

┌─id─┬─column1─┐
│  1 │ A       │
│  2 │ A       │
│  3 │ B       │
│  4 │ B       │
└────┴─────────┘

اختبار امتيازات الدور باستخدام مستخدم مقيَّد على مستوى الصفوف

[object Object]

clickhouse-client --user row_user --password password

اعرض الصفوف المتاحة

SELECT *
FROM db1.table1
Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb

┌─id─┬─column1─┬─column2─┐
│  1 │ A       │ abc     │
│  2 │ A       │ def     │
└────┴─────────┴─────────┘

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

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

على سبيل المثال، إذا كان role1 يتيح فقط تنفيذ SELECT على column1 وكان role2 يتيح تنفيذ SELECT على column1 وcolumn2، فسيكون لدى المستخدم حق الوصول إلى كلا العمودين.

باستخدام حساب مسؤول، أنشئ مستخدمًا جديدًا لتقييد الوصول حسب الصف والعمود مع أدوار افتراضية

CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users;

[object Object]

REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users;

[object Object]

GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users;

[object Object]

clickhouse-client --user row_and_column_user --password password;

اختبر باستخدام جميع الأعمدة:

SELECT *
FROM db1.table1
Query id: 8cdf0ff5-e711-4cbe-bd28-3c02e52e8bc4

0 rows in set. Elapsed: 0.005 sec.

Received exception from server (version 22.3.2):
Code: 497. DB::Exception: Received from localhost:9000. 
DB::Exception: row_and_column_user: Not enough privileges. 
To execute this query it's necessary to have grant 
SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED)

اختبر باستخدام الأعمدة المسموح بها فقط:

SELECT
    id,
    column1
FROM db1.table1
Query id: 5e30b490-507a-49e9-9778-8159799a6ed0

┌─id─┬─column1─┐
│  1 │ A       │
│  2 │ A       │
└────┴─────────┘

استكشاف الأخطاء وإصلاحها

قد تتداخل الامتيازات أو تجتمع أحيانًا فتؤدي إلى نتائج غير متوقعة، ويمكن استخدام الأوامر التالية لحصر المشكلة باستخدام حساب مسؤول

عرض الامتيازات والأدوار الخاصة بمستخدم

SHOW GRANTS FOR row_and_column_user
Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b

┌─GRANTS FOR row_and_column_user───────────────────────────┐
│ GRANT A_rows_users, column1_users TO row_and_column_user │
└──────────────────────────────────────────────────────────┘

عرض الأدوار في ClickHouse

SHOW ROLES
Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a

┌─name────────────┐
│ A_rows_users    │
│ column1_users   │
└─────────────────┘

عرض السياسات

SHOW ROW POLICIES
Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc

┌─name───────────────────────────────────┐
│ A_row_filter ON db1.table1             │
│ allow_other_users_filter ON db1.table1 │
└────────────────────────────────────────┘

الاطلاع على كيفية تعريف سياسة ما والامتيازات الحالية

SHOW CREATE ROW POLICY A_row_filter ON db1.table1
Query id: 0d3b5846-95c7-4e62-9cdd-91d82b14b80b

┌─CREATE ROW POLICY A_row_filter ON db1.table1────────────────────────────────────────────────┐
│ CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

أوامر نموذجية لإدارة الأدوار والسياسات والمستخدمين

تُستخدم الأوامر التالية من أجل:

  • حذف الامتيازات
  • حذف السياسات
  • إلغاء تعيين المستخدمين من الأدوار
  • حذف المستخدمين والأدوار

سحب امتياز من دور

REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users;

حذف سياسة

DROP ROW POLICY A_row_filter ON db1.table1;

إزالة مستخدم من دور

REVOKE A_rows_users FROM row_user;

حذف دور

DROP ROLE A_rows_users;

حذف مستخدم

DROP USER row_user;

الملخص

استعرضت هذه المقالة أساسيات إنشاء مستخدمي SQL والأدوار، وقدّمت خطوات لتعيين الامتيازات للمستخدمين والأدوار وتعديلها. ولمزيد من التفاصيل حول كل منها، يُرجى الرجوع إلى أدلة المستخدم والوثائق المرجعية لدينا.

Navigation