SSH 키 기반 인증 보안 설정 단계별 가이드

ED25519 키, authorized_keys, ssh-agent 및 안전한 sshd 설정을 사용하여 SSH 키 기반 인증을 설정합니다.

SSH 키 기반 인증 보안 설정 단계별 가이드

SSH 키 기반 인증은 많은 비밀번호 기반 공격으로부터 서버를 보호하지만, 키를 신중하게 생성하고, 공개 키를 올바르게 설치하며, 서버 설정을 변경하기 전에 접속을 테스트해야만 효과적입니다.

이 가이드는 ED25519 키 생성, 공개 키 설치, 로그인 테스트 및 안전한 SSH 데몬 설정 과정을 안내합니다.

SSH 키 기반 인증 이해하기

SSH 키 기반 인증은 암호학적으로 연결된 한 쌍의 키, 즉 개인 키공개 키에 의존합니다.

  • 개인 키: 이 키는 로컬 머신에서 비밀로 유지되고 보호되어야 합니다. 오직 당신만이 가지고 있는 매우 복잡한 비밀번호와 같습니다.
  • 공개 키: 이 키는 자유롭게 공유할 수 있으며 접속하려는 원격 서버에 배치됩니다. 서버가 당신의 신원을 확인하는 데 사용됩니다.

접속을 시도하면 서버는 공개 키를 사용하여 로컬 머신에 도전합니다. 그러면 로컬 머신은 개인 키를 사용하여 이 도전에 응답함으로써 네트워크를 통해 개인 키를 전송하지 않고 신원을 증명합니다. 이 방법은 더 안전할 뿐만 아니라 올바르게 구성되면 매 연결마다 비밀번호를 입력할 필요가 없어 더 편리합니다.

1단계: SSH 키 쌍 생성하기

ssh-keygen 유틸리티는 새로운 SSH 키 쌍을 생성하는 데 사용됩니다. ED25519와 같은 현대적이고 강력한 알고리즘을 사용하는 것이 좋습니다.

키 유형 및 강도 선택

RSA 키가 여전히 널리 사용되지만, ED25519는 더 짧은 키 길이와 더 빠른 작업으로 뛰어난 보안을 제공합니다. 새로운 설정의 경우 일반적으로 ED25519가 선호됩니다.

키 쌍 생성

로컬 머신(클라이언트)에서 터미널을 열고 다음 명령을 실행하십시오:

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519: 키 유형을 ED25519로 지정합니다.
  • -C "[email protected]": 공개 키에 주석을 추가하며, 주로 식별 용도로 사용됩니다. 실제 이메일이나 설명 레이블로 바꾸십시오.

명령은 키를 저장할 위치와 선택적 암호를 묻습니다.

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_ed25519): 
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: ...

강력한 암호 설정 (매우 권장)

메시지가 표시되면 개인 키에 항상 강력한 암호를 설정하십시오. 이 암호는 로컬 머신에서 개인 키를 암호화하여 추가 보안 계층을 제공합니다. 개인 키가 잘못된 사람의 손에 들어가더라도 암호 없이는 무용지물입니다. ssh-agent를 사용하여 암호를 반복적으로 입력하지 않을 수 있습니다(4단계 참조).

키 파일 위치

기본적으로 ssh-keygen은 개인 키를 ~/.ssh/id_ed25519에, 공개 키를 ~/.ssh/id_ed25519.pub에 저장합니다.

개인 키 권한

개인 키 파일은 매우 엄격한 권한을 가져야 합니다. 소유자만 읽을 수 있어야 합니다. ssh-keygen은 일반적으로 이를 올바르게 설정하지만 확인하는 것이 좋습니다:

chmod 600 ~/.ssh/id_ed25519

2단계: 서버에 공개 키 배포하기

키 쌍을 생성한 후에는 접속하려는 원격 서버에 공개 키를 복사해야 합니다. 원격 서버 사용자의 ~/.ssh/ 디렉토리 내에 authorized_keys라는 파일에 배치되어야 합니다.

방법 1: ssh-copy-id 사용 (권장)

ssh-copy-id는 가장 간단하고 안전한 방법입니다. 원격 서버에 로그인하여(비밀번호 사용) ~/.ssh 디렉토리가 없으면 생성하고, 올바른 권한을 설정하며, 공개 키를 ~/.ssh/authorized_keys에 추가합니다.

ssh-copy-id user@your_server_ip

user를 원격 서버의 사용자 이름으로, your_server_ip를 서버의 IP 주소 또는 호스트 이름으로 바꾸십시오. 원격 서버의 비밀번호를 묻습니다.

방법 2: 수동 복사

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

  1. 로컬 머신에서 공개 키 내용 복사:

    cat ~/.ssh/id_ed25519.pub
    

    전체 출력을 클립보드에 복사하십시오(ssh-ed25519 ...로 시작).

  2. 비밀번호를 사용하여 원격 서버에 로그인:

    ssh user@your_server_ip
    
  3. ~/.ssh 디렉토리가 없으면 생성하고 권한 설정:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  4. 공개 키를 authorized_keys에 추가:

    echo "PASTE_YOUR_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
    

    PASTE_YOUR_PUBLIC_KEY_HERE를 복사한 실제 내용으로 바꾸십시오. >>(추가)를 사용하는 것은 기존 키가 있을 경우 덮어쓰지 않도록 중요합니다.

  5. authorized_keys에 올바른 권한 설정:

    chmod 600 ~/.ssh/authorized_keys
    
    • 경고: ~/.ssh 또는 ~/.ssh/authorized_keys의 잘못된 권한은 키 기반 인증이 작동하지 못하게 합니다.

3단계: SSH 키 기반 인증 테스트

비밀번호 인증을 비활성화하기 전에 키 기반 인증이 올바르게 작동하는지 확인하는 것이 절대적으로 중요합니다. 수동 복사 단계에서 여전히 연결되어 있다면 원격 서버에서 로그아웃하십시오.

로컬 머신에서 비밀번호를 지정하지 않고 서버에 연결을 시도하십시오:

ssh user@your_server_ip
  • 개인 키에 암호를 설정한 경우 암호를 입력하라는 메시지가 표시됩니다.
  • 비밀번호 프롬프트 없이(해당하는 경우 암호 후) 연결이 성공하면 키 기반 인증이 작동하는 것입니다. 원격 서버의 프롬프트가 표시되어야 합니다.

SSH 키를 사용하여 로그인할 수 없으면 4단계로 진행하지 마십시오. 비밀번호 인증을 비활성화하기 전에 문제를 해결하십시오. 그렇지 않으면 서버에서 잠길 위험이 있습니다.

4단계: 보안 강화 - 비밀번호 인증 비활성화

SSH 키 기반 인증이 작동하는 것을 확인한 후에는 서버에서 비밀번호 기반 로그인을 비활성화하여 보안을 크게 향상시킬 수 있습니다. 이는 비밀번호에 대한 무차별 대입 공격을 방지하고 유효한 SSH 키를 가진 사람만 서버에 접속할 수 있도록 보장합니다.

  1. SSH 키를 사용하여 원격 서버에 로그인.

    ssh user@your_server_ip
    
  2. SSH 데몬 구성 파일 편집. 이 파일은 일반적으로 /etc/ssh/sshd_config에 있습니다.

    sudo nano /etc/ssh/sshd_config
    

    (nano 대신 vi 또는 선호하는 텍스트 편집기를 사용할 수 있습니다.)

  3. 다음 지시문을 찾아 수정:

    • PasswordAuthentication을 찾아 값을 no로 변경.

      #PasswordAuthentication yes
      PasswordAuthentication no
      

      (#로 주석 처리된 경우 줄의 주석을 해제하십시오)

    • KbdInteractiveAuthentication을 찾아 값을 no로 변경. 이전 OpenSSH 릴리스에서는 해당 지시문이 ChallengeResponseAuthentication일 수 있습니다.

      KbdInteractiveAuthentication no
      
    • (선택 사항이지만 권장) 일반 사용자로 로그인한 후 sudo를 사용할 계획이라면 SSH를 통한 직접 루트 로그인을 비활성화하는 것을 고려하십시오.

      PermitRootLogin no
      
    • (선택 사항) 기본 SSH 포트를 22에서 비표준 높은 포트(예: 2222)로 변경하는 것을 고려하십시오. 이는 표적 공격에 대한 보안을 추가하지는 않지만 자동화된 포트 스캐너의 노이즈를 줄일 수 있습니다.

      #Port 22
      Port 2222
      

      포트를 변경한 경우 연결 시 -p 플래그로 지정하는 것을 기억하십시오(예: ssh -p 2222 user@your_server_ip).

  4. 변경 사항을 저장하고 텍스트 편집기를 종료.

  5. 새 구성을 적용하기 위해 SSH 서비스를 다시 시작. 명령은 운영 체제에 따라 약간 다릅니다(예: Ubuntu/Debian vs. CentOS/RHEL).

    • Systemd 기반 시스템(대부분의 최신 Linux 배포판):

      sudo sshd -t
      sudo systemctl restart sshd
      
    • 이전 SysVinit 기반 시스템:

      sudo service ssh restart
      
  6. 중요: 새 터미널 창을 열고(현재 활성 SSH 세션을 닫지 마십시오!) 키를 사용하여 로그인을 시도. 이는 문제가 발생할 경우 잠기지 않도록 새 구성을 테스트합니다.

    ssh user@your_server_ip
    

    포트를 변경한 경우:

    ssh -p 2222 user@your_server_ip
    

    연결이 성공하면 원래 SSH 세션을 안전하게 닫을 수 있습니다.

    새 로그인이 실패하면 원래의 여전히 활성화된 SSH 세션에서 sshd_config의 변경 사항을 즉시 되돌리고 SSH 서비스를 다시 시작한 후 재평가하십시오.

모범 사례 및 팁

  • 개인 키에는 항상 강력한 암호를 사용하십시오. 이는 개인 키가 손상되었을 때 최후의 방어선입니다.
  • 개인 키를 보호하십시오. 절대 공유하지 말고 엄격한 파일 권한(chmod 600 ~/.ssh/id_ed25519)으로 안전하게 저장하십시오. 최고의 보호를 위해 하드웨어 보안 모듈(HSM) 또는 YubiKey를 고려하십시오.
  • 편의를 위해 ssh-agent를 사용하십시오. ssh-agent를 사용하면 개인 키를 메모리에 로드하고 여러 SSH 연결에서도 세션당 한 번만 암호를 입력하면 됩니다. ssh-add ~/.ssh/id_ed25519로 에이전트에 키를 추가하십시오.
  • 정기적으로 SSH 키를 교체하십시오. 특히 팀원이 떠나거나 키의 보안이 손상되었다고 의심되는 경우 주기적으로 새 키 쌍을 생성하고 서버에서 오래된 공개 키를 제거하십시오.
  • PermitRootLoginno 또는 prohibit-password로 제한하십시오. 일반 사용자로 로그인하고 sudo를 사용하여 관리 작업을 수행하는 것이 일반적으로 더 좋습니다.
  • 방화벽을 구성하십시오. SSH 포트와 같은 필요한 포트만 인터넷에 열려 있는지 확인하십시오. ufw 또는 firewalld와 같은 도구가 도움이 될 수 있습니다.

최종 정리

이제 개인 키가 주요 로그인 자격 증명이므로 암호와 엄격한 파일 권한으로 보호하십시오. sshd_config를 변경하는 동안 테스트된 SSH 세션 하나를 열어 두고, sshd -t로 구성을 검증한 후 새 키 기반 로그인이 작동한 후에만 이전 세션을 닫으십시오.