نفق SSH لـ QGIS وPostGIS: احتفظ باسم الخادم من أجل TLS
يمنح نفق SSH تطبيق QGIS منفذًا محليًا، لكن قاعدة البيانات لا تزال بحاجة إلى اسمها الحقيقي من أجل TLS. استخدم خدمة libpq مع hostaddr ومستمع loopback.
يُنشأ النفق ويتصل QGIS، ثم يفشل تسجيل الدخول بخطأ في الشهادة يذكر 127.0.0.1 بدلًا من مضيف قاعدة البيانات. الخطوة التالية المغرية هي إرخاء sslmode، ما يُسكت الفحص ويُلقي بضمان الهوية الذي أردته أصلًا. المشكلة الفعلية أن المنفذ المحلي واسم الخادم يُخزَّنان في الحقل نفسه. يفصل إدخال خدمة libpq بينهما، فيذهب المقبس إلى المنفذ الموجَّه بينما يتحقق TLS من الاسم المطبوع على الشهادة.
ما يظن العميل أنه يتصل به
عند sslmode=verify-full، يقارن libpq الشهادة التي يقدمها الخادم باسم المضيف المطلوب. وعندما يكون ذلك الاسم عنوان loopback، تفشل المقارنة رغم أن الشهادة صالحة لمضيف قاعدة البيانات الحقيقي. نفق SSH يغيّر المقبس الذي يحمل البايتات، لا الهوية التي ينبغي أن يتوقعها العميل. وبعد فصل الفكرتين، يتوقف الخطأ عن الظهور كعطل في TLS.
النفق ليس تخويلًا أيضًا. لا يزال PostgreSQL يطبّق قواعده الخاصة على الاتصال الذي يُنشئه خادم SSH، لذا أبقِ طبقة النقل وطبقة قاعدة البيانات منفصلتين قبل تغيير أي شيء.
اربط النفق بـ loopback فقط
ينبغي أن يوجد المستمع على جهاز QGIS ولا مكان آخر. ذكر 127.0.0.1 صراحةً يبقيه بعيدًا عن الواجهات الأخرى، بينما قد يعرّض عنوان الربط المحذوف المنفذ للخطر حسب إعدادات البوابة في عميل SSH.
ssh -N -L 127.0.0.1:15432:127.0.0.1:5432 [email protected]يُحلّ الهدف بعد النقطتين الثانية من جهة خادم SSH، لذا يفترض هذا المثال أن PostgreSQL على المضيف نفسه الذي يعمل عليه sshd؛ أما قاعدة بيانات على جهاز آخر فتحتاج إلى ذلك العنوان وأذوناته. شغّل الجلسة بـ -N كي لا تُفتح أي صدفة، واترك التحقق من مفتاح المضيف كما هو، وتأكد من ظهور المستمع قبل لوم QGIS. وإذا كان المنفذ مستخدمًا بالفعل، يفشل النفق عند بدء التشغيل لا عند الاستعلام.
ضع الاسم والمقبس في إدخال خدمة واحد
يتيح ملف الخدمة للاتصال نفسه حمل اسم تحقق ووجهة مقبس مختلفة. احفظ الإدخال حيث يبحث libpq عن الخدمات، أو وجّه PGSERVICEFILE إليه.
[gis-via-ssh]
host=db.geo.example
hostaddr=127.0.0.1
port=15432
dbname=gisdb
user=gis_reader
sslmode=verify-full
gssencmode=disable
sslrootcert=/path/to/approved-root.crtهنا يحتفظ host بالهوية المستخدمة في فحوص الشهادة بينما hostaddr يرسل الحزم إلى منفذ loopback الموجَّه، وكلاهما مطلوب ليعمل هذا الترتيب. gssencmode=disable مهم في البِنى التي كانت ستتفاوض على تشفير GSSAPI أولًا، لأن ذلك المسار يتجاهل إعدادات TLS التي ضُبطت للتو. أشر إلى الخدمة بالاسم من مربع حوار اتصال PostgreSQL في QGIS، وقدّم كلمة المرور عبر المطالبة المعتادة لا داخل ملف مشترك. الأسماء والمسارات أعلاه عناصر نائبة؛ استبدلها بقيمك المعتمدة.
ما يزال PostgreSQL يفحصه بعد النفق
يرى الخادم اتصالًا من مضيف SSH، أي loopback في هذا الترتيب، ويطابقه مع قواعد المصادقة المعتمدة على المضيف بالترتيب. لا يزال دور قاعدة البيانات لديك بحاجة إلى المصادقة، وتسجيل دخول SSH لا يمنح هوية قاعدة بيانات بحد ذاته. تحقق مما يعتقده الخادم لا مما افترضه العميل.
psql "service=gis-via-ssh" -c "select inet_server_addr(), current_user"أغلق جلسة التوجيه عند انتهاء العمل؛ يتوقف الإدخال المحلي عن العمل حينها ولا يتغير شيء آخر. مسار قاعدة بيانات واحد ليس VPN لكل عميل GIS، والتعامل معه على هذا الأساس هو ما يجعل الاتصال التالي يُشخَّص خطأً.