ON CLUSTER بإنشاء المستخدمين في العنقود، راجع DDL الموزّع.
تحديد الهوية
IDENTIFIED WITH no_passwordIDENTIFIED WITH plaintext_password BY 'qwerty'IDENTIFIED WITH sha256_password BY 'qwerty'orIDENTIFIED BY 'password'IDENTIFIED WITH sha256_hash BY 'hash'orIDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'IDENTIFIED WITH double_sha1_password BY 'qwerty'IDENTIFIED WITH double_sha1_hash BY 'hash'IDENTIFIED WITH bcrypt_password BY 'qwerty'IDENTIFIED WITH bcrypt_hash BY 'hash'IDENTIFIED WITH ldap SERVER 'server_name'IDENTIFIED WITH kerberosorIDENTIFIED WITH kerberos REALM 'realm'IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'IDENTIFIED WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa', KEY 'another_public_key' TYPE 'ssh-ed25519'IDENTIFIED WITH http SERVER 'http_server'orIDENTIFIED WITH http SERVER 'http_server' SCHEME 'basic'IDENTIFIED BY 'qwerty'
في ClickHouse Cloud، يجب أن تستوفي كلمات المرور، افتراضيًا، متطلبات التعقيد التالية:
- أن تتكون من 12 محرفًا على الأقل
- أن تحتوي على رقم واحد على الأقل
- أن تحتوي على حرف كبير واحد على الأقل
- أن تحتوي على حرف صغير واحد على الأقل
- أن تحتوي على رمز خاص واحد على الأقل
أمثلة
-
اسم الـ username التالي هو
name1ولا يتطلب كلمة مرور، وهو ما لا يوفر بطبيعة الحال قدرًا كبيرًا من الأمان: -
لتحديد كلمة مرور بنص واضح:
-
الخيار الأكثر شيوعًا هو استخدام كلمة مرور مُجزّأة باستخدام SHA-256. سيتولى ClickHouse تجزئة كلمة المرور نيابةً عنك عند تحديد
IDENTIFIED WITH sha256_password. على سبيل المثال:يمكن للمستخدمname3الآن تسجيل الدخول باستخدامmy_password، لكن كلمة المرور تُخزَّن على هيئة قيمة التجزئة المذكورة أعلاه. ويُنشأ ملف SQL التالي في/var/lib/clickhouse/accessويُنفَّذ عند بدء تشغيل الخادم:
-
لا تكون
double_sha1_passwordمطلوبة عادةً، لكنها تكون مفيدة عند العمل مع العملاء الذين يتطلبونها (مثل MySQL interface):يُنشئ ClickHouse الاستعلام التالي ويشغّله: -
يُعد
bcrypt_passwordالخيار الأكثر أمانًا لتخزين كلمات المرور. فهو يستخدم خوارزمية bcrypt، وهي مقاومة لهجمات القوة الغاشمة حتى إذا أصبحت قيمة تجزئة كلمة المرور compromised.يقتصر طول كلمة المرور في هذه الطريقة على 72 حرفًا. كما يمكن تعديل معلمة عامل العمل الخاصة بـ bcrypt، التي تحدد مقدار العمليات الحسابية والوقت اللازمين لحساب التجزئة والتحقق من كلمة المرور، في إعدادات الخادم:يجب أن تكون قيمة عامل العمل بين 4 و31، والقيمة الافتراضية هي 12.
-
يمكن أيضًا حذف نوع كلمة المرور:
في هذه الحالة، سيستخدم ClickHouse نوع كلمة المرور الافتراضي المحدد في إعدادات الخادم:أنواع كلمات المرور المتاحة هي:
plaintext_password,sha256_password,double_sha1_password. -
يمكن تحديد عدة طرق مصادقة:
- قد لا تدعم الإصدارات الأقدم من ClickHouse صيغة تعدد طرق المصادقة. لذلك، إذا كان خادم ClickHouse يحتوي على مستخدمين من هذا النوع ثم جرى الرجوع به إلى إصدار لا يدعم ذلك، فسيصبح هؤلاء المستخدمون غير قابلين للاستخدام وستتعطل بعض العمليات المرتبطة بالمستخدمين. ولإجراء الرجوع إلى إصدار أقدم بسلاسة، يجب ضبط جميع المستخدمين بحيث تكون لكل منهم طريقة مصادقة واحدة فقط قبل الرجوع إلى إصدار أقدم. وبدلاً من ذلك، إذا جرى الرجوع بالخادم إلى إصدار أقدم من دون اتباع الإجراء الصحيح، فيجب حذف المستخدمين المتأثرين.
- لا يمكن أن يتعايش
no_passwordمع طرق مصادقة أخرى لأسباب أمنية. لذلك، لا يمكنك تحديدno_passwordإلا إذا كانت طريقة المصادقة الوحيدة في الاستعلام.
مضيف المستخدم
HOST من الاستعلام بالطرق التالية:
HOST IP 'ip_address_or_subnetwork'— لا يمكن للمستخدم الاتصال بـ خادم ClickHouse إلا من عنوان IP المحدد أو من شبكة فرعية. أمثلة:HOST IP '192.168.0.0/16'،HOST IP '2001:DB8::/32'. للاستخدام في production، حدِّد عناصرHOST IPفقط (عناوين IP وأقنعتها)، لأن استخدامhostوhost_regexpقد يسبب latency إضافيًا.HOST ANY— يمكن للمستخدم الاتصال من أي موقع. وهذا هو الخيار الافتراضي.HOST LOCAL— لا يمكن للمستخدم الاتصال إلا محليًا.HOST NAME 'fqdn'— يمكن تحديد مضيف المستخدم بصيغة FQDN. على سبيل المثال،HOST NAME 'mysite.com'.HOST REGEXP 'regexp'— يمكنك استخدام التعبيرات النمطية pcre عند تحديد مضيفات المستخدمين. على سبيل المثال،HOST REGEXP '.*\.mysite\.com'.HOST LIKE 'template'— يتيح لك استخدام المعامل LIKE لتطبيق filter على مضيفات المستخدمين. على سبيل المثال،HOST LIKE '%'يكافئHOST ANY، بينما يقومHOST LIKE '%.mysite.com'بتصفية جميع المضيفات ضمن النطاقmysite.com.
@ بعد username. أمثلة:
CREATE USER mira@'127.0.0.1'— يكافئ صياغةHOST IP.CREATE USER mira@'localhost'— يكافئ صياغةHOST LOCAL.CREATE USER mira@'192.168.%.%'— يكافئ صياغةHOST LIKE.
عبارة VALID UNTIL
YYYY-MM-DD [hh:mm:ss] [timezone] للتاريخ والوقت، حيث يجب أن تكون [timezone] إزاحة رقمية مثل +09:00 أو إحدى القيم UTC أو GMT أو Z أو MSK أو MSD؛ ولا يتم التعرّف على مناطق IANA الزمنية المسمّاة مثل Asia/Tokyo (انظر الملاحظة أدناه). افتراضيًا، تساوي هذه المعلَمة 'infinity'. يتراوح الموعد النهائي المقبول من 1900-01-01 00:00:00 UTC إلى 9999-12-31 09:59:59 UTC — وهي أحدث لحظة تظل ضمن السنة 9999 في كل منطقة زمنية، لذا لا تُقيَّد اللحظة المخزنة عند عرضها. يعني الموعد النهائي الماضي أن بيانات الاعتماد منتهية الصلاحية بالفعل. لا تُقبل المواعيد النهائية السابقة لـ 1970-01-01 00:00:01 UTC إلا كوسم «منتهي الصلاحية بالفعل»: إذ تُحوَّل إلى التمثيل القياسي لأقدم لحظة منتهية الصلاحية، أي بعد ثانية واحدة من حقبة Unix (1970-01-01 00:00:01)، لذا يعرض SHOW CREATE USER تلك اللحظة بدلًا من الموعد النهائي الذي كتبته. أما المواعيد النهائية بدءًا من تلك اللحظة فتُخزَّن كما هي تمامًا.
يُخزَّن الموعد النهائي كلحظة مطلقة، لكن SHOW CREATE USER وsystem.users يعرضانه وفق المنطقة الزمنية للخادم أو الجلسة، لذا تظهر اللحظة المخزنة نفسها كنص وقت محلي مختلف على الخوادم ذات التهيئات المختلفة: فعلى سبيل المثال، تُعرض اللحظة المنتهية الصلاحية والمحوَّلة إلى التمثيل القياسي أعلاه كـ 1970-01-01 00:00:01 على خادم في UTC وكـ 1970-01-01 14:00:01 على خادم في Pacific/Kiritimati. يعتمد فرض القيود دائمًا على اللحظة المخزنة، وليس على طريقة عرضها.
يحدد موضع العبارة طرق المصادقة التي تنطبق عليها:
- قبل عبارة
IDENTIFIED(أو عندما لا يحدد الاستعلام أي طريقة مصادقة على الإطلاق): يكون الموعد النهائي على مستوى المستخدم وينطبق على جميع طرق مصادقة المستخدم. - بعد طريقة مصادقة: ينطبق الموعد النهائي على تلك الطريقة فقط. لذلك، فإن العبارة المكتوبة بعد قائمة
IDENTIFIEDكاملة ترتبط بالطريقة الأخيرة فقط، وتبقى الطرق السابقة دون انتهاء صلاحية.
CREATE USER name1 VALID UNTIL '2025-01-01'CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 UTC'CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 +09:00'CREATE USER name1 VALID UNTIL 'infinity'CREATE USER name1 VALID UNTIL '2025-01-01' IDENTIFIED WITH plaintext_password BY 'password_1', bcrypt_password BY 'password_2'— ينطبق الموعد النهائي على مستوى المستخدم على كلتا الطريقتين.CREATE USER name1 IDENTIFIED WITH plaintext_password BY 'no_expiration', bcrypt_password BY 'expiration_set' VALID UNTIL '2025-01-01'— ينطبق الموعد النهائي على طريقةbcrypt_passwordفقط؛ ولا تنتهي صلاحيةplaintext_passwordأبدًا.
تُحلَّل سلسلة التاريخ والوقت بواسطة
parseDateTimeBestEffort، التي لا تتعرّف إلا على رموز المناطق الزمنية UTC وGMT وZ وMSK وMSD، والإزاحات الرقمية مثل +09:00 أو -05:00. لا تُدعم مناطق IANA الزمنية المسمّاة مثل Asia/Tokyo أو Europe/London، كما أن الإزاحة الثابتة ليست مكافئة لمنطقة IANA في المناطق التي تتبع التوقيت الصيفي، لذا يجب حساب الإزاحة الصحيحة للتاريخ المحدد الذي تُرمِّزه.عبارة VALID FOR
VALID FOR اختصارًا ملائمًا لعبارة VALID UNTIL. فبدلًا من تاريخ ووقت مطلقين، تقبل فاصلًا زمنيًا، ويُحتسب الموعد النهائي لانتهاء الصلاحية بإضافة ذلك الفاصل الزمني إلى الوقت الحالي عند تنفيذ الاستعلام. ثم تُخزَّن النتيجة بصيغة VALID UNTIL، لذا يعرض SHOW CREATE USER دائمًا الموعد النهائي المطلق بعد حسمه. يمكن استخدامها في كل موضع يمكن استخدام VALID UNTIL فيه، وتتبع قواعد الترتيب نفسها: قبل IDENTIFIED (أو عند عدم تحديد طريقة مصادقة) تمثل موعدًا نهائيًا على مستوى المستخدم ينطبق على جميع الطرق، بينما إذا جاءت بعد طريقة مصادقة فإنها تنطبق على تلك الطريقة فقط. يُخزَّن الموعد النهائي ويُطبَّق بدقة الثواني، لذلك تُرفض الفواصل الزمنية التي تقل عن ثانية (NANOSECOND وMICROSECOND وMILLISECOND)؛ وأصغر وحدة مقبولة هي SECOND. يُقبل الفاصل الزمني السالب كوسيلة لاعتبار بيانات الاعتماد منتهية الصلاحية بالفعل؛ وإذا وقع الموعد النهائي الناتج قبل 1970-01-01 00:00:01 UTC، فيُحوَّل إلى تلك اللحظة الأدنى المنتهية الصلاحية، وهي التي يعرضها SHOW CREATE USER لاحقًا — وفق المنطقة الزمنية للخادم أو الجلسة، كما هو موضح في VALID UNTIL.
أمثلة:
CREATE USER name1 VALID FOR INTERVAL 1 DAYCREATE USER name1 VALID FOR INTERVAL 3 MONTHCREATE USER name1 VALID FOR INTERVAL 1 DAY + INTERVAL 12 HOURCREATE USER name1 VALID FOR INTERVAL 30 DAY IDENTIFIED WITH plaintext_password BY 'password_1', bcrypt_password BY 'password_2'— ينطبق الموعد النهائي على مستوى المستخدم على كلتا الطريقتين.CREATE USER name1 IDENTIFIED WITH plaintext_password BY 'no_expiration', bcrypt_password BY 'expiration_set' VALID FOR INTERVAL 30 DAY— ينطبق الموعد النهائي على طريقةbcrypt_passwordفقط؛ ولا تنتهي صلاحيةplaintext_passwordأبدًا.
عبارة GRANTS
VALID UNTIL الخاصة بها، إن وُجدت)، ولا تنطبق إلا على تلك الطريقة.
عندما يسجّل مستخدم الدخول باستخدام طريقة مصادقة كهذه، تكون حقوق وصول الجلسة هي تقاطع حقوق وصول المستخدم (بما فيها الحقوق الناتجة عن الأدوار الممنوحة) والامتيازات المدرجة في العبارة. ولا تضيف العبارة أي حقوق وصول مطلقًا: فإذا لم يكن امتياز مدرج ممنوحًا للمستخدم، فلن تمتلكه الجلسة. كذلك، لا تستطيع الجلسات التي تمت مصادقتها بهذه الطريقة منح امتيازات (إذ لا يبقى GRANT OPTION بعد التقاطع) أو إدارة الأدوار. ولا تقتصر إدارة الأدوار على إنشائها وتعديلها وحذفها ومنحها وسحبها، بل تشمل أيضًا تغيير الأدوار المفعّلة افتراضيًا للمستخدم (SET DEFAULT ROLE وALTER USER ... DEFAULT ROLE)، وهو أمر مرفوض أيضًا.
تبدّل EXECUTE AS الكيان الأساسي للجلسة، لذا تقتصر العبارة التي تعمل بانتحال الهوية على تقاطع حقوق وصول المستخدم الهدف والامتيازات المدرجة، بدلًا من حقوق المستخدم الذي سجّل الدخول. ولا يُرفع القيد نفسه مطلقًا، ويتطلب انتحال الهوية أن يكون IMPERSONATE ON target ممنوحًا للمستخدم ومدرجًا في العبارة في آنٍ واحد؛ لذا لا يمكن لبيانات اعتماد مقيّدة أن تتجاوز مطلقًا ما تتيحه بيانات الاعتماد غير المقيّدة للمستخدم نفسه.
يوفر هذا طريقة ملائمة لإنشاء رموز مميزة للتطبيقات: بيانات اعتماد إضافية ذات تاريخ انتهاء ومجموعة محدودة من الامتيازات، ومرتبطة بالمستخدم؛ إذ تظهر في system.query_log وsystem.processes باسم المستخدم، وتتوقف عن العمل إذا حُذف المستخدم، وتفقد حقوق الوصول عندما يفقدها المستخدم.
أمثلة:
CREATE USER name1 IDENTIFIED BY 'qwerty' GRANTS (SELECT ON db.*)ALTER USER name1 ADD IDENTIFIED WITH plaintext_password BY 'app_token' VALID UNTIL '2026-12-31' GRANTS (SELECT ON db.table, INSERT ON db.table)
ALTER USER في الجلسات الجديدة، لا في الجلسات المنشأة بالفعل.
امتيازات المصدر المُرشَّحة، مثل READ ON S3('s3://bucket/.*')، غير مدعومة في العبارة بعد: إذ يقارن التقاطع مرشح المصدر كسلسلة معتمة ولا يمكنه تضييق مرشح ليطابق مرشحًا آخر، لذا يُرفض هذا الامتياز بدلًا من عدم منح أي وصول بصمت.
العبارة مدعومة فقط لطرق المصادقة التي يتحقق الخادوم من بيانات اعتمادها محليًا بالكامل. أما الطرق التي يتصل فيها التحقق (أو قد يتصل، في حالة jwt، مثلًا لجلب مفاتيح التوقيع) بنظام خارجي (ldap أو kerberos أو http أو jwt)، فتُرفض العبارة: فعندما تقبل عدة طرق مصادقة بيانات الاعتماد نفسها، يُفرض القيد بإعادة التحقق من بيانات الاعتماد وفق الطرق الأخرى، وإجراء فحص إضافي لنظام خارجي ليس آمنًا؛ لذا قد تتجاوز طريقة أخرى تقبل بيانات الاعتماد نفسها القيد.
عندما تقبل أكثر من طريقة مصادقة بيانات الاعتماد الفعلية نفسها، يُقيَّد تسجيل الدخول، بأسلوب الفشل الآمن، بجميعها: تحصل الجلسة على تقاطع GRANTS لجميع الطرق المطابقة، وتنتهي صلاحيتها عند أسبق قيم VALID UNTIL الخاصة بها. وتكون الأولوية لأسبق قيمة VALID UNTIL حتى إن كانت قد انقضت بالفعل — إذ يُرفض تسجيل الدخول، تمامًا كما لو أن الطريقة المطابقة الوحيدة قد انتهت صلاحيتها؛ وبذلك لا يؤدي انتهاء صلاحية رمز مميز إلى منح بيانات الاعتماد المشتركة، بصمت، حقوق أو مدة صلاحية طريقة أوسع.
لا يُتحقق من هذا الدمج إلا بين طرق المصادقة التي يتحقق الخادم منها محليًا، للسبب نفسه الذي تُرفض من أجله العبارة نفسها مع طريقة مصادقة يُتحقق منه خارجيًا، كما ذُكر أعلاه: إذ إن إعادة التحقق من بيانات الاعتماد في هذه الحالة ستتطلب فحصًا إضافيًا غير آمن للنظام الخارجي. لذلك، إذا كانت بيانات الاعتماد نفسها مقبولة أيضًا عبر طريقة مصادقة يُتحقق منه خارجيًا (ldap أو kerberos أو http أو jwt) للمستخدم نفسه، فإن VALID UNTIL الخاص بذلك الأسلوب لا يدخل ضمن هذا الدمج، ولا يؤدي ضبط تاريخ انتهاء أسبق له إلى تقصير الجلسة التي تم الحصول عليها عبر طريقة المصادقة الذي يُتحقق منه محليًا.
بند GRANTEES
GRANTEES:
user— يحدّد مستخدمًا يمكن لهذا المستخدم منح الامتيازات إليه.role— يحدّد دورًا يمكن لهذا المستخدم منح الامتيازات إليه.ANY— يمكن لهذا المستخدم منح الامتيازات لأي شخص. وهذا هو الإعداد الافتراضي.NONE— لا يمكن لهذا المستخدم منح الامتيازات إلى أي شخص.
EXCEPT. على سبيل المثال: CREATE USER user1 GRANTEES ANY EXCEPT user2. وهذا يعني أنه إذا كانت بعض الامتيازات قد مُنحت إلى user1 باستخدام GRANT OPTION، فسيتمكن من منح هذه الامتيازات لأي شخص باستثناء user2.
أمثلة
mira بكلمة المرور qwerty:
mira تطبيق العميل على المضيف الذي يعمل عليه خادم ClickHouse.
أنشئ حساب المستخدم john وعيّن الأدوار:
john، وعيّن الأدوار واجعل بعضًا منها افتراضيًا:
john واسمح له بمنح امتيازاته للمستخدم صاحب الحساب jack:
john: