비밀번호 프롬프트 없이 ssh-add를 자동으로 실행하는 방법은 무엇입니까?

비밀번호 프롬프트 없이 ssh-add를 자동으로 실행하는 방법은 무엇입니까?

네트워크(정적 이더넷)의 여러 컴퓨터 간에 SSH를 통해 통신하고 싶습니다. 이렇게하려면 실행해야합니다.ssh-add특정 컴퓨터에 로그인할 때마다.

한 번만 설정하면 로그인하거나 컴퓨터를 다시 시작할 때마다 비밀번호를 묻지 않게 하려면 어떻게 해야 합니까?

파일에 몇 줄을 추가하는 방법이 있다는 것을 알고 있지만 bash_profile특정 시스템을 재부팅하거나 로그인할 때마다 여전히 비밀번호를 입력해야 합니다.

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent -s`
    ssh-add
fi

답변1

이는 보안과 편의성 사이의 균형을 보여주는 전형적인 예입니다. 다행히도 많은 옵션이 있습니다. 가장 적합한 솔루션은 사용 시나리오와 필요한 보안 수준에 따라 다릅니다.

비밀번호가 있는 SSH 키, 없음 ssh-agent

이제 인증에 키를 사용할 때마다 비밀번호를 입력해야 합니다. 보안 측면에서는 이것이 최선의 옵션이지만 유용성은 최악입니다. 이로 인해 다시 입력해야 하는 부담을 줄이기 위해 취약한 비밀번호를 선택하게 될 수도 있습니다.

비밀번호가 포함된 SSH 키 ssh-agent

다음을 추가하면 ~/.bash_profile로그인 시 ssh-agentSSH 키가 자동으로 시작되고 로드 됩니다.

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

이제 로그인할 때마다 비밀번호를 입력해야 합니다. 유용성 측면에서는 약간 더 좋지만 ssh-agent로그인 세션 중에 키 사용 여부에 관계없이 비밀번호를 묻는 메시지가 표시된다는 단점이 있습니다 . 각각의 새로운 로그인은 또한 ssh-agent명시적으로 종료되지 않는 한 로그아웃 후에도 추가된 키를 사용하여 메모리에서 계속 실행되는 다른 인스턴스를 생성합니다.

로그아웃 시 종료 하려면 ssh_agent다음을 추가하세요.~/.bash_logout

if [ -n "$SSH_AUTH_SOCK" ] ; then
  eval `/usr/bin/ssh-agent -k`
fi

또는 다음~/.bash_profile

trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0

파일 시스템의 ssh-agent고정된 위치를 통해(예:콜린 앤더슨의 답변. 이는 여러 프록시 인스턴스를 생성하는 것보다 향상된 기능입니다. 그러나 명시적으로 종료되지 않는 한 로그아웃 후에도 해독된 키는 메모리에 남아 있습니다.

데스크톱에서는 SSH 에이전트가 데스크톱 환경에 포함되어 있습니다.그놈 키링 SSH 에이전트, 일반적으로 로그인 세션 중에 SSH 키를 처음 사용할 때 비밀번호를 묻는 메시지를 표시하고 세션이 끝날 때까지 해독된 개인 키를 메모리에 저장할 수 있으므로 더 나은 접근 방식일 수 있습니다.

비밀번호가 포함된 SSH 키 ssh-ident

ssh-identssh-agent필요에 따라 사용자를 대신하여 ID를 관리하고 로드하는 유틸리티입니다 . 액세스가 필요한 터미널, SSH 또는 로그인 세션 수에 관계없이 필요한 경우에만 키를 추가합니다 ssh-agent. 또한 연결된 호스트 또는 ssh호출하는 디렉터리에 따라 다양한 프록시 및 다양한 키 세트를 추가하고 사용할 수 있습니다. 이를 통해 다른 호스트로 프록시 전달을 사용할 때 키를 격리할 수 있습니다. 또한 GitHub와 같은 사이트에서 여러 계정을 사용할 수 있습니다.

을 활성화하려면 ssh-ident이를 설치하고 다음 별칭을 에 추가하세요 ~/.bash_profile.

alias ssh='/path/to/ssh-ident'

비밀번호가 포함된 SSH 키 keychain

keychainssh-agent귀하를 대신하여 이를 관리하고 ssh-agent로그인 세션이 끝날 때에도 계속 실행되도록 하는 작은 유틸리티입니다 . 이후 로그인 시 keychain기존 인스턴스에 연결됩니다 ssh-agent. 실제로 이는 재부팅 후 처음 로그인할 때만 비밀번호를 입력하면 된다는 의미입니다. 후속 로그인에서는 ssh-agent기존 인스턴스의 암호화되지 않은 키가 사용됩니다. 이는 cron비밀번호 없는 SSH 키가 없는 작업에서 비밀번호 없는 RSA/DSA 인증을 허용하는 데에도 유용합니다 .

을 활성화하려면 keychain설치하고 다음과 같이 추가하세요 ~/.bash_profile.

eval `keychain --agents ssh --eval id_rsa`

보안 관점에서 ssh-ident볼 때 keychain특정 세션 수명으로 제한된 인스턴스보다 나쁘지만 ssh-agent높은 수준의 편의성을 제공합니다. 보안을 강화하기 위해 keychain일부 사람들은 키체인 호출 --clear에 옵션을 추가합니다 ~/.bash_profile. 이렇게 하면 위에서 설명한 대로 로그인 시 비밀번호를 다시 입력해야 하지만 cron사용자가 로그아웃한 후에도 작업은 암호화되지 않은 키에 계속 액세스할 수 있습니다. 이것keychain 위키 페이지더 많은 정보와 예시가 있습니다.

비밀번호가 없는 SSH 키

보안 관점에서 볼 때 이는 개인 키가 노출되면 완전히 보호되지 않기 때문에 최악의 옵션입니다. 그러나 이는 재부팅 후 비밀번호를 다시 입력할 필요가 없도록 하는 유일한 방법입니다.

비밀번호가 포함된 SSH 키 ssh-agent,암호를 다음으로 전달하세요. ssh-add 스크립트에서

ssh-add예를 들어 스크립트에서 비밀번호를 전달하는 것은 간단한 아이디어처럼 보일 수 있지만 echo "passphrase\n" | ssh-add보기만큼 간단하지는 않습니다.ssh-add 비밀번호를 읽지 말고 stdin직접 /dev/tty열어서 읽으세요..

이것은 될 수있다해결됨그리고expect, 대화형 애플리케이션을 자동화하는 도구입니다. 다음은 스크립트에 저장된 비밀번호를 사용하여 SSH 키를 추가하는 예제 스크립트입니다.

#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact

비밀번호는 스크립트에 일반 텍스트로 저장되므로 비밀번호 없는 SSH 키를 사용하는 것보다 보안 측면에서 나을 것이 없습니다. 이 방법을 사용하려면 expect암호가 포함된 스크립트에 키 소유자만 읽고, 쓰고, 실행할 수 있도록 적절한 권한이 설정되어 있는지 확인하십시오.

답변2

이를 귀하의 것에 추가 ~/.bashrc하고 로그아웃했다가 다시 로그인하면 적용됩니다.

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

재부팅할 때마다 처음 로그인할 때만 비밀번호를 묻는 메시지가 표시됩니다. ssh-agent실행되는 동안에는 동일한 콘텐츠를 계속 재사용합니다.

답변3

OP의 질문과 밀접하게 관련되어 있지 않지만 다른 사람들에게 유용할 수 있습니다.7.2.0부터, 첫 번째 인증 시 키 추가를 허용하는 옵션이 있습니다 ssh. ssh-agent이 옵션은 시스템 전체 또는 개인 파일에서 , , 또는 AddKeysToAgent으로 설정할 수 있습니다.yesnoaskconfirm.ssh/config

답변4

다음은 SSH 비밀번호 자동화에 대한 해결 방법입니다.

  1. 비밀번호를 표준 출력으로 인쇄하는 한 줄 스크립트를 만듭니다. 예를 들면 다음과 같습니다.

     echo 'echo MY_SSH_PASSWORD' > ~/.print_ssh_password && chmod 700 ~/.print_ssh_password
    

    중요: 앞에 공백을 복사해야 합니다.비밀번호가 기록에 저장되지 않도록 방지.

다음 방법 중 하나를 사용하십시오.

  • 표준 입력 방법을 사용하십시오.

    cat ~/.ssh/id_rsa | SSH_ASKPASS=~/.print_ssh_password ssh-add -
    
  • 또는명명된 파이프방법:

    1. 만들다명명된 파이프(당신은 또한 시도할 수 있습니다프로세스 교체):

      mkfifo --mode 0600 ~/.ssh_fifo
      
    2. ssh-add인증에 사용할 프로그램을 지정하여 실행합니다.

      cat ~/.ssh/id_rsa >~/.ssh_fifo | SSH_ASKPASS=~/.print_ssh_password ssh-add ~/.ssh_fifo
      

    바라보다:man ssh-add에 대해 자세히 알아보세요 SSH_ASKPASS.

관련 정보