비밀번호가없는 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_rsa와 id_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로 연결하십시오.


무엇에 대한 touch과 chmodRinzwind의 대답에 명령?
— 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

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

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

  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). 아래 예에서는 원격 호스트에 RSA1 및 DSA 키를 생성 및 설치 하여보다 유연하게 사용할 수 있습니다. .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.