비밀번호가없는 SSH 로그인을 설정하려면 어떻게해야합니까?


252

암호를 항상 입력하지 않고도 ssh를 통해 원격으로 로그인 할 수 있기를 원합니다.

  • 어떻게 설정합니까?
  • 암호없는 세션을 실행하려면 다른 명령이 필요합니까?

openssh를 사용하고 있습니까? (그렇게 쉬운 경우;))
Rinzwind

@Rinzwind, OpenSSH가 이미 사전 설치되어 있는데 왜 독점 버전을 얻는 것이 귀찮습니까?
Oxwivi 2016 년

15
나는 assuptions을 만들려고 노력하지 않는다;)
Rinzwind

1
@ 케빈, 자신을 명확히하십시오. 우리는 암호없는 ssh-ing에 대해 이야기하고 있습니다 . 루트 쉘에 ssh-ing을 의미합니까? 이 질문은 다루지 않습니다.
Oxwivi

@Oxwivi : 죄송합니다. 루트 로그인을 목표로하는 Ravindra의 답변에 대한 의견이었습니다.
Kevin

답변:


266

대답

이 명령을 실행하십시오 :

ssh-keygen

그런 다음 새 키를 서버에 복사해야합니다 .

ssh-copy-id user@host
## or if your server uses custom port no:
ssh-copy-id "user@host -p 1234"

키가 복사 된 후 정상적으로 ssh를 시스템에 ssh하십시오.

ssh user@host

명령을 실행 한 특정 머신에서 비밀번호를 입력하지 않고도 로그인 할 수 있습니다.

not-marco@rinzwind-desktop:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/not-marco/.ssh/id_rsa): 
Created directory '/home/not-marco/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/not-marco/.ssh/id_rsa.
Your public key has been saved in /home/not-marco/.ssh/id_rsa.pub.
The key fingerprint is:
b1:25:04:21:1a:38:73:38:3c:e9:e4:5b:81:e9:ac:0f not-marco@rinzwind-desktop
The key's randomart image is:
+--[ RSA 2048]----+
|.o= . oo.        |
|*B.+ . .         |
|*=o .   o .      |
| = .     =       |
|. o     S        |
|E.               |
| o               |
|  .              |
|                 |
+-----------------+

not-marco@rinzwind-desktop:~$ ssh-copy-id not-marco@server
not-marco@server's password: 
Now try logging into the machine, with "ssh 'not-marco@server'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

설명

이것은 이미 SSH를 통해 서버에 성공적으로 연결할 수 있다고 가정합니다.

비밀번호를 사용하지 않고 자신을 식별 할 수있는 SSH 키 쌍을 생성해야합니다. 원하는 경우 암호로 키를 보호하도록 선택할 수 있지만 암호없이 SSH로 액세스 할 수 있도록 비워 둘 수 있습니다.

  1. 먼저 실행하여 SSH 키 쌍을 생성 ssh-keygen만듭니다이 id_rsaid_rsa.pub파일을. pub파일은 서버에 어떤 일이 일어나는지, 개인 키 (인 id_rsa) 당신과 함께 유지하고 자신을 식별하는 방법입니다 것입니다.
  2. 그런 다음 공개 키를 서버에 복사하고 ssh-copy-id user@server사용자를 시스템 DNS 이름 또는 IP 주소를 가진 원격 사용자 및 서버로 바꿉니다. SSH 비밀번호를 입력하라는 메시지가 표시되면 비밀번호를 입력하면 모든 비밀번호가 성공적으로 완료되면 ssh user@server비밀번호없이 기기에 액세스 할 수 있습니다.

참고 문헌


11
@ Oxwivi이 대답은 더 올바른 방법이지만 더 길어 보입니다. 입력하기 만하면 ssh-keygen화면의 지시에 따라이 입력 한 다음 ssh-copy-id user@server원격 컴퓨터와 원격 사용자 및 서버와 사용자를 교체
마르코 Ceppi

3
"에이전트가 키를 사용하여 서명하지 못했습니다"라는 오류가 발생했습니다. 이 절차를 따른 후 로그인을 시도 할 때마다. 해결책은 로컬 시스템에서 "> ssh-add"를 실행하는 것이 었으며 이제 예상대로 원격 시스템에 로그인 할 수 있습니다.
jmbouffard

1
@server에 사용자 정의 포트를 사용해야하는 경우 다음을 사용하여이를 수행해야합니다 ssh-copy-id "not-marco@127.0.0.1 -p 1234".
s3m3n

@Rinzwind : passwd 인증을 비활성화하고 키 인증 만 허용하면 알 수없는 클라이언트 / 컴퓨터에서 서버로 인증 할 수 없습니다. 알려진 / 구성된 클라이언트가 서버와 통신하기 위해 생성 된 개인 키를 사용하여 알 수없는 시스템에서 로그인 할 수있는 방법이 있습니까? 내 말은,이 개인 키는 휴대 가능하며 비상 사태가 필요한 경우 다른 컴퓨터에서 서버로 자신을 인증하는 데 사용할 수 있습니까 ??
Rajat Gupta

4
그러나 서버는 여전히 암호를 요구하고 있습니다.
Lerner Zhang

34

다음 명령을 입력하십시오.

  1. ssh-keygen

    Enter프롬프트가 표시 될 때까지 키를 누릅니다.

  2. ssh-copy-id -i root@ip_address

    (한 번 호스트 시스템의 비밀번호를 요구합니다)

  3. ssh root@ip_address

이제 비밀번호없이 로그인 할 수 있습니다.


25

내가 보통하는 방법은 다음과 같습니다.

ssh-keygen -t rsa

(암호를 묻는 메시지가 표시되면 비워 두십시오)

그때: cat ~/.ssh/id_rsa.pub | ssh username@hostname 'cat >> .ssh/authorized_keys'

(이를 위해서는 .ssh 폴더가 대상 호스트 이름의 홈 디렉토리에 있고 권한이 부여 된 키 파일이 있어야합니다)

물론, username을 원하는 username으로 바꾸고 hostname을 원하는 호스트 이름 또는 IP 주소로 바꾸십시오.

그 후에는 익숙한 것처럼 해당 상자에 SSH로 연결하십시오.


무엇에 대한 touchchmodRinzwind의 대답에 명령?
Oxwivi 2016 년

7
.ssh/authorized_keys파일을 0600 으로 chmod해야합니다. 그렇지 않으면 작동하지 않습니다
Marco Ceppi

이것은 ssh-copy-id를 내 서버의 루트에서 작동시킬 수 없기 때문에 실제로 도움이되었습니다. backuppc (또는 다른 데몬)가 다른 머신에 ssh되어야하는 상황에서 루트 여야합니다.
Adam

18

나는 보통 sshpass그것을 sudo apt-get install sshpass위해 사용하고 설치하고 다음과 같이 사용합니다

sshpass -p 'password' ssh your_username@your_server

6
왜 ssh 키를 사용하지 않습니까?
enzotib

1
"그렇지 않은"상황이 아니라, 키를 추가하지 않고도 완벽하게 작동합니다.
Bruno Pereira

sshpass에 대한 정보에 감사드립니다.
Panther

7
SSH 키는 질문에 대한 "올바른"답변이지만 sshpass원격 서버에서 인증 방법을 변경할 수없는 경우 매우 유용한 해킹입니다!
Jacob Krall

9
이것은 매우 위험합니다. bash_history 또는 연결하려는 호스트의 일반 비밀번호를 유지하십시오.
kappa

10

비밀번호 인증 비활성화

SSH 서버를 가진 많은 사람들이 약한 암호를 사용하기 때문에 많은 온라인 공격자가 SSH 서버를 찾은 다음 임의로 암호를 추측하기 시작합니다. 공격자는 한 시간에 수천 개의 암호를 시도 할 수 있으며 충분한 시간이 주어지면 가장 강력한 암호도 추측 할 수 있습니다. 권장되는 솔루션은 비밀번호 대신 SSH 키를 사용하는 것입니다. 일반적인 SSH 키처럼 추측하기 어려운 암호는 634 개의 임의의 문자와 숫자를 포함해야합니다. SSH 키를 사용하여 컴퓨터에 항상 로그인 할 수 있으면 암호 인증을 완전히 비활성화해야합니다.

비밀번호 인증을 비활성화하면 특별히 승인 한 컴퓨터에서만 연결할 수 있습니다. 이렇게하면 보안이 크게 향상되지만 PC를 사전 승인하지 않고 친구의 PC 또는 실수로 키를 삭제할 때 자신의 랩톱에서 자신의 컴퓨터에 연결할 수 없습니다.

특별한 이유가없는 한 비밀번호 인증을 비활성화하는 것이 좋습니다.

비밀번호 인증을 비활성화하려면 sshd_config 파일에서 다음 줄을 찾으십시오.

#PasswordAuthentication yes

다음과 같은 줄로 바꾸십시오.

PasswordAuthentication no

파일을 저장하고 SSH 서버를 다시 시작한 후에는 로그인 할 때 비밀번호를 묻지 않아도됩니다.

https://help.ubuntu.com/community/SSH/OpenSSH/Configuring#disable-password-authentication


2
이것은 가장 기본적인 정답이지만 보안에는 좋습니다! 또한 루트 로그인을 비활성화하는 것도 좋은 방법입니다
FreeSoftwareServers

PasswordAuthentication no모든 사용자에게 영향을 줍 니까 ? 그렇지 않은 경우 일반 사용자의 경우이를 끄고 테스트하는 동안 루트를 변경하지 않은 상태로 두는 방법은 무엇입니까? 나는 그것을 foobar하고 완전히 잠그고 싶지 않습니다.
Adam

다시 변경할 수 있도록 ssh 세션을 열어 두십시오. 비밀번호 및 루트를 사용하지 않으려 고합니다. 그렇습니다. Do n't;)
Thufir

ssh 중에에 오류 Permission denied (publickey).PasswordAuthentication no있습니다. 어떻게해야합니까? PasswordAuthentication no다른 호스트에서 변경 합니까?
ParisaN

9

이 솔루션은 특히 Windows 를 사용하는 사용자 가 AWS 클라우드GCE 클라우드의 클라우드 이미지를 포함하여 원격 시스템 에 ssh 할 수 있도록합니다.

기권

최근이 솔루션을 사용하여 GCE에 새로 배포 된 vm 이미지를 원격 로그인했습니다.


사용되는 도구 :

  1. puttygen 퍼티 겐 다운로드
  2. winscp winscp 다운로드

수행 단계 :

  1. puttygen을 사용하여 공개 / 개인 키 쌍을 생성하십시오.
  2. 클라우드 또는 원격 위치에서 서버에 공개 키를 업로드하십시오.

그것을하는 방법 :

1. 키 / 페어 생성 또는 기존 개인 키 사용

개인 키를 소유 한 경우 :

를 열고 puttygen로드 버튼을 누른 다음 개인 키 ( *.pem) 파일을 선택하십시오 .


개인 키를 소유하지 않은 경우 :

  • 열기 puttygen,
  • 매개 변수 섹션 에서 원하는 키 유형 SSH2 DSA (RSA 또는 DSA를 사용할 수 있음)를 선택 하십시오. 암호 문구 필드를 비워 두는 것이 중요합니다.
  • generate지침을 누르고 (공개 / 개인) 키 페어를 생성합니다.

샘플 키 생성 그림

(소스 1에서 아래 링크 참조)

2. (와 새로운 'authorized_keys에'파일을 만듭니다 notepad)

PuTTY 키 생성기의 "OpenSSH authorized_keys 파일에 붙여 넣기위한 공개 키"섹션에서 공개 키 데이터를 복사하고 키 데이터를 authorized_keys파일에 붙여 넣으십시오 .


이 파일에는 한 줄의 텍스트 만 있어야합니다.


3. Linux 서버에 키를 업로드

  • WinSCP를 엽니 다.
  • SFTP 파일 프로토콜을 선택하고 ssh 자격 증명으로 로그인하십시오.
  • 성공하면 원격 시스템에 홈 디렉토리 구조가 나타납니다.

authorized_keys 파일을 원격 시스템의 홈 디렉토리에 업로드하십시오.


4. 적절한 권한 설정

.ssh디렉토리 만들기 (없는 경우)


authorized_keys파일을 .ssh디렉토리로 복사 하십시오 .
(이것은 존재하는 모든 authorized_keys파일 을 대체합니다 .이 점에 유의하십시오).

파일이 존재하면이 파일의 내용을 기존 파일에 추가하십시오.


권한을 설정하는 명령을 실행하십시오.

sudo chmod 700 .ssh && chmod 600 .ssh/authorized_keys

이제 ssh매번 자격 증명을 입력하지 않고도 원격 컴퓨터에 접속할 수 있습니다 .

더 읽을 거리 :


4

공개 / 프라이빗 키 쌍을 생성하고 새로 생성 된 공개 키를 사용하여 로그인하는 경우 비밀번호를 입력 할 필요가 없습니다. 키 링 및 / 또는 ssh 에이전트의 구성에 따라 암호로 키를 보호해야 할 수도 있습니다.

여기 당신을위한 많은 짧은 하우투 중 하나가 있습니다. 생성 된 개인 키를 개인용으로 유지하는 것이이 방법의 안전에 매우 중요합니다! 다른 사람과 공유하거나 용량에 관계없이 액세스해서는 안됩니다.

이 명령은 다음과 같이 상당히 강력한 키를 생성합니다 ~/.ssh/.

ssh-keygen -b 4096

에서 ~/.ssh/당신과 같은 공개 키를 찾을 수 있습니다 id_rsa.pub. authorized_keys전송 가능한 매체 (펜 드라이브)를 통해 전송하거나 서버에서 비밀번호 인증을 잠시 사용 가능하게 한 후 사용 ssh-copy-id ~/.ssh/id_rsa.pub username@server하고 다시 사용 불가능하게 하여 해당 내용을 서버 파일에 추가해야 합니다.

암호를 사용하여 키를 보호하기로 선택한 경우 (첫 번째 단계에서) ssh-agent또는 Ubuntu 키링을 사용하여 해당 pharse를 로컬로 보호 할 수 있으므로 항상 입력하지 않아도됩니다.


3

추가하려면 다음을 수행하십시오.

  • Mac에는 기본적으로가 ssh-copy-id설치되어 있지 않으므로 직접 설치해야합니다.

    curl https://raw.github.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
    chmod +x /usr/local/bin/ssh-copy-id
    

https://github.com/beautifulcode/ssh-copy-id-for-OSX에서 더 많은 것을 찾으십시오

  • 포트 전달을 수행 한 경우 명령은 다음과 같아야합니다.

    ssh-copy-id "not-marco@127.0.0.1 -p 2222"
    

따옴표가 필요합니다.


3

비밀번호없이 원격 로그인 / 복사

응용 프로그램 sshscp원격 로그인 및 원격 복사 각각에 대해 암호를 제공하지 않고도 원격 호스트와 통신 할 수 있습니다. 이를 위해서는 아래에 설명 된 것과 같은 인증 절차를 따라야합니다. 클라이언트는 사용자가 앉아있는 컴퓨터를 의미하고 서버는 암호를 제공하지 않고 로그온하려는 컴퓨터를 의미합니다. 인증 절차의 단계는 다음과 같습니다.

  1. 시스템에서 아직 개인 키와 공개 키가 수행되지 않은 경우 ssh-keygen을 실행하여 개인 키와 공개 키를 생성하십시오. 이들은에 파일로 저장됩니다 $HOME/.ssh.
  2. 공개 키 파일의 내용을 파일 $HOME/.ssh/authorized_keys또는 $HOME/.ssh/authorized_keys2서버에 추가하십시오.

세 가지 유형의 인증 프로토콜이 있습니다. ssh-keygen을 실행할 때 유형을 지정하십시오.

  1. SSH 프로토콜 버전 1, RSA1 : 이것이 기본 선택이며 파일 ID (개인 키, chmod 0700이 파일을 다른 사람이 읽을 수 없도록하기 위해 가져와야 함 ) 및 identity.pub (공개 키)가됩니다.
  2. SSH 프로토콜 버전 1, RSA : 이것은 ssh-keygen -t rsa파일 id_rsa(개인 키) 및 id_rsa.pub(공개 키) 를 실행하여 얻습니다.
  3. SSH 프로토콜 버전 1, DSA : 이것은 ssh-keygen -t dsa파일 id_dsa(개인 키) 및 id_dsa.pub(공개 키) 를 실행 하여 얻은 것입니다.

ssh-keygen을 실행할 때 기본 답변에 의존 할 수 있습니다 (암호를 제공하지 않음을 의미 함). 이로 인해 전체 설정이 간단하지만 안전하지 않습니다.

ssh 옵션으로 사용할 키 유형을 지정할 수 있습니다 . ssh -1의 힘을 사용 RSA1의 반면 키 (프로토콜 버전 1), ssh -2강제로 ssh를 시도하는 RSA 또는 DSA 키 만 (프로토콜 버전 2). 아래 예에서는 원격 호스트에 RSA1DSA 키를 생성 및 설치 하여보다 유연하게 사용할 수 있습니다. .ssh디렉토리에 구성 파일을 만들 수 있습니다.

Protocol 1,2

이것은 ssh가 RSA / DSA (프로토콜 버전 2) 전에 RSA1 (프로토콜 버전 1) 연결을 시도하게합니다 .

RSA1 키 사용

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat identity.pub >> authorized_keys"

DSA 키 사용

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy DSA key: 
scp id_dsa.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat id_dsa.pub >> authorized_keys2"

키를 생성 할 때 암호를 사용하지 않은 경우이 작업을 수행하면됩니다. ssh $ remote를 실행하여 연결을 테스트하고 비밀번호를 제공하지 않고 로그인 할 수 있는지 확인하십시오 ( ssh 를 사용 -1하거나 -2옵션으로 사용해야 할 수 있음 ). 물론 로그온하려는 모든 머신에 대해 절차를 반복 할 수 있습니다.

암호를 사용했다면 프로그램 ssh-agent을 실행하여 특수 쉘을 시작한 다음 키 / 암호 조합을 ssh-add로 등록해야합니다 . 자세한 내용은이 프로그램의 매뉴얼 페이지를 참조하십시오.sshd

비밀번호없는 연결 자동화를위한 스크립트 : ssh-no-password.sh

#!/bin/sh

# create ssh connections without giving a password

if [ $# -lt 1 ]; then
  echo Usage: $0 username@remotehost
  exit
fi
remote="$1"  # 1st command-line argument is the user@remotehost address
this=$HOST   # name of client host

# first check if we need to run ssh-keygen for generating
# $HOME/.ssh with public and private keys:
if [ ! -d $HOME/.ssh ]; then
  echo "just type RETURN for each question:" # no passphrase - unsecure!!
  # generate RSA1, RSA and DSA keys:
  echo; echo; echo
  ssh-keygen
  echo; echo; echo
  ssh-keygen -t rsa
  echo; echo; echo
  ssh-keygen -t dsa
else
  # we have $HOME/.ssh, but check that we have all types of
  # keys (RSA1, RSA, DSA):
  if [ ! -f $HOME/.ssh/identity ]; then
     # generate RSA1 keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate RSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t rsa
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate DSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t dsa
  fi
fi


cd $HOME/.ssh

if [ ! -f config ]; then
  # make ssh try ssh -1 (RSA1 keys) first and then ssh -2 (DSA keys)
  echo "Protocol 1,2" > config
fi

# copy public keys (all three types) to the destination host:

echo; echo; echo
# create .ssh on remote host if it's not there:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh/${this}_rsa1.pub
# copy RSA key:
#scp id_rsa.pub ${remote}:.ssh/${this}_rsa.pub
# copy DSA key:
scp id_dsa.pub ${remote}:.ssh/${this}_dsa.pub
# make authorized_keys(2) files on remote host:

echo; echo; echo
# this one copies all three keys:
#ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_rsa.pub >> authorized_keys2; cat ${this}_dsa.pub >> authorized_keys2;"
# this one copies RSA1 and DSA keys:
ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_dsa.pub >> authorized_keys2;"

echo; echo; echo
echo "try an ssh $remote"

http://folk.uio.no/hpl/scripting/doc/ssh-no-password.html 에서 복사


1

IdentitiesOnly를 yes로 설정했기 때문에 여기에서 모든 답변을 읽은 경우에도 비밀번호를 입력해야하는 사람들을위한 답변을 추가하고 싶습니다. 그리고 여기에 대한 답변은 git 또는 server의 키 인 여러 키를 관리하는 데 많은 시간을 절약 할 수 있습니다.

키를 생성하여 서버에 복사 한 후 :

ssh-keygen  # change the file to /home/yourname/.ssh/something
ssh-copy-id -i ~/.ssh/something.pub lerner@192.168.20.160

작동하지 않는 것을 발견했습니다.

그런 다음 ~/.ssh/config클라이언트 에서 파일 을 확인하기 위해 맨 아래에서 이것을 보았습니다.

Host *
IdentitiesOnly yes

그런 다음 위에 이것을 추가하십시오.

Host somename
HostName 192.168.20.160
User lerner
IdentityFile ~/.ssh/something

을 입력하여 로그인하면 ssh somename됩니다.

그런 다음 원하는 이름을 사용하여 여러 개의 ssh 키를 추가 할 수 있으며 위의 4 줄과 같은 설정 만 구성 파일에 추가하면됩니다.

호스트는 나중에 서버를 연결할 때 입력하려는 이름입니다. HostName은 서버의 IP입니다. 사용자는 서버에 로그인 한 사용자 이름입니다. 그리고 identityfile은 생성 한 키를 저장하는 파일입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.