SSH 보안 설정으로 원격 접속 안전하게 하기

SSH 보안 설정으로 원격 접속 안전하게 하기

SSH(Secure Shell)는 네트워크를 통해 다른 컴퓨터에 안전하게 접속할 수 있도록 해주는 프로토콜입니다. 마치 문을 잠그고 열쇠를 사용하는 것처럼, SSH는 암호화된 연결을 통해 데이터를 안전하게 전송하고, 악의적인 사용자가 중간에서 정보를 가로채거나 시스템에 침입하는 것을 방지합니다. 하지만 SSH를 기본 설정 그대로 사용하면 보안에 취약할 수 있습니다. 이 글에서는 SSH 보안을 강화하여 원격 접속을 더욱 안전하게 만드는 방법에 대해 자세히 알아보겠습니다.

SSH 보안의 중요성

SSH는 서버 관리, 파일 전송, 터널링 등 다양한 용도로 사용됩니다. 만약 SSH가 제대로 보호되지 않으면 다음과 같은 위험에 노출될 수 있습니다.

  • 무차별 대입 공격(Brute-force attack): 공격자가 가능한 모든 비밀번호 조합을 시도하여 서버에 접속하려고 시도합니다.
  • 사전 공격(Dictionary attack): 일반적인 단어나 구문을 비밀번호로 사용하여 서버에 접속하려고 시도합니다.
  • 중간자 공격(Man-in-the-middle attack): 공격자가 통신 중간에 끼어들어 데이터를 가로채거나 변조합니다.
  • 취약점 공격(Exploit attack): SSH 소프트웨어의 알려진 취약점을 이용하여 서버에 침입합니다.

이러한 공격으로부터 시스템을 보호하기 위해서는 SSH 보안 설정을 강화하는 것이 필수적입니다.

SSH 보안 강화를 위한 주요 설정

다음은 SSH 보안을 강화하기 위한 몇 가지 주요 설정입니다.

1. 비밀번호 인증 대신 키 기반 인증 사용

비밀번호 인증은 무차별 대입 공격에 취약합니다. 키 기반 인증은 공개 키와 개인 키를 사용하여 서버에 접속하는 방식으로, 훨씬 더 안전합니다.

키 기반 인증 설정 방법

    • 키 쌍 생성: 로컬 컴퓨터에서 `ssh-keygen` 명령어를 사용하여 공개 키와 개인 키를 생성합니다.

      ssh-keygen -t rsa -b 4096
    • 공개 키 전송: 생성된 공개 키(일반적으로 `~/.ssh/id_rsa.pub`)를 서버의 `~/.ssh/authorized_keys` 파일에 추가합니다. `ssh-copy-id` 명령어를 사용하면 편리하게 공개 키를 전송할 수 있습니다.

      ssh-copy-id user@server_ip
    • 비밀번호 인증 비활성화: 서버의 `/etc/ssh/sshd_config` 파일에서 `PasswordAuthentication` 옵션을 `no`로 변경합니다.

      PasswordAuthentication no
    • SSH 서비스 재시작: SSH 서비스를 재시작하여 변경 사항을 적용합니다.

      sudo systemctl restart sshd

2. SSH 포트 변경

SSH는 기본적으로 22번 포트를 사용합니다. 이 포트는 공격자들에게 널리 알려져 있으므로, 다른 포트로 변경하는 것이 보안에 도움이 됩니다.

SSH 포트 변경 방법

    • `/etc/ssh/sshd_config` 파일 수정: `Port` 옵션을 원하는 포트 번호로 변경합니다. 1024보다 큰 숫자를 사용하는 것이 좋습니다.

      Port 2222
    • 방화벽 설정 변경: 변경한 포트를 방화벽에서 허용하도록 설정합니다. 예를 들어, `ufw`를 사용하는 경우 다음과 같이 설정할 수 있습니다.

      sudo ufw allow 2222
    • SSH 서비스 재시작: SSH 서비스를 재시작하여 변경 사항을 적용합니다.

      sudo systemctl restart sshd

3. root 계정 접속 제한

root 계정으로 직접 SSH 접속을 허용하는 것은 매우 위험합니다. 일반 계정으로 접속한 후 `sudo` 명령어를 사용하여 root 권한을 얻는 것이 더 안전합니다.

root 계정 접속 제한 방법

    • `/etc/ssh/sshd_config` 파일 수정: `PermitRootLogin` 옵션을 `no`로 변경합니다.

      PermitRootLogin no
    • SSH 서비스 재시작: SSH 서비스를 재시작하여 변경 사항을 적용합니다.

      sudo systemctl restart sshd

4. 접속 시도 횟수 제한

무차별 대입 공격을 방지하기 위해 접속 시도 횟수를 제한하는 것이 좋습니다. `fail2ban`과 같은 도구를 사용하면 자동으로 접속 시도 횟수를 제한하고, 공격자의 IP 주소를 차단할 수 있습니다.

fail2ban 설치 및 설정 방법

    • fail2ban 설치: 패키지 관리자를 사용하여 `fail2ban`을 설치합니다.

      sudo apt install fail2ban  # Debian/Ubuntu

      sudo yum install fail2ban # CentOS/RHEL

    • jail.local 설정 파일 생성: `jail.conf` 파일을 복사하여 `jail.local` 파일을 생성합니다.

      sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    • `/etc/fail2ban/jail.local` 파일 수정: `[sshd]` 섹션을 찾아 `enabled = true`로 설정하고, 필요한 경우 `maxretry`, `findtime`, `bantime` 등의 옵션을 조정합니다.

      [sshd]

      enabled = true

      port = ssh

      filter = sshd

      logpath = /var/log/auth.log

      maxretry = 3

      findtime = 600

      bantime = 86400

    • fail2ban 서비스 재시작: fail2ban 서비스를 재시작하여 변경 사항을 적용합니다.

      sudo systemctl restart fail2ban

5. 방화벽 설정

방화벽을 사용하여 허용된 IP 주소로부터의 SSH 접속만 허용하는 것이 좋습니다. `ufw`, `iptables` 등의 방화벽 도구를 사용할 수 있습니다.

ufw를 사용한 방화벽 설정 방법

    • ufw 활성화:

      sudo ufw enable
    • 기본 정책 설정: 모든 인바운드 연결을 거부하고, 아웃바운드 연결을 허용하도록 설정합니다.

      sudo ufw default deny incoming

      sudo ufw default allow outgoing

    • SSH 포트 허용: 특정 IP 주소 또는 IP 주소 대역으로부터의 SSH 접속을 허용합니다.

      sudo ufw allow from 192.168.1.0/24 to any port 2222  # 특정 IP 대역 허용

      sudo ufw allow from 10.0.0.1 to any port 2222 # 특정 IP 주소 허용

    • 방화벽 상태 확인:

      sudo ufw status

6. 최신 SSH 버전 유지

SSH 소프트웨어의 최신 버전을 유지하는 것은 보안 취약점을 해결하는 데 매우 중요합니다. 정기적으로 업데이트를 확인하고 적용해야 합니다.

SSH 업데이트 방법

    • 패키지 관리자 사용: 패키지 관리자를 사용하여 SSH를 업데이트합니다.

      sudo apt update && sudo apt upgrade  # Debian/Ubuntu

      sudo yum update # CentOS/RHEL

7. SSH 클라이언트 설정 강화

SSH 서버뿐만 아니라 클라이언트 설정도 중요합니다. 클라이언트 설정 파일(`~/.ssh/config`)을 수정하여 보안을 강화할 수 있습니다.

클라이언트 설정 예시

Host server_alias

HostName server_ip

Port 2222

User username

IdentityFile ~/.ssh/id_rsa

TCPKeepAlive yes

ServerAliveInterval 60

ServerAliveCountMax 3

    • Host: 접속할 서버의 별칭을 지정합니다.
    • HostName: 서버의 IP 주소 또는 도메인 이름을 지정합니다.
    • Port: SSH 포트 번호를 지정합니다.
    • User: 접속할 사용자 이름을 지정합니다.
    • IdentityFile: 사용할 개인 키 파일을 지정합니다.
    • TCPKeepAlive: TCP 연결을 유지하기 위해 주기적으로 신호를 보냅니다.
    • ServerAliveInterval: 서버에 신호를 보내는 간격을 초 단위로 지정합니다.
    • ServerAliveCountMax: 서버로부터 응답이 없을 경우 연결을 끊기 전까지 신호를 보내는 횟수를 지정합니다.

흔한 오해와 사실 관계

  • 오해: SSH는 기본 설정으로도 충분히 안전하다.
  • 사실: SSH는 기본 설정으로는 무차별 대입 공격 등에 취약하므로 보안 설정을 강화해야 합니다.
  • 오해: SSH 포트를 변경하면 보안이 완전히 보장된다.
  • 사실: SSH 포트 변경은 공격을 어렵게 만들 수 있지만, 다른 보안 설정과 함께 사용해야 효과적입니다.
  • 오해: 키 기반 인증만 사용하면 완벽하게 안전하다.
  • 사실: 키 기반 인증은 비밀번호 인증보다 훨씬 안전하지만, 개인 키를 안전하게 보관해야 합니다.

전문가의 조언

보안 전문가들은 다음과 같은 조언을 합니다.

  • 정기적으로 보안 감사를 실시하여 SSH 설정을 점검하십시오.
  • 최소한의 권한 원칙을 준수하여 필요한 권한만 부여하십시오.
  • 보안 로그를 주기적으로 확인하여 이상 징후를 탐지하십시오.
  • 자동화된 보안 도구를 사용하여 보안 설정을 관리하십시오.

자주 묻는 질문과 답변

Q: SSH 키를 분실하면 어떻게 해야 하나요?

A: 서버에서 해당 공개 키를 삭제하고, 새로운 키 쌍을 생성하여 다시 등록해야 합니다. 만약 root 계정에 접근할 수 없다면, 서버 관리자에게 문의해야 합니다.

Q: SSH 포트를 변경했는데 접속이 안 돼요. 어떻게 해야 하나요?

A: 방화벽 설정이 올바른지 확인하고, SSH 클라이언트에서 접속할 때 변경된 포트 번호를 지정해야 합니다. 예를 들어, `ssh -p 2222 user@server_ip`와 같이 접속할 수 있습니다.

Q: fail2ban 설정이 제대로 작동하는지 어떻게 확인할 수 있나요?

A: `fail2ban-client status sshd` 명령어를 사용하여 fail2ban의 상태를 확인할 수 있습니다. 또한, `/var/log/fail2ban.log` 파일을 확인하여 차단된 IP 주소를 확인할 수 있습니다.

비용 효율적인 활용 방법

SSH 보안 강화를 위해 많은 비용을 들이지 않고도 효과적인 방법을 사용할 수 있습니다.

  • 무료 오픈 소스 도구 활용: `fail2ban`, `ufw`와 같은 무료 오픈 소스 도구를 사용하여 보안을 강화할 수 있습니다.
  • 클라우드 서비스 제공업체의 보안 기능 활용: AWS, Azure, GCP와 같은 클라우드 서비스 제공업체는 SSH 보안 강화를 위한 다양한 기능을 제공합니다.
  • 자동화된 보안 스크립트 활용: SSH 보안 설정을 자동으로 구성하고 관리하는 스크립트를 활용하여 시간을 절약하고 일관성을 유지할 수 있습니다.

이러한 방법들을 통해 예산을 절약하면서도 강력한 SSH 보안을 구축할 수 있습니다.

댓글 남기기