초보자를 위한 SSH 키 가이드: 안전한 생성, 사용 및 관리

SSH 키 생성, 서버에 공개 키 복사, ssh-agent 사용, 호스트별 SSH 구성을 안전하게 관리하는 방법을 알아봅니다.

SSH 키 초보자 가이드: 안전하게 생성, 사용 및 관리하기

SSH 키를 사용하면 네트워크를 통해 재사용 가능한 비밀번호를 보내지 않고도 서버에 로그인할 수 있습니다. Linux 서버, 클라우드 인스턴스 또는 Git 원격 저장소를 관리하는 경우, 적절히 보호된 SSH 키는 일반적으로 비밀번호 기반 로그인보다 안전하고 편리합니다.

이 초보자 가이드에서는 SSH 키 쌍을 생성하고, 공개 키를 서버에 복사하고, 올바른 개인 키로 연결하며, 서버 목록이 늘어남에 따라 키를 관리하는 방법을 설명합니다.

SSH 키 쌍 이해하기

SSH 키 인증은 개인 키와 공개 키라는 한 쌍의 암호화 키에 의존합니다. 이 키들은 수학적으로 연결되어 있지만, 공개 키로부터 개인 키를 유도하는 것은 계산적으로 불가능합니다.

  • 개인 키: 이 키는 비밀로 유지해야 하며 절대 공유해서는 안 됩니다. 로컬 머신에 저장되며 사용자의 신원 역할을 합니다. SSH 연결을 시작하면 클라이언트가 개인 키를 사용하여 신원을 증명합니다.
  • 공개 키: 이 키는 자유롭게 공유할 수 있습니다. 접근하려는 원격 서버에 공개 키를 배치합니다. 연결을 시도하면 서버는 공개 키를 사용하여 해당 개인 키를 소유하고 있는지 확인합니다.

서버에 연결을 시도하면 다음 과정이 진행됩니다:

  1. SSH 클라이언트가 서버에 공개 키를 제시합니다.
  2. 서버는 이 공개 키가 인증되었는지(즉, authorized_keys 파일에 있는지) 확인합니다.
  3. 인증되면 서버가 클라이언트에 챌린지를 보냅니다.
  4. 클라이언트는 개인 키로 챌린지에 서명하고 서명을 서버로 다시 보냅니다.
  5. 서버는 공개 키로 서명을 확인합니다. 서명이 유효하면 비밀번호 없이 인증이 승인됩니다.

SSH 키 쌍 생성하기

SSH 키 쌍을 생성하는 가장 일반적인 도구는 ssh-keygen입니다. 이 명령은 대부분의 Linux, macOS 및 Windows(WSL 또는 Git Bash를 통해) 시스템에서 사용할 수 있습니다.

ssh-keygen 사용하기

새 SSH 키 쌍을 생성하려면 터미널 또는 명령 프롬프트를 열고 다음 명령을 실행합니다:

ssh-keygen -t ed25519

이 명령을 분석해 보겠습니다:

  • ssh-keygen: SSH 키를 생성하는 명령입니다.
  • -t ed25519: 생성할 키 유형을 지정합니다. ed25519는 현대적이고 매우 안전하며 빠른 타원 곡선 암호화 알고리즘입니다. 다른 일반적인 옵션으로는 rsa(예: 4096비트 RSA 키의 경우 ssh-keygen -t rsa -b 4096)가 있습니다.

명령을 실행하면 몇 가지 질문이 표시됩니다:

  1. 키를 저장할 파일 입력 (예: /home/your_user/.ssh/id_ed25519): 기본 위치를 수락하려면 Enter를 누릅니다. 그러면 .ssh 디렉토리에 id_ed25519(개인 키)와 id_ed25519.pub(공개 키)라는 두 개의 파일이 생성됩니다.
  2. 암호 입력 (암호 없음은 빈 칸): 이것은 중요한 보안 단계입니다. 암호를 입력하면 디스크에 개인 키가 암호화됩니다. 개인 키 파일이 유출되더라도 공격자는 이를 사용하려면 여전히 암호가 필요합니다. 강력한 암호를 사용하는 것이 좋습니다.
  3. 동일한 암호 다시 입력: 암호를 확인합니다.

출력 파일 이해하기

생성 후 ~/.ssh/ 디렉토리(또는 지정한 경로)에 두 개의 파일이 생성됩니다:

  • id_ed25519 (또는 id_rsa): 개인 키입니다. 이 파일을 절대 공유하지 마십시오. 사용자만 읽을 수 있도록 권한을 제한하십시오.
  • id_ed25519.pub (또는 id_rsa.pub): 공개 키입니다. 서버에 배포할 키입니다.

개인 키 보호하기

개인 키의 파일 권한이 올바른지 확인하는 것이 중요합니다. Linux/macOS에서 다음을 실행합니다:

chmod 600 ~/.ssh/id_ed25519

이 명령은 읽기 및 쓰기 권한을 파일 소유자로만 제한하여 시스템의 다른 사용자가 개인 키에 접근하지 못하도록 합니다.

서버에 공개 키 배포하기

SSH 키 쌍을 생성한 후에는 접근하려는 원격 서버에 공개 키를 배치해야 합니다.

ssh-copy-id 사용하기 (권장)

ssh-copy-id는 공개 키를 원격 서버에 복사하는 과정을 단순화하는 유틸리티 스크립트입니다. 서버의 ~/.ssh/authorized_keys 파일에 공개 키를 자동으로 추가하고 올바른 권한을 설정합니다.

ssh-copy-id를 사용하려면 로컬 머신에서 다음 명령을 실행합니다:

ssh-copy-id user@remote_host

user를 원격 서버의 사용자 이름으로, remote_host를 서버의 IP 주소 또는 호스트 이름으로 바꿉니다. 키 전송을 승인하기 위해 remote_hostuser 비밀번호를 마지막으로 한 번 묻습니다.

비표준 SSH 포트(예: 2222)를 사용하는 경우 -p 옵션으로 지정할 수 있습니다:

ssh-copy-id -p 2222 user@remote_host

수동 배포 (ssh-copy-id를 사용할 수 없는 경우)

ssh-copy-id를 사용할 수 없는 경우 공개 키를 수동으로 복사할 수 있습니다. 먼저 로컬 머신에서 공개 키 내용을 표시합니다:

cat ~/.ssh/id_ed25519.pub

전체 출력을 복사합니다. 그런 다음 비밀번호를 사용하여 원격 서버에 SSH로 접속합니다:

ssh user@remote_host

로그인한 후 .ssh 디렉토리가 없으면 생성하고 authorized_keys 파일을 생성하거나 추가합니다:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

이제 공개 키 내용을 authorized_keys 파일에 붙여넣습니다. nano 또는 vim과 같은 텍스트 편집기를 사용하여 이 작업을 수행할 수 있습니다:

nano ~/.ssh/authorized_keys

복사한 공개 키를 새 줄에 붙여넣습니다. 편집기를 저장하고 종료합니다.

마지막으로 authorized_keys 파일의 권한이 올바른지 확인합니다:

chmod 600 ~/.ssh/authorized_keys

이 단계를 완료하면 비밀번호 없이 서버에 SSH로 접속할 수 있습니다.

SSH 키로 연결하기

공개 키가 서버에 있으면 개인 키를 사용하여 연결할 수 있습니다. SSH 클라이언트는 ~/.ssh/에 있는 키를 자동으로 사용하려고 시도합니다.

ssh user@remote_host

키 생성 중에 암호를 사용한 경우 지금 입력하라는 메시지가 표시됩니다. 암호를 사용하지 않은 경우 직접 로그인됩니다.

다른 키 지정하기

여러 SSH 키 쌍이 있거나 키가 기본 위치에 없는 경우 -i 옵션으로 사용할 개인 키를 지정할 수 있습니다:

ssh -i /path/to/your/private_key user@remote_host

SSH 키 관리하기

더 많은 서버에 접근할수록 더 많은 SSH 키가 축적됩니다. 효과적인 관리는 보안과 편의성을 유지하는 데 중요합니다.

SSH 에이전트

SSH 에이전트는 개인 키를 암호로 해독된 상태로 메모리에 보관하는 백그라운드 프로그램입니다. 이를 통해 매번 암호를 다시 입력하지 않고도 여러 SSH 연결에 키를 사용할 수 있습니다.

  • SSH 에이전트 시작하기: 에이전트는 데스크톱 환경에 로그인할 때 자동으로 시작되는 경우가 많습니다. 그렇지 않은 경우 수동으로 시작할 수 있습니다:
    eval "$(ssh-agent -s)"
    
  • 에이전트에 키 추가하기: 에이전트가 실행 중이면 개인 키를 추가합니다:
    ssh-add ~/.ssh/id_ed25519
    
    암호를 입력하라는 메시지가 표시됩니다. 이후 에이전트가 키를 관리하고 이후 SSH 연결에서 자동으로 사용합니다.

SSH 구성 파일 (~/.ssh/config)

SSH 클라이언트 구성 파일(~/.ssh/config)을 사용하면 호스트에 대한 별칭을 정의하고 특정 호스트에 사용할 키를 포함한 연결 매개변수를 지정할 수 있습니다. 이는 여러 서버를 관리하는 데 매우 유용합니다.

로컬 머신에서 ~/.ssh/config 파일을 생성하거나 편집하고 다음과 같은 항목을 추가합니다:

# 기본 설정
Host *
  ServerAliveInterval 60

# 서버 1: 웹 서버
Host webserver
  HostName 192.168.1.100
  User webadmin
  Port 2222
  IdentityFile ~/.ssh/webserver_key

# 서버 2: 데이터베이스 서버
Host dbserver
  HostName db.example.com
  User dbuser
  IdentityFile ~/.ssh/db_key

이 구성을 사용하면 다음을 사용하여 웹 서버에 연결할 수 있습니다:

ssh webserver

그리고 데이터베이스 서버에:

ssh dbserver

SSH 클라이언트는 ~/.ssh/config 파일에 정의된 대로 올바른 사용자 이름, 포트 및 개인 키 파일을 자동으로 사용합니다. ForwardAgent yes를 전역적으로 활성화하지 마십시오. 에이전트 전달은 점프 호스트 워크플로에 유용할 수 있지만 세션이 활성화된 동안 원격 호스트에 에이전트 소켓을 노출합니다.

키 교체 및 폐기

  • 교체: 특히 민감한 시스템의 경우 정기적으로 SSH 키 교체를 고려하십시오. 여기에는 새 키를 생성하고 서버에서 이전 공개 키를 교체하는 작업이 포함됩니다.
  • 폐기: 개인 키가 유출되었거나 더 이상 액세스가 필요하지 않은 경우 배포된 모든 서버의 authorized_keys 파일에서 해당 공개 키를 제거해야 합니다. 이는 보안 유지에 중요합니다.

모범 사례 및 보안 팁

  • 암호 사용: 항상 강력한 암호로 개인 키를 보호하십시오. 이는 개인 키 파일이 도난당한 경우 무단 사용에 대한 주요 방어 수단입니다.
  • 개인 키 권한 보호: 개인 키 파일에 600 권한(-rw-------)이 있는지 확인하십시오.
  • ssh-agent 사용: SSH 에이전트를 활용하여 암호를 반복해서 입력하지 않도록 하십시오.
  • 비밀번호 인증 비활성화: SSH 키 인증이 작동하면 추가 보안 계층을 위해 서버에서 비밀번호 기반 인증을 비활성화하는 것을 고려하십시오.
  • 키 최신 상태 유지: Ed25519와 같은 현대적이고 강력한 알고리즘을 사용하십시오. 충분한 비트 길이(최소 4096)가 없는 이전 RSA 키는 피하십시오.
  • authorized_keys 주의: 신뢰할 수 있는 소스의 공개 키만 authorized_keys 파일에 추가하십시오.
  • 정기적인 감사: 서버의 authorized_keys 파일을 정기적으로 검토하여 승인된 키만 있는지 확인하십시오.

요점

SSH 키는 긴급 서버 액세스가 필요하기 전에 설정할 가치가 있습니다. 최신 키를 생성하고, 개인 키를 암호로 보호하고, 공개 키만 서버에 복사하고, 액세스가 변경되면 authorized_keys에서 오래된 키를 제거하십시오.