Linux 서버에서 SSH 키 기반 인증을 구성하는 방법


소개

SSH 또는 보안 셸은 서버를 관리하고 서버와 통신하는 데 사용되는 암호화된 프로토콜입니다. Linux 서버로 작업할 때 SSH를 통해 서버에 연결된 터미널 세션에서 많은 시간을 보내는 경우가 많습니다.

SSH 서버에 로그인하는 몇 가지 방법이 있지만 이 가이드에서는 SSH 키 설정에 중점을 둘 것입니다. SSH 키는 서버에 로그인하는 매우 안전한 방법을 제공합니다. 이러한 이유로 모든 사용자에게 권장하는 방법입니다.

SSH 키는 어떻게 작동합니까?

SSH 서버는 다양한 방법을 사용하여 클라이언트를 인증할 수 있습니다. 이 중 가장 기본적인 것은 비밀번호 인증으로 사용하기 쉽지만 가장 안전하지는 않습니다.

암호는 안전한 방식으로 서버에 전송되지만 일반적으로 복잡하지 않거나 반복적이고 끈질긴 공격을 막을 수 있을 만큼 길지 않습니다. 자동화된 스크립트와 결합된 최신 처리 능력을 통해 암호로 보호된 계정에 대한 무차별 대입이 가능해졌습니다. 보안을 추가하는 다른 방법(fail2ban 등)이 있지만 SSH 키는 안정적이고 안전한 대안임이 입증되었습니다.

SSH 키 쌍은 클라이언트를 SSH 서버에 인증하는 데 사용할 수 있는 두 개의 암호화된 보안 키입니다. 각 키 쌍은 공개 키와 개인 키로 구성됩니다.

개인 키는 클라이언트에 의해 유지되며 절대적으로 비밀로 유지되어야 합니다. 개인 키가 손상되면 공격자는 추가 인증 없이 연결된 공개 키로 구성된 서버에 로그인할 수 있습니다. 추가 예방 조치로 디스크에서 암호를 사용하여 키를 암호화할 수 있습니다.

연결된 공개 키는 부정적인 결과 없이 자유롭게 공유할 수 있습니다. 공개 키는 개인 키로만 해독할 수 있는 메시지를 암호화하는 데 사용할 수 있습니다. 이 속성은 키 쌍을 사용하여 인증하는 방법으로 사용됩니다.

공개 키는 SSH로 로그인하려는 원격 서버에 업로드됩니다. 키는 로그인할 사용자 계정 내의 ~/.ssh/authorized_keys라는 특수 파일에 추가됩니다.

클라이언트가 SSH 키를 사용하여 인증을 시도하면 서버는 클라이언트가 개인 키를 소유하고 있는지 테스트할 수 있습니다. 클라이언트가 개인 키를 소유하고 있음을 증명할 수 있으면 셸 세션이 생성되거나 요청된 명령이 실행됩니다.

1단계 - SSH 키 생성

서버에 대한 SSH 키 인증을 구성하는 첫 번째 단계는 로컬 컴퓨터에서 SSH 키 쌍을 생성하는 것입니다.

이를 위해 표준 OpenSSH 도구 모음에 포함된 ssh-keygen이라는 특수 유틸리티를 사용할 수 있습니다. 기본적으로 이렇게 하면 3072비트 RSA 키 쌍이 생성됩니다.

로컬 컴퓨터에서 다음을 입력하여 SSH 키 쌍을 생성합니다.

  1. ssh-keygen
Output
Generating public/private rsa key pair. Enter file in which to save the key (/home/username/.ssh/id_rsa):

이 유틸리티는 생성될 키의 위치를 선택하라는 메시지를 표시합니다. 기본적으로 키는 사용자 홈 디렉토리 내의 ~/.ssh 디렉토리에 저장됩니다. 개인 키는 id_rsa라고 하고 연결된 공개 키는 id_rsa.pub라고 합니다.

일반적으로 이 단계에서는 기본 위치를 유지하는 것이 가장 좋습니다. 이렇게 하면 인증을 시도할 때 SSH 클라이언트가 자동으로 SSH 키를 찾을 수 있습니다. 비표준 경로를 선택하려면 지금 입력하십시오. 그렇지 않으면 ENTER를 눌러 기본값을 적용하십시오.

이전에 SSH 키 쌍을 생성한 경우 다음과 같은 프롬프트가 표시될 수 있습니다.

Output
/home/username/.ssh/id_rsa already exists. Overwrite (y/n)?

디스크의 키를 덮어쓰도록 선택하면 더 이상 이전 키를 사용하여 인증할 수 없습니다. 되돌릴 수 없는 파괴적인 프로세스이므로 예를 선택할 때 매우 주의하십시오.

Output
Created directory '/home/username/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again:

다음으로 키의 암호를 입력하라는 메시지가 표시됩니다. 이것은 디스크의 개인 키 파일을 암호화하는 데 사용할 수 있는 선택적 암호입니다.

여전히 암호를 입력해야 하는 경우 SSH 키가 제공하는 이점이 무엇인지 궁금할 수 있습니다. 장점 중 일부는 다음과 같습니다.

  • 개인 SSH 키(암호로 보호할 수 있는 부분)는 네트워크에 노출되지 않습니다. 암호는 로컬 시스템에서 키를 해독하는 데만 사용됩니다. 즉, 암호에 대해 네트워크 기반 무차별 대입이 불가능합니다.
  • 개인 키는 제한된 디렉토리에 보관됩니다. SSH 클라이언트는 제한된 디렉토리에 보관되지 않은 개인 키를 인식하지 않습니다. 키 자체에도 제한된 권한이 있어야 합니다(소유자는 읽기 및 쓰기만 가능). 이는 시스템의 다른 사용자가 스누핑할 수 없음을 의미합니다.
  • 개인 SSH 키 암호를 해독하려는 공격자는 이미 시스템에 대한 액세스 권한이 있어야 합니다. 즉, 사용자 계정이나 루트 계정에 대한 액세스 권한이 이미 있음을 의미합니다. 이 위치에 있는 경우 암호는 공격자가 다른 서버에 즉시 로그인하는 것을 방지할 수 있습니다. 이렇게 하면 새로운 SSH 키 쌍을 생성 및 구현하고 손상된 키에서 액세스를 제거할 수 있는 시간을 가질 수 있습니다.

개인 키는 네트워크에 노출되지 않고 파일 권한을 통해 보호되므로 이 파일은 귀하(및 루트 사용자) 이외의 다른 사람이 액세스할 수 없어야 합니다. 암호는 이러한 조건이 손상된 경우 추가 보호 계층 역할을 합니다.

암호는 선택적으로 추가할 수 있습니다. 하나를 입력하면 이 키를 사용할 때마다 제공해야 합니다(해독된 키를 저장하는 SSH 에이전트 소프트웨어를 실행 중인 경우 제외). 암호를 사용하는 것이 좋지만 암호를 설정하지 않으려면 ENTER를 눌러 이 프롬프트를 무시할 수 있습니다.

Output
Your identification has been saved in /home/username/.ssh/id_rsa. Your public key has been saved in /home/username/.ssh/id_rsa.pub. The key fingerprint is: SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname The key's randomart image is: +---[RSA 3072]----+ |o ..oo.++o .. | | o o +o.o.+... | |. . + oE.o.o . | | . . oo.B+ .o | | . .=S.+ + | | . o..* | | .+= o | | .=.+ | | .oo+ | +----[SHA256]-----+

이제 인증에 사용할 수 있는 공개 및 개인 키가 있습니다. 다음 단계는 SSH 키 인증을 사용하여 로그인할 수 있도록 공개 키를 서버에 배치하는 것입니다.

2단계 - 서버에 SSH 공개 키 복사

참고: 이 튜토리얼의 이전 버전에는 SSH 공개 키를 DigitalOcean 계정에 추가하는 지침이 있습니다. 이러한 지침은 이제 DigitalOcean 제품 설명서의 SSH 키 섹션에서 찾을 수 있습니다.

공개 키를 원격 SSH 서버에 업로드하는 방법에는 여러 가지가 있습니다. 사용하는 방법은 주로 사용 가능한 도구와 현재 구성의 세부 정보에 따라 다릅니다.

다음 방법은 모두 동일한 최종 결과를 생성합니다. 가장 간단하고 가장 자동화된 방법이 먼저 설명되고 그 다음에는 각각 추가 수동 단계가 필요합니다. 앞의 방법을 사용할 수 없는 경우에만 다음을 따라야 합니다.

ssh-copy-id를 사용하여 공개 키 복사

공개 키를 기존 서버에 복사하는 가장 간단한 방법은 ssh-copy-id라는 유틸리티를 사용하는 것입니다. 이 방법은 간단하기 때문에 가능한 경우 권장됩니다.

ssh-copy-id 도구는 많은 배포판의 OpenSSH 패키지에 포함되어 있으므로 로컬 시스템에서 이미 사용할 수 있습니다. 이 방법이 작동하려면 현재 서버에 대한 암호 기반 SSH 액세스 권한이 있어야 합니다.

이 유틸리티를 사용하려면 연결하려는 원격 호스트와 암호 기반 SSH 액세스 권한이 있는 사용자 계정을 지정해야 합니다. 공개 SSH 키가 복사될 계정입니다.

구문은 다음과 같습니다.

  1. ssh-copy-id username@remote_host

다음과 같은 메시지가 표시될 수 있습니다.

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes

이것은 로컬 컴퓨터가 원격 호스트를 인식하지 못한다는 것을 의미합니다. 이것은 새 호스트에 처음 연결할 때 발생합니다. 계속하려면 yes를 입력하고 ENTER를 누르십시오.

다음으로 유틸리티는 이전에 생성한 id_rsa.pub 키에 대한 로컬 계정을 스캔합니다. 키를 찾으면 원격 사용자 계정의 암호를 묻는 메시지가 표시됩니다.

Output
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys username@203.0.113.1's password:

암호를 입력하고(보안상의 이유로 입력한 내용은 표시되지 않음) ENTER를 누릅니다. 유틸리티는 제공한 암호를 사용하여 원격 호스트의 계정에 연결합니다. 그런 다음 ~/.ssh/id_rsa.pub 키의 내용을 authorized_keys<라는 원격 계정의 홈 ~/.ssh 디렉토리에 있는 파일에 복사합니다. /코드>.

다음과 같은 출력이 표시됩니다.

Output
Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'username@203.0.113.1'" and check to make sure that only the key(s) you wanted were added.

이 시점에서 id_rsa.pub 키가 원격 계정에 업로드되었습니다. 다음 섹션으로 계속 진행할 수 있습니다.

SSH를 사용하여 공개 키 복사

ssh-copy-id를 사용할 수 없지만 서버의 계정에 대한 암호 기반 SSH 액세스 권한이 있는 경우 기존 SSH 방법을 사용하여 키를 업로드할 수 있습니다.

공개 SSH 키의 내용을 로컬 컴퓨터에 출력하고 SSH 연결을 통해 원격 서버에 연결하여 이를 수행할 수 있습니다. 다른 한편으로는 사용 중인 계정 아래에 ~/.ssh 디렉토리가 있는지 확인한 다음 authorized_keys라는 파일로 파이프한 콘텐츠를 출력할 수 있습니다. 이 디렉토리 내에서.

콘텐츠를 덮어쓰지 않고 추가하기 위해 >> 리디렉션 기호를 사용합니다. 이렇게 하면 이전에 추가된 키를 파괴하지 않고 키를 추가할 수 있습니다.

전체 명령은 다음과 같습니다.

  1. cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

다음과 같은 메시지가 표시될 수 있습니다.

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes

이것은 로컬 컴퓨터가 원격 호스트를 인식하지 못한다는 것을 의미합니다. 이것은 새 호스트에 처음 연결할 때 발생합니다. 계속하려면 yes를 입력하고 ENTER를 누르십시오.

그런 다음 연결하려는 계정의 비밀번호를 입력하라는 메시지가 표시됩니다.

Output
username@203.0.113.1's password:

비밀번호를 입력하면 id_rsa.pub 키의 내용이 원격 사용자 계정의 authorized_keys 파일 끝에 복사됩니다. 이것이 성공하면 다음 섹션을 계속하십시오.

공개 키를 수동으로 복사

사용 가능한 서버에 대한 암호 기반 SSH 액세스 권한이 없는 경우 위의 프로세스를 수동으로 수행해야 합니다.

id_rsa.pub 파일의 내용은 어떻게든 원격 시스템의 ~/.ssh/authorized_keys에 있는 파일에 추가되어야 합니다.

id_rsa.pub 키의 내용을 표시하려면 로컬 컴퓨터에 다음을 입력하십시오.

  1. cat ~/.ssh/id_rsa.pub

다음과 같은 키 내용이 표시됩니다.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== username@hostname

사용 가능한 방법을 사용하여 원격 호스트에 액세스하십시오. 이는 인프라 공급자가 제공하는 웹 기반 콘솔일 수 있습니다.

참고: DigitalOcean Droplet을 사용하는 경우 DigitalOcean 제품 문서의 복구 콘솔 문서를 참조하십시오.

원격 서버에서 계정에 액세스할 수 있으면 ~/.ssh 디렉토리가 생성되었는지 확인해야 합니다. 이 명령은 필요한 경우 디렉토리를 생성하거나 이미 존재하는 경우 아무 작업도 수행하지 않습니다.

  1. mkdir -p ~/.ssh

이제 이 디렉터리 내에서 authorized_keys 파일을 생성하거나 수정할 수 있습니다. id_rsa.pub 파일의 내용을 authorized_keys 파일 끝에 추가하고 필요한 경우 다음을 사용하여 생성할 수 있습니다.

  1. echo public_key_string >> ~/.ssh/authorized_keys

위 명령에서 public_key_string을 로컬에서 실행한 cat ~/.ssh/id_rsa.pub 명령의 출력으로 대체합니다. 체계. ssh-rsa AAAA... 또는 이와 유사한 것으로 시작해야 합니다.

이것이 작동하면 새 키 기반 SSH 인증을 테스트할 수 있습니다.

3단계 - SSH 키를 사용하여 서버에 인증

위의 절차 중 하나를 성공적으로 완료했다면 원격 계정의 비밀번호 없이 원격 호스트에 로그인할 수 있어야 합니다.

프로세스는 대부분 동일합니다.

  1. ssh username@remote_host

이 호스트에 처음 연결하는 경우(위의 마지막 방법을 사용한 경우) 다음과 같은 내용이 표시될 수 있습니다.

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes

이것은 로컬 컴퓨터가 원격 호스트를 인식하지 못한다는 것을 의미합니다. yes를 입력한 다음 ENTER를 눌러 계속하십시오.

개인 키에 대한 암호를 제공하지 않은 경우 즉시 로그인됩니다. 키를 생성할 때 개인 키에 대한 암호를 제공한 경우 지금 입력해야 합니다. 그런 다음 원격 시스템의 계정으로 새 셸 세션이 생성됩니다.

성공하면 계속해서 서버를 잠그는 방법을 알아봅니다.

4단계 - 서버에서 암호 인증 비활성화

암호 없이 SSH를 사용하여 계정에 로그인할 수 있었다면 계정에 SSH 키 기반 인증을 성공적으로 구성한 것입니다. 그러나 암호 기반 인증 메커니즘은 여전히 활성 상태이므로 서버가 여전히 무차별 대입 공격에 노출되어 있습니다.

이 섹션의 단계를 완료하기 전에 이 서버의 루트 계정에 대해 SSH 키 기반 인증이 구성되어 있는지 또는 를 사용하여 이 서버의 계정에 대해 구성된 SSH 키 기반 인증이 있는지 확인하십시오. sudo 액세스. 이 단계는 암호 기반 로그인을 잠그므로 여전히 관리 액세스 권한을 얻을 수 있는지 확인하는 것이 중요합니다.

위의 조건이 충족되면 루트 또는 sudo 권한이 있는 계정으로 SSH 키를 사용하여 원격 서버에 로그인합니다. SSH 데몬의 구성 파일을 엽니다.

  1. sudo nano /etc/ssh/sshd_config

파일 내에서 PasswordAuthentication이라는 지시문을 검색합니다. 이것은 주석 처리될 수 있습니다. 줄 시작 부분에서 #를 제거하여 줄의 주석 처리를 제거하고 값을 no로 설정합니다. 이렇게 하면 계정 암호를 사용하여 SSH를 통해 로그인하는 기능이 비활성화됩니다.

PasswordAuthentication no

완료되면 파일을 저장하고 닫습니다. 방금 변경한 사항을 실제로 구현하려면 서비스를 다시 시작해야 합니다.

대부분의 Linux 배포판에서 다음 명령을 실행하여 이를 수행할 수 있습니다.

  1. sudo systemctl restart ssh

이 단계를 완료하면 SSH 데몬이 SSH 키에만 응답하도록 성공적으로 전환되었습니다.

결론

이제 서버에서 SSH 키 기반 인증이 구성되고 실행되어 계정 암호를 제공하지 않고 로그인할 수 있습니다. 여기에서 갈 수 있는 여러 방향이 있습니다. SSH 작업에 대해 자세히 알아보려면 SSH 필수 가이드를 살펴보세요.