파일 이름으로 ssh-agent에서 ID를 선택하십시오.


9

문제 : 20-30 개의 ssh-agent신원이 있습니다. Too many failed authenticationsSSH는 일반적으로 20 개의 다른 키로 로그인을 시도하지 않으므로 대부분의 서버는로 인증을 거부합니다 .

현재 SSH를 사용하여 하나의 키 파일 만 시도 할 수 있도록 IdentityFileand IdentitiesOnly지시문을 사용하여 모든 호스트의 ID 파일을 수동으로 지정하고 있습니다.

불행히도, 원래 키를 더 이상 사용할 수 없게 되 자마자 작동이 중지됩니다. ssh-add -l모든 키 파일의 올바른 경로를 표시하고의 경로와 일치 .ssh/config하지만 작동하지 않습니다. 분명히 SSH는 파일 이름이 아닌 공개 키 서명으로 들여 쓰기를 선택합니다. 즉, SSH가 공개 키를 추출 할 수 있도록 원본 파일을 사용할 수 있어야합니다.

이것에는 두 가지 문제가 있습니다 :

  • 키를 누른 상태에서 플래시 드라이브를 분리하자마자 작동이 중지됩니다.
  • 원격 호스트에서 키 파일을 사용할 수 없으므로 에이전트 전달을 쓸모 ​​없게 만듭니다.

물론 신원 파일에서 공개 키를 추출하여 내 컴퓨터와 일반적으로 로그인하는 모든 원격 컴퓨터에 저장할 수 있습니다. 그러나 이것은 바람직한 해결책처럼 보이지 않습니다.

필요한 것은 파일 이름으로 ssh-agent에서 아이디를 선택할 수 있기 때문에 SSH를 사용 하는 원격 호스트에서도을 사용 .ssh/config하거나 전달 하여 올바른 키를 쉽게 선택할 수 있습니다 -i /path/to/original/key. 전체 경로를 지정할 필요가 없도록 키를 "닉네임"할 수 있으면 더 좋습니다.


1
왜 많은 ssh ID가 필요합니까? 하나의 개인 키가 손상되어 모든 계정에 액세스하지 못하게하려면 왜 모든 플래시 키를 단일 플래시 드라이브에 보관해야합니까? 여러 ssh ID 관리와 관련된 문제에 대해 처음 듣지는 않지만 왜 필요한지 물어볼 기회는 없었습니다.
— Dmitri Chubarov 2016 년

그들 모두가 하나의 플래시 드라이브에 있다고 말한 적이 없습니다.
— leoluk 2016 년

3
@DmitriChubarov 여러 ssh ID에 사용할 수있는 응용 프로그램 중 하나는 authorized_keys사용 된 키에 따라 직접 셸 액세스를 허용하지 않고 다른 명령을 실행 하는 파일입니다.
— Tobias Kienzler

답변:


8

파일 이름으로 신원을 요청할 수있는 방법이없는 것처럼 내 자신의 질문에 대답해야한다고 생각합니다.

.ssh/fingerprints에이전트가 보유한 모든 키 에 대해 공개 키 파일을 생성하는 빠르고 더러운 Python 스크립트를 작성했습니다 . 그런 다음 비밀 키가없는이 파일을 사용 IdentityFile하여 SSH를 사용 하면 SSH 에이전트에서 올바른 ID를 선택할 수 있습니다. 완벽하게 작동하며 원하는 개인 키 수만큼 에이전트를 사용할 수 있습니다.

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

허용 된 솔루션에서 가져 와서 초기 서버에 액세스하는 데 사용 된 ID를 재사용한다고 가정하면 다음과 같습니다.

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

충분하다.


이것은 나를 위해 작동하지 않습니다. 신원 파일에 공개 키가 하나만있는 경우 작동하지만 여러 개인 키는 작동하지 않습니다.
— ygrek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.