يوفّر هذا الدليل إعدادات بسيطة ومحدودة لتهيئة ClickHouse لاستخدام شهادات OpenSSL للتحقق من صحة الاتصالات. ولأغراض هذا العرض التوضيحي، تُنشأ شهادة ومفتاح لمرجع شهادات (CA) موقَّعين ذاتيًا، إلى جانب شهادات للعُقد، بحيث يمكن إنشاء الاتصالات باستخدام الإعدادات المناسبة.
إنشاء عملية نشر لـ ClickHouse
أُعدّ هذا الدليل باستخدام Ubuntu 20.04، وتم تثبيت ClickHouse على المضيفات التالية باستخدام حزمة DEB (عبر apt). اسم النطاق هو marsnet.local:
| المضيف | عنوان IP |
|---|---|
chnode1 |
192.168.1.221 |
chnode2 |
192.168.1.222 |
chnode3 |
192.168.1.223 |
أنشئ شهادات TLS
-
أنشئ مفتاحًا سيُستخدم لمرجع CA الجديد:
openssl genrsa -out marsnet_ca.key 2048 -
أنشئ شهادة CA جديدة موقَّعة ذاتيًا. سينشئ الأمر التالي شهادة جديدة ستُستخدم لتوقيع شهادات أخرى باستخدام مفتاح CA:
openssl req -x509 -subj "/CN=marsnet.local CA" -nodes -key marsnet_ca.key -days 1095 -out marsnet_ca.crt
-
تحقّق من محتويات شهادة CA الجديدة:
openssl x509 -in marsnet_ca.crt -text -
أنشئ طلب شهادة (CSR) وولِّد مفتاحًا لكل عقدة:
openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1" -addext "subjectAltName = DNS:chnode1.marsnet.local,IP:192.168.1.221" -keyout chnode1.key -out chnode1.csr openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode2" -addext "subjectAltName = DNS:chnode2.marsnet.local,IP:192.168.1.222" -keyout chnode2.key -out chnode2.csr openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode3" -addext "subjectAltName = DNS:chnode3.marsnet.local,IP:192.168.1.223" -keyout chnode3.key -out chnode3.csr -
باستخدام CSR وCA، أنشئ أزواجًا جديدة من الشهادات والمفاتيح:
openssl x509 -req -in chnode1.csr -out chnode1.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy openssl x509 -req -in chnode2.csr -out chnode2.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy openssl x509 -req -in chnode3.csr -out chnode3.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy -
تحقّق من الشهادات من حيث subject وissuer:
openssl x509 -in chnode1.crt -text -noout -
تأكّد من إمكانية التحقق من الشهادات الجديدة باستخدام شهادة CA:
openssl verify -CAfile marsnet_ca.crt chnode1.crt chnode1.crt: OK
أنشئ واضبط دليلاً لتخزين الشهادات والمفاتيح.
-
أنشئ مجلدًا داخل دليل يمكن لـ ClickHouse الوصول إليه على كل عقدة. نوصي باستخدام دليل الإعدادات الافتراضي (مثل
/etc/clickhouse-server):mkdir /etc/clickhouse-server/certs -
انسخ شهادة CA وشهادة العقدة والمفتاح الخاص المقابل لكل عقدة إلى دليل
certsالجديد. -
حدّث المالك والأذونات للسماح لـ ClickHouse بقراءة الشهادات:
chown clickhouse:clickhouse -R /etc/clickhouse-server/certs chmod 600 /etc/clickhouse-server/certs/* chmod 755 /etc/clickhouse-server/certs ll /etc/clickhouse-server/certstotal 20 drw-r--r-- 2 clickhouse clickhouse 4096 Apr 12 20:23 ./ drwx------ 5 clickhouse clickhouse 4096 Apr 12 20:23 ../ -rw------- 1 clickhouse clickhouse 997 Apr 12 20:22 chnode1.crt -rw------- 1 clickhouse clickhouse 1708 Apr 12 20:22 chnode1.key -rw------- 1 clickhouse clickhouse 1131 Apr 12 20:23 marsnet_ca.crt
تهيئة البيئة بمجموعات أساسية باستخدام ClickHouse Keeper
في بيئة النشر هذه، تُستخدم إعدادات ClickHouse Keeper التالية في كل عقدة. سيكون لكل خادم معرّفه الخاص <server_id>. (مثلاً، <server_id>1</server_id> للعقدة chnode1، وهكذا دواليك.)
- أضف ما يلي ضمن الوسم
<clickhouse>في ملفconfig.xmlالخاص بخادم ClickHouse
<keeper_server>
<tcp_port_secure>9281</tcp_port_secure>
<server_id>1</server_id>
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
<raft_logs_level>trace</raft_logs_level>
</coordination_settings>
<raft_configuration>
<secure>true</secure>
<server>
<id>1</id>
<hostname>chnode1.marsnet.local</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>chnode2.marsnet.local</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>chnode3.marsnet.local</hostname>
<port>9444</port>
</server>
</raft_configuration>
</keeper_server>-
قم بإلغاء التعليق وتحديث إعدادات Keeper على جميع العُقد، ثم اضبط العلامة
<secure>على 1:<zookeeper> <node> <host>chnode1.marsnet.local</host> <port>9281</port> <secure>1</secure> </node> <node> <host>chnode2.marsnet.local</host> <port>9281</port> <secure>1</secure> </node> <node> <host>chnode3.marsnet.local</host> <port>9281</port> <secure>1</secure> </node> </zookeeper> -
حدِّث وأضِف إعدادات العنقود التالية إلى
chnode1وchnode2. سيُستخدمchnode3لاستكمال النصاب لـ ClickHouse Keeper.
يُنشئ ما يلي مجموعةً (cluster) بنسخة مكررة (replica) واحدة لكل شريحة (shard) موزَّعة على خادمَين (خادم على كل عقدة).
<remote_servers>
<cluster_1S_2R>
<shard>
<replica>
<host>chnode1.marsnet.local</host>
<port>9440</port>
<user>default</user>
<password>ClickHouse123!</password>
<secure>1</secure>
</replica>
<replica>
<host>chnode2.marsnet.local</host>
<port>9440</port>
<user>default</user>
<password>ClickHouse123!</password>
<secure>1</secure>
</replica>
</shard>
</cluster_1S_2R>
</remote_servers>-
حدّد قيم الماكرو لتتمكن من إنشاء جدول ReplicatedMergeTree للاختبار. على
chnode1:<macros> <shard>1</shard> <replica>replica_1</replica> </macros>على العقدة
chnode2:<macros> <shard>1</shard> <replica>replica_2</replica> </macros>
تكوين واجهات TLS على عُقد ClickHouse
تُكوَّن الإعدادات التالية في ملف config.xml الخاص بخادم ClickHouse
-
عيّن اسم العرض لعملية النشر (اختياري):
<display_name>clickhouse</display_name> -
اضبط ClickHouse للاستماع على المنافذ الخارجية:
<listen_host>0.0.0.0</listen_host> -
كوّن منفذ
httpsوعطّل منفذhttpعلى كل عقدة:<https_port>8443</https_port> {/*<http_port>8123</http_port>*/} -
كوّن منفذ TCP الآمن لـ ClickHouse Native وعطّل المنفذ الافتراضي غير الآمن على كل عقدة:
<tcp_port_secure>9440</tcp_port_secure> {/*<tcp_port>9000</tcp_port>*/} -
كوّن منفذ
interserver httpsوعطّل المنفذ الافتراضي غير الآمن على كل عقدة:<interserver_https_port>9010</interserver_https_port> {/*<interserver_http_port>9009</interserver_http_port>*/} -
كوّن OpenSSL باستخدام الشهادات والمسارات
<openSSL>
<server>
<certificateFile>/etc/clickhouse-server/certs/chnode1.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/certs/chnode1.key</privateKeyFile>
<verificationMode>relaxed</verificationMode>
<caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>relaxed</verificationMode>
<invalidCertificateHandler>
<name>RejectCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>لمزيد من المعلومات، تفضّل بزيارة هذه الصفحة
-
اضبط TLS لـ gRPC على كل عقدة:
<grpc> <enable_ssl>1</enable_ssl> <ssl_cert_file>/etc/clickhouse-server/certs/chnode1.crt</ssl_cert_file> <ssl_key_file>/etc/clickhouse-server/certs/chnode1.key</ssl_key_file> <ssl_require_client_auth>true</ssl_require_client_auth> <ssl_ca_cert_file>/etc/clickhouse-server/certs/marsnet_ca.crt</ssl_ca_cert_file> <transport_compression_type>none</transport_compression_type> <transport_compression_level>0</transport_compression_level> <max_send_message_size>-1</max_send_message_size> <max_receive_message_size>-1</max_receive_message_size> <verbose_logs>false</verbose_logs> </grpc>لمزيد من المعلومات، تفضّل بزيارة https://clickhouse.com/docs/interfaces/grpc/
-
اضبط clickhouse client على عقدة واحدة على الأقل لاستخدام TLS في الاتصالات ضمن ملف
config.xmlالخاص به (يوجد افتراضيًا في/etc/clickhouse-client/):<openSSL> <client> <loadDefaultCAFile>false</loadDefaultCAFile> <caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig> <cacheSessions>true</cacheSessions> <disableProtocols>sslv2,sslv3</disableProtocols> <preferServerCiphers>true</preferServerCiphers> <invalidCertificateHandler> <name>RejectCertificateHandler</name> </invalidCertificateHandler> </client> </openSSL> -
عطّل منافذ المحاكاة الافتراضية لكلٍّ من MySQL وPostgreSQL:
{/*mysql_port>9004</mysql_port*/} {/*postgresql_port>9005</postgresql_port*/}
الاختبار
-
شغِّل جميع العقد، واحدةً تلو الأخرى:
service clickhouse-server start -
تأكّد من أن المنافذ الآمنة تعمل وفي وضع الاستماع، ويجب أن يكون الإخراج مشابهًا لهذا المثال على كل عقدة:
root@chnode1:/etc/clickhouse-server# netstat -ano | grep tcptcp 0 0 0.0.0.0:9010 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:9440 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:9281 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 192.168.1.221:33046 192.168.1.222:9444 ESTABLISHED off (0.00/0/0) tcp 0 0 192.168.1.221:42730 192.168.1.223:9444 ESTABLISHED off (0.00/0/0) tcp 0 0 192.168.1.221:51952 192.168.1.222:9281 ESTABLISHED off (0.00/0/0) tcp 0 0 192.168.1.221:22 192.168.1.210:49801 ESTABLISHED keepalive (6618.05/0/0) tcp 0 64 192.168.1.221:22 192.168.1.210:59195 ESTABLISHED on (0.24/0/0) tcp6 0 0 :::22 :::* LISTEN off (0.00/0/0) tcp6 0 0 :::9444 :::* LISTEN off (0.00/0/0) tcp6 0 0 192.168.1.221:9444 192.168.1.222:59046 ESTABLISHED off (0.00/0/0) tcp6 0 0 192.168.1.221:9444 192.168.1.223:41976 ESTABLISHED off (0.00/0/0)منفذ ClickHouse الوصف 8443 واجهة https 9010 منفذ https بين الخوادم 9281 منفذ ClickHouse Keeper الآمن 9440 بروتوكول TCP الأصلي الآمن 9444 منفذ Raft لـ ClickHouse Keeper -
تحقق من حالة ClickHouse Keeper لن تعمل أوامر الأحرف الأربعة (4lW) المعتادة باستخدام
echoبدون TLS، وإليك كيفية استخدام هذه الأوامر معopenssl.- ابدأ جلسة تفاعلية باستخدام
openssl
- ابدأ جلسة تفاعلية باستخدام
openssl s_client -connect chnode1.marsnet.local:9281CONNECTED(00000003)
depth=0 CN = chnode1
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = chnode1
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:CN = chnode1
i:CN = marsnet.local CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICtDCCAZwCFD321grxU3G5pf6hjitf2u7vkusYMA0GCSqGSIb3DQEBCwUAMBsx
...-
أرسِل أوامر 4LW ضمن جلسة OpenSSL
mntr--- Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 ... read R BLOCK zk_version v22.7.3.5-stable-e140b8b5f3a5b660b6b576747063fd040f583cf3 zk_avg_latency 0 zk_max_latency 4087 zk_min_latency 0 zk_packets_received 4565774 zk_packets_sent 4565773 zk_num_alive_connections 2 zk_outstanding_requests 0 zk_server_state leader zk_znode_count 1087 zk_watch_count 26 zk_ephemerals_count 12 zk_approximate_data_size 426062 zk_key_arena_size 258048 zk_latest_snapshot_size 0 zk_open_file_descriptor_count 187 zk_max_file_descriptor_count 18446744073709551615 zk_followers 2 zk_synced_followers 1 closed
-
شغِّل عميل ClickHouse باستخدام الخيار
--secureومنفذ TLS:root@chnode1:/etc/clickhouse-server# clickhouse-client --user default --password ClickHouse123! --port 9440 --secure --host chnode1.marsnet.local ClickHouse client version 22.3.3.44 (official build). Connecting to chnode1.marsnet.local:9440 as user default. Connected to ClickHouse server version 22.3.3 revision 54455. clickhouse :) -
سجّل الدخول إلى واجهة Play عبر واجهة
httpsعلىhttps://chnode1.marsnet.local:8443/play.
-
أنشئ جدولًا مكرّرًا:
clickhouse :) CREATE TABLE repl_table ON CLUSTER cluster_1S_2R ( id UInt64, column1 Date, column2 String ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/repl_table', '{replica}' ) ORDER BY (id);┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ │ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ └───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ -
أضِف صفّين إلى
chnode1:INSERT INTO repl_table (id, column1, column2) VALUES (1,'2022-04-01','abc'), (2,'2022-04-02','def'); -
تحقق من النسخ المتماثل من خلال عرض الصفوف على
chnode2:SELECT * FROM repl_table┌─id─┬────column1─┬─column2─┐ │ 1 │ 2022-04-01 │ abc │ │ 2 │ 2022-04-02 │ def │ └────┴────────────┴─────────┘
تهيئة OpenSSL لـ ClickHouse Keeper المستقل
عند تشغيل ClickHouse Keeper كعملية مستقلة (بدلاً من تضمينه داخل ClickHouse server)، يجب تهيئة شهادات OpenSSL وإعداداته بشكل منفصل في ملف تهيئة Keeper. ومن دون ذلك، لن يتمكن Keeper من إنشاء اتصالات آمنة لاتصال العميل (tcp_port_secure) أو لتنفيذ تكرار Raft بين عُقد Keeper.
أضف قسم <openSSL> التالي إلى ملف تهيئة ClickHouse Keeper المستقل على كل عقدة:
<openSSL>
<server>
<certificateFile>/etc/clickhouse-keeper/certs/chnode1.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-keeper/certs/chnode1.key</privateKeyFile>
<verificationMode>relaxed</verificationMode>
<caConfig>/etc/clickhouse-keeper/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<caConfig>/etc/clickhouse-keeper/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>relaxed</verificationMode>
<invalidCertificateHandler>
<name>RejectCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>يُستخدم القسم <server> لاستقبال اتصالات العملاء الواردة عبر منفذ Keeper الآمن (tcp_port_secure). ويُستخدم القسم <client> للاتصالات الصادرة بين عُقد Keeper أثناء النسخ المتماثل باستخدام Raft.
أوضاع التحقق في OpenSSL ومعالِجات الشهادات
يوفّر الإعداد <openSSL> عدة خيارات لكلٍّ من <verificationMode> و<invalidCertificateHandler>، تتحكّم في الطريقة التي يتحقق بها ClickHouse من شهادات TLS. وتنطبق هذه الإعدادات على clickhouse-server وclickhouse-client وClickHouse Keeper المستقل.
أوضاع التحقق
اضبط <verificationMode> داخل القسم <server> أو <client> في <openSSL>:
| الوضع | الوصف |
|---|---|
none |
بدون التحقق من الشهادة. يكون الاتصال مشفّرًا، لكن لا تُتحقَّق هوية الطرف المقابل. استخدم هذا للاختبار فقط. |
relaxed |
يتحقق من شهادة الطرف المقابل إذا قُدِّمت، لكنه لا يفشل إذا لم تُقدَّم أي شهادة. |
once |
على جانب الخادم، يتحقق من شهادة العميل أثناء المصافحة الأولية فقط، ويتخطى إعادة التفاوض. وعلى جانب العميل، يتصرف بالطريقة نفسها مثل relaxed. |
strict |
يتطلب شهادة الطرف المقابل ويتحقق منها بالكامل. يفشل الاتصال إذا كانت الشهادة مفقودة أو منتهية الصلاحية أو غير موقَّعة من CA موثوقة. ويُنصح به لبيئات الإنتاج. |
معالجات الشهادات غير الصالحة
عيّن <invalidCertificateHandler> داخل القسم <server> أو <client> ضمن <openSSL>. يحدّد هذا المعالج ما يحدث عند فشل التحقق من الشهادة. على جانب الخادم، يتحكم في كيفية التعامل مع شهادات العميل غير الصالحة. وعلى جانب العميل، يتحكم في كيفية التعامل مع شهادات الخادم غير الصالحة.
| المعالج | الوصف |
|---|---|
RejectCertificateHandler |
يرفض الاتصال إذا كانت الشهادة غير صالحة. هذا هو الإعداد الافتراضي والموصى به. |
AcceptCertificateHandler |
يقبل الاتصال حتى إذا كانت الشهادة غير صالحة. لا تستخدمه إلا لأغراض الاختبار. |
مثال: تعطيل التحقق من الشهادة
لتجاوز التحقق من الشهادة بالكامل (على سبيل المثال، عند استخدام شهادات موقّعة ذاتيًا في بيئة اختبار)، اضبط verificationMode على none واستخدم AcceptCertificateHandler.
بالنسبة إلى clickhouse-client، يمكنك أيضًا استخدام الخيار --accept-invalid-certificate في واجهة سطر الأوامر، والذي يطبّق كلا الإعدادين تلقائيًا.
clickhouse-client (/etc/clickhouse-client/config.xml):
<openSSL>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>none</verificationMode>
<invalidCertificateHandler>
<name>AcceptCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>clickhouse-server (config.xml أو ملف في config.d/). لا يزال قسم <server> يتطلب مسارات الشهادة والمفتاح الخاص، لأن الخادم يجب أن يقدّم شهادته الخاصة إلى العملاء، حتى عندما لا يتحقق من شهاداتهم:
<openSSL>
<server>
<certificateFile>/etc/clickhouse-server/certs/server.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/certs/server.key</privateKeyFile>
<verificationMode>none</verificationMode>
<caConfig>/etc/clickhouse-server/certs/ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>none</verificationMode>
<invalidCertificateHandler>
<name>AcceptCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>ClickHouse Keeper المستقل (ملف تهيئة Keeper):
<openSSL>
<server>
<certificateFile>/etc/clickhouse-keeper/certs/keeper.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-keeper/certs/keeper.key</privateKeyFile>
<verificationMode>none</verificationMode>
<caConfig>/etc/clickhouse-keeper/certs/ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>none</verificationMode>
<invalidCertificateHandler>
<name>AcceptCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>الملخص
ركّزت هذه المقالة على إعداد بيئة ClickHouse باستخدام TLS. ستختلف الإعدادات بحسب المتطلبات في بيئات الإنتاج؛ فعلى سبيل المثال، مستويات التحقق من الشهادات، والبروتوكولات، وخوارزميات التشفير، وغيرها. لكن ينبغي أن تكون لديك الآن فكرة واضحة عن الخطوات اللازمة لتهيئة الاتصالات الآمنة وتنفيذها.