Skip to main content
هذه الصفحة هي المرجع الأمني لـ ClickHouse Connector: الهويات، والاتصالات، والامتيازات المحددة بدقة، والحدود البنيوية، وكيفية إسناد كل إجراء إلى مصدره. ولمعرفة كيف تتكامل هذه المكوّنات معًا، راجع المعمارية.

الهويات

  • شهادة عميل mTLS الخاصة بالموصّل، والتي يكون Organization ID الخاص بك هو الاسم الشائع (common name) فيها، تُصادق كل برنامج خفي لدى نقطة نهاية الموصّل الخاصة بك. ويستخدم clicklink clctl instances create الشهادة نفسها ومفتاح HMAC نفسه عند استدعائه لنقطة النهاية.
  • pcm_scraper وpcm_troubleshooter هما مستخدما ClickHouse للقراءة فقط اللذان يتصل بهما scraper ومستكشف الأخطاء ومصلحها. أما المنفّذ فليس له مستخدم ClickHouse.
  • حسابات ServiceAccount الخاصة بمستكشف الأخطاء ومصلحها، بواقع حساب لكل نشر مُجهّز، تحمل صلاحيات العرض للقراءة فقط في Kubernetes التي يمكن لجلسة الدعم استخدامها.
  • pcm-executor هو حساب ServiceAccount في Kubernetes الخاص بالمنفّذ لإدارة دورة حياة الخدمات المُدارة. وتقيّد سياسة ValidatingAdmissionPolicy عمليات الكتابة الخاصة به ضمن مساحات أسماء الخدمات.
  • pcm-platform هي هوية المنفّذ لتحديثات المنصة. ويُصدر أمر clicklink clctl platform approve لديك رمزها المميز لمدة ساعتين دون تجديده أبدًا؛ وبين عمليات الموافقة لا يملك المنفّذ أي صلاحية كتابة على طبقة المنصة.
  • دور IAM المخصص لكل خدمة (CH-S3-<service>-<region>-00-Role افتراضيًا) يُنشئه clicklink clctl executor prepare باستخدام بيانات الاعتماد الخاصة بك. ويقتصر نطاقه على حاويات البيانات والنسخ الاحتياطي لتلك الخدمة، ولا يثق به سوى حساب ServiceAccount في Kubernetes الخاص بتلك الخدمة، بحيث لا يستطيع المنفّذ ولا ClickHouse تولّيه.
  • ملف تعريف المثيل الخاص بجهاز EC2 الافتراضي للموصّل يتولّى دور سحب ECR للقراءة فقط الخاص ببيئتك من أجل الوصول المباشر إلى المنصة، وذلك لتسجيل الدخول لمخططات Helm ولفحوصات الصور معًا. وتستخدم واجهة سطر الأوامر الخاصة بالموافقة المسار نفسه لملف تعريف المثيل؛ ولا تحل محله ملفات تعريف AWS على محطة العمل ولا بيانات اعتماد SSO. أما سجلات مخططات ECR الأخرى فتستخدم بيانات اعتماد AWS المتاحة من البيئة. أما عمليات سحب الصور فتتم على عُقدك بموجب دور السحب الخاص بها. ولا يحتفظ المنفّذ بأي بيانات اعتماد لحاويات التخزين أو IAM الخاصة بك ولا يجري أي استدعاءات لـ S3 أو IAM. راجع بيانات اعتماد السجل.
  • بيانات الاعتماد الخاصة بك هي ما يمنح كل صلاحية: صلاحية وصول المنفّذ عند init --managed، وحاويات التخزين والدور عند prepare، والشق المتعلق بالأذونات من كل تحديث للمنصة عند approve، والتنظيف عند teardown.

ما يمكن للموصل القيام به

الاتصالات الصادرة

كل اتصال يفتحه الموصّل ينشأ من داخل بيئتك. وفي ما يلي القائمة الكاملة: أما على الجانب الوارد، فيُتيح كل برنامج خفي منفذ سلامة محلياً واحداً يقدّم أيضاً مقاييس Prometheus الخاصة به، إلى جانب بوابة الجلسات الاختيارية. وترتبط واجهة برمجة تطبيقات الأوامر المحلية للمُنفِّذ بالحلقة المحلية (loopback) فقط، ولا يستمع أي شيء آخر. ولا تتصل ClickHouse Cloud أبداً ببيئتك: فكل ما تستطيعه هو الرد على اتصالي WebSocket الصادرين.

أذونات ClickHouse

ينشئ التوفير مستخدمًا واحدًا بصلاحية القراءة فقط لكل مكوّن مراقِب. يُنشأ المستخدمون باستخدام IDENTIFIED WITH bcrypt_hash، لذا لا تحتوي SQL الخاصة بالتوفير إلا على تجزئة bcrypt مملّحة. أما كلمة المرور بنص واضح فلا توجد إلا في ملف بيانات الاعتماد الذي يقرأه البرنامج الخفي وقت التشغيل. وسطر ALTER USER الذي يلي كل CREATE USER يعيد توليد التجزئة عند استخدام --force. ولا يملك المنفّذ أي مستخدم ClickHouse ولا يتصل بـ ClickHouse إطلاقًا. وهذه هي الأذونات تحديدًا، مع مجموعات الجداول الافتراضية:
يلزم امتياز READ ON REMOTE لأن استعلامات السحب تُغلّف كل جدول نظام ضمن clusterAllReplicas(). أما SYSTEM FLUSH LOGS فهو الإذن الوحيد على مستوى النظام؛ إذ يجعل جداول النظام *_log تحفظ الإدخالات المخزّنة مؤقتًا لديها بحيث ترى عمليات السحب البيانات الحالية، ولا يتيح قراءة أي شيء أو تعديله. ولا يقبل ClickHouse هذا الامتياز إلا على النطاق العام، ولا يطبّقه إلا على جداول السجلات، لذا يكون الإذن الممنوح أوسع من القدرة الفعلية.
تُمنح إذن system.user_directories لكلا المستخدمين لغرض تشخيصي واحد. يعمل clicklink clctl preflight باستخدام بيانات اعتماد الموصل نفسه، ويتحقق مما إذا كان المثيل يخزّن مستخدمي ClickHouse بنسخ متماثلة أو محليًا. يحتوي الجدول على بيانات وصفية لإعدادات تخزين المستخدمين، وليس بيانات المستخدمين نفسها. ولا تشتمل عليه قائمة السماح لمجموعة الجلب أو جدول الجلسات، لذا لا يقرأه أي مسار إخراج للجلب أو الجلسات. ومن دون هذه الإذن، يُبلغ فحص المتطلبات المسبقة هذا بأنه تم تخطيه، بينما يستمر كل شيء آخر. لا توجد امتيازات INSERT أو DDL أو إدارة المستخدمين أو الإعدادات أو التحكم بالعمليات. وعندما تشترك عملية نشر ثانية للموصل في مثيل واحد، تكون أسماء مستخدميها ذات لاحقة (pcm_scraper_<suffix>) ومجموعات الامتيازات نفسها.

RBAC في Kubernetes

أداة السحب ومستكشف الأعطال

لا تمتلك أداة السحب ومستكشف الأعطال أي ClusterRole أو ClusterRoleBinding. ينشئ المخطط كائنات Role ضمن نطاق مساحة الأسماء في مساحة أسماء الموصّل، وتُنشئ كل حزمة وصول خاصة بمثيل كائن Role في مساحة أسماء ClickHouse أو الخدمة الخاصة بذلك المثيل.

Executor

في الوضع المُدار، يطبّق clicklink clctl init --managed (أو clicklink clctl executor access grant --cluster متبوعًا بـ apply --cluster) منح الـ executor باستخدام بيانات اعتمادك. ويتألف المنح من ServiceAccount باسم pcm-executor (في namespace الموصل على Kubernetes، وفي clicklink-system عند التثبيت على جهاز افتراضي)، وClusterRole واحد مرتبط به، وValidatingAdmissionPolicy باسم pcm-executor-prefix-guard. تُمنح الأفعال على مستوى العنقود بأكمله لأن RBAC لا يمكنه التعبير عن بادئة namespace. وبناءً عليه ترفض سياسة الـ admission كل عملية كتابة صادرة عن pcm-executor وتستهدف namespace خارج بادئة الخدمة (ns- افتراضيًا). أما namespace الأصلي فيسمح بثلاث عمليات كتابة: تجديد الرمز الخاص به، وConfigMap باسم clicklink-instance-registry التي يقرأها الـ scraper، وعلى Kubernetes شهادة العميل المجدَّدة التي تُكتب مجددًا في Secret باسم clicklink-mtls. وتنطبق السياسة على ذلك الـ ServiceAccount وحده، وتستخدم failurePolicy: Fail وvalidationActions: [Deny]. ويُطبَّق الـ ClusterRoleBinding في النهاية، بعد السياسة وارتباطها، حتى لا يترك المنح المطبَّق جزئيًا للـ executor أي صلاحيات بدلًا من أن يتركه بصلاحيات غير محروسة. وعلى جهاز افتراضي، يطبّق clicklink clctl executor prepare أيضًا حزمة خاصة بكل خدمة، تتألف من ServiceAccount باسم pcm-executor داخل ns-<name>، وRole يحمل عائلات الموارد نفسها، وClusterRole مقيّد بـ get وdelete على ذلك الـ namespace وحده. ويستخدم الـ executor تلك الحزمة للخدمة عند وجودها، وإلا فالمنح على مستوى العنقود. أما على Kubernetes فيعمل الـ pod دائمًا بصفة الـ ServiceAccount المسمى pcm-executor في namespace الموصل. ولا يعمل الـ admission مع get أو list أو watch، لذا فإن قراءات الـ executor لعائلات الموارد هذه ليست محصورة بالبادئة.

هوية المنصة

يطبّق الأمر clicklink clctl platform approve الشقّ الخاص بالصلاحيات من تحديث المنصة باستخدام بيانات اعتمادك: Namespaces وCustomResourceDefinitions وServiceAccounts وClusterRoles وClusterRoleBindings وRoles وRoleBindings وتهيئات webhook وadmission وPriorityClasses وStorageClass. ثم يطبّق ServiceAccount المسمى pcm-platform، وClusterRole الخاص به، وValidatingAdmissionPolicy المسماة pcm-platform-scope-guard، والربط الخاص بها، ويُصدر رمزاً مقيّداً صالحاً لمدة ساعتين. وبهذا الرمز، لا يستطيع المنفّذ الكتابة إلا على deployments وservices وconfigmaps وsecrets وjobs وpoddisruptionbudgets، وفي مساحات الأسماء للمنصة التي يسمح بها حارس النطاق دون غيرها. ويمكنه قراءة pods وevents وnamespaces وserviceaccounts وCustomResourceDefinitions وكائنات RBAC وتهيئات webhook وStorageClasses وPriorityClasses للتأكد من أن شقّ الصلاحيات قائم قبل أن يطبّق أي شيء. وهو لا يحمل أبداً escalate أو bind أو impersonate، ولا يكتب أبداً نوعاً على نطاق العنقود أو كائن RBAC، ولا يمكنه إصدار رمزه الخاص أو تجديده. ويخوّل الرمز حزمة واحدة بعينها: فالبصمة التي وافقت عليها مسجّلة على ServiceAccount، ويرفض المنفّذ أي حزمة سواها.

ما لا يستطيع الموصّل فعله

  • لا كتابة على بيانات ClickHouse أو حالتها. لا تتضمن الأذونات الممنوحة أعلاه أي INSERT، ولا أوامر DDL، ولا أي امتيازات لإدارة المستخدمين أو الإعدادات أو التحكم في العمليات. والامتياز الوحيد من فئة النظام، وهو SYSTEM FLUSH LOGS الخاص بـ scraper، لا يفعل سوى دفع جداول السجلات إلى تثبيت ما هو موجود أصلًا في مخازنها المؤقتة. ولا يملك المنفّذ أي مستخدم ClickHouse. فلا يستطيع أي مكوّن تعديل البيانات أو المخططات أو المستخدمين أو الإعدادات عبر ClickHouse.
  • لا تنفيذ للأوامر. لا يتضمن أي RBAC الصلاحية pods/exec؛ ولا يمكن لأي مكوّن تشغيل أوامر داخل الحاويات (pods) الخاصة بك.
  • لا كتابة خارج مساحات أسماء الخدمة والمنصة. لا يملك scraper ولا مستكشف الأخطاء ومصلحها صلاحية delete أو patch. والتعديلات الوحيدة التي تجريانها هي update بالاسم المحدد بدقة على Secret mTLS الخاص بالموصّل نفسه، وcreate على serviceaccounts/token، وهو ما يُصدر رموزًا قصيرة الأجل لحسابات الخدمة الخاصة بهما دون تعديل أي كائن مخزَّن. وتمنع طبقة الـ admission عمليات كتابة المنفّذ خارج بادئة الخدمة، ولا تجري عمليات كتابته على مستوى المنصة إلا أثناء صلاحية رمز أصدرتَه أنت.
  • لا صلاحية لمنح الصلاحيات. بيانات اعتمادك هي التي تُطبّق مساحات الأسماء وتعريفات الموارد المخصصة وحسابات الخدمة وقواعد RBAC وتهيئات الـ webhook والـ admission وفئات الأولوية وفئة التخزين (StorageClass) الخاصة بالمنصة أثناء approve. ولا تستطيع هوية المنفّذ على مستوى المنصة التصعيد أو الربط أو انتحال الهوية. وداخل مساحة أسماء الخدمة، لا يمكن للمنفّذ إنشاء سوى أدوار تمنح صلاحيات يملكها بالفعل.
  • لا بيانات اعتماد لحاويات التخزين الخاصة بك أو لـ IAM. يُنشئ الأمر clicklink clctl executor prepare حاويات التخزين ودور كل خدمة، ويزيلها الأمر clicklink clctl executor teardown، وكلاهما يعمل ببيانات اعتمادك. ولا يمكن تولّي هذا الدور إلا من قِبَل الحاويات (pods) الخاصة بتلك الخدمة. وللوصول المباشر إلى المنصة، يستخدم المنفّذ ملف تعريف المثيل الخاص بجهاز EC2 الافتراضي للموصّل لتولّي دور السحب من ECR للقراءة فقط، سواء لتسجيل الدخول لسحب المخطط أو للتحقق من الصور. أما سجلات مخططات ECR الأخرى فتستخدم بيانات اعتماد AWS المتاحة من البيئة؛ انظر الهويات. واستدعاءات واجهة برمجة التطبيقات السحابية الوحيدة التي يجريها تذهب إلى ECR وSTS؛ ولا يستطيع قراءة بياناتك أو حذفها.
  • لا علم له بكلمة مرور المستخدم الافتراضي لديك. يولّدها الأمر clicklink clctl executor prepare على جانبك ويعرضها مرة واحدة (أو يفعل ذلك الأمر clicklink clctl instances create عندما تمرر المدخلات كرايات). ولا تُرسَل سوى بصماتها المشفّرة، لذا لا يستطيع الموصّل ولا ClickHouse Cloud استرجاعها.
  • لا شيء وارد. لا تفتح ClickHouse Cloud أبدًا اتصالًا إلى بيئتك. ومسارا الأوامر الوحيدان هما اتصالا WebSocket الصادران. ويرفض مستكشف الأخطاء ومصلحها كل أمر ما لم تكن هناك جلسة دعم فعّالة قمت أنت بتمكينها. ولا يقبل المنفّذ أوامر دورة الحياة إلا للخدمات التي طلبت من ClickHouse إدارتها، وضمن النطاقات المذكورة أعلاه. وحتى أثناء الجلسة، يظل مستكشف الأخطاء ومصلحها محدودًا من الجانبين. فاستعلامات ClickHouse مقصورة على قائمة الجداول المسموح بها، وهي ترفض query_log وtext_log، فلا يُمنح الوصول إليهما أبدًا. أما الوصول إلى Kubernetes فمحصور في العروض للقراءة فقط وسجلات الحاويات (pods) التي تمنحها الأدوار المحصورة بمساحة الأسماء.

ما يتطلب إجراءً منك

  • تفعيل الوضع المُدار. لا يعمل executor، ولا يوجد grant الخاص به في Kubernetes، إلا بعد أن تفعّل الوضع المُدار عند init؛ ويُطبَّق الـ grant بصلاحيات مسؤول العنقود. راجع الخدمات المُدارة.
  • إنشاء خدمة. يعمل الأمر clicklink clctl executor prepare باستخدام بيانات اعتماد AWS الخاصة بك لإنشاء الـ حاويات ودور IAM، ويقدّم الأمر clicklink clctl instances create التعريف. لا تستطيع ClickHouse Cloud إنشاء خدمة في عنقودك بدونهما معًا. راجع إنشاء خدمة.
  • تحديثات المنصة. لا يُطبَّق أي تحديث على مكوّنات المنصة إلا بعد تشغيلك للأمر clicklink clctl platform approve لتلك الحزمة تحديدًا؛ وتنتهي صلاحية الرمز الذي يصدره بعد ساعتين ولا يُجدَّد أبدًا. راجع تحديثات المنصة.
  • التنظيف بعد الحذف. حذف خدمة يزيل موارد Kubernetes الخاصة بها فقط. أما الأمر clicklink clctl executor teardown، الذي يُشغَّل ببيانات اعتمادك، فيزيل دور IAM، ويزيل البيانات والنسخ الاحتياطية فقط عند تمرير أعلام صريحة. راجع حذف خدمة.
  • جلسات الدعم. لا يتم استكشاف الأخطاء وإصلاحها تفاعليًا إلا ضمن جلسة تفعّلها، وتكون مدتها 4 ساعات افتراضيًا وبحد أقصى 24 ساعة. يسري التعطيل فورًا. راجع جلسات الدعم.
  • قائمة السماح للمشغّلين. يجب أن يتضمن كل طلب إلى Gateway رمز OIDC يكون البريد الإلكتروني المُثبت فيه مدرجًا في قائمة السماح لديك. تكون قائمة السماح الفارغة مغلقة. أنت تدير هذه القائمة؛ راجع دليل التكوين.
  • إتاحة Gateway. تكون بوابة الجلسة معطّلة ما لم تفعّلها، ولا يمكن الوصول إليها إلا عبر إعادة توجيه المنفذ ما لم تختر استخدام مورد Ingress. على جهاز افتراضي، يجب على كل مشغّل تثبيت بصمة شهادتها الموقّعة ذاتيًا، أو التحقق منها باستخدام CA bundle يُمرَّر عبر --gateway-ca، قبل أن تتصل بها أوامر الجلسة.
  • حركة الشبكة الصادرة. عند استخدام CNI يفرض السياسات، لا يصل أي برنامج خفي إلى نقطة نهاية الموصل لديك حتى تدرج نطاقات CIDR الخاصة بها في networkPolicy.allowEgressCIDRs. كما يحتاج executor إلى نطاقات CIDR الخاصة بخادم API في Kubernetes (networkPolicy.apiserverCIDRs)، والتي يشتقها init --managed من VPC الخاص بالعنقود. وإذا كانت مخططات المنصة تأتي من Amazon ECR، فأضف نطاقات ECR وSTS أيضًا.

كيف يُنسب الوصول

  • هوية النشر. الاسم الشائع (common name) في شهادة عميل mTLS هو معرّف مؤسستك، واسم DNS الوحيد الخاص بها مرتبط بمضيف نقطة النهاية لديك. وهذا يجعل كل اتصال بواجهة برمجة التطبيقات قابلًا للنسب إلى مؤسستك. ويجري التجديد تلقائيًا داخل البرنامج الخفي؛ ولا يتعامل أي مشغّل مع مادة المفتاح.
  • سلامة الطلب. يحمل كل طلب لواجهة برمجة التطبيقات أيضًا توقيع HMAC-SHA256 (Authorization: HMAC-SHA256 AccessKey=..., Signature=..., Timestamp=...) يغطي الطريقة والمسار والطابع الزمني وتجزئة المتن، باستخدام زوج المفاتيح الصادر عند التسجيل.
  • هوية المشغّل. تُنسب استدعاءات البوابة إلى البريد الإلكتروني المُصادَق عليه في رمز هوية OIDC الخاص بالمشغّل، والذي يُتحقق منه مقابل JWKS لموفّر الهوية لديك. ولا يُوثق مطلقًا باسم ذاتي التصريح متى توفّر رمز.
  • أوامر دورة الحياة. يسجّل المنفّذ كل أمر يتلقاه في مخزنه المحلي مع مصدره (ClickHouse Cloud أو استدعاء clicklink clctl محلي)، ومرحلته، ونتيجته، ثم يُبلّغ بالنتيجة عبر قناة الأوامر. اقرأ السجل باستخدام clicklink clctl commands list وclicklink clctl commands get؛ راجع مرجع CLI.
  • موافقات المنصة. تُسجَّل خلاصة الحزمة التي وافقت عليها على ServiceAccount المسمى pcm-platform. وكل كائن تطبّقه بيانات اعتمادك يحمل تجزئة محتوى يتحقق منها المنفّذ قبل أن يكتب أي شيء. وتُرفض أي حزمة تحمل خلاصة مختلفة.
  • مسار التدقيق. يُلحق كل أمر جلسة، سواء قُبل أو حُجب، بسجل تدقيق NDJSON مع هوية المؤسسة المأخوذة من قناة الأوامر. وتُسجَّل استدعاءات البوابة كأسطر clctl.gateway مهيكلة في سجل مستكشف الأخطاء ومصلحها مع البريد الإلكتروني المُصادَق عليه للمشغّل. أما تغييرات الجلسة المحلية على الآلة الافتراضية فتسجّل مستخدم المضيف في session.json. اقرأ سجل التدقيق باستخدام clicklink clctl troubleshoot audit tail؛ راجع مرجع CLI.

الإعدادات الافتراضية لتقليل البيانات

  • query_log مُستثنى من عمليات السحب افتراضيًا. فأعمدته تحمل SQL خامًا يتضمن قيمًا حرفية قد تحتوي على بيانات شخصية أو أسرار. وهو لا يخرج من حدود بيئتك إلا إذا أضفته بنفسك.
  • لا يقرأ مستكشف الأخطاء ومصلحها سوى الجداول المُدرجة في قائمة السماح. يُرفض كل من query_log وtext_log داخل تهيئة قائمة السماح نفسها، فلا يُمنحان مطلقًا ويبقى سجل الاستعلامات غير قابل للقراءة. أما قائمة السماح الافتراضية فتتضمن system.processes (نص الاستعلامات الجارية)؛ فقلّص محتواها (troubleshooter.allowedTables على Kubernetes، وtroubleshooter.allowed_tables على جهاز افتراضي) إذا كان يجب إبقاء ذلك مخفيًا أثناء الجلسات.
  • تُنقَّح جميع مُخرجات مستكشف الأخطاء ومصلحها باستخدام أنماط مضمّنة إضافة إلى أي أنماط تحددها أنت. وتغطي الأنماط المضمّنة عناوين IPv4 وIPv6، ورموز bearer، ومفاتيح الوصول في AWS، وعناوين البريد الإلكتروني، ورموز JWT، ومفاتيح SSH الخاصة، وبيانات اعتماد سلاسل الاتصال. ويرفض البرنامج الخفي أن يبدأ التشغيل إذا كان ملف الأنماط غير صالح، بدلًا من العمل دون تنقيح.
  • حالة الخدمة المُدارة بيانات وصفية فقط. يُبلّغ المُنفِّذ عن حالة الخدمة، وأعداد النسخ المتماثلة، والإصدارات، ونتائج الأوامر. ولا يقرأ مطلقًا جداول الخدمة أو حاوياتها.
  • تُقلَّل بيانات الاعتماد المخزَّنة إلى الحد الأدنى. يحتوي SQL الخاص بالتجهيز على تجزئات bcrypt، ولا يحتوي أبدًا على كلمات مرور بنص صريح. وتُعرض كلمة مرور المستخدم default للخدمة المُدارة مرة واحدة فقط، ولا تخرج إلا في صورة تجزئات. ولا يُكتب رمز التسجيل مطلقًا في سطر الأوامر أو على القرص أو في السجلات. أما المفاتيح فتُخزَّن في Kubernetes Secrets أو في ملفات بالصلاحية 0600.