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

SSH 키로 안전하고 비밀번호 없는 원격 접속을 시작하세요. 이 초보자 가이드에서는 `ssh-keygen`을 사용하여 SSH 키 쌍을 생성하고, `ssh-copy-id`로 서버에 배포하며, `ssh-agent` 및 설정 파일을 통해 키를 효과적으로 관리하는 방법을 다룹니다. 서버 보안을 강화하고 연결을 간소화하기 위한 모범 사례를 알아보세요.

38 조회수

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

SSH(Secure Shell)는 서버 및 기타 네트워크 장치에 안전하게 원격으로 접속하기 위한 사실상의 표준입니다. 암호 기반 인증이 일반적이지만, 무차별 대입 공격에 취약할 수 있으며 복잡한 암호를 외워야 하는 번거로움이 있습니다. SSH 키는 암호 없는 인증을 가능하게 하고 전반적인 보안 태세를 강화하는 보다 강력하고 편리한 대안을 제공합니다.

이 가이드는 SSH 키 쌍을 생성, 배포 및 관리하는 필수 단계를 안내합니다. 이러한 관행을 이해하고 구현함으로써 원격 액세스의 보안을 크게 개선하고 워크플로우를 간소화할 수 있습니다. SSH 키 인증을 시작하기 위해 핵심 개념, 실제 명령어 및 모범 사례를 다룰 것입니다.

SSH 키 쌍 이해하기

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

  • 개인 키 (Private Key): 이 키는 비밀로 유지해야 하며 절대 공유해서는 안 됩니다. 로컬 컴퓨터에 상주하며 사용자의 신원 역할을 합니다. SSH 연결을 시작할 때 클라이언트가 이 개인 키를 사용하여 신원을 증명합니다.
  • 공개 키 (Public Key): 이 키는 자유롭게 공유할 수 있습니다. 액세스하려는 원격 서버에 이 공개 키를 배치합니다. 연결을 시도하면 서버는 이 공개 키를 사용하여 해당 개인 키를 소유하고 있는지 확인합니다.

서버에 연결을 시도하면 다음과 같은 프로세스가 발생합니다:

  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. 암호 구문(passphrase) 입력 (암호 구문 없이 비워 두려면 Enter): 이것은 중요한 보안 단계입니다. 암호 구문을 입력하면 디스크에 있는 개인 키가 암호화됩니다. 개인 키 파일이 손상되더라도 공격자는 이를 사용하기 위해 암호 구문이 필요합니다. 강력한 암호 구문을 사용하는 것이 강력히 권장됩니다.
  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 에이전트 시작: 에이전트는 데스크톱 환경에 로그인할 때 자동으로 시작되는 경우가 많습니다. 그렇지 않은 경우 수동으로 시작할 수 있습니다.
    bash eval "$(ssh-agent -s)"
  • 에이전트에 키 추가: 에이전트가 실행되면 개인 키를 추가합니다.
    bash ssh-add ~/.ssh/id_ed25519
    암호 구문을 입력하라는 메시지가 표시됩니다. 그 후 에이전트가 키를 관리하며 후속 SSH 연결에서 자동으로 사용됩니다.

SSH 설정 파일 (~/.ssh/config)

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

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

# 기본 설정
Host *
  ForwardAgent yes
  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

The SSH 클라이언트는 ~/.ssh/config 파일에 정의된 올바른 사용자 이름, 포트 및 개인 키 파일을 자동으로 사용합니다.

키 순환 및 해지

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

모범 사례 및 보안 팁

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

결론

SSH 키는 원격 서버 관리의 보안과 편의성을 높이는 강력한 도구입니다. ssh-keygenssh-copy-id와 같은 도구를 사용하여 SSH 키 쌍의 생성, 배포 및 관리를 마스터함으로써 암호 기반 인증을 넘어 보다 안전하고 효율적인 원격 액세스 워크플로우를 구축할 수 있습니다. 강력한 암호 구문을 사용하고 개인 키를 보호하여 보안을 우선시하는 것을 기억하십시오.