Linux 서버 초기 보안 설정 7단계

왜 서버 초기 보안 설정이 중요한가

클라우드 VM이나 VPS를 생성하면 기본 상태는 보안에 취약합니다. root 계정으로 SSH 비밀번호 로그인이 가능하고, 방화벽은 꺼져 있으며, 자동 업데이트도 설정되지 않은 경우가 대부분입니다. 서버가 인터넷에 노출되는 순간 봇에 의한 무차별 대입 공격(brute force)이 시작되므로, 서비스 배포 전에 기본 보안 설정을 마쳐야 합니다.

이 글에서는 Ubuntu/Debian 기반 Linux 서버의 초기 보안 설정 7단계를 순서대로 정리합니다. 모든 명령어는 실제 운영 서버에서 바로 사용할 수 있습니다.

7단계 보안 설정 요약

단계 목적 위협 차단
1. 시스템 업데이트 알려진 취약점 패치 CVE 기반 공격
2. 일반 사용자 생성 + sudo root 직접 사용 방지 권한 남용, 실수로 인한 시스템 손상
3. SSH 키 인증 전환 비밀번호 로그인 차단 무차별 대입 공격
4. SSH 설정 강화 root 로그인·비밀번호 인증 비활성화 SSH 기반 침투
5. 방화벽(UFW) 설정 필요한 포트만 개방 불필요한 서비스 노출
6. Fail2Ban 설치 반복 실패 IP 자동 차단 무차별 대입·사전 공격
7. 자동 보안 업데이트 패치 누락 방지 알려진 취약점의 장기 방치

1단계: 시스템 업데이트

서버에 접속한 직후 가장 먼저 해야 할 일은 패키지를 최신 상태로 업데이트하는 것입니다.

sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y

커널 업데이트가 포함된 경우 재부팅이 필요합니다. needrestart 패키지가 설치되어 있으면 재부팅 필요 여부를 자동으로 알려줍니다.

2단계: 일반 사용자 생성 + sudo 권한 부여

root 계정으로 직접 작업하면 실수로 시스템 파일을 삭제하거나 권한을 잘못 설정할 위험이 있습니다. 일반 사용자를 생성하고 sudo 권한을 부여합니다.

# 사용자 생성
adduser deploy

# sudo 그룹에 추가
usermod -aG sudo deploy

# 전환 테스트
su - deploy
sudo whoami  # root가 출력되면 정상

3단계: SSH 키 인증 설정

비밀번호 대신 SSH 키 쌍(공개키/개인키)으로 인증하면 무차별 대입 공격을 원천 차단할 수 있습니다.

# 로컬 머신에서 키 생성 (이미 있으면 생략)
ssh-keygen -t ed25519 -C "deploy@myserver"

# 공개키를 서버에 복사
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@서버IP

# 키 인증으로 접속 테스트
ssh deploy@서버IP

ed25519 알고리즘은 RSA보다 키가 짧고 성능이 좋으며 보안 수준도 동등합니다. 레거시 시스템 호환이 필요한 경우에만 rsa -b 4096을 사용합니다.

4단계: SSH 설정 강화

SSH 키 인증이 동작하는 것을 확인한 뒤, 비밀번호 로그인과 root 로그인을 비활성화합니다.

# /etc/ssh/sshd_config 수정
sudo nano /etc/ssh/sshd_config

다음 항목을 찾아 수정합니다.

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
# 설정 문법 검사 후 재시작
sudo sshd -t && sudo systemctl restart sshd

설정 변경 전에 반드시 다른 터미널에서 SSH 키 인증 접속이 되는지 확인하세요. 비밀번호 인증을 끈 뒤 키 인증이 안 되면 서버에 접근할 수 없게 됩니다.

5단계: UFW 방화벽 설정

UFW(Uncomplicated Firewall)는 iptables를 간편하게 관리하는 도구입니다. 필요한 포트만 열고 나머지는 모두 차단합니다.

# SSH 허용 (반드시 먼저 실행)
sudo ufw allow OpenSSH

# 웹 서버 포트 허용 (필요 시)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 방화벽 활성화
sudo ufw enable

# 상태 확인
sudo ufw status verbose

UFW 설정 시 주의사항

실수 결과 방지법
SSH 허용 전에 ufw enable 실행 서버 접속 불가 (잠김) 반드시 ufw allow OpenSSH를 먼저 실행
기본 정책을 allow로 설정 방화벽이 있으나 마나 기본 정책은 deny (UFW 기본값)
포트 범위를 넓게 개방 불필요한 서비스 노출 서비스별로 필요한 포트만 개별 허용

6단계: Fail2Ban으로 자동 차단

Fail2Ban은 로그 파일을 모니터링하다가 일정 횟수 이상 인증에 실패한 IP를 자동으로 차단합니다.

# 설치
sudo apt install fail2ban -y

# 로컬 설정 파일 생성 (원본을 직접 수정하지 않음)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

[sshd] 섹션을 다음과 같이 설정합니다.

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600

이 설정은 10분(600초) 내에 3번 실패하면 1시간(3600초) 동안 해당 IP를 차단합니다.

# Fail2Ban 시작 및 상태 확인
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client status sshd

7단계: 자동 보안 업데이트 설정

보안 패치를 수동으로 관리하면 누락될 위험이 있습니다. unattended-upgrades를 설정하면 보안 업데이트가 자동으로 적용됩니다.

# 설치 및 설정
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades

설정 파일 /etc/apt/apt.conf.d/50unattended-upgrades에서 보안 업데이트만 적용되도록 확인합니다.

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";

Automatic-Rebootfalse로 설정하면 커널 업데이트 시 자동 재부팅을 방지합니다. 운영 서버에서는 재부팅 시점을 직접 관리하는 것이 안전합니다.

설정 후 검증 체크리스트

  1. 일반 사용자로 SSH 키 인증 접속이 되는지 확인
  2. root 계정으로 SSH 접속 시 Permission denied가 뜨는지 확인
  3. 비밀번호로 SSH 접속 시 거부되는지 확인
  4. sudo ufw status에서 허용된 포트가 의도한 것만 있는지 확인
  5. sudo fail2ban-client status sshd에서 jail이 활성화되어 있는지 확인
  6. sudo systemctl status unattended-upgrades가 active인지 확인

관련 글

Linux 서버 보안 설정에 대해 궁금한 점이 있거나, 현재 인프라의 보안 점검이 필요하시면 문의 페이지를 통해 연락해 주세요.

8) 자동화 스크립트: 초기 보안 설정 원클릭

#!/bin/bash
# linux-server-hardening.sh
# 사용법: sudo bash hardening.sh <새_SSH_포트> <관리자_유저명>
set -euo pipefail

SSH_PORT=${1:-2222}
ADMIN_USER=${2:-admin}

echo "=== 1. 시스템 업데이트 ==="
apt update && apt upgrade -y
apt install -y ufw fail2ban unattended-upgrades

echo "=== 2. 관리자 계정 생성 ==="
useradd -m -s /bin/bash -G sudo "$ADMIN_USER"
mkdir -p /home/$ADMIN_USER/.ssh
chmod 700 /home/$ADMIN_USER/.ssh
echo "→ /home/$ADMIN_USER/.ssh/authorized_keys에 공개키를 추가하세요"

echo "=== 3. SSH 보안 강화 ==="
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cat >> /etc/ssh/sshd_config < /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = $SSH_PORT
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF
systemctl restart fail2ban

echo "=== 6. 자동 보안 업데이트 ==="
dpkg-reconfigure -plow unattended-upgrades

echo "=== 완료 ==="
echo "SSH 포트: $SSH_PORT"
echo "관리자: $ADMIN_USER"
echo "⚠️ 새 SSH 포트로 접속 테스트 후 현재 세션을 종료하세요!"

9) 보안 점검 체크리스트

📋 서버 보안 정기 점검 (월 1회)
━━━━━━━━━━━━━━━━━━━━━━━━━━━
□ sudo apt update && apt list --upgradable  # 미적용 업데이트 확인
□ fail2ban-client status sshd               # 차단 현황
□ ufw status verbose                         # 방화벽 규칙 확인
□ last -20                                    # 최근 로그인 이력
□ lastb -20                                   # 실패한 로그인 시도
□ cat /var/log/auth.log | grep "Failed"      # SSH 실패 로그
□ df -h                                       # 디스크 사용량
□ netstat -tlnp                               # 열린 포트 확인
□ systemctl list-units --state=running        # 실행 중인 서비스

10) 관련 글

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux