
بروتوكول شل سريع وآمن مبني على HTTP/3 وQUIC وTLS 1.3. يدعم OAuth2 وOpenID Connect ومصادقة SSH التقليدية مع إعادة توجيه منفذ UDP وقدرات الخادم المخفي.
[!NOTE] من المحتمل أن يغير SSH3 اسمه. لا يزال بروتوكول اتصال SSH (RFC4254) يعمل فوق HTTP/3 Extended connect، لكن التغييرات المطلوبة ثقيلة وبعيدة جدًا عن فلسفة تطبيقات SSH الشائعة ليتم اعتبارها للتكامل. مسودة المواصفات قد أعيدت تسميتها بالفعل ("Remote Terminals over HTTP/3")، لكننا نحتاج بعض الوقت للخروج باسم دائم لطيف.
SSH3 هو إعادة نظر كاملة لبروتوكول SSH، حيث يربط دلالاته فوق آليات HTTP. إنه ناتج عن عملنا البحثي ونحن (الباحثون) اقترحناه مؤخرًا كـ مسودة إنترنت (draft-michel-remote-terminal-http3-00).
باختصار، يستخدم SSH3 QUIC+TLS1.3 لإنشاء القناة الآمنة وآليات تفويض HTTP لمصادقة المستخدم. من بين أمور أخرى، يتيح SSH3 التحسينات التالية:
[!TIP] هل تريد البدء سريعًا؟ اطلع على كيفية تثبيت SSH3. ستتعلم إعداد خادم SSH3 و استخدام عميل SSH3.
أسرع في إنشاء الجلسة، وليس في الإنتاجية! يقدم SSH3 إنشاء جلسة أسرع بكثير من SSHv2. إنشاء جلسة جديدة باستخدام SSHv2 يمكن أن يستغرق 5 إلى 7 رحلات ذهابًا وإيابًا عبر الشبكة، وهو ما يمكن للمستخدم ملاحظته بسهولة. يحتاج SSH3 فقط إلى 3 رحلات ذهابًا وإيابًا. زمن انتقال ضغطة المفاتيح في جلسة قيد التشغيل يبقى دون تغيير.
SSH3 (أعلى) مقارنة بـ SSHv2 (أسفل) في إنشاء الجلسة مع زمن ping قدره 100ms نحو الخادم.
بينما يحدد SSHv2 بروتوكولاته الخاصة لمصادقة المستخدم وإنشاء القناة الآمنة، يعتمد SSH3 على آليات TLS 1.3 و QUIC و HTTP القوية والمختبرة عبر الزمن. تُستخدم هذه البروتوكولات بالفعل على نطاق واسع لتأمين التطبيقات الحساسة للأمان على الإنترنت مثل التجارة الإلكترونية والخدمات المصرفية عبر الإنترنت.
يطبق SSH3 بالفعل طرق المصادقة الشائعة القائمة على كلمة المرور والمفتاح العام (RSA و EdDSA/ed25519). كما يدعم طرق مصادقة جديدة مثل OAuth 2.0 ويسمح بتسجيل الدخول إلى خوادمك باستخدام حسابات Google/Microsoft/Github الخاصة بك.
بينما يُظهر SSH3 وعدًا بإنشاء جلسة أسرع، فإنه لا يزال في مرحلة إثبات المفهوم المبكرة. كما هو الحال مع أي بروتوكول معقد جديد، هناك حاجة إلى مراجعة تشفيرية خبيرة على مدى زمني ممتد قبل إمكانية استخلاص استنتاجات أمان معقولة.
نحن نطور SSH3 كمشروع مفتوح المصدر لتسهيل تعليقات المجتمع وتحليله. ومع ذلك، لا يمكننا بعد الموافقة على ملاءمته للأنظمة الإنتاجية دون مزيد من مراجعة النظراء. يرجى التعاون معنا إذا كانت لديك الخبرة ذات الصلة!
نظرًا لحالة النموذج الأولي الحالية، ننصح باختبار SSH3 في بيئات معزولة أو شبكات خاصة. كن على علم أن جعل الخوادم التجريبية متصلة بالإنترنت مباشرة قد يقدم مخاطر قبل الفحص الأمني الشامل.
بينما لإخفاء الخوادم خلف مسارات سرية فوائد محتملة، فإنه لا يلغي الحاجة إلى تحليل دقيق للثغرات قبل الدخول في الإنتاج. نحن متحمسون لإمكانيات SSH3 المستقبلية ولكننا نشجع على فحص إضافي أولاً.
باستخدام SSH3، يمكنك تجنب الإجهاد المعتاد لفحص وهجمات القاموس ضد خادم SSH الخاص بك. مثل مستندات Google Drive السرية الخاصة بك، يمكن إخفاء خادم SSH3 الخاص بك خلف رابط سري والاستجابة فقط لمحاولات المصادقة التي قدمت طلب HTTP إلى هذا الرابط المحدد، مثل التالي:
ssh3-server -bind 192.0.2.0:443 -url-path <my-long-secret>
عن طريق استبدال <my-long-secret> بالقيمة العشوائية M3MzkxYWMxMjYxMjc5YzJkODZiMTAyMjU على سبيل المثال، سيستجيب خادم SSH3 الخاص بك فقط لمحاولات اتصال SSH3 الموجهة إلى URL https://192.0.2.0:443/M3MzkxYWMxMjYxMjc5YzJkODZiMTAyMjU وسيرد بـ 404 Not Found على الطلبات الأخرى. لذلك لا يمكن للمهاجمين والزواحف على الإنترنت اكتشاف وجود خادم SSH3 الخاص بك. سيرون فقط خادم ويب بسيط يرد برموز حالة 404 على كل طلب.
لاحظ جيدًا: وضع خادم SSH3 الخاص بك خلف URL سري قد يقلل من تأثير هجمات الفحص ولكنه لن ولن يستبدل أبدًا آليات المصادقة التقليدية. يجب استخدام الرابط السري فقط لتجنب اكتشاف مضيفك. لا ينبغي أن تمنح معرفة الرابط السري شخصًا ما الوصول إلى خادمك. استخدم آليات المصادقة التقليدية الموضحة أعلاه لحماية خادمك.
يوفر SSH3 ميزات جديدة لم يتمكن بروتوكول SSHv2 من توفيرها.
هذا التطبيق لـ SSH3 يوفر بالفعل العديد من الميزات الشائعة لـ OpenSSH، لذا إذا كنت معتادًا على OpenSSH، فستكون عملية اعتماد SSH3 سلسة. فيما يلي قائمة ببعض ميزات OpenSSH التي ينفذها SSH3 أيضًا:
~/.ssh/authorized_keys على الخادمknown_hosts عند عدم استخدام شهادات X.509.ssh-agent تلقائيًا لمصادقة المفتاح العام-proxy-jump). إذا كان A عميل SSH3 وكان B و C كلاهما خوادم SSH3، يمكنك الاتصال من A إلى C باستخدام B كبوابة/وكيل. يستخدم الوكيل إعادة توجيه UDP لإعادة توجيه حزم QUIC من A إلى C، لذلك لا يمكن لـ B فك تشفير حركة مرور SSH3 بين A و C.~/.ssh/config على العميل ويتعامل مع خيارات التكوين Hostname و User و Port و IdentityFile (يتم تجاهل الخيارات الأخرى حاليًا). كما يوزع خيارًا جديدًا UDPProxyJump يعمل بشكل مشابه لـ ProxyJump الخاص بـ OpenSSH.ساعدنا في تطوير SSH3 بمسؤولية! نرحب بباحثي الأمن القادرين على مراجعة قاعدة الكود الخاصة بنا وتقديم الملاحظات. يرجى أيضًا التواصل معنا بشأن هيئات المعايير ذات الصلة للترويج لـ SSH3 عبر عمليات IETF/IRTF الرسمية بمرور الوقت.
بمساعدة تعاونية، نأمل في تحسين SSH3 بشكل تدريجي نحو الاستعداد الآمن للإنتاج. لكن لا يمكننا تقديم ادعاءات أمان قاطعة بشكل موثوق دون دليل على مراجعة تشفيرية خبيرة واسعة النطاق واعتماد من قبل سلطات أمان محترمة. دعونا نعمل معًا لتحقيق إمكانيات SSH3!
يمكنك إما تنزيل الإصدارات الثنائية الأخيرة أو تثبيته باستخدام go install أو إنشاء هذه الإصدارات الثنائية بنفسك عن طريق تجميع الكود من المصدر.
[!TIP] SSH3 لا يزال تجريبيًا وهو ثمرة عمل بحثي. إذا كنت تخشى نشر خادم SSH3 جديد علنًا، يمكنك استخدام ميزة المسار السري لـ SSH3 لإخفائه خلف URL سري.
go install github.com/francoismichel/ssh3/cmd/...@latest
تحتاج إلى إصدار حديث من Golang للقيام بذلك. يمكن تنزيل الكود المصدري وتجميع الإصدارات الثنائية بالخطوات التالية:
git clone https://github.com/francoismichel/ssh3 # استنساخ المستودع
cd ssh3
go build -o ssh3 cmd/ssh3/main.go # بناء العميل
CGO_ENABLED=1 go build -o ssh3-server cmd/ssh3-server/main.go # بناء الخادم، يتطلب تثبيت gcc
إذا كان لديك صلاحيات الجذر/ sudo وتريد جعل ssh3 متاحًا لجميع المستخدمين، يمكنك نسخ الإصدارات الثنائية مباشرة إلى /usr/bin:
cp ssh3 /usr/bin/ && cp ssh3-server /usr/bin
وإلا، يمكنك ببساطة إضافة الملفات التنفيذية إلى متغير البيئة PATH الخاص بك عن طريق إضافة السطر التالي في نهاية ملف .bashrc أو ما يعادله:
export PATH=$PATH:/path/to/the/ssh3/directory
قبل الاتصال بالمضيف الخاص بك، تحتاج إلى نشر خادم SSH3 عليه. لا يوجد حاليًا خفي SSH3، لذا ستحتاج الآن إلى تشغيل الملف التنفيذي ssh3-server في الخلفية باستخدام screen أو أداة مماثلة.
[!NOTE] نظرًا لأن SSH3 يعمل فوق HTTP/3، يحتاج الخادم إلى شهادة X.509 ومفتاحها الخاص المقابل. يمكن إنشاء الشهادات العامة تلقائيًا لاسم المجال العام الخاص بك من خلال Let's Encrypt باستخدام وسيطة سطر الأوامر
-generate-public-certعلى الخادم. إذا كنت لا ترغب في إنشاء شهادة موقعة من هيئة شهادات حقيقية أو ليس لديك اسم مجال عام، يمكنك إنشاء شهادة ذاتية التوقيع باستخدام وسيطة-generate-selfsigned-cert. توفر الشهادات ذاتية التوقيع ضمانات أمان مماثلة لآلية مفاتيح المضيف في SSHv2، مع نفس مشكلة الأمان: قد تكون عرضة لهجمات الوسيط أثناء اتصالك الأول بالخادم. استخدام الشهادات الحقيقية الموقعة من هيئات شهادات عامة مثل Let's Encrypt يتجنب هذه المشكلة.
فيما يلي استخدام الملف التنفيذي ssh3-server:
Usage of ./ssh3-server:
-bind string
the address:port pair to listen to, e.g. 0.0.0.0:443 (default "[::]:443")
-cert string
the filename of the server certificate (or fullchain) (default "./cert.pem")
-key string
the filename of the certificate private key (default "./priv.key")
-enable-password-login
if set, enable password authentication (disabled by default)
-generate-public-cert value
Automatically produce and use a valid public certificate usingLet's Encrypt for the provided domain name. The flag can be used several times to generate several certificates.If certificates have already been generated previously using this flag, they will simply be reused without being regenerated. The public certificates are automatically renewed as long as the server is running. Automatically-generated IP public certificates are not available yet.
-generate-selfsigned-cert
if set, generates a self-self-signed cerificate and key that will be stored at the paths indicated by the -cert and -key args (they must not already exist)
-url-path string
the secret URL path on which the ssh3 server listens (default "/ssh3-term")
-v verbose mode, if set
-version
if set, displays the software version on standard output and exit
يقوم الأمر التالي بتشغيل خادم SSH3 عام على المنفذ 443 بشهادة عامة صالحة من Let's Encrypt للنطاق my-domain.example.org ويستجيب لطلبات الجلسات الجديدة التي تستعلم عن مسار URL /ssh3:
ssh3-server -generate-public-cert my-domain.example.org -url-path /ssh3
إذا لم يكن لديك اسم مجال عام (أي عنوان IP فقط)، يمكنك إما استخدام شهادة موجودة لعنوان IP الخاص بك باستخدام وسيطتي -cert و -key أو إنشاء شهادة ذاتية التوقيع باستخدام وسيطة -generate-selfsigned-cert.
إذا كان لديك شهادات ومفاتيح موجودة، يمكنك تشغيل الخادم على النحو التالي لاستخدامها:
ssh3-server -cert /path/to/cert/or/fullchain -key /path/to/cert/private/key -url-path /ssh3
[!NOTE] على غرار OpenSSH، يجب تشغيل الخادم بصلاحيات الجذر لتسجيل الدخول كمستخدمين آخرين.
افتراضيًا، سيبحث خادم SSH3 عن الهويات في ملفي ~/.ssh/authorized_keys و ~/.ssh3/authorized_identities لكل مستخدم. يتيح ملف ~/.ssh3/authorized_identities هويات جديدة مثل OpenID Connect (oidc) التي تمت مناقشتها أدناه. يمكن استخدام أنواع المفاتيح الشائعة مثل rsa و ed25519 والمفاتيح بتنسيق OpenSSH.
بمجرد تشغيل خادم SSH3، يمكنك الاتصال به باستخدام عميل SSH3 بشكل مشابه لما كنت تفعله باستخدام أداة SSHv2 الكلاسيكية.
فيما يلي استخدام الملف التنفيذي ssh3:
Usage of ssh3:
-pubkey-for-agent string
if set, use an agent key whose public key matches the one in the specified path
-privkey string
private key file
-use-password
if set, do classical password authentication
-forward-agent
if set, forwards ssh agent to be used with sshv2 connections on the remote host
-forward-tcp string
if set, take a localport/remoteip@remoteport forwarding localhost@localport towards remoteip@remoteport
-forward-udp string
if set, take a localport/remoteip@remoteport forwarding localhost@localport towards remoteip@remoteport
-proxy-jump string
if set, performs a proxy jump using the specified remote host as proxy
-insecure
if set, skip server certificate verification
-keylog string
Write QUIC TLS keys and master secret in the specified keylog file: only for debugging purpose
-use-oidc string
if set, force the use of OpenID Connect with the specified issuer url as parameter
-oidc-config string
OpenID Connect json config file containing the "client_id" and "client_secret" fields needed for most identity providers
-do-pkce
if set, perform PKCE challenge-response with oidc
-v if set, enable verbose mode
يمكنك الاتصال بخادم SSH3 الخاص بك على my-server.example.org الذي يستمع على /my-secret-path باستخدام المفتاح الخاص الموجود في ~/.ssh/id_rsa بالأمر التالي:
ssh3 -privkey ~/.ssh/id_rsa [email protected]/my-secret-path
يعمل عميل SSH3 مع وكيل OpenSSH ويستخدم متغير البيئة الكلاسيكي SSH_AUTH_SOCK للتواصل مع هذا الوكيل. على غرار OpenSSH، سيقوم SSH3 بسرد المفاتيح المقدمة من وكيل SSH والاتصال باستخدام أول مفتاح يدرجه الوكيل افتراضيًا. إذا كنت تريد تحديد مفتاح معين لاستخدامه مع الوكيل، يمكنك إما تحديد المفتاح الخاص مباشرة باستخدام وسيطة -privkey كما هو موضح أعلاه، أو تحديد المفتاح العام المقابل باستخدام وسيطة -pubkey-for-agent. هذا يسمح لك بالمصادقة في المواقف التي يكون فيها للوكيل فقط وصول مباشر إلى المفتاح الخاص ولكن لديك فقط وصول إلى المفتاح العام.
على الرغم من عدم تشجيعها، يمكنك الاتصال بخادمك باستخدام كلمات المرور (إذا تم تمكينها صراحةً على ssh3-server) بالأمر التالي:
ssh3 -use-password [email protected]/my-secret-path
ssh3 يقوم بتحليل تكوين OpenSSH الخاص بك. حاليًا، يتعامل فقط مع خيارات OpenSSH Hostname و User و Port و IdentityFile. كما يضيف خيارات جديدة يستخدمها SSH3 فقط، مثل URLPath أو UDPProxyJump. يسمح لك URLPath بحذف مسار URL السري في أمر SSH3 الخاص بك. يسمح لك UDPProxyJump بإجراء القفز عبر الوكيل لـ SSH3 وله نفس معنى وسيطة سطر الأوامر -proxy-jump. لنفترض أن لديك الأسطر التالية في تكوين OpenSSH الخاص بك الموجود في ~/.ssh/config:
IgnoreUnknown URLPath
Host my-server
HostName 192.0.2.0
User username
IdentityFile ~/.ssh/id_rsa
URLPath /my-secret-path
على غرار ما يفعله OpenSSH، سيقوم أمر ssh3 التالي بتوصيلك بخادم SSH3 الذي يعمل على 192.0.2.0 على منفذ UDP 443 باستخدام مصادقة المفتاح العام مع المفتاح الخاص الموجود في .ssh/id_rsa:
ssh3 my-server/my-secret-path
إذا كنت لا ترغب في استخدام SSH3 القائم على التكوين، يمكنك قراءة الأقسام أدناه لمعرفة كيفية استخدام معاملات CLI الخاصة بـ ssh3.
تتيح لك هذه الميزة الاتصال باستخدام موفر هوية خارجي مثل موفر شركتك أو أي موفر آخر يطبق معيار OpenID Connect، مثل Google Identity أو Github أو Microsoft Entra. يوضح GIF أدناه تدفق المصادقة.
اتصال آمن بدون مفتاح خاص باستخدام حساب Google.
يتم تكوين طريقة الاتصال بموفر الهوية الخاص بك في ملف يُسمى ~/.ssh3/oidc_config.json. يوجد أدناه مثال على ملف config.json للاستخدام مع حساب Google. ملف التكوين هذا عبارة عن مصفوفة ويمكن أن يحتوي على عدة تكوينات لموفري الهوية.
[
{
"issuer_url": "https://accounts.google.com",
"client_id": "<your_client_id>",
"client_secret": "<your_client_secret>"
}
]
قد يتغير هذا في المستقبل، ولكن حاليًا، لجعل هذه الميزة تعمل مع حساب Google الخاص بك، ستحتاج إلى إعداد تطبيق تجريبي جديد في وحدة تحكم Google Cloud الخاصة بك وإضافة بريدك الإلكتروني كمستخدمين مصرح لهم. سيوفر لك هذا client_id و client_secret يمكنك بعد ذلك تعيينهما في ملف ~/.ssh3/oidc_config.json. على جانب الخادم، كل ما عليك فعله هو إضافة السطر التالي في ملف ~/.ssh3/authorized_identities:
oidc <client_id> https://accounts.google.com <email>
نحن نعتبر حاليًا إزالة الحاجة إلى تعيين client_id في ملف authorized_identities في المستقبل.
غالبًا ما يحدث أن بعض مضيفات SSH لا يمكن الوصول إليها إلا من خلال بوابة. يتيح لك SSH3 إجراء قفزة عبر الوكيل بشكل مشابه لما يقدمه OpenSSH. يمكنك الاتصال من A إلى C باستخدام B كبوابة/وكيل. يجب أن يكون B و C كلاهما يشغلان خادم SSH3 صالح. يعمل هذا عن طريق إنشاء إعادة توجيه منفذ UDP على B لإعادة توجيه حزم QUIC من A إلى C. وبالتالي فإن الاتصال من A إلى C هو اتصال كامل من طرف إلى طرف ولا يمكن لـ B فك تشفير أو تغيير حركة مرور SSH3 بين A و C.