Chọn danh tính từ ssh-agent theo tên tệp


9

Vấn đề: Tôi có khoảng 20-30 ssh-agentdanh tính. Hầu hết các máy chủ từ chối xác thực Too many failed authentications, vì SSH thường không cho phép tôi thử 20 khóa khác nhau để đăng nhập.

Hiện tại, tôi đang chỉ định tệp nhận dạng cho mọi máy chủ theo cách thủ công, sử dụng lệnh IdentityFilevà lệnh IdentitiesOnly, do đó SSH sẽ chỉ thử một tệp chính, hoạt động.

Thật không may, điều này dừng hoạt động ngay khi các khóa gốc không còn nữa. ssh-add -lchỉ cho tôi các đường dẫn chính xác cho mọi tệp chính và chúng khớp với các đường dẫn trong đó .ssh/config, nhưng nó không hoạt động. Rõ ràng, SSH chọn sự thụt lề bằng chữ ký khóa chung chứ không phải theo tên tệp, điều đó có nghĩa là các tệp gốc phải có sẵn để SSH có thể trích xuất khóa chung.

Có hai vấn đề này:

  • nó dừng hoạt động ngay khi tôi rút ổ đĩa flash đang giữ các phím
  • nó làm cho tác nhân chuyển tiếp vô dụng vì các tệp chính không có sẵn trên máy chủ từ xa

Tất nhiên, tôi có thể trích xuất các khóa công khai từ các tệp nhận dạng của mình và lưu trữ chúng trên máy tính của mình và trên mọi máy tính từ xa tôi thường đăng nhập. Điều này không giống như một giải pháp mong muốn, mặc dù.

Điều tôi cần là khả năng chọn một danh tính từ ssh-agent theo tên tệp, để tôi có thể dễ dàng chọn đúng khóa bằng cách sử dụng .ssh/confighoặc bằng cách chuyển -i /path/to/original/key, ngay cả trên một máy chủ từ xa mà tôi SSH vào. Sẽ tốt hơn nữa nếu tôi có thể "biệt danh" các phím để tôi thậm chí không phải chỉ định đường dẫn đầy đủ.


1
Tại sao bạn cần nhiều danh tính ssh? Nếu đó là để tránh một khóa riêng bị xâm phạm cấp quyền truy cập vào tất cả các tài khoản của bạn, thì tại sao bạn giữ tất cả chúng trên một ổ flash? Đây không phải là lần đầu tiên tôi nghe thấy các vấn đề liên quan đến việc quản lý nhiều danh tính ssh nhưng không bao giờ có cơ hội để hỏi tại sao chúng lại cần thiết.
Dmitri Chubarov

Không bao giờ nói tất cả chúng là trên một ổ đĩa flash.
leoluk

3
@DmitriChubarov Một ứng dụng có thể có cho nhiều định danh ssh là một authorized_keystệp, tùy thuộc vào khóa được sử dụng, thực thi các lệnh khác nhau, mà không bao giờ cho phép truy cập shell trực tiếp.
Tobias Kienzler

Câu trả lời:


8

Đoán tôi sẽ phải trả lời câu hỏi của riêng tôi, vì dường như không có cách nào để yêu cầu một danh tính theo tên tệp.

Tôi đã viết một tập lệnh Python nhanh và bẩn để tạo một tệp khóa công khai .ssh/fingerprintscho mọi khóa mà tác nhân nắm giữ. Sau đó tôi có thể chỉ định tệp này không chứa khóa bí mật, sử dụng IdentityFilevà SSH sẽ chọn đúng danh tính từ tác nhân SSH. Hoạt động hoàn toàn tốt, và cho phép tôi sử dụng tác nhân cho bao nhiêu khóa riêng tôi muốn.

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

Làm tốt lắm, tôi sẽ thử nó sớm thôi
Tobias Kienzler

3

Chạy

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

trên máy từ xa để tự động tạo tất cả các tệp khóa chung (giả sử các khóa chung trong bạn .ssh/configđược đặt tên privateKeyFileName.pubvà không có đường dẫn không nhất quán nào được tham gia). Gọi chown $USER .ssh/*cho sudotrường hợp của bạn .


1

Chọn từ giải pháp được chấp nhận và giả sử bạn chỉ muốn sử dụng lại danh tính được sử dụng để có quyền truy cập vào máy chủ ban đầu, sau đó đại loại như:

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

là hiệu quả.


điều này không làm việc cho tôi. Khi tệp nhận dạng chỉ có một khóa chung - nó hoạt động, nhưng không phải khi nhiều.
ygrek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.