CREATE USER ... IDENTIFIED WITH jwt، وأي محاولة لذلك تؤدي إلى ظهور استثناء. ويُدار مستخدمو JWT بالكامل وفقًا لدورة حياة الـ رمز المميز.
نظرة عامة
- يقدّم عميل رمز JWT موقّعًا عبر إحدى آليات النقل المدعومة (ترويسة HTTP
Authorization: Bearer، أو البروتوكول الأصلي عبر TCP، أو الحقلjwtفي gRPC). - يتحقق ClickHouse من توقيع الرمز المميز.
- يُتحقق من المطالبات المطلوبة (
exp,iat,iss,sub,aud). - يُنشأ مستخدم مؤقت في الذاكرة مع صلاحيات وصول مشتقة من مطالبات الرمز المميز
clickhouse:grantsوclickhouse:roles، ومتقاطعة مع حدّ الصلاحيات. - عند انتهاء صلاحية الرمز المميز، تزيل مهمة جمع البيانات المهملة في الخلفية هذا المستخدم.
مطالبات الرمز المميز
المطالبات المطلوبة
تكون مطالبة
kid في الترويسة (معرّف المفتاح) مطلوبة أيضًا عند استخدام تحليل المفاتيح المستند إلى JWKS.
مطالبات أخرى معترف بها
المطالبات الاختيارية
مثال على رأس الرمز المميز وحمولته
سلوك المستخدم المؤقت
الهوية والتسمية
iss وsub وaud. ويظل هذا المعرّف ثابتًا عبر عمليات تسجيل الدخول. لذا فإن المستخدم الذي يسجّل الدخول عدة مرات باستخدام رموز مميزة مختلفة (ولكن مع الجهة المُصدِرة والمعرّف والجمهور المستهدف نفسها) يحصل دائمًا على معرّف UUID نفسه.
أما اسم المستخدم فهو غير ثابت. ويُنشأ على النحو التالي:
<claims_hash> إلى قيمة تجزئة مشتقة من مطالبات iss وsub وaud إلى جانب المطالبتين clickhouse:roles وclickhouse:grants. ولا تدخل المطالبتان iss وaud إلا من خلال هذه القيمة؛ إذ لم تعودا تُدرجان مباشرةً ضمن بادئة اسم المستخدم الظاهرة. وهذا يُبقي الاسم موجزًا وسهل القراءة عندما تكون عناوين URL الخاصة بـ IdP في iss/aud طويلة وغير واضحة (على سبيل المثال، Microsoft Entra أو Okta)، مع ضمان أن الثلاثيات المختلفة (iss, sub, aud) ومجموعات clickhouse:roles / clickhouse:grants المختلفة تُنتِج أسماء مختلفة وثابتة. أما المطالبات التي لا تدخل في حساب قيمة التجزئة (مثل iat أو exp أو nbf أو المطالبات المخصصة غير المرتبطة) فلا تغيّر اسم المستخدم.
يتغيّر الجزء <claims_hash> كلما تغيّرت المطالبات clickhouse:roles أو clickhouse:grants. وهذا يعني أن الرموز المميّزة ذات مجموعات الأدوار أو الامتيازات المختلفة تُنتِج أسماء مستخدمين مختلفة حتى للهوية نفسها.
صلاحيات الوصول
permission_limit هي مجموعة حقوق الوصول التي يمتلكها دور مرجعي أو مستخدم مُعدّ ليكون الحد الأعلى. وأي حقوق يطلبها الرمز المميز وتتجاوز هذا الحد تُسقَط بصمت.
حداثة الرمز المميز
iat (وقت الإصدار) لأحدث رمز مميز تمت مصادقته لكل هوية مستقرة. وإذا قُدِّم رمز مميز بقيمة iat تساوي القيمة المخزنة أو تسبقها، يعيد الخادم استخدام المستخدم المؤقت الحالي من دون إعادة تقييم المطالبات. ويمنع ذلك الرموز المميزة الأقدم من تقليص أذونات المستخدم.
دورة الحياة وجمع البيانات المهملة
valid_until (المشتق من exp). ويتم التحكم في الفاصل الزمني لـ GC بواسطة المعلَمة gc_interval (الافتراضي: 5 دقائق).
بين مرات تشغيل GC، قد يظل المستخدمون منتهو الصلاحية ظاهرين في system.users، لكن لن يعودوا قادرين على المصادقة.
تعيينات صلاحيات الوصول الدائمة
يمكن العثور على اسم المستخدم ومعرّف UUID لهوية معيّنة في العمودين
name وid في system.users ما دام المستخدم نشطًا.ALTER USER لا يعمل مباشرةً مع مستخدمي JWT، لأنهم للقراءة فقط. لإسناد ملفات تعريف الإعدادات أو الحصص أو السياسات، استخدم عبارات ALTER SETTINGS PROFILE أو ALTER QUOTA أو ALTER ROW POLICY كما هو موضح أعلاه.
الاختلافات عن المستخدمين العاديين
طرق العرض SQL SECURITY DEFINER
SQL SECURITY DEFINER، ينشئ الخادم تلقائيًا نسخة ظل دائمة من هذا المستخدم لتكون مُعرِّف طريقة العرض. ويتميّز هذا المستخدم الظل بما يلي:
- يحمل الاسم
<original_jwt_username>:definer - لديه
NO_AUTHENTICATION(ولا يمكن استخدامه لتسجيل الدخول) - يحتفظ بحقوق الوصول نفسها التي كانت لدى مستخدم JWT الأصلي وقت إنشاء طريقة العرض
استخدام العميل البرمجي
تمرير رمز مميز مباشرةً
--jwt مع clickhouse-client للمصادقة باستخدام رمز مميز تم الحصول عليه مسبقًا:
الخيار
--jwt لا يمكن استخدامه مع --user. عند تحديد --jwt، يُشتق اسم المستخدم من الرمز المميّز.واجهة HTTP
Authorization:
تسجيل الدخول باستخدام رمز الجهاز عبر OAuth2
يدعمclickhouse-client آلية أذونات تفويض الجهاز التفاعلية في OAuth 2.0 (RFC 8628) عبر العلامة --login.
بالنسبة إلى نقاط النهاية في ClickHouse Cloud، وفي حال عدم تمرير أي خيار من نوع --oauth-*، يسجّل العميل الدخول عبر موفّر الهوية (IdP) الخاص بـ ClickHouse Cloud، ويُجري تلقائيًا عملية تبادل الرموز للحصول على JWT خاص بـ ClickHouse. وتُحدَّث الرموز بشكل شفاف طوال مدة الـ session، وعند الحصول على رمز جديد، يعيد العميل الاتصال تلقائيًا.
--oauth-url. ويؤدي تمرير أي خيار من خيارات --oauth-* إلى اعتماد مسار IdP المخصص، حتى مع مضيفي ClickHouse Cloud (على سبيل المثال، عند تفعيل مصادقة JWT باستخدام موفّر هوية مخصص للخدمة). يكتشف العميل device_authorization_endpoint وtoken_endpoint من /.well-known/openid-configuration الخاص بالمُصدِر (ومن عناوين URL الأخرى ذات الصلة الخاصة ببيانات OAuth الوصفية). وإذا كان grant_types_supported موجودًا، فيجب أن يتضمن urn:ietf:params:oauth:grant-type:device_code. أما إذا فشل الاكتشاف، فيُبلغ العميل عن error؛ لذا اضبط كلًّا من --oauth-device-uri و--oauth-token-uri صراحةً عند عدم توفر البيانات الوصفية.
أثناء تسجيل الدخول، يطبع العميل verification_uri المختصر وuser_code (RFC 8628). وإذا أعاد IdP أيضًا verification_uri_complete، يُطبع عنوان URL المختصر هذا ويُفتح في المتصفح، كما يُعرض رمز QR في الطرفية إذا كانت أداة qrencode متوفرة. أما مع IdP الخاص بـ ClickHouse Cloud، فلا يُطبع سوى verification_uri_complete وuser_code. ويمكن للعملاء السريين تمرير --oauth-client-secret مع --oauth-client-auth basic|post.
clickhouse:roles).
مُصادِق JWT المضمّن في ClickHouse Cloud
--login في clickhouse-client. يُضبط هذا المُصادِق على النحو التالي:
يحتوي المُصادِق المضمّن على حدٍّ للصلاحيات مضبوط على الدور
default_role والمستخدم default. وهذا يعني أن الصلاحيات الفعلية لأي مستخدم JWT تُقاطع مع الصلاحيات الممنوحة لهذين الكيانين، لذا لا يمكن لأي رمز JWT مطلقًا رفع الامتيازات إلى ما يتجاوز المسموح به لكل من default_role وdefault.
لا تحتاج إلى تهيئة أي شيء لاستخدام هذا المُصادِق. إذ يُوفَّر تلقائيًا عند إنشاء الخدمة.
تمكين المصادقة باستخدام JWT لخدمتك
بالإضافة إلى المُصادِق المضمّن، يمكنك تهيئة خدمة ClickHouse Cloud لقبول رموز مميزة JWT الصادرة عن موفّر الهوية الخاص بك، مثل Microsoft Entra أو Okta. تتوفر هذه الميزة ضمن خطة Enterprise للخدمات التي تعمل بإصدار ClickHouse 26.4 أو أحدث. يمكنك تهيئتها بنفسك من وحدة تحكم Cloud ضمن الإعدادات ← الأمان ← المصادقة باستخدام JWT — راجع إعداد المصادقة باستخدام JWT للحصول على إرشادات خطوة بخطوة. يُعرَّف كل موفّر بما يلي:الاتصال بين الخوادم
استكشاف الأخطاء وإصلاحها
- لم تُمنح صلاحيات الوصول: قد يفتقر الدور أو المستخدم المشار إليه إلى الامتيازات المطلوبة. تأكد من أن الأدوار المشار إليها في
clickhouse:rolesموجودة وتتضمن الامتيازات المناسبة. - رُفض الرمز المميز: تحقّق من أن
issوaudوخوارزمية التوقيع في الرمز المميز لديك تطابق ما يتوقعه موفّر JWT. إذا كان JWKS مستخدمًا، فتأكد من أنkidالخاص بالرمز المميز يطابق مفتاحًا في مجموعة مفاتيح الموفّر. - يختفي المستخدم بين الاستعلامات: يُزال المستخدمون المؤقتون بعد انتهاء صلاحية الرمز المميز. استخدم عميلًا يدعم تحديث الرمز المميز (مثل وضع
--login) للجلسات طويلة الأمد. - يفشل
CREATE USER ... IDENTIFIED WITH jwt: هذا متوقع. لا يمكن إنشاء مستخدمي JWT عبر DDL، إذ تُدار بالكامل من خلال دورة حياة الرمز المميز.