फ़ाइल नाम से ssh-Agent से पहचान चुनें


9

समस्या: मेरी कुछ 20-30 ssh-agentपहचान हैं। अधिकांश सर्वर प्रमाणीकरण के साथ मना कर देते हैं Too many failed authentications, क्योंकि एसएसएच आमतौर पर मुझे लॉग इन करने के लिए 20 विभिन्न कुंजियों की कोशिश नहीं करने देता।

फिलहाल, मैं प्रत्येक होस्ट के लिए पहचान फ़ाइल को मैन्युअल रूप से निर्दिष्ट कर रहा हूं, IdentityFileऔर IdentitiesOnlyनिर्देश का उपयोग कर रहा हूं , ताकि एसएसएच केवल एक कुंजी फ़ाइल का प्रयास करेगा, जो काम करती है।

दुर्भाग्य से, यह काम करना बंद कर देता है जैसे ही मूल कुंजी अब उपलब्ध नहीं हैं। ssh-add -lमुझे हर कुंजी फ़ाइल के लिए सही पथ दिखाता है, और वे पथों के साथ मेल खाते हैं .ssh/config, लेकिन यह काम नहीं करता है। जाहिरा तौर पर, SSH सार्वजनिक कुंजी हस्ताक्षर द्वारा इंडेंटिटी का चयन करता है न कि फ़ाइल नाम से, जिसका अर्थ है कि मूल फाइलें उपलब्ध होनी हैं ताकि SSH सार्वजनिक कुंजी को निकाल सके।

इसके साथ दो मुश्किलें हैं:

  • जैसे ही मैं चाबी पकड़ फ्लैश ड्राइव को अनप्लग करता है, यह काम करना बंद कर देता है
  • यह दूरस्थ होस्ट पर उपलब्ध महत्वपूर्ण फ़ाइलों के रूप में बेकार को अग्रेषित करने वाले एजेंट को प्रस्तुत नहीं करता है

बेशक, मैं अपनी पहचान फ़ाइलों से सार्वजनिक कुंजी निकाल सकता हूं और उन्हें अपने कंप्यूटर पर संग्रहीत कर सकता हूं, और प्रत्येक दूरस्थ कंप्यूटर पर मैं आमतौर पर लॉग इन करता हूं। यह एक वांछनीय समाधान की तरह नहीं दिखता है, हालांकि।

मुझे फ़ाइल नाम से ssh-agent से एक पहचान का चयन करने के लिए एक संभावना की आवश्यकता है, ताकि मैं दूरस्थ होस्ट I SSH'd पर उपयोग करके .ssh/configया पास करके आसानी से सही कुंजी का चयन कर -i /path/to/original/keyसकूं। यह बेहतर होगा यदि मैं कुंजियों को "उपनाम" दे सकूं ताकि मुझे पूर्ण पथ निर्दिष्ट न करना पड़े।


1
आपको कई ssh पहचान की आवश्यकता क्यों है? यदि यह आपके सभी खातों तक पहुंच प्रदान करने वाली एक समझौता किए गए निजी कुंजी से बचने के लिए है, तो आप सभी को एक ही फ्लैश ड्राइव पर क्यों रखते हैं? यह पहली बार नहीं है जब मैंने कई ssh पहचानों को प्रबंधित करने से संबंधित समस्याओं के बारे में सुना है, लेकिन कभी भी यह पूछने का मौका नहीं मिला कि उनकी आवश्यकता क्यों है।
दिमित्री चुबारोव

कभी नहीं कहा कि सभी एक फ्लैश ड्राइव पर हैं।
लूलुक

3
@DmitriChubarov कई ssh आइडेंटिटी के लिए एक संभावित एप्लिकेशन एक authorized_keysफाइल है, जिसका उपयोग की गई कुंजी के आधार पर, अलग-अलग कमांड को निष्पादित करता है, कभी भी सीधे शेल एक्सेस की अनुमति के बिना।
टोबियास किंजलर

जवाबों:


8

मुझे लगता है कि मुझे अपने सवाल का जवाब देना होगा, क्योंकि फ़ाइल नाम से पहचान का अनुरोध करने का कोई तरीका नहीं लगता है।

मैंने एक त्वरित और गंदा पायथन स्क्रिप्ट लिखी जो .ssh/fingerprintsएजेंट के पास मौजूद हर कुंजी के लिए एक सार्वजनिक कुंजी फ़ाइल बनाता है । मैं फिर इस फ़ाइल को निर्दिष्ट कर सकता हूं, जिसमें कोई गुप्त कुंजी नहीं है, IdentityFileएसएसएच एजेंट का उपयोग करके सही पहचान करेगा। पूरी तरह से ठीक काम करता है, और मुझे अपनी इच्छानुसार कई निजी कुंजियों के लिए एजेंट का उपयोग करने की अनुमति देता है।

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Dumps all public keys held by ssh-agent and stores them in ~/.ssh/fingerprints/, so that
they can be identified using the IdentityFile directive.

"""

import sys, os
import stat
import re
import envoy

RE_MATCH_FILENAME = re.compile(r'([^\\/:*?"<>|\r\n]+)\.\w{2,}$', re.IGNORECASE)

if os.getuid() == 0:
    USERNAME = os.environ['SUDO_USER']
else:
    USERNAME = os.environ['USER']

def error(message):
    print "Error:", message
    sys.exit(1)

def main():
    keylist = envoy.run('ssh-add -L').std_out.strip('\n').split('\n')

    if len(keylist) < 1:
        error("SSH-Agent holds no indentities")

    for key in keylist:
        crypto, ckey, name = key.split(' ')
        filename = os.path.join(os.environ['HOME'], '.ssh/fingerprints',
                  RE_MATCH_FILENAME.search(name).group(1)+'.pub')

        with open(filename, 'w') as f:
            print "Writing %s ..." % filename
            f.write(key)

        envoy.run('chmod 600 %s' % filename)
        envoy.run('chown %s %s' % (USERNAME, filename))


if __name__ == '__main__':
    main()

अच्छा काम, मैं जल्द ही यह कोशिश करूँगा
टोबियास किन्ज़लर

3

Daud

ssh-add -L | gawk ' { print $2 > $3 ".pub" } '

दूरस्थ मशीन पर सभी सार्वजनिक कुंजी फ़ाइलों को स्वचालित रूप से जनरेट करने के लिए (यह मानते हुए कि आपके .ssh/configनाम में सार्वजनिक कुंजियाँ हैं privateKeyFileName.pubऔर कोई असंगत पथ शामिल नहीं हैं)। chown $USER .ssh/*अपने sudoमामले के लिए कॉल करें ।


1

स्वीकार किए गए समाधान से उठाकर, और यह मानकर कि आप प्रारंभिक सर्वर तक पहुंच प्राप्त करने के लिए उपयोग की गई पहचान का पुन: उपयोग करना चाहते हैं, तो कुछ इस प्रकार है:

Host github.com
    IdentitiesOnly yes
    IdentityFile ~/.ssh/authorized_keys

पर्याप्त है।


यह मेरे लिए काम नहीं करता है। जब पहचान फ़ाइल में केवल एक सार्वजनिक कुंजी होती है - यह काम करती है, लेकिन एकाधिक नहीं।
यग्रेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.