초보자를 위한 우분투 서버 보안 필수 설정

초보자를 위한 우분투 서버 보안 필수 설정

서론 (Introduction)

처음으로 나만의 우분투 서버를 구축하고 WordPress 블로그, Docker 컨테이너, 혹은 n8n 자동화 워크플로우를 운영하게 된 것을 축하합니다! 하지만 신나는 마음도 잠시, 인터넷에 연결된 서버는 수많은 보안 위협에 노출된다는 사실을 잊어서는 안 됩니다. 서버 보안은 전문가만의 영역이 아니라, 모든 서버 운영자의 기본 책임입니다.

많은 초보자분들이 기능 구현에만 집중한 나머지 보안 설정을 간과하는 경우가 많습니다. 이렇게 기본적인 방어막 없이 서버를 운영하는 것은, 문을 활짝 열어둔 채 집을 비우는 것과 같습니다. 데이터 유출, 서비스 중단, 심하면 서버가 악성코드 유포의 숙주가 되는 끔찍한 상황으로 이어질 수 있습니다.

이 글의 목적은 우분투 서버를 처음 다루는 분들도 쉽게 따라 할 수 있도록, 가장 필수적이고 실용적인 초기 보안 설정 단계를 안내하는 것입니다. 복잡한 이론 대신 지금 당장 적용할 수 있는 구체적인 방법을 알려드립니다.

우리는 앞으로 서버의 첫 번째 관문인 SSH 접속부터, 불필요한 접근을 막는 방화벽(UFW), 안전한 사용자 관리, 시스템 업데이트, 그리고 자동 침입 방지 시스템(Fail2Ban)까지, 안전한 서버 운영을 위한 핵심 주제들을 하나씩 다뤄볼 것입니다.

SSH를 통한 안전한 서버 접속 환경 구축

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

설명: 서버에 접속할 때마다 비밀번호를 입력하는 방식은 간단하지만, 무차별 대입 공격(Brute-Force Attack)에 취약합니다. SSH 키 기반 인증은 ‘열쇠(개인 키)’와 ‘자물쇠(공개 키)’ 쌍을 이용하는 훨씬 안전한 방식입니다. 내가 가진 열쇠 없이는 그 누구도 서버의 문을 열 수 없게 만드는 강력한 보안 장치입니다.

설정 단계:

  • 1. 클라이언트 PC에서 SSH 키 페어 생성하기:
    내 컴퓨터(Windows의 WSL, macOS, Linux)의 터미널에서 다음 명령어를 실행합니다. 대부분의 경우 엔터를 눌러 기본값으로 설정해도 무방합니다. ssh-keygen -t rsa -b 4096
  • 2. 공개 키(Public Key)를 서버에 업로드 및 등록하기:
    가장 쉬운 방법은 `ssh-copy-id` 명령어를 사용하는 것입니다. `[사용자명]@[서버 IP]`를 자신의 정보로 바꾸세요. ssh-copy-id [사용자명]@[서버 IP]
  • 3. SSH 비밀번호 로그인 비활성화 설정:
    서버에 접속하여 SSH 설정 파일을 엽니다. sudo nano /etc/ssh/sshd_config 파일 내용 중 `PasswordAuthentication` 부분을 찾아 `yes`를 `no`로 변경하고 저장합니다. PasswordAuthentication no 마지막으로 SSH 서비스를 재시작하여 설정을 적용합니다. sudo systemctl restart ssh

흔한 실수: 개인 키 파일(`id_rsa`)을 이메일이나 클라우드에 백업하는 등 안전하지 않게 관리하는 것입니다. 개인 키는 내 컴퓨터의 `~/.ssh/` 디렉토리에 안전하게 보관해야 합니다. 또한, 키 파일의 권한이 너무 개방적이면 SSH 클라이언트가 접속을 거부할 수 있습니다.

실용적인 팁: SSH 키 생성 시 패스프레이즈(passphrase)를 설정하면, 개인 키 파일이 유출되더라도 패스프레이즈를 모르면 사용할 수 없어 한층 더 안전합니다. 또한, 자주 접속하는 서버 정보는 `~/.ssh/config` 파일에 등록해두면 `ssh my-server` 와 같이 간단한 명령어로 접속할 수 있어 편리합니다.

2.2. SSH 기본 포트 변경 및 Root 로그인 제한

설명: 전 세계의 공격 봇들은 기본 SSH 포트인 22번을 향해 끊임없이 접속을 시도합니다. 포트 번호를 잘 알려지지 않은 다른 번호(예: 2222, 10000~65535 사이의 숫자)로 바꾸는 것만으로도 이러한 자동화된 공격의 99%를 피할 수 있습니다. 또한, 시스템의 모든 권한을 가진 root 계정으로의 직접 로그인을 막는 것은 보안의 기본 원칙입니다.

설정 단계:

  • 1. `/etc/ssh/sshd_config` 파일 수정:
    다시 한번 SSH 설정 파일을 엽니다. sudo nano /etc/ssh/sshd_config 주석 처리된 `#Port 22`를 찾아 주석(#)을 제거하고 원하는 포트 번호(예: 2222)로 변경합니다. 그리고 `PermitRootLogin` 항목을 찾아 `no`로 설정합니다. Port 2222 PermitRootLogin no
  • 2. UFW 방화벽에 새 SSH 포트 허용 규칙 추가:
    (매우 중요!) SSH 서비스를 재시작하기 전에, 반드시 방화벽에서 새로 바꾼 포트를 허용해야 합니다. 그렇지 않으면 서버에 접속할 수 없게 됩니다. sudo ufw allow 2222/tcp
  • 3. SSH 서비스 재시작 및 새 포트로 접속 테스트:
    이제 SSH 서비스를 재시작합니다. sudo systemctl restart ssh 접속을 끊고, 새 포트 번호를 지정하여 다시 접속해 보세요. ssh -p 2222 [사용자명]@[서버 IP]

운영 주의사항: 포트 변경 전 방화벽 규칙 추가는 아무리 강조해도 지나치지 않습니다. 실수로 서버에 접속할 수 없게 되면 클라우드 서비스 제공업체의 웹 콘솔 등 다른 방법으로 복구해야 하는 번거로움이 생깁니다. 또한, Root 로그인을 비활성화하기 전에 반드시 sudo 권한을 가진 일반 사용자 계정이 있는지 확인해야 합니다.

UFW 방화벽으로 서버의 문단속 강화하기

3.1. 필수 서비스 포트만 허용하는 UFW 기본 정책 설정

설명: UFW(Uncomplicated Firewall)는 이름처럼 사용하기 쉬운 우분투의 기본 방화벽 도구입니다. 방화벽의 기본 원칙은 ‘모든 것을 차단하고, 필요한 것만 허용한다(Default Deny)’입니다. 이렇게 하면 SSH, 웹 서버(HTTP/HTTPS) 등 우리가 명시적으로 허용한 서비스를 제외한 모든 외부 접근이 원천적으로 차단되어 서버가 훨씬 안전해집니다.

설정 단계:

  • 1. UFW 설치 및 활성화:
    먼저 기본 정책을 설정합니다. 들어오는 연결은 모두 차단하고, 나가는 연결은 허용합니다. sudo ufw default deny incoming sudo ufw default allow outgoing
  • 2. 필수 서비스 포트 허용 규칙 추가:
    우리가 접속해야 할 SSH 포트(변경했다면 변경된 포트)와 웹 서버 포트를 허용합니다. sudo ufw allow 2222/tcp (이전에 변경한 SSH 포트) sudo ufw allow 80/tcp (HTTP) sudo ufw allow 443/tcp (HTTPS)
  • 3. UFW 활성화:
    모든 준비가 끝났으면 UFW를 활성화합니다. 활성화 시 SSH 연결이 끊어질 수 있다는 경고가 나오지만, SSH 포트를 이미 허용했으므로 `y`를 입력하고 진행합니다. sudo ufw enable

운영 주의사항: UFW를 활성화하기 전, 현재 접속 중인 SSH 포트가 허용 목록에 있는지 반드시 다시 확인하세요. 포트 번호와 함께 프로토콜(TCP/UDP)을 정확히 지정하는 습관을 들이는 것이 좋습니다.

실용적인 팁: `sudo ufw allow from [내 IP 주소] to any port 2222` 와 같이 특정 IP 주소에서만 SSH 접속을 허용하도록 규칙을 추가하면 보안을 한층 더 강화할 수 있습니다. 또한, `sudo ufw app list` 명령어로 Nginx, OpenSSH 등 사전 정의된 애플리케이션 프로파일 목록을 확인하고 `sudo ufw allow ‘Nginx Full’` 과 같이 편리하게 규칙을 추가할 수도 있습니다.

3.2. UFW 규칙 관리 및 로깅을 통한 모니터링

설명: 방화벽 설정은 한 번으로 끝나는 것이 아닙니다. 주기적으로 규칙을 확인하고 불필요한 규칙은 삭제해야 합니다. 또한, UFW 로그를 활성화하면 어떤 IP가 어떤 포트로 접속을 시도하다 차단되었는지 확인할 수 있어 잠재적인 위협을 파악하는 데 도움이 됩니다.

설정 단계:

  • 1. UFW 규칙 목록 확인:
    현재 설정된 규칙을 자세히 보려면 다음 명령어를 사용합니다. 규칙마다 번호가 부여되어 관리가 편리합니다. sudo ufw status numbered
  • 2. 불필요한 규칙 삭제:
    위에서 확인한 번호를 이용해 특정 규칙을 삭제할 수 있습니다. 예를 들어 1번 규칙을 삭제하려면 아래와 같이 실행합니다. sudo ufw delete 1
  • 3. UFW 로깅 활성화:
    로깅 기능을 켜서 차단 기록을 남깁니다. sudo ufw logging on

운영 주의사항: 서버에 새로운 서비스를 설치할 때마다 해당 서비스가 사용하는 포트를 방화벽에서 열어주는 것을 잊지 말아야 합니다. 로그 파일은 시간이 지나면 용량이 커질 수 있으므로, `logrotate`와 같은 도구를 활용해 주기적으로 관리하는 것이 좋습니다.

실용적인 팁: `tail -f /var/log/ufw.log` 명령어를 사용하면 실시간으로 방화벽 로그를 모니터링할 수 있습니다. 수많은 `[UFW BLOCK]` 메시지를 보며 방화벽이 얼마나 열심히 일하고 있는지 직접 확인할 수 있습니다.

시스템 업데이트와 사용자 권한 관리의 중요성

4.1. 최신 보안 패치 적용을 위한 정기적인 시스템 업데이트

설명: 우리가 사용하는 우분투 운영체제와 수많은 소프트웨어에는 언제든 새로운 보안 취약점이 발견될 수 있습니다. 개발자들은 이런 취약점을 해결하기 위해 계속해서 보안 패치를 배포합니다. 시스템을 정기적으로 업데이트하는 것은 이러한 알려진 위협으로부터 서버를 보호하는 가장 기본적이고 효과적인 방법입니다.

설정 단계:

  • 1. 수동 업데이트:
    서버에 접속했을 때 주기적으로 다음 명령어들을 실행하여 시스템을 최신 상태로 유지합니다. sudo apt update (패키지 목록 업데이트) sudo apt upgrade -y (설치된 패키지 업그레이드)
  • 2. 자동 보안 업데이트 설정:
    매번 수동으로 업데이트하기 번거롭다면, 보안 관련 업데이트만 자동으로 설치하도록 설정할 수 있습니다. sudo apt install unattended-upgrades sudo dpkg-reconfigure –priority=low unattended-upgrades 이 설정은 중요한 보안 패치를 놓치지 않도록 도와줍니다.

흔한 실수: “업데이트하면 뭔가 잘못될까 봐”라는 막연한 두려움 때문에 업데이트를 계속 미루는 것입니다. 대부분의 업데이트는 안정성과 보안을 향상시키므로 미루지 않는 것이 좋습니다.

운영 주의사항: 커널 업데이트 등 중요한 시스템 업데이트를 실행하기 전에는 만약을 대비해 클라우드 서비스에서 제공하는 스냅샷 기능 등으로 서버를 백업하는 것이 안전합니다. 업데이트 후에는 운영 중인 서비스(웹 서버 등)가 정상적으로 작동하는지 꼭 확인해야 합니다.

4.2. 최소 권한 원칙 기반의 사용자 계정 관리

설명: ‘최소 권한 원칙’은 보안의 핵심 개념 중 하나입니다. 모든 작업을 시스템 최고 관리자인 `root` 계정으로 하는 것은 매우 위험합니다. 작은 실수 하나가 시스템 전체를 망가뜨릴 수 있기 때문입니다. 대신, 평소에는 일반 사용자 계정을 사용하고, 관리자 권한이 필요할 때만 `sudo` 명령어를 사용하는 것이 안전합니다.

설정 단계:

  • 1. 새 일반 사용자 계정 생성:
    `[사용자명]` 부분에 원하는 계정 이름을 넣습니다. sudo adduser [사용자명]
  • 2. 새 사용자에게 sudo 그룹 추가:
    생성한 사용자가 관리자 권한을 사용할 수 있도록 `sudo` 그룹에 추가합니다. sudo usermod -aG sudo [사용자명]
  • 3. 불필요한 사용자 계정 확인 및 관리:
    주기적으로 `/etc/passwd` 파일을 확인하여 더 이상 사용하지 않거나 의심스러운 계정이 있는지 점검하고, 필요 시 잠그거나 삭제합니다.

흔한 실수: 편하다는 이유로 모든 작업을 `root` 계정으로 수행하거나, 여러 사용자에게 무분별하게 `sudo` 권한을 부여하는 것입니다. 각 사용자에게는 꼭 필요한 만큼의 권한만 부여해야 합니다.

실용적인 팁: `sudo`를 사용할 때도 `-i` 옵션(`sudo -i`)으로 root 셸에 완전히 진입하기보다는, `sudo [명령어]` 형태로 개별 명령어에만 권한을 부여하는 습관을 들이는 것이 더 안전합니다. 또한, 팀원들과 함께 서버를 관리한다면 `sudoers` 파일을 직접 편집하여 각 사용자나 그룹별로 실행할 수 있는 명령어를 세밀하게 제어할 수 있습니다.

침입 방지 및 주기적인 보안 점검

5.1. Fail2Ban을 이용한 무차별 대입 공격 방어

설명: Fail2Ban은 서버 로그 파일을 실시간으로 감시하다가, SSH나 웹 로그인 등에서 반복적으로 실패하는 IP를 발견하면 해당 IP를 일정 시간 동안 방화벽으로 자동 차단해주는 아주 유용한 도구입니다. 앞서 SSH 포트를 변경한 것과 더불어 무차별 대입 공격을 방어하는 강력한 2중 방어막이 되어 줍니다.

설정 단계:

  • 1. Fail2Ban 설치:
    sudo apt install fail2ban
  • 2. 설정 파일 복사 및 편집:
    기본 설정 파일(`jail.conf`)을 직접 수정하는 대신, 로컬 설정 파일(`jail.local`)을 만들어 수정합니다. 이렇게 해야 업데이트 시 설정이 초기화되는 것을 막을 수 있습니다. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local
  • 3. 주요 설정 변경:
    `jail.local` 파일에서 `[DEFAULT]` 섹션을 찾아 아래 항목들을 필요에 맞게 수정합니다. bantime = 1h (차단 시간, 1시간) maxretry = 5 (최대 재시도 횟수) ignoreip = 127.0.0.1/8 ::1 [내 집 IP] [내 사무실 IP] (차단 예외 IP)
  • 4. Fail2Ban 서비스 재시작:
    sudo systemctl restart fail2ban

흔한 실수: `ignoreip`에 자신의 IP 주소를 등록하는 것을 잊어버리는 것입니다. 비밀번호를 몇 번 틀리다가 자신의 IP가 차단되어 서버에 접속하지 못하는 당황스러운 상황이 발생할 수 있습니다.

실용적인 팁: `sudo fail2ban-client status sshd` 명령어로 SSH 서비스에 대한 Fail2Ban의 작동 상태와 현재 차단된 IP 목록을 확인할 수 있습니다. Fail2Ban은 SSH뿐만 아니라 Nginx, Apache 등 다양한 서비스의 로그를 감시하도록 확장 설정이 가능합니다.

5.2. 보안 로그 검토 및 시스템 정기 점검

설명: 최고의 보안 시스템도 주기적인 점검과 관심 없이는 무용지물이 될 수 있습니다. 시스템에 어떤 일들이 일어나고 있는지 로그 파일을 통해 확인하고, 간단한 명령어들로 서버 상태를 점검하는 습관을 들이는 것이 중요합니다. 이를 통해 의심스러운 활동을 조기에 발견하고 대응할 수 있습니다.

실용적인 팁 (정기 점검 리스트):

  • 최근 로그인 기록 확인:
    `last` 명령어로 내가 모르는 시간이나 IP에서 로그인한 기록이 있는지 확인합니다. last
  • 열려있는 포트 확인:
    `netstat` 또는 `ss` 명령어로 현재 어떤 포트들이 열려 있고 어떤 프로그램이 사용 중인지 확인합니다. 의도하지 않은 포트가 열려 있다면 즉시 조치해야 합니다. sudo netstat -tunlp
  • 시스템 자원 및 프로세스 모니터링:
    `top` 이나 `htop` 명령어로 CPU나 메모리를 비정상적으로 많이 사용하는 의심스러운 프로세스가 있는지 확인합니다. htop
  • 인증 관련 로그 확인:
    `/var/log/auth.log` 파일에는 로그인 성공/실패 등 사용자 인증과 관련된 중요한 기록이 담겨 있습니다. `grep “Failed password”` 와 같은 명령어로 비정상적인 로그인 시도를 확인할 수 있습니다.

운영 주의사항: 처음에는 로그를 봐도 무엇이 정상이고 비정상인지 구분하기 어려울 수 있습니다. 하지만 꾸준히 들여다보는 습관을 들이면, 평소와 다른 패턴을 금방 알아챌 수 있게 됩니다. `logwatch`와 같은 로그 분석 도구를 설치하면 매일 아침 이메일로 서버 로그 요약 리포트를 받아볼 수도 있습니다.

결론 (Conclusion)

지금까지 우리는 우분투 서버를 안전하게 지키기 위한 필수 보안 설정들을 함께 살펴보았습니다. SSH 키 기반 접속, 포트 변경, UFW 방화벽, 정기적인 업데이트, 최소 권한 사용자 관리, 그리고 Fail2Ban을 이용한 침입 방지까지. 이 설정들은 여러분의 소중한 서버를 위한 튼튼한 기초 공사와 같습니다.

기억해야 할 가장 중요한 점은, 보안은 한 번의 설정으로 끝나는 작업이 아니라는 것입니다. 새로운 보안 위협은 계속해서 등장하기 때문에, 지속적인 관심과 관리가 필요합니다. 오늘 배운 내용들을 바탕으로 주기적으로 서버를 점검하고, 중요한 데이터는 반드시 정기적으로 백업하는 습관을 들이시길 바랍니다.

이제 여러분은 기본적인 보안 설정을 마친, 한층 더 안전한 서버의 주인이 되었습니다. 이 튼튼한 기반 위에서 안심하고 여러분의 멋진 서비스와 프로젝트를 마음껏 펼쳐나가세요!

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

코멘트

답글 남기기

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