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

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

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

SSH 키 인증은 많은 관리자, 개발자, CI 시스템 및 배포 도구가 서버에 로그인하는 일반적인 방법입니다. 노트북은 개인 키를 보관하고, 서버는 일치하는 공개 키를 저장하며, SSH는 네트워크를 통해 개인 키를 보내지 않고도 개인 키를 소유하고 있음을 증명합니다.

마지막 부분이 핵심입니다. 비밀번호는 여러 곳에 입력하는 비밀입니다. 개인 키는 기계에 남아 있어야 하는 비밀입니다. 암호로 보호하고 서버에 공개 키만 저장하면 공유 비밀번호보다 더 안전하고 자동화하기 쉬운 로그인 방법을 얻을 수 있습니다.

비밀번호의 문제점

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

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

SSH 키 인증은 개인 비밀이 원격 서버에 입력되지 않기 때문에 이러한 위험을 줄입니다. 그러나 이것이 키를 마법처럼 만드는 것은 아닙니다. 도난당한 암호화되지 않은 개인 키는 여전히 악용될 수 있으며, 잘못 관리된 authorized_keys 파일은 조용한 백도어가 될 수 있습니다.

SSH 키 인증: 개요

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

키로 연결할 때 서버는 계정이 제공된 공개 키를 신뢰하는지 확인합니다. 그런 다음 클라이언트는 일치하는 개인 키로 인증 데이터에 서명합니다. 서버는 공개 키로 해당 서명을 확인합니다. 개인 키는 서버에 업로드되지 않습니다.

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

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

개인 키

개인 키는 비밀 신원입니다. 길고 복잡한 문자열로 절대적으로 기밀로 유지되어야 하며 누구와도 공유해서는 안 됩니다. 디지털 금고의 고유한 키라고 생각하세요.

  • 보안 중요성: 개인 키가 손상되면 공격자가 사용자를 사칭하고 해당 공개 키가 배포된 모든 서버에 무단 액세스할 수 있습니다.
  • 위치: 일반적으로 로컬 시스템에 저장됩니다(예: ~/.ssh/id_rsa, ~/.ssh/id_ed25519).
  • 보호: 암호로 보호할 수 있습니다. 누군가 키 파일을 복사하면 암호는 "파일 도난"과 "서버 액세스 도난" 사이의 추가 장벽입니다.

공개 키

공개 키는 개인 키의 대응물입니다. 개인 키에서 파생되지만 개인 키를 재생성하는 데 사용할 수 없습니다. 이름에서 알 수 있듯이 공개 키는 공유하기 위한 것이며 액세스하려는 모든 서버에 배치할 수 있습니다.

  • 공유 가능: 보안을 손상시키지 않고 공개 키를 누구에게나 또는 모든 서버에 안전하게 배포할 수 있습니다.
  • 위치: 서버에서 공개 키는 일반적으로 각 사용자 계정의 ~/.ssh/authorized_keys 파일에 저장됩니다. 이 파일의 각 줄은 신뢰할 수 있는 공개 키를 나타냅니다.
  • 역할: 공개 키를 사용하면 서버가 일치하는 개인 키로 만든 서명을 확인할 수 있습니다.

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

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

  1. 키 쌍 생성: 먼저 로컬 시스템에서 공개 키와 개인 키 쌍을 생성합니다. 개인 키는 비밀로 유지되고 공개 키는 배포할 키입니다.
  2. 공개 키 배포: 액세스하려는 원격 서버에 공개 키를 복사합니다. 이 키는 일반적으로 서버 사용자 홈 디렉토리의 ~/.ssh/authorized_keys 파일에 추가됩니다.
  3. 연결 시도: 로컬 시스템에서 원격 서버로 SSH 연결을 시작하면 SSH 클라이언트는 키를 사용하여 인증하려고 한다고 표시합니다.
  4. 서버 확인: 서버는 제공된 공개 키가 해당 사용자에게 허용되는지 확인합니다.
  5. 클라이언트 증명: 클라이언트는 개인 키로 인증 데이터에 서명합니다. 개인 키에 암호가 있는 경우 로컬에서 잠금 해제하라는 메시지가 표시될 수 있습니다.
  6. 확인: 서버는 authorized_keys의 공개 키를 사용하여 서명을 확인합니다. 서명이 유효하고 계정이 로그인할 수 있으면 인증이 성공합니다.
  7. 인증 승인: 확인이 성공하면 서버가 액세스를 허용하고 보안 SSH 세션이 설정됩니다.

중요한 점은 이 전체 과정에서 개인 키가 로컬 시스템을 절대 떠나지 않는다는 것입니다. 개인 키에서 파생된 암호화 증명만 교환됩니다.

SSH 키 쌍 생성

SSH 키 쌍 생성은 로컬 시스템(Linux, macOS 또는 Windows의 WSL/Git Bash)에서 ssh-keygen 명령을 사용하는 간단한 프로세스입니다.

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519: 생성할 키 유형을 지정합니다. Ed25519는 대부분의 새로운 OpenSSH 키에 대한 현대적인 기본값입니다. RSA는 특히 오래된 시스템에서 여전히 일반적입니다.
  • -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 (공개 키)

개인 키 파일에 엄격한 권한이 있는지 확인하세요:

chmod 700 ~/.ssh
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를 원격 서버의 사용자 이름으로, remote_host를 서버의 IP 주소 또는 호스트 이름으로 바꾸세요. 키를 업로드하기 위해 마지막으로 user@remote_host비밀번호를 입력하라는 메시지가 표시됩니다.

수동 배포

ssh-copy-id를 사용할 수 없는 경우 공개 키를 수동으로 복사할 수 있습니다:

  1. 공개 키 내용 복사: cat을 사용하여 공개 키를 표시합니다.

    cat ~/.ssh/id_ed25519.pub
    

    ssh-ed25519 ...로 시작하여 주석으로 끝나는 전체 출력을 복사합니다.

  2. 비밀번호 인증을 사용하여 원격 서버에 SSH로 연결:

    ssh user@remote_host
    

    메시지가 표시되면 비밀번호를 입력합니다.

  3. ~/.ssh 디렉토리와 authorized_keys 파일이 없으면 생성:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
  4. 공개 키를 authorized_keys에 추가: 이전에 복사한 공개 키 내용을 authorized_keys 파일에 붙여넣습니다.

    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. 비밀번호 추측 위험 감소: 비밀번호 로그인이 비활성화되면 공격자는 SSH 비밀번호를 통해 해당 계정을 무차별 대입할 수 없습니다.
  2. 더 강력한 자격 증명: 적절하게 생성된 SSH 키는 사람이 추측할 수 있는 것이 아닙니다.
  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------) 권한이 있는지 확인하세요.
  • 비밀번호 인증 신중하게 비활성화: 두 번째 터미널에서 키 로그인이 작동하면 많은 서버에서 /etc/ssh/sshd_configPasswordAuthentication no를 설정해야 합니다. 원격 시스템에서 이 설정을 변경하기 전에 콘솔 액세스를 사용할 수 있도록 유지하세요.
  • ssh-agent 사용: 편의성과 보안을 위해 ssh-agent를 사용하여 키(특히 암호가 있는 키)를 관리하세요.

간단한 정신 모델

공개 키는 서버 계정에 설치하는 자물쇠입니다. 개인 키는 자신의 시스템에 보관하는 자격 증명입니다. 암호는 파일이 복사된 경우 해당 자격 증명을 보호합니다. authorized_keys 파일은 액세스 목록입니다.

대부분의 SSH 키 문제는 이러한 것을 혼동하여 발생합니다: 개인 키를 서버에 복사하거나, 잘못된 사용자 아래에 공개 키를 붙여넣거나, 잘못된 ID 파일을 사용하거나, OpenSSH가 신뢰할 수 있도록 권한을 너무 열어두는 경우입니다. 목적에 따라 키 이름을 지정하고, 암호로 개인 키를 보호하고, 편의를 위해 ssh-agent를 사용하고, 액세스가 종료되어야 할 때 오래된 공개 키를 제거하고, 비밀번호 로그인을 비활성화하기 전에 두 번째 터미널에서 변경 사항을 테스트하세요.