SSH 키 비밀번호 문구를 한 번만 요청하고 필요한 경우에만 요청하는 방법은 무엇입니까?


15

(이 사이트에서 관련성이있는 많은 질문을 읽었으며 이것이 실제로 새로운 질문이라고 생각합니다.)

많은 서버에 많은 키가 있으며 모두 암호로 보호됩니다.

암호를 입력하는 것만 큼 암호를 입력하는 것이 좋습니다. 실제 생산성이 떨어집니다.

  • 로그인 쉘에서 ssh-agent + ssh-add 명령을 사용하면 로그인시 암호를 한 번만 입력하면됩니다

  • 키 체인 을 사용하면 ssh-agent를 로그 아웃 이상으로 유지하는 데 사용할 수 있습니다. 예를 들어 부팅 할 때 암호를 한 번만 입력하거나 한 시간 정도 그대로 유지할 수 있습니다.

내가 가진 문제는이 두 솔루션 모두 일반적으로 쉘 로그인 (예 :)에서 시작되어 .zshrc잠금을 해제하지 않아도 로그인 할 때 암호를 입력해야한다는 것입니다. 에이전트를 무기한으로 유지하는 키 체인에 만족하지 않습니다.

내가 원하는 것은 필요할 때만 ( 에이전트에 대한) 암호 문구를 묻는 메시지가 표시 됩니다 .

그래서 서버 A에 로그인하고 몇 가지 작업을 수행 한 다음 서버 B에 ssh를 입력 하고 그 시점 에서 암호 문구를 묻습니다. 서버 B에서 몇 가지 작업을 수행하고 로그 아웃하십시오. A로 돌아가서 더 많은 일을하고 B로 다시 ssh하고 암호 문구가 필요하지 않습니다 (에이전트가 보유하고 있음).

나는 Gnome과 같은 그래픽 데스크탑에서 가능하다-당신이 ssh를 시도하자마자 개인 키의 잠금을 해제하기 위해 암호 문구를 묻는 팝업이 나타난다. 그래서 이것은 콘솔에서 나온 것입니다.


왜 암호없이 ssh 키를 생성하지 않습니까? 어쨌든이 모든 문제를 해결하려고한다면?
devnull

1
누군가 침입하여 암호가없는 키 (또는 활성 ssh 에이전트)가있는 경우 다른 많은 서버에도 액세스 할 수 있습니다. 또한 암호문없는 키를 도난 당하고 다른 곳에서 사용할 수 있습니다.
artfulrobot 2016 년

내가 아는 한, 원하는 수준의 보안을 희생하지 않으면 서 원하는 것을 수행 할 수있는 방법이 없습니다. Thomas Nyman의 심층 답변이 여기에 있습니다 ( unix.stackexchange.com/a/90869/82289) . Tmux와의 ssh 세션을 관리하는 중간 서버를 사용하여 회사 에서이 문제를 해결합니다.
devnull

@DevNull은 데스크톱으로 할 수 있지만 터미널로는 할 수 없다는 것이 이상해 보입니다. 키가 추가되지 않은 경우 에이전트가 tty로 이동해야합니까? 이것이 GUI가 작동하는 방식이어야합니까?
artfulrobot

: 당신은 여기 내 대답에 좀있을 수 있습니다 unix.stackexchange.com/a/184160/89706 (질문의 링크 : unix.stackexchange.com/questions/90853/... )
조니 웡

답변:


16

쉘 시작 스크립트에 아무 것도 추가하지 마십시오. 이것은 불필요한 해커입니다.

대신에

AddKeysToAgent yes

.ssh / config에

이와 같이, ssh-add는 다른 상자에 처음 ssh 할 때 자동으로 실행됩니다. ssh-agent에서 만료되거나 재부팅 한 후에 만 ​​키를 다시 입력해야합니다.


나는 투표 할 때 사람들이 논평하기를 바랍니다. 그것이 옳지 않다면 우리는 왜 옳지 않은지를 안다. 게시 해 주셔서 감사합니다. 귀하의 제안을 직접 시도 할 시간이 없었습니다.
artfulrobot

크로스 포스트 때문 일까?
Toby

이것은 나를 위해 작동합니다. 그러나 openssh (7.2)에 최근 추가되었습니다. 누구에게나 도움이되는 경우, openssh 7.3은 데비안 Sid에서 사용할 수 있습니다.
artfulrobot

@artfulrobot : 몇 년 전까지 똑같은 행동 (ssh를 처음 호출 할 때 auto-ssh-add)이 있었기 때문에 이상한 일이 일어났습니다. 원인을 검색하면서 AddKeysToAgent를 발견했으며 그 이유는 우연히 .ssh / config 및 AddKeysToAgent를 정리해야했기 때문이라고 가정했습니다. 이제 OpenSSH 7.2가 출시되기 오래 전에 왜 작동했는지 궁금합니다. 나는 이것을 상상하지 못한다 :-)
Toby

@ Toby 이것은 내가 필요한 것입니다. 불행히도 ssh-agent는 kubuntu에서 자동으로 시작되지 않는 것 같습니다. 그래서 다음으로 해결해야합니다.
Ogaday

7

Zsh 에는 preexec명령 줄에 입력 된 명령이 실행되기 전에 기능을 실행 하는 후크가 있습니다. 찾는 고리는 다음과 같습니다.ssh 명령 행에서 있으면 ssh 에이전트의 존재를 확인 . 찾을 수 없으면 키 체인을 실행합니다.

따라서이 방법으로 키 체인은 ssh 명령 전에 만 실행 한 다음 필요한 경우에만 실행됩니다.

이것을 당신의 것으로 넣으십시오 ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

여기서 일어나는 일은 명령을 입력 할 때마다 발생합니다. check_ssh 명령이 실행되기 전에 호출됩니다.

함수의 첫 번째 줄은 sshZsh 정규식 을 사용하기 위해 확장 명령을 확인합니다 . ssh단어 경계가 있어야합니다\b양쪽에 . 이를 찾지 못하면 함수가 반환됩니다.

다음 행은 환경 변수에 SSH 에이전트 프로세스가 있고 해당 프로세스가 프로세스 테이블에 여전히 존재하는지 그리고 하나 이상의 키가 에이전트에 추가되었는지 확인합니다. 이 모든 것이 정상이면 ssh 에이전트가 설정되고 아무것도 할 필요가 없으므로 반환됩니다.

마지막으로 에이전트가 1 시간 동안 유지되도록 키 체인을 시작합니다.

그것은 여전히 같은 임베디드 SSH 물건에 대한 문제를 잎 git이나 rsync또는 scp그 기능을 트리거하지 않으므로 (당신이 정규식에 추가 할 수 있습니다).


이 없어도 zsh동일한 효과를 가진 짧은 스크립트를 만들어 PATH실제 ssh클라이언트 앞에 배치 할 수 있습니다. 직접 실행하지 않고 읽는 경우rsync 등을 사용할 수도 있습니다. PATH/usr/bin/ssh
ilkkachu

2

zsh의 경우 https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils를 사용하여 유틸리티를 몇 가지 작성했습니다.

실제로는 ssh-agent모든 로그인 세션 (데스크톱 또는 SSH를 통해)이 공유 되므로 로그인 쉘을 시작하면 GNU 화면도 지원 shell -zsh됩니다.~/.screenrc 파일), 그리고 그것은 이후에만 종료됩니다 마지막 세션이 종료됩니다.

참고 : 모든 키에 암호를 하나만 사용합니다. 다른 암호문의 동작을 잘 모르겠습니다. 약간의 변경이 필요할 수 있습니다.


와우 그것은 꽤 많은 코드입니다. 좋은 일과 공유 주셔서 감사합니다. 더 간단한 것이 필요하다고 생각합니다. SSH는 나에게 매우 핵심적인 도구입니다.
artfulrobot 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.