เลือก identity จาก ssh-agent ตามชื่อไฟล์


9

ปัญหา: ฉันมีssh-agentตัวตนประมาณ 20-30 ตัว เซิร์ฟเวอร์ส่วนใหญ่ปฏิเสธการรับรองความถูกต้องด้วยToo many failed authenticationsโดยทั่วไป SSH จะไม่ให้ฉันลองใช้ 20 คีย์ที่แตกต่างกันในการเข้าสู่ระบบ

ในขณะนี้ฉันกำลังระบุไฟล์ข้อมูลประจำตัวสำหรับทุกโฮสต์ด้วยตนเองโดยใช้IdentityFileและIdentitiesOnlyคำสั่งเพื่อให้ SSH จะลองใช้ไฟล์คีย์หนึ่งไฟล์เท่านั้นซึ่งทำงานได้

แต่น่าเสียดายที่นี่จะหยุดทำงานทันทีที่ปุ่มเดิมไม่สามารถใช้งานได้อีกต่อไป ssh-add -lแสดงพา ธ ที่ถูกต้องให้ฉันสำหรับไฟล์คีย์ทุกไฟล์และพวกเขาจับคู่กับพา.ssh/configธ แต่มันไม่ทำงาน เห็นได้ชัดว่า SSH เลือกการเยื้องตามลายเซ็นของกุญแจสาธารณะและไม่ใช่โดยชื่อไฟล์ซึ่งหมายความว่าจะต้องมีไฟล์ต้นฉบับเพื่อที่ SSH จะสามารถแยกคีย์สาธารณะได้

มีสองปัญหากับสิ่งนี้:

  • มันจะหยุดทำงานทันทีที่ฉันถอดปลั๊กแฟลชไดรฟ์ที่ถือกุญแจ
  • ทำให้เอเจนต์ส่งต่อไร้ประโยชน์เนื่องจากไฟล์คีย์ไม่พร้อมใช้งานบนรีโมตโฮสต์

แน่นอนว่าฉันสามารถแยกกุญแจสาธารณะออกจากไฟล์ข้อมูลส่วนตัวของฉันและเก็บไว้ในคอมพิวเตอร์ของฉันและในคอมพิวเตอร์ระยะไกลทุกเครื่องที่ฉันมักจะลงชื่อเข้าใช้ มันไม่ได้เป็นวิธีที่น่าพอใจ

สิ่งที่ฉันต้องการคือความเป็นไปได้ในการเลือกข้อมูลประจำตัวจาก ssh-agent ตามชื่อไฟล์เพื่อให้ฉันสามารถเลือกคีย์ที่ถูกต้องโดยใช้.ssh/configหรือผ่าน-i /path/to/original/keyแม้ในพื้นที่ห่างไกลที่ฉันเข้า SSH มันจะดีกว่านี้ถ้าฉันสามารถ "ตั้งชื่อเล่น" กุญแจให้ฉันได้โดยไม่ต้องระบุเส้นทางแบบเต็ม


1
ทำไมคุณถึงต้องการข้อมูลประจำตัว ssh มากมาย? หากเป็นการหลีกเลี่ยงการใช้กุญแจส่วนตัวที่ถูกบุกรุกซึ่งทำให้เข้าถึงบัญชีทั้งหมดของคุณได้ทำไมคุณถึงถือกุญแจทั้งหมดไว้ในแฟลชไดรฟ์เดียว ไม่ใช่ครั้งแรกที่ฉันได้ยินปัญหาเกี่ยวกับการจัดการข้อมูลประจำตัวหลาย ssh แต่ไม่เคยมีโอกาสถามว่าทำไมจึงจำเป็น
Dmitri Chubarov

ไม่เคยพูดว่าพวกเขาทั้งหมดอยู่ในแฟลชไดรฟ์เดียว
leoluk

3
@DmitriChubarov แอปพลิเคชั่นเดียวที่เป็นไปได้สำหรับ identities หลาย ๆ ssh คือauthorized_keysไฟล์ที่เรียกใช้คำสั่งต่าง ๆ โดยขึ้นอยู่กับคีย์ที่ใช้เรียกใช้คำสั่งที่ต่างกัน
Tobias Kienzler

คำตอบ:


8

เดาว่าฉันจะต้องตอบคำถามของตัวเองเพราะดูเหมือนจะไม่มีทางที่จะขอข้อมูลประจำตัวด้วยชื่อไฟล์

ฉันเขียนสคริปต์ Python ที่รวดเร็วและสกปรกซึ่งสร้างไฟล์พับลิกคีย์.ssh/fingerprintsสำหรับทุกคีย์ที่เอเจนต์ถืออยู่ ฉันสามารถระบุไฟล์นี้ซึ่งไม่มีรหัสลับการใช้IdentityFileและ SSH จะเลือกข้อมูลประจำตัวที่ถูกต้องจากตัวแทน SSH ทำงานได้ดีอย่างสมบูรณ์และช่วยให้ฉันใช้ตัวแทนสำหรับคีย์ส่วนตัวได้มากเท่าที่ฉันต้องการ

#!/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()

เป็นงานที่ดีฉันจะลองในไม่ช้า
Tobias Kienzler

3

วิ่ง

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

พอเพียง


มันไม่ได้ผลสำหรับฉัน เมื่อไฟล์ระบุตัวตนมีรหัสสาธารณะเพียงอันเดียว - มันใช้งานได้ แต่ไม่ใช่เมื่อมีหลายรหัส
ygrek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.