كيفية إدارة عدة مفاتيح SSH

من الآمن أن نقول إن معظم المطورين في مجال الويب قد واجهوا SSH في وقت ما. SSH هو أحد البروتوكولات الأكثر استخدامًا للتبادل الآمن للبيانات. أنت تستخدم SSH للاتصال بالخوادم البعيدة ، والتي تتضمن أيضًا إدارة التعليمات البرمجية باستخدام Git والمزامنة مع المستودعات البعيدة.

على الرغم من أنه من الممارسات الجيدة أن يكون لديك زوج واحد من المفاتيح الخاصة والعامة لكل جهاز ، فأنت تحتاج أحيانًا إلى استخدام مفاتيح متعددة و / أو لديك أسماء مفاتيح غير تقليدية.

ربما تستخدم زوج مفاتيح SSH واحدًا للعمل في المشاريع الداخلية لشركتك ، لكن ربما تستخدم مفتاحًا مختلفًا للوصول إلى بعض خوادم عملاء الشركة. ربما تستخدم مفتاحًا مختلفًا للوصول إلى الخادم الخاص بك.

يمكن أن تصبح إدارة مفاتيح SSH مرهقة بمجرد أن تحتاج إلى استخدام مفتاح ثانٍ. آمل أن تكون هذه المقالة مفيدة لأي شخص لديه مشكلات في إدارة مفاتيح SSH.

أفترض أن القارئ لديه معرفة أساسية بـ Git و SSH. ستستخدم معظم الأمثلة في المقالة Git. بالطبع ، سينطبق كل هذا على أي اتصال SSH آخر. ومع ذلك ، هناك بعض الحيل الخاصة بـ Git المضمنة.

حزام ، ها نحن ذا!

التعامل مع مفتاح SSH واحد

أولاً ، دعنا نرى كيف سيبدو سير عملك قبل أن يكون لديك مفاتيح متعددة للقلق بشأنها.

لديك مفتاح خاص واحد مخزّن ~/.ssh/id_rsaمع مفتاح عام مطابق ~/.ssh/id_rsa.pub.

دعنا نتخيل أنك تريد دفع / سحب تغييرات الكود من / إلى خادم Git بعيد - قل GitHub ، لماذا لا. للقيام بذلك ، عليك أولاً إضافة مفتاحك العام إلى GitHub.

لن أتجاوز هذه الخطوة ، يجب أن تكون سهلة بما يكفي لمعرفة كيفية القيام بذلك. لقد افترضت أيضًا أن اسمك هو ستيف وأنت تعمل على مشروع سري للغاية يستخدم Raspberry Pies لاستنشاق حركة مرور الشبكة.

لبدء عملك ، عليك استنساخ مستودع git باستخدام SSH:

git clone [email protected]:steve/raspberry-spy.git

في هذه اللحظة سيكون GitHub مثل: "Yo ، هذا مستودع خاص! نحتاج إلى تشفير حركة المرور باستخدام هذا المفتاح العام الموجود لدي هنا ومفتاحك الخاص ".

لقد أضفت المفتاح العام إلى ملف التعريف الخاص بك على GitHub ، ولكن على SSH أن يكتشف بطريقة ما مكان وجود مفتاحك الخاص المطابق.

نظرًا لعدم وجود دليل على المفتاح الخاص الذي يجب استخدامه عند دخول [email protected]SSH ، يحاول عميل SSH العثور على مفتاح في الموقع الافتراضي ، وهو ~/.ssh/id_rsa- أفضل تخمين له. إذا لم يكن هناك ملف في هذا الموقع ، فستتلقى خطأ:

Cloning into 'raspberry-spy'... Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

إذا كان لديك بعض المفاتيح الخاصة مخزنة في ملف ~/.ssh/id_rsa، فسيستخدم عميل SSH هذا المفتاح الخاص لتشفير الاتصال. إذا تم تسجيل هذا المفتاح بكلمة مرور (كما ينبغي) ، فسيُطلب منك إدخال كلمة مرور ، مثل:

Enter passphrase for key '/Users/steve/.ssh/id_rsa':

إذا أدخلت عبارة المرور الصحيحة وإذا كان هذا المفتاح الخاص هو بالفعل الذي يتوافق مع المفتاح العام الذي أرفقته بملفك الشخصي ، فسيتم كل شيء على ما يرام وسيتم استنساخ المستودع بنجاح.

ولكن ماذا لو قمت بتسمية مفتاحك بشكل مختلف (على سبيل المثال ~/.ssh/_id_rsa)؟ لن يتمكن عميل SSH من تحديد مكان تخزين المفتاح الخاص. سوف تحصل على نفس Permission denied ...الخطأ كما كان من قبل.

إذا كنت تريد استخدام مفتاح خاص قمت بتسميته بشكل مختلف ، فعليك إضافته يدويًا:

ssh-add ~/.ssh/_id_rsa

بعد إدخال عبارة المرور ، يمكنك التحقق مما إذا تمت إضافة المفتاح إلى ssh-agent(عميل SSH) عن طريق التنفيذ ssh-add -l. سيقوم هذا الأمر بسرد جميع المفاتيح المتاحة حاليًا لعميل SSH.

إذا حاولت استنساخ المستودع الآن ، فسيكون ناجحًا.

حتى الان جيدة جدا؟

إذا كنت شديد الانتباه ، فقد تبدأ في ملاحظة بعض المشكلات المحتملة.

أولاً ، إذا قمت ssh-agentبإعادة تشغيل جهاز الكمبيوتر الخاص بك ، فستتم إعادة تشغيله وسيتعين عليك إضافة مفاتيحك غير ذات الأسماء الافتراضية باستخدام ssh-addكل شيء مرة أخرى ، وكتابة كلمات المرور وكل هذه الأشياء المملة.

هل يمكننا أتمتة إضافة المفاتيح أو تحديد المفتاح بطريقة ما لاستخدامه عند الوصول إلى خوادم معينة؟

هل يمكننا بطريقة ما حفظ كلمات المرور حتى لا نضطر إلى كتابتها في كل مرة؟ إذا كان هناك شيء مثل سلسلة المفاتيح لحفظ مفاتيح SSH المحمية بكلمة مرور؟

كن مطمئنًا ، هناك إجابات لكل هذه الأسئلة.

أدخل ، SSH config

كما اتضح ، ملف تكوين SSH شيء يمكن أن يساعدنا. إنه ملف تكوين لكل مستخدم لاتصالات SSH. قم بإنشاء ملف جديد: ~/.ssh/configوافتحه للتحرير.

إدارة مفاتيح SSH ذات الأسماء المخصصة

أول شيء سنحله باستخدام هذا configالملف هو تجنب الاضطرار إلى إضافة مفاتيح SSH ذات الأسماء المخصصة باستخدام ssh-add. بافتراض تسمية مفتاح SSH ~/.ssh/_id_rsa، أضف ما يلي إلى configالملف:

Host github.com HostName github.com User git IdentityFile ~/.ssh/_id_rsa IdentitiesOnly yes

تأكد الآن من أن ذلك ~/.ssh/_id_rsaليس ssh-agentموجودًا بالتنفيذ ssh-add -D. سيؤدي هذا الأمر إلى إزالة جميع المفاتيح من ssh-agentالجلسة النشطة حاليًا . تتم إعادة ضبط الجلسة في كل مرة تقوم فيها بتسجيل الخروج أو إعادة التشغيل (أو إذا قمت بإيقاف ssh-agentالعملية يدويًا). يمكننا "محاكاة" إعادة التشغيل بتنفيذ الأمر المذكور.

إذا حاولت استنساخ مستودع GitHub الخاص بك الآن ، فسيكون كما لو أننا أضفنا المفتاح يدويًا (كما فعلنا من قبل). سيُطلب منك كلمة المرور:

git clone [email protected]:steve/raspberry-spy.git Cloning into 'raspberry-spy'... Enter passphrase for key '/Users/steve/.ssh/_id_rsa':

ستلاحظ أن المفتاح الذي تمت مطالبتنا بكلمة المرور الخاصة به هو نفس المفتاح الذي حددناه في configملفنا. بعد إدخال كلمة مرور مفتاح SSH الصحيحة ، سيتم نسخ المستودع بنجاح.

ملاحظة: إذا حاولت ، بعد الاستنساخ الناجح ، فسيُطلب git pullمنك كلمة المرور مرة أخرى. سنحل ذلك لاحقًا.

من المهم أن مباراة Host github.comمن configوإلى github.comURI [email protected]:steve/raspberry-spy.git. يمكنك أيضًا التغيير configلتكون Host mygithubواستنساخ باستخدام URI [email protected]:steve/raspberry-spy.git.

هذا يفتح الباب على مصراعيه. أثناء قيامك بإعادة هذا ، يتسابق عقلك ويفكر في كيفية انتهاء كل مشاكلك مع مفاتيح SSH. فيما يلي بعض أمثلة التكوين المفيدة:

Host bitbucket-corporate HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_corp IdentitiesOnly yes

الآن يمكنك استخدام ملفات git clone [email protected]:company/project.git

Host bitbucket-personal HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes

الآن يمكنك استخدام ملفات git clone [email protected]:steve/other-pi-project.git

Host myserver HostName ssh.steve.com Port 1111 IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes User steve IdentitiesOnly yes

الآن يمكنك SSH في الخادم الخاص بك باستخدام ssh myserver. كم ذلك رائع؟ لا تحتاج إلى إدخال المنفذ واسم المستخدم يدويًا في كل مرة تقوم فيها بتنفيذ sshالأمر.

المكافأة: إعدادات لكل مستودع

يمكنك أيضًا تحديد أي مفتاح معين يجب استخدامه لمستودع معين ، متجاوزًا أي شيء في SSH config. يمكن تعريف القيادة SSH معين عن طريق وضع sshCommandتحت coreفي /.git/config. مثال:

[core] sshCommand = ssh -i ~/.ssh/id_rsa_corp

هذا ممكن مع git 2.10 أو أحدث. يمكنك أيضًا استخدام هذا الأمر لتجنب تحرير الملف يدويًا:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_corp'

إدارة كلمة المرور

الجزء الأخير من اللغز هو إدارة كلمات المرور. نريد تجنب الاضطرار إلى إدخال كلمة المرور في كل مرة يتم فيها بدء اتصال SSH. للقيام بذلك ، يمكننا استخدام برنامج إدارة سلسلة المفاتيح الذي يأتي مع MacOS وتوزيعات Linux المختلفة.

ابدأ بإضافة مفتاحك إلى سلسلة المفاتيح عن طريق تمرير -Kالخيار إلى ssh-addالأمر:

ssh-add -K ~/.ssh/id_rsa_whatever

الآن يمكنك رؤية مفتاح SSH الخاص بك في سلسلة المفاتيح. على نظام MacOS يبدو الأمر كالتالي:

الوصول إلى سلسلة المفاتيح

إذا قمت بإزالة المفاتيح من ssh-agentخلال ssh-add -D(سيحدث هذا عند إعادة تشغيل جهاز الكمبيوتر الخاص بك ، كما ذكرنا من قبل) وحاولت SSH-ing ، فسيُطلب منك كلمة المرور مرة أخرى. لماذا ا؟ لقد أضفنا للتو المفتاح إلى سلسلة المفاتيح. إذا قمت بالتحقق من Keychain Access مرة أخرى ، فستلاحظ أن المفتاح الذي أضفته باستخدام ssh-add -Kلا يزال في keychain. غريب ، هاه؟

اتضح أن هناك طوقًا آخر للقفز من خلاله. افتح configملف SSH وأضف ما يلي:

Host * AddKeysToAgent yes UseKeychain yes

الآن ، سيبحث SSH عن المفتاح في keychain وإذا وجده فلن تتم مطالبتك بكلمة المرور. ستتم إضافة المفتاح أيضًا إلى ssh-agent. في MacOS ، سيعمل هذا على MacOS Sierra 10.12.2 أو أحدث. على Linux ، يمكنك استخدام شيء مثل gnome-keyringوقد يعمل حتى بدون هذا التعديل الأخير لـ SSH config. بالنسبة لـ Windows - من يدري ، أليس كذلك؟

آمل أن يكون شخص ما وجد هذا مفيدًا. اذهب الآن وقم بتكوين configملف SSH الخاص بك !

تعرف على المزيد حول SSH:

  • الدليل النهائي لمفاتيح SSH
  • مقدمة من أعلى إلى أسفل لـ SSH