SSH 키 인증 이해하기: 공개 키 대 개인 키 설명

이 종합 가이드로 SSH 키 인증의 비밀을 풀어보세요. 공개 키와 개인 키의 근본적인 역할, 이들이 어떻게 함께 작동하여 원격 연결을 안전하게 보호하는지, 그리고 이 방법이 비밀번호 기반 로그인을 왜 훨씬 능가하는지 알아보세요. 이 문서는 키 생성 및 배포를 위한 단계별 지침과 필수 보안 이점 및 모범 사례를 제공합니다. SSH 키로 서버 보안을 강화하고 액세스를 간소화하십시오.

36 조회수

SSH 키 인증 이해하기: 공개 키 대 개인 키 설명

SSH(Secure Shell)는 서버에 안전하게 원격으로 접속하는 데 필수적인 요소로, 관리자와 개발자가 어디서든 시스템을 관리할 수 있도록 합니다. 비밀번호 기반 인증도 일반적인 방법이지만, 종종 보안 취약점을 야기합니다. 업계에서 선호하고 훨씬 더 안전한 대안은 SSH 키 인증입니다.

이 글은 공개 키와 개인 키의 근본적인 역할을 명확히 설명함으로써 SSH 키 인증을 쉽게 이해하도록 돕는 것을 목표로 합니다. 이 암호화 쌍이 어떻게 함께 작동하여 원격 연결을 안전하게 보호하고 무단 액세스로부터 강력하게 방어하는지 자세히 살펴보겠습니다. 글을 마치면 이 방법이 기존의 비밀번호 기반 로그인보다 안전할 뿐만 아니라 일상적인 사용에도 더 편리한 이유를 이해하게 될 것입니다.

비밀번호의 문제점

전통적인 비밀번호 기반 인증은 공유된 비밀, 즉 비밀번호에 의존합니다. 강력한 비밀번호는 상당한 수준의 보안을 제공할 수 있지만, 다음과 같은 여러 가지 약점에 취약합니다.

  • 무차별 대입 공격: 공격자는 올바르게 추측할 때까지 수많은 비밀번호 조합을 시도할 수 있습니다.
  • 사전 공격: 일반적인 단어나 구문을 사용하여 공격자는 계정을 빠르게 손상시킬 수 있습니다.
  • 키로거: 악성 소프트웨어가 키 입력을 캡처하여 비밀번호를 노출할 수 있습니다.
  • 피싱: 사회 공학 기법으로 사용자를 속여 자격 증명을 공개하도록 유도할 수 있습니다.
  • 인적 오류: 사용자는 종종 약하고 추측하기 쉬운 비밀번호를 선택하거나 재사용하며, 실수로 노출할 수도 있습니다.

SSH 키 인증은 네트워크를 통해 비밀을 전송할 필요성을 제거하여 이러한 위험을 완화하므로 원격 인프라를 안전하게 보호하는 데 더 나은 선택입니다.

SSH 키 인증 개요

SSH 키 인증은 비대칭 암호화를 활용합니다. 이 시스템은 공개 키와 개인 키라는 한 쌍의 수학적으로 연결된 키를 사용합니다. 암호화와 복호화에 동일한 키를 사용하는 대칭 암호화와 달리, 비대칭 암호화는 암호화에는 한 키를, 복호화에는 다른 관련 키를 사용합니다.

키를 사용하여 SSH 서버에 연결을 시도하면, 서버는 클라이언트에 도전(challenge)을 보내고, 클라이언트는 개인 키 자체를 네트워크로 전송하지 않고 개인 키를 사용하여 신원을 증명합니다. 이 과정은 올바른 개인 키를 가진 클라이언트만이 해당 공개 키를 신뢰하도록 구성된 서버와 연결을 설정할 수 있도록 보장합니다.

암호화 듀오: 공개 키와 개인 키

SSH 키 인증의 핵심에는 이 두 개의 별개이지만 상호 연결된 구성 요소가 있습니다.

개인 키

개인 키는 당신의 비밀 신분입니다. 이는 절대로 누구와도 공유해서는 안 되며 절대적으로 기밀로 유지해야 하는 길고 복잡한 문자열입니다. 당신의 디지털 잠금 상자에 대한 고유한 열쇠라고 생각하십시오.

  • 보안 중요: 개인 키가 손상되면 공격자가 당신을 사칭하여 해당 공개 키가 배포된 모든 서버에 무단으로 액세스할 수 있습니다.
  • 위치: 일반적으로 로컬 머신(예: ~/.ssh/id_rsa, ~/.ssh/id_ed25519)에 저장됩니다.
  • 보호: 추가 보안 계층을 제공하는 암호 문구로 보호되는 경우가 많습니다. 공격자가 개인 키 파일에 액세스하더라도 암호 문구 없이는 사용할 수 없습니다.

공개 키

공개 키는 개인 키에 대한 상대방입니다. 개인 키에서 파생되지만 개인 키를 다시 만들 수는 없습니다. 이름에서 알 수 있듯이 공개 키는 공유되도록 설계되었으며 액세스하려는 모든 서버에 배치됩니다.

  • 공유 가능: 보안을 손상시키지 않고 안전하게 공개 키를 누구에게나 또는 어떤 서버에나 배포할 수 있습니다.
  • 위치: 서버에서 공개 키는 일반적으로 각 사용자 계정에 대한 ~/.ssh/authorized_keys 파일에 저장됩니다. 이 파일의 각 줄은 신뢰할 수 있는 공개 키를 나타냅니다.
  • 역할: 공개 키는 디지털 지문처럼 작동합니다. 연결을 시도할 때 서버는 공개 키를 사용하여 개인 키 자체를 보지 않고도 일치하는 개인 키를 가지고 있는지 확인합니다.

SSH 키 인증 작동 방식: 핸드셰이크

SSH 키 인증이 보안 연결을 설정하는 단계별 프로세스를 살펴보겠습니다.

  1. 키 쌍 생성: 먼저 로컬 머신에서 공개 키와 개인 키 쌍을 생성합니다. 개인 키는 비밀로 유지되고 공개 키는 배포할 것입니다.
  2. 공개 키 배포: 액세스하려는 원격 서버에 공개 키를 복사합니다. 이 키는 일반적으로 서버의 사용자 홈 디렉터리에 있는 ~/.ssh/authorized_keys 파일에 추가됩니다.
  3. 연결 시도: 로컬 머신에서 원격 서버로 SSH 연결을 시작하면 SSH 클라이언트는 키를 사용하여 인증하려는 것을 알립니다.
  4. 서버 도전: 서버는 공개 키를 가지고 무작위 데이터 문자열( "도전" )을 생성하고 공개 키를 사용하여 이를 암호화합니다.
  5. 클라이언트 응답: 서버는 이 암호화된 도전을 SSH 클라이언트로 보냅니다. 그런 다음 클라이언트는 개인 키를 사용하여 도전을 복호화합니다.
  6. 검증: 그런 다음 클라이언트는 개인 키를 사용하여 원본 무작위 문자열(또는 그 파생본과 세션 데이터를 함께)을 암호화하고 서버로 다시 보냅니다. 서버는 공개 키를 사용하여 이 응답을 복호화합니다. 복호화된 값이 원본 도전과 일치하면 서버는 올바른 개인 키를 가지고 있음을 확신합니다.
  7. 인증 부여: 검증이 성공하면 서버가 액세스를 부여하고 보안 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를 사용할 수 없는 경우 공개 키를 수동으로 복사할 수 있습니다.

  1. 공개 키 내용 복사: cat을 사용하여 공개 키를 표시합니다.
    bash cat ~/.ssh/id_ed25519.pub
    ssh-ed25519 ...로 시작하고 주석으로 끝나는 전체 출력을 복사합니다.

  2. 비밀번호 인증을 사용하여 원격 서버에 SSH 접속:
    bash ssh user@remote_host
    암호를 입력하라는 메시지가 표시되면 입력합니다.

  3. ~/.ssh 디렉터리 및 authorized_keys 파일이 없는 경우 생성:
    bash mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys

  4. 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 키 인증의 보안 이점

  1. 비밀번호 추측 방지: 인증에 비밀번호를 사용하지 않으므로 비밀번호에 대한 무차별 대입 공격이 불가능합니다.
  2. 강력한 자격 증명: SSH 키는 일반적으로 2048비트(RSA) 또는 256비트(Ed25519) 암호화 값으로, 가장 강력한 사람이 생성한 비밀번호보다 훨씬 복잡하고 해독하기 어렵습니다.
  3. 비밀 전송 없음: 개인 키는 로컬 머신을 떠나지 않으므로 인증 중에 가로채거나 도난당할 위험이 크게 줄어듭니다.
  4. 자동화 친화적: 키는 스크립트 가능한 비밀번호 없는 로그인을 허용하며, 이는 자동화 도구 및 CI/CD 파이프라인에 필수적입니다.
  5. 암호 문구 보호: 개인 키에 암호 문구를 추가하면 추가 보안 계층이 제공됩니다. 개인 키 파일이 도난당하더라도 암호 문구 없이는 사용할 수 없습니다.

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 키로 전환하는 것은 더 나은 서버 관리와 일반적인 공격 벡터로부터의 보호를 위한 근본적인 단계입니다. 이 강력한 보안 메커니즘을 채택하여 디지털 인프라를 보호하십시오.