리눅스 서버 SSH 보안 강화를 위한 모범 사례

이 필수적인 SSH 강화 기술들을 숙달하여 즉시 리눅스 서버를 보호하십시오. 이 전문가 가이드는 `sshd_config` 파일의 구성 변경에 중점을 둔 실행 가능한 단계를 제공합니다. 위험도가 높은 루트 로그인 비활성화, 취약한 암호를 제거하기 위한 의무적인 키 기반 인증 구현, 기본 포트 변경, 그리고 무차별 대입 공격에 대한 효과적인 속도 제한을 위한 Fail2Ban 설치 방법을 배우십시오. SSH를 견고하고 안전한 채널로 변환하여 시스템을 보호하십시오.

36 조회수

Linux 서버에서 SSH 보안 강화를 위한 모범 사례

SSH(Secure Shell)는 사실상 모든 Linux 서버 원격 관리의 중추입니다. SSH는 매우 강력하고 기본적으로 안전하지만, 무차별 대입 공격(brute-force attacks), 사전 공격(dictionary attacks), 자격 증명 스터핑(credential stuffing)을 통해 무단 액세스를 시도하는 악의적인 공격자들의 주된 표적이기도 합니다.

SSH 구성을 강화하는 것은 새로운 Linux 배포판을 보호하는 데 있어 가장 중요한 단계라고 할 수 있습니다. 몇 가지 핵심 모범 사례를 구현하여—단순한 사용자 이름 및 암호 인증을 넘어섬으로써—공격 표면을 획기적으로 줄이고, 로그의 노이즈를 최소화하며, 안전한 방법을 사용하는 승인된 사용자만이 시스템에 액세스할 수 있도록 보장할 수 있습니다.

이 가이드는 모든 Linux 배포판에서 SSH 서비스를 보호하기 위한 필수적이고 실행 가능한 단계를 설명하며, 핵심 구성 파일인 /etc/ssh/sshd_config에 초점을 맞춥니다.


필수 조건: 구성 백업

SSH 데몬 구성 파일(sshd_config)을 변경하기 전에 백업을 생성하는 것이 매우 중요합니다. 잘못된 구성은 서버에 대한 액세스를 차단할 수 있습니다. 변경 사항은 항상 철저하게 테스트하십시오.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%F)

파일을 편집한 후, 서비스를 재시작하기 전에 구문 검사를 수행하십시오:

sudo sshd -t

테스트가 통과하면 SSH 서비스를 안전하게 재시작할 수 있습니다 (명령어는 배포판마다 다름):

# systemd를 사용하는 시스템의 경우 (대부분의 최신 배포판)
sudo systemctl restart sshd

1. Root 로그인 비활성화

root 사용자로 직접 로그인하는 것을 허용하는 것은 가장 큰 보안 위험 중 하나입니다. 공격자가 암호를 성공적으로 무차별 대입하면 즉시 시스템에 대한 완벽한 제어권을 얻게 됩니다. 대신, 비(非)루트 사용자가 먼저 로그인하고 sudo를 사용하여 권한을 상승시켜야 합니다.

구성 단계

/etc/ssh/sshd_config 파일을 열고 PermitRootLogin 지시문을 찾습니다. 해당 값을 no로 변경하십시오.

# 이전:
# PermitRootLogin yes

# 이후 (모범 사례):
PermitRootLogin no

중요 참고 사항

루트 로그인을 비활성화하기 전에 sudo 권한을 가진 표준 사용자를 최소한 한 명 이상 생성하고 구성했는지 확인하십시오. 그렇지 않으면 관리자 액세스가 차단됩니다.

2. 필수 키 기반 인증 구현

암호 인증은 무차별 대입 공격 및 사전 공격에 취약합니다. 서버의 공개 키와 클라이언트의 개인 키로 구성된 SSH 키는 극도의 복잡성과 길이 덕분에 훨씬 강력한 보안을 제공합니다.

A. 키 생성 및 설치

  1. 키 쌍 생성 (로컬 클라이언트 머신에서):
    bash ssh-keygen -t ed25519 -C "[email protected]"
  2. 공개 키 복사 (서버로):
    bash ssh-copy-id -i ~/.ssh/id_ed25519 user@your_server_ip

B. 암호 인증 비활성화

SSH 키를 사용하여 성공적으로 로그인할 수 있음을 확인한 후에는 암호 인증을 완전히 비활성화하십시오.

# 암호 비활성화
PasswordAuthentication no

# 키가 활성화되었는지 확인
PubkeyAuthentication yes

모범 사례: Ed25519 또는 RSA 4096비트와 같이 강력한 키 유형을 사용하십시오. 개인 키는 항상 강력한 암호 문구로 보호하십시오.

3. 기본 SSH 포트 변경 (심층 방어)

기본 SSH 포트(TCP 포트 22)는 자동화된 봇에 의해 지속적으로 스캔됩니다. 포트를 높은 비표준 번호(예: 2222, 22222 또는 30000 이상)로 변경하면 서버 로그의 노이즈 양을 크게 줄이고 일반적인 스캐너로부터 보이지 않게 됩니다.

구성 단계

/etc/ssh/sshd_config에서 Port 지시문을 변경합니다:

# 이전:
# Port 22

# 이후 (비표준 포트 예시):
Port 22222

경고: 방화벽 조정 필요

포트를 변경하는 경우, 새 포트의 트래픽을 허용하도록 방화벽(예: iptables, firewalld 또는 AWS 보안 그룹)을 반드시 업데이트해야 합니다. 그렇게 하지 않으면 즉시 연결이 끊어집니다.

firewalld를 사용한 예시 (CentOS/RHEL):

sudo firewall-cmd --permanent --add-port=22222/tcp
sudo firewall-cmd --reload

4. 특정 사용자 및 그룹으로 액세스 제한

엄격한 액세스 제어를 시행하려면, SSH를 통해 연결이 허용되는 사용자 또는 그룹을 명시적으로 정의해야 합니다. 이는 계정이 손상되거나 사용되지 않는 경우에도 잠재적인 진입점을 제한합니다.

구성 지시문

sshd_config에서 다음 지시문 중 하나 또는 둘 다를 사용하십시오:

  1. 특정 사용자 허용:
    config AllowUsers alice bob
  2. 특정 그룹 허용:
    config AllowGroups sshaccess admins

이러한 지시문이 존재하는 경우, 명시적으로 나열되지 않은 모든 사용자나 그룹은 액세스가 거부됩니다.

5. 강력한 프로토콜 및 암호화 방식 강제 적용

현대적이고 안전한 SSH 프로토콜 2를 사용하고, 강력한 암호화 암호(ciphers) 및 메시지 인증 코드(MAC)의 사용을 강제해야 합니다.

구성 단계

오래되고 취약한 프로토콜이 비활성화되었는지 확인하십시오:

Protocol 2

# 안전하지 않은 레거시 인증 방법 거부
HostbasedAuthentication no
IgnoreRhosts yes

최신 SSH 구현은 기본적으로 잘 구성되어 있는 경우가 많지만, 강력한 암호화 방식과 MAC을 명시적으로 정의하면 다운그레이드 공격을 방지할 수 있습니다. 권장되는 최소 설정은 다음과 같습니다:

Ciphers [email protected],[email protected]
MACs hmac-sha2-512,hmac-sha2-256

6. 속도 제한 및 침입 감지 구현 (Fail2Ban)

키 기반 인증을 사용하더라도 봇에 의한 지속적인 프로빙은 리소스를 소모하고 로그를 복잡하게 만듭니다. Fail2Ban은 로그인 실패 시도(또는 기타 의심스러운 활동)에 대한 로그를 모니터링하고 방화벽을 동적으로 조정하여 IP 주소를 일시적 또는 영구적으로 차단하는 중요한 도구입니다.

설치 및 구성 (일반적인 단계)

  1. Fail2Ban 설치:
    ```bash
    # Debian/Ubuntu
    sudo apt update && sudo apt install fail2ban

    RHEL/CentOS/Fedora

    sudo dnf install fail2ban
    `` 2. **SSH Jail 구성:** Fail2Ban은 'jails'라고 불리는 구성을 사용합니다. 기본sshdjail은/var/log/auth.log` (또는 이와 동등한 파일)를 모니터링하여 SSH 서비스에서 반복되는 실패를 감지하고 자동으로 임시 차단을 적용하는 데 매우 효과적입니다.

  2. 서비스 실행 확인:
    bash sudo systemctl enable fail2ban sudo systemctl start fail2ban

Fail2Ban은 자동화된 무차별 대입 시도를 크게 완화하며 인터넷에 노출된 서버에 필수적인 것으로 간주됩니다.

7. 기타 필수 SSH 강화 지시문

이러한 사소한 조정은 세션 관리를 돕고 잠재적인 공격 창을 줄이는 데 도움이 됩니다:

지시문 권장 값 목적
ClientAliveInterval 300 세션을 유지하기 위해 300초(5분)마다 널 패킷을 전송합니다.
ClientAliveCountMax 3 연결이 끊어지기 전 실패한 '활성' 확인 최대 횟수 (총 유휴 시간 15분).
UsePAM yes 추가적인 로컬 시스템 보안 정책을 위해 PAM(Pluggable Authentication Modules)을 활성화합니다.
PermitEmptyPasswords no 암호가 비어 있는 사용자의 로그인을 금지합니다 (기본적으로 no여야 함).

강화 점검표 요약

이 점검표를 사용하여 서버가 기본 SSH 강화 표준을 충족하는지 확인하십시오:

  1. [ ] 변경 전에 sshd_config를 백업합니다.
  2. [ ] PermitRootLogin no로 설정합니다.
  3. [ ] 키 설정 후 PasswordAuthentication no로 설정합니다.
  4. [ ] Port를 비표준 값으로 변경합니다.
  5. [ ] 새 포트를 허용하도록 방화벽을 업데이트합니다.
  6. [ ] 액세스를 제한하기 위해 AllowUsers 또는 AllowGroups를 사용합니다.
  7. [ ] Protocol 2로 설정합니다.
  8. [ ] Fail2Ban을 설치하고 구성합니다.
  9. [ ] 재시작하기 전에 sshd -t로 구성을 확인합니다.

이러한 모범 사례를 구현함으로써 SSH를 잠재적인 취약점에서 고도로 안전한 원격 관리 채널로 전환할 수 있습니다.