SSH 키 인증 이해하기: 공개 키 대 개인 키 설명
SSH(Secure Shell)는 서버에 안전하게 원격으로 접속하는 데 필수적인 요소로, 관리자와 개발자가 어디서든 시스템을 관리할 수 있도록 합니다. 비밀번호 기반 인증도 일반적인 방법이지만, 종종 보안 취약점을 야기합니다. 업계에서 선호하고 훨씬 더 안전한 대안은 SSH 키 인증입니다.
이 글은 공개 키와 개인 키의 근본적인 역할을 명확히 설명함으로써 SSH 키 인증을 쉽게 이해하도록 돕는 것을 목표로 합니다. 이 암호화 쌍이 어떻게 함께 작동하여 원격 연결을 안전하게 보호하고 무단 액세스로부터 강력하게 방어하는지 자세히 살펴보겠습니다. 글을 마치면 이 방법이 기존의 비밀번호 기반 로그인보다 안전할 뿐만 아니라 일상적인 사용에도 더 편리한 이유를 이해하게 될 것입니다.
비밀번호의 문제점
전통적인 비밀번호 기반 인증은 공유된 비밀, 즉 비밀번호에 의존합니다. 강력한 비밀번호는 상당한 수준의 보안을 제공할 수 있지만, 다음과 같은 여러 가지 약점에 취약합니다.
- 무차별 대입 공격: 공격자는 올바르게 추측할 때까지 수많은 비밀번호 조합을 시도할 수 있습니다.
- 사전 공격: 일반적인 단어나 구문을 사용하여 공격자는 계정을 빠르게 손상시킬 수 있습니다.
- 키로거: 악성 소프트웨어가 키 입력을 캡처하여 비밀번호를 노출할 수 있습니다.
- 피싱: 사회 공학 기법으로 사용자를 속여 자격 증명을 공개하도록 유도할 수 있습니다.
- 인적 오류: 사용자는 종종 약하고 추측하기 쉬운 비밀번호를 선택하거나 재사용하며, 실수로 노출할 수도 있습니다.
SSH 키 인증은 네트워크를 통해 비밀을 전송할 필요성을 제거하여 이러한 위험을 완화하므로 원격 인프라를 안전하게 보호하는 데 더 나은 선택입니다.
SSH 키 인증 개요
SSH 키 인증은 비대칭 암호화를 활용합니다. 이 시스템은 공개 키와 개인 키라는 한 쌍의 수학적으로 연결된 키를 사용합니다. 암호화와 복호화에 동일한 키를 사용하는 대칭 암호화와 달리, 비대칭 암호화는 암호화에는 한 키를, 복호화에는 다른 관련 키를 사용합니다.
키를 사용하여 SSH 서버에 연결을 시도하면, 서버는 클라이언트에 도전(challenge)을 보내고, 클라이언트는 개인 키 자체를 네트워크로 전송하지 않고 개인 키를 사용하여 신원을 증명합니다. 이 과정은 올바른 개인 키를 가진 클라이언트만이 해당 공개 키를 신뢰하도록 구성된 서버와 연결을 설정할 수 있도록 보장합니다.
암호화 듀오: 공개 키와 개인 키
SSH 키 인증의 핵심에는 이 두 개의 별개이지만 상호 연결된 구성 요소가 있습니다.
개인 키
개인 키는 당신의 비밀 신분입니다. 이는 절대로 누구와도 공유해서는 안 되며 절대적으로 기밀로 유지해야 하는 길고 복잡한 문자열입니다. 당신의 디지털 잠금 상자에 대한 고유한 열쇠라고 생각하십시오.
- 보안 중요: 개인 키가 손상되면 공격자가 당신을 사칭하여 해당 공개 키가 배포된 모든 서버에 무단으로 액세스할 수 있습니다.
- 위치: 일반적으로 로컬 머신(예:
~/.ssh/id_rsa,~/.ssh/id_ed25519)에 저장됩니다. - 보호: 추가 보안 계층을 제공하는 암호 문구로 보호되는 경우가 많습니다. 공격자가 개인 키 파일에 액세스하더라도 암호 문구 없이는 사용할 수 없습니다.
공개 키
공개 키는 개인 키에 대한 상대방입니다. 개인 키에서 파생되지만 개인 키를 다시 만들 수는 없습니다. 이름에서 알 수 있듯이 공개 키는 공유되도록 설계되었으며 액세스하려는 모든 서버에 배치됩니다.
- 공유 가능: 보안을 손상시키지 않고 안전하게 공개 키를 누구에게나 또는 어떤 서버에나 배포할 수 있습니다.
- 위치: 서버에서 공개 키는 일반적으로 각 사용자 계정에 대한
~/.ssh/authorized_keys파일에 저장됩니다. 이 파일의 각 줄은 신뢰할 수 있는 공개 키를 나타냅니다. - 역할: 공개 키는 디지털 지문처럼 작동합니다. 연결을 시도할 때 서버는 공개 키를 사용하여 개인 키 자체를 보지 않고도 일치하는 개인 키를 가지고 있는지 확인합니다.
SSH 키 인증 작동 방식: 핸드셰이크
SSH 키 인증이 보안 연결을 설정하는 단계별 프로세스를 살펴보겠습니다.
- 키 쌍 생성: 먼저 로컬 머신에서 공개 키와 개인 키 쌍을 생성합니다. 개인 키는 비밀로 유지되고 공개 키는 배포할 것입니다.
- 공개 키 배포: 액세스하려는 원격 서버에 공개 키를 복사합니다. 이 키는 일반적으로 서버의 사용자 홈 디렉터리에 있는
~/.ssh/authorized_keys파일에 추가됩니다. - 연결 시도: 로컬 머신에서 원격 서버로 SSH 연결을 시작하면 SSH 클라이언트는 키를 사용하여 인증하려는 것을 알립니다.
- 서버 도전: 서버는 공개 키를 가지고 무작위 데이터 문자열( "도전" )을 생성하고 공개 키를 사용하여 이를 암호화합니다.
- 클라이언트 응답: 서버는 이 암호화된 도전을 SSH 클라이언트로 보냅니다. 그런 다음 클라이언트는 개인 키를 사용하여 도전을 복호화합니다.
- 검증: 그런 다음 클라이언트는 개인 키를 사용하여 원본 무작위 문자열(또는 그 파생본과 세션 데이터를 함께)을 암호화하고 서버로 다시 보냅니다. 서버는 공개 키를 사용하여 이 응답을 복호화합니다. 복호화된 값이 원본 도전과 일치하면 서버는 올바른 개인 키를 가지고 있음을 확신합니다.
- 인증 부여: 검증이 성공하면 서버가 액세스를 부여하고 보안 SSH 세션이 설정됩니다.
이 전체 과정에서 개인 키는 절대로 로컬 머신을 떠나지 않습니다. 파생된 암호화 증명만 교환됩니다.
SSH 키 쌍 생성
SSH 키 쌍 생성은 로컬 머신(Linux, macOS 또는 Windows의 WSL/Git Bash)에서 ssh-keygen 명령을 사용하는 간단한 프로세스입니다.
ssh-keygen -t ed25519 -C "[email protected]"
-t ed25519: 생성할 키의 유형을 지정합니다.ed25519는 현대적이고 매우 안전하며 효율적인 알고리즘입니다.rsa도 일반적이지만ed25519가 현재 일반적으로 선호됩니다.-C "[email protected]": 공개 키에 주석을 추가하여 목적 또는 소유자를 식별하는 데 도움이 됩니다.
키를 저장할 파일(기본값은 ~/.ssh/id_ed25519)과 암호 문구를 입력하라는 메시지가 표시됩니다. 개인 키를 보호하기 위해 항상 강력한 암호 문구를 사용하십시오.
Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519):
Created directory '/home/youruser/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/youruser/.ssh/id_ed25519.
Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:...
The key's randomart image is:
+--[ED25519 256]----+
| .=+ |
| . o. . |
| . + o. |
| o = B o. |
| . S @ + + |
| = + B . |
| o * * E |
| . o o |
| . . |
+----[SHA256]-------+
생성 후 ~/.ssh 디렉터리에 두 개의 파일이 생성됩니다.
id_ed25519(개인 키)id_ed25519.pub(공개 키)
경고: 개인 키 파일(id_ed25519)에 자신만 읽고 쓸 수 있도록 엄격한 권한(예: chmod 600 ~/.ssh/id_ed25519)이 설정되어 있는지 확인하십시오.
공개 키 배포
키 인증을 사용하려면 액세스하려는 원격 서버에 공개 키를 배치해야 합니다.
ssh-copy-id 사용 (권장)
ssh-copy-id 유틸리티는 공개 키를 배포하는 가장 간단하고 안전한 방법입니다. ~/.ssh 디렉터리와 authorized_keys 파일이 존재하지 않는 경우 올바른 권한으로 생성합니다.
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host
원격 서버의 사용자 이름으로 user를, 서버의 IP 주소 또는 호스트 이름으로 remote_host를 바꾸십시오. 키를 업로드하기 위해 user@remote_host에 대한 비밀번호를 마지막으로 한 번 입력하라는 메시지가 표시됩니다.
수동 배포
ssh-copy-id를 사용할 수 없는 경우 공개 키를 수동으로 복사할 수 있습니다.
-
공개 키 내용 복사:
cat을 사용하여 공개 키를 표시합니다.
bash cat ~/.ssh/id_ed25519.pub
ssh-ed25519 ...로 시작하고 주석으로 끝나는 전체 출력을 복사합니다. -
비밀번호 인증을 사용하여 원격 서버에 SSH 접속:
bash ssh user@remote_host
암호를 입력하라는 메시지가 표시되면 입력합니다. -
~/.ssh디렉터리 및authorized_keys파일이 없는 경우 생성:
bash mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys -
authorized_keys에 공개 키 추가: 이전에 복사한 공개 키 내용을authorized_keys파일에 붙여넣습니다.
bash echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys
(실제 공개 키 내용으로ssh-ed25519 AAAA...를 바꾸십시오)
SSH 키로 연결
서버에 공개 키가 배치되면 사용자 및 호스트를 지정하여 간단하게 연결할 수 있습니다.
ssh user@remote_host
여러 키 쌍이 있거나 개인 키가 기본 위치(~/.ssh/id_rsa 또는 ~/.ssh/id_ed25519)에 없는 경우 -i 옵션을 사용하여 지정해야 할 수 있습니다.
ssh -i ~/.ssh/my_custom_key user@remote_host
개인 키가 암호 문구로 보호되어 있는 경우 입력하라는 메시지가 표시됩니다. 세션 중에 암호 문구를 반복해서 입력하는 것을 피하려면 ssh-agent를 사용할 수 있습니다.
SSH 키 인증의 보안 이점
- 비밀번호 추측 방지: 인증에 비밀번호를 사용하지 않으므로 비밀번호에 대한 무차별 대입 공격이 불가능합니다.
- 강력한 자격 증명: SSH 키는 일반적으로 2048비트(RSA) 또는 256비트(Ed25519) 암호화 값으로, 가장 강력한 사람이 생성한 비밀번호보다 훨씬 복잡하고 해독하기 어렵습니다.
- 비밀 전송 없음: 개인 키는 로컬 머신을 떠나지 않으므로 인증 중에 가로채거나 도난당할 위험이 크게 줄어듭니다.
- 자동화 친화적: 키는 스크립트 가능한 비밀번호 없는 로그인을 허용하며, 이는 자동화 도구 및 CI/CD 파이프라인에 필수적입니다.
- 암호 문구 보호: 개인 키에 암호 문구를 추가하면 추가 보안 계층이 제공됩니다. 개인 키 파일이 도난당하더라도 암호 문구 없이는 사용할 수 없습니다.
SSH 키 관리
ssh-agent
ssh-agent는 백그라운드에서 실행되며 메모리에 해독된 개인 키를 보유하는 프로그램입니다. SSH 서버에 연결을 시도할 때 SSH 클라이언트는 필요한 개인 키를 ssh-agent에 쿼리하여 암호 문구를 반복해서 입력할 필요가 없습니다.
ssh-agent를 시작하고 키를 추가하려면:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
키를 에이전트에 추가할 때 암호 문구를 한 번 입력합니다.
키 이름 지정 및 구성
여러 키(예: 다른 조직, 프로젝트 또는 개인 용도)를 관리하려면 의미 있는 이름을 사용하는 것을 고려하십시오.
ssh-keygen -t ed25519 -f ~/.ssh/id_work_project -C "work_project_key"
ssh-keygen -t ed25519 -f ~/.ssh/id_personal_github -C "personal_github_key"
그런 다음 -i 옵션을 사용하여 사용할 키를 지정하거나, 호스트에 따라 올바른 키를 자동으로 선택하도록 ~/.ssh/config 파일을 구성할 수 있습니다.
~/.ssh/config 예시:
Host github.com
IdentityFile ~/.ssh/id_personal_github
User git
Host work-server
Hostname 192.168.1.100
IdentityFile ~/.ssh/id_work_project
User devuser
모범 사례 및 팁
- 개인 키를 절대 공유하지 마십시오: 이것이 황금률입니다. 개인 키는 당신의 디지털 신분입니다.
- 강력한 암호 문구를 사용하십시오: 강력한 비밀번호와 유사한 견고한 암호 문구로 개인 키를 보호하십시오. 이렇게 하면 잘못된 손에 들어가더라도 키가 쓸모없게 됩니다.
- 키를 정기적으로 교체하십시오: 키가 손상되었을 가능성이 있다고 의심되는 경우, 주기적으로 새 키를 생성하고 이전 키를 해지하십시오.
- 파일 권한 제한: 개인 키 파일에
600권한(rw-------)이 있고~/.ssh디렉터리에700(rwx------) 권한이 있는지 확인하십시오. - 서버에서 비밀번호 인증 비활성화: 키 인증을 설정한 후에는 서버에서 SSH에 대한 비밀번호 인증을 비활성화하여 보안을 대폭 향상시키는 것을 고려하십시오. 이는 종종
/etc/ssh/sshd_config에서PasswordAuthentication no를 설정하여 수행됩니다. ssh-agent사용: 편의성과 보안을 위해ssh-agent를 사용하여 키(암호 문구가 있는 키 포함)를 관리하십시오.
결론
SSH 키 인증은 원격 서버에 액세스하는 데 강력하고 안전하며 편리한 방법을 제공합니다. 공개 키와 개인 키의 개별적인 역할과 암호화 핸드셰이크에서 어떻게 상호 작용하는지 이해함으로써 운영 보안을 크게 향상시킬 수 있습니다. 비밀번호 기반 로그인을 SSH 키로 전환하는 것은 더 나은 서버 관리와 일반적인 공격 벡터로부터의 보호를 위한 근본적인 단계입니다. 이 강력한 보안 메커니즘을 채택하여 디지털 인프라를 보호하십시오.