우분투 서버: 초보도 할 수 있는 기본 보안 설정 가이드

우분투 서버: 초보도 할 수 있는 기본 보안 설정 가이드

서론 (Introduction)

이제 막 나만의 우분투 서버를 만들고 WordPress, Docker, n8n 같은 멋진 서비스를 운영할 준비를 마쳤나요? 축하합니다! 하지만 흥분되는 마음과 함께 꼭 챙겨야 할 것이 있습니다. 바로 ‘보안’입니다. 인터넷에 연결된 모든 서버는 24시간 내내 자동화된 공격에 노출되어 있습니다. 초보 사용자라고 해서 예외는 아닙니다.

다행히 우분투는 초보자에게 친숙하면서도 강력한 보안 기능을 기본적으로 제공합니다. 이 가이드는 복잡한 이론 대신, 지금 당장 적용할 수 있는 가장 필수적인 기본 보안 설정 단계를 안내합니다. 이 글을 끝까지 따라오시면, 여러분의 소중한 서버를 훨씬 더 안전하게 만들 수 있을 겁니다. 이 가이드는 우분투 서버 보안의 첫걸음을 떼는 초보 서버 운영자를 위한 기본 서버 설정 가이드입니다.

1. 초기 설정: 가장 먼저 해야 할 일들 (Initial Setup: The First Things You Must Do)

1.1 루트 계정 직접 로그인 비활성화 및 SUDO 사용자 생성

서버의 모든 권한을 가진 ‘root’ 계정으로 직접 작업하는 것은 매우 위험합니다. 작은 실수 하나가 시스템 전체를 망가뜨릴 수 있기 때문이죠. 대신, 일반 사용자를 만들고 필요할 때만 ‘sudo’ 명령으로 관리자 권한을 얻는 것이 안전합니다.

  • 설정 단계:
    1. 새로운 사용자를 생성합니다. (예: `coder`라는 사용자)
      adduser coder
    2. 생성한 사용자를 `sudo` 그룹에 추가하여 관리자 권한을 사용할 수 있게 합니다.
      usermod -aG sudo coder
    3. SSH 설정 파일을 수정하여 root 계정의 원격 로그인을 막습니다.
      sudo nano /etc/ssh/sshd_config
      파일을 열고 `PermitRootLogin yes` 부분을 찾아 `PermitRootLogin no`로 변경 후 저장합니다.
    4. SSH 서비스를 재시작하여 변경사항을 적용합니다.
      sudo systemctl restart sshd
  • 운영상 주의사항:

    가장 중요합니다! root 계정 로그인을 비활성화하기 전에, 반드시 새 터미널 창을 열어 방금 만든 `coder` 사용자로 로그인이 잘 되는지, `sudo` 명령이 작동하는지 테스트해야 합니다. 테스트 없이 기존 root 세션을 종료하면 서버에 영원히 접속하지 못하게 될 수도 있습니다.

  • 일반적인 실수:
    • 새 `sudo` 사용자 생성을 테스트하지 않고 root 세션을 닫아버리는 경우.
    • 사용자를 `sudo` 그룹에 추가하는 것을 잊고 root 로그인을 비활성화하는 경우.

1.2 SSH 비밀번호 인증 대신 키 기반 인증 설정

비밀번호는 항상 유출이나 무차별 대입 공격(Brute-force attack)의 위험이 있습니다. SSH 키 기반 인증은 비밀번호 대신 암호화된 키 파일을 사용해 훨씬 더 안전하게 서버에 접속하는 방식입니다.

  • 설정 단계:
    1. 사용자 PC(클라이언트)에서 SSH 키 쌍(개인키, 공개키)을 생성합니다.
      ssh-keygen
    2. 생성된 공개키를 서버로 복사합니다.
      ssh-copy-id coder@YOUR_SERVER_IP
    3. 서버의 SSH 설정 파일을 다시 수정하여 비밀번호 로그인을 비활성화합니다.
      sudo nano /etc/ssh/sshd_config
      파일을 열고 `PasswordAuthentication yes` 부분을 찾아 `PasswordAuthentication no`로 변경 후 저장합니다.
    4. SSH 서비스를 재시작합니다.
      sudo systemctl restart sshd
  • 실용적인 팁:
    • 개인키(`~/.ssh/id_rsa`)는 여러분의 집 열쇠와 같습니다. 절대로 다른 사람에게 공유해서는 안 되며, `ssh-keygen` 실행 시 강력한 암호(passphrase)를 설정해 2중으로 보호하세요.
    • 서버마다 다른 SSH 키를 생성하여 관리하는 것이 보안상 더 좋습니다.
  • 일반적인 실수:
    • 비밀번호 로그인을 비활성화하기 전에 키 기반 로그인이 잘 되는지 테스트하지 않아 접속이 막히는 경우.
    • 중요한 개인키 파일을 분실하는 경우.

2. 방화벽 설정: 서버의 문지기, UFW 활용 (Firewall Setup: Your Server’s Gatekeeper, Using UFW)

방화벽은 서버로 들어오고 나가는 모든 네트워크 트래픽을 감시하고, 허용된 연결만 통과시키는 문지기 역할을 합니다. 우분투의 UFW(Uncomplicated Firewall)는 이름처럼 매우 쉽고 직관적입니다.

2.1 UFW 기본 규칙 설정 및 필수 포트 열기

기본 전략은 ‘모두 차단하고, 필요한 것만 허용’하는 것입니다.

  • 설정 단계:
    1. 기본 정책을 설정합니다. 들어오는 모든 연결은 거부하고, 나가는 모든 연결은 허용합니다.
      sudo ufw default deny incoming
      sudo ufw default allow outgoing
    2. 필수 포트를 열어줍니다. 최소한 SSH 접속은 허용해야 합니다. 웹서버를 운영한다면 HTTP, HTTPS도 열어줍니다.
      sudo ufw allow ssh (또는 `sudo ufw allow 22/tcp`)
      sudo ufw allow http (또는 `sudo ufw allow 80/tcp`)
      sudo ufw allow https (또는 `sudo ufw allow 443/tcp`)
    3. UFW를 활성화합니다. 활성화 시 SSH 연결이 끊길 수 있다는 경고가 나오지만, 이미 SSH 포트를 열었으므로 ‘y’를 입력합니다.
      sudo ufw enable
    4. 설정된 규칙과 활성화 상태를 확인합니다.
      sudo ufw status
  • 실용적인 팁:
    • 사용할 서비스에 필요한 포트만 최소한으로 열어두는 것이 보안의 기본입니다.
    • SSH 포트를 22번이 아닌 다른 번호로 변경했다면, `sudo ufw allow 22` 대신 변경한 포트 번호를 직접 입력해야 합니다. (예: `sudo ufw allow 2222/tcp`)
  • 일반적인 실수:
    • UFW를 활성화하기 전에 SSH 포트를 허용하는 규칙을 추가하지 않아 서버 접속이 차단되는 치명적인 실수.
    • 개발 편의를 위해 불필요한 포트들을 무분별하게 열어두는 것.

2.2 특정 서비스/IP에 대한 고급 UFW 규칙 적용

보안을 한 단계 더 높이려면, 특정 IP 주소에서만 특정 서비스에 접근하도록 제한할 수 있습니다.

  • 설정 단계:
    • 내 집이나 사무실 IP에서만 SSH 접속을 허용하는 규칙:
      sudo ufw allow from YOUR_HOME_IP to any port 22
    • Nginx 웹서버를 위한 모든 포트(HTTP, HTTPS)를 한 번에 열기:
      sudo ufw allow 'Nginx Full'
    • 잘못 추가한 규칙 삭제하기:
      sudo ufw delete allow http
  • 운영상 주의사항:
    • Docker나 n8n 같은 컨테이너 기반 서비스를 사용하면 Docker가 UFW 규칙을 우회하여 포트를 직접 열 수 있습니다. 이는 초보자가 혼란을 겪는 흔한 원인이므로, Docker 사용 시에는 추가적인 네트워크 보안 설정이 필요할 수 있다는 점을 인지해야 합니다.
    • IP 기반 규칙은 내 IP가 바뀌면(유동 IP의 경우) 접속이 안 될 수 있으므로 주의가 필요합니다.

3. 시스템 업데이트 및 필수 보안 도구 (System Updates & Essential Security Tools)

3.1 정기적인 시스템 업데이트 및 업그레이드

소프트웨어의 취약점은 계속해서 발견됩니다. 시스템을 최신 상태로 유지하는 것은 가장 기본적이면서도 가장 중요한 보안 활동입니다.

  • 설정 단계:
    1. 패키지 목록을 최신 정보로 업데이트합니다.
      sudo apt update
    2. 설치된 패키지들을 새로운 버전으로 업그레이드합니다.
      sudo apt upgrade -y
    3. 만약 리눅스 커널이 업데이트되었다면, 안정적인 적용을 위해 시스템을 재부팅하는 것이 좋습니다.
      sudo reboot
  • 운영상 주의사항:
    • 중요한 서버라면 업데이트 전에 스냅샷을 찍거나 데이터를 백업하는 습관을 들이는 것이 안전합니다.
    • 주기적으로(최소 주 1회) 업데이트를 실행하여 시스템을 항상 최신 상태로 유지하세요.
  • 일반적인 실수:
    • “귀찮아서” 또는 “실행 중인 서비스에 영향이 갈까 봐” 업데이트를 미루다가 알려진 취약점에 공격당하는 경우.
    • 오랜 기간 업데이트를 하지 않아 한 번에 너무 많은 변경이 발생하여 시스템 충돌을 겪는 경우.

3.2 Fail2Ban 설치 및 설정으로 무차별 대입 공격 방어

Fail2Ban은 서버 로그를 감시하다가 비정상적인 로그인 시도(예: 짧은 시간에 비밀번호를 여러 번 틀리는 행위)를 하는 IP를 감지하여 자동으로 방화벽에서 차단해주는 아주 유용한 도구입니다.

  • 설정 단계:
    1. Fail2Ban을 설치합니다.
      sudo apt install fail2ban
    2. 기본 설정 파일을 직접 수정하지 않고, 로컬 설정 파일을 복사하여 사용합니다. 이렇게 해야 나중에 업데이트 시 설정이 덮어씌워지는 것을 막을 수 있습니다.
      sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    3. 복사한 로컬 설정 파일을 수정합니다.
      sudo nano /etc/fail2ban/jail.local
      파일 내에서 `[sshd]` 섹션을 찾아 `enabled = true`로 되어 있는지 확인하고, 필요에 따라 차단 시간(`bantime`), 감지 시간(`findtime`), 최대 시도 횟수(`maxretry`) 등을 조정할 수 있습니다.
    4. Fail2Ban 서비스를 재시작하여 설정을 적용합니다.
      sudo systemctl restart fail2ban
  • 실용적인 팁:
    • `sudo fail2ban-client status sshd` 명령으로 현재 SSH 서비스에 대해 차단된 IP 목록을 확인할 수 있습니다.
    • `bantime`을 너무 짧게 설정하면 공격자가 금방 다시 시도할 수 있습니다. 최소 10분(600s) 이상으로 설정하는 것을 권장합니다.
  • 일반적인 실수:
    • Fail2Ban을 설치만 하고 `jail.local` 파일을 생성 및 설정하지 않아 실제로는 아무런 동작도 하지 않는 경우.
    • 자신이 비밀번호를 여러 번 틀려 스스로의 IP가 차단되어 당황하는 경우. (이럴 땐 다른 네트워크를 이용해 접속하거나 잠시 기다려야 합니다.)

4. 서버 운영 중 알아야 할 보안 수칙 (Security Practices to Know While Operating Your Server)

4.1 강력한 비밀번호 정책 및 주기적인 변경

가장 기본적인 수칙입니다. 서버 로그인 계정, 데이터베이스 비밀번호, 워드프레스 관리자 비밀번호 등 모든 곳에 강력하고 서로 다른 비밀번호를 사용해야 합니다.

  • 실용적인 팁:
    • 강력한 비밀번호: 대/소문자, 숫자, 특수문자를 조합하여 최소 12자 이상으로 만드세요.
    • 고유한 비밀번호: 여러 서비스에 동일한 비밀번호를 재사용하지 마세요.
    • 비밀번호 관리 도구: Bitwarden, 1Password와 같은 도구를 사용하면 강력한 비밀번호를 쉽게 생성하고 안전하게 관리할 수 있습니다.

4.2 정기적인 백업 및 보안 로그 점검

보안은 ‘만약’을 대비하는 것입니다. 아무리 보안을 잘해도 100% 안전은 없습니다. 문제가 생겼을 때 복구할 수 있는 백업은 최후의 보루입니다.

  • 실용적인 팁:
    • 정기적인 백업: `rsync` 스크립트를 작성하거나, 클라우드 제공업체의 스냅샷 기능을 활용하여 중요한 데이터를 주기적으로 백업하세요. 백업 파일은 서버가 아닌 다른 곳(클라우드 스토리지, 다른 서버 등)에 보관해야 합니다.
    • 로그 점검: 가끔 서버의 인증 로그를 확인하는 습관을 들이세요. `cat /var/log/auth.log | grep “Failed password”` 와 같은 명령으로 실패한 로그인 시도를 쉽게 확인할 수 있습니다. 낯선 IP의 비정상적인 접근 시도가 보인다면 경계해야 합니다.
  • 일반적인 실수:
    • 백업을 만들어두고 한 번도 복구 테스트를 해보지 않아, 정작 필요할 때 백업 파일이 손상되었거나 사용할 수 없다는 사실을 알게 되는 경우.
    • 로그를 전혀 확인하지 않아 서버가 해킹 시도를 당하고 있다는 사실조차 인지하지 못하는 경우.

5. 결론 (Conclusion)

서버 보안은 한 번 설정하고 끝나는 일이 아닙니다. 자동차를 주기적으로 점검하고 관리하듯, 서버 역시 지속적인 관심과 관리가 필요합니다. 하지만 오늘 이 가이드에서 다룬 내용만 충실히 이행하셔도, 수많은 기본적인 위협으로부터 여러분의 우분투 서버를 훨씬 더 안전하게 지킬 수 있습니다.

두려워하지 마세요. 이 설정들은 안전한 서버 운영을 위한 가장 확실하고 효과적인 첫걸음입니다. 이제 여러분은 훨씬 더 자신감 있게 서버를 운영할 수 있을 겁니다. 다음 단계로는 Let’s Encrypt를 이용한 HTTPS 설정, 웹 애플리케이션 방화벽(WAF) 도입 등 더 심화된 우분투 서버 보안 강화 방법을 알아보는 것을 추천합니다.

🏷️ 관련 태그: 우분투 서버 보안, SSH 키 인증, UFW 방화벽, Fail2Ban 설정, 초보 서버 관리

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다