리눅스 서버 보안 설정 필수 체크리스트 및 초기 방화벽 구성 전략
서버 보안 사고를 예방하는 기본 운영 습관은 생각보다 거창한 기술이 필요하지 않습니다. 저 역시 처음 리눅스 서버를 구축하고 서비스를 런칭했을 때, 혹시나 내가 잠든 사이에 누군가 서버를 망가뜨리지 않을까 노심초사했던 기억이 생생합니다. 실제로 서버 로그를 처음 열어보았을 때, 1초에도 수십 번씩 낯선 IP들이 접속을 시도하는 흔적을 보고 등골이 서늘해지기도 했습니다. 오늘은 제가 실무에서 직접 겪은 시행착오를 바탕으로, 해킹의 위협에서 내 서버를 안전하게 지키기 위해 반드시 실천해야 할 운영 습관들을 정리해 드립니다.
1. 서버 보안이 뚫리는 순간은 예고 없이 찾아온다
서버를 직접 운영하다 보면 "설마 내 작은 서버를 누가 건드리겠어?"라는 안일한 생각을 하기 쉽습니다. 하지만 제 경험상 해킹 시도는 서버가 온라인에 연결되어 공인 IP를 할당받는 그 순간부터 시작됩니다. 해커들은 특정 서버를 노리는 것이 아니라, 인터넷 전체를 스캔하는 자동화된 봇(Bot)들을 풀어놓기 때문입니다.
실제로 `/var/log/auth.log`를 확인해보면 1초에도 수십 번씩 로그인을 시도하는 섬뜩한 기록을 볼 수 있습니다. 보안 사고는 대단한 기술적 해킹보다는, 관리자의 사소한 설정 실수나 습관의 부재에서 발생합니다. 따라서 우리는 공격자가 들어올 틈을 주지 않는 기본적인 문단속부터 시작해야 합니다.
2. 사고의 원인: 기본 설정 방치와 모니터링 부재
대부분의 보안 사고는 'Default(기본) 설정'을 그대로 두었을 때 발생합니다. 해커들은 이미 알려진 기본 포트(22, 80, 443 등)와 기본 계정명(root, admin)을 타겟으로 무차별 대입 공격(Brute Force)을 퍼붓습니다. 기본 설정만 변경해도 공격의 90% 이상을 회피할 수 있습니다.
또한, 공격이 들어오고 있음에도 로그를 보지 않아 인지하지 못하는 '모니터링 부재'가 상황을 악화시킵니다. 단순히 방화벽만 켜두는 것이 능사가 아니라, 어떤 IP가 접근을 시도하는지 파악하지 못하는 것이 가장 큰 취약점입니다. 적을 알고 나를 알면 위태롭지 않습니다.
3. 해결책 1단계: SSH 접속 환경 하드닝(Hardening)
가장 먼저 수행해야 할 작업은 원격 접속(SSH)의 문단속입니다. 비밀번호 입력 방식은 시간이 지나면 언젠가 뚫릴 수밖에 없는 구조이므로, 반드시 SSH Key 기반 인증으로 전환해야 합니다.
- 비밀번호 로그인 비활성화: `/etc/ssh/sshd_config` 파일에서 `PasswordAuthentication no`로 설정합니다. 이제 물리적인 키 파일 없이는 누구도 접속할 수 없습니다.
- Root 직접 로그인 차단: 관리자 권한을 탈취당하면 서버의 모든 것을 잃습니다. `PermitRootLogin no`로 설정하여, 일반 유저로 접속 후 `sudo`를 통해 권한을 얻도록 강제해야 합니다. 이것만으로도 공격 성공률을 현저히 낮출 수 있습니다.
4. 해결책 2단계: 네트워크 방화벽(UFW) 및 포트 변경
서버의 대문 위치를 바꾸고, 불필요한 문을 폐쇄하는 단계입니다. Ubuntu 사용자라면 `ufw`를 적극 활용해야 합니다.
- SSH 포트 변경: 기본 22번 포트는 봇들의 놀이터입니다. 2222, 49152 등 잘 알려지지 않은 포트로 변경하십시오. 포트 번호만 바꿔도 로그 파일이 눈에 띄게 깨끗해지는 것을 경험할 것입니다.
- 필수 포트만 개방: 웹 서비스(80, 443)와 변경된 SSH 포트만 열고, 나머지는 모두 deny(거부) 처리해야 합니다.
- 경험적 조언: 포트를 변경하고 방화벽을 올리기 전, 반드시 현재 세션을 유지한 채 새 창으로 접속 테스트를 하십시오. 실수로 자신을 차단하여 데이터 센터에 연락해야 하는 낭패를 겪을 수 있습니다.
5. 해결책 3단계: 자동 방어 도구 Fail2Ban 도입
사람이 24시간 모니터 앞에 앉아 로그를 감시할 수는 없습니다. Fail2Ban과 같은 침입 차단 시스템(IPS)을 설치하여 방어 시스템을 자동화해야 합니다. 이 도구는 특정 시간 내에 로그인 실패가 반복되면 해당 IP를 방화벽 레벨에서 즉시 차단합니다.
설정 팁을 드리자면, 기본 설정(3~5회 실패 시 차단) 외에도, 재범 IP에 대해서는 차단 기간을 기하급수적으로 늘리는 설정을 추가하면 끈질긴 악성 봇의 접근을 효과적으로 무력화할 수 있습니다.
6. 운영 습관: 정기적인 로그 감사와 업데이트 루틴
기술적 설정이 끝났다면 이제는 '습관'의 영역입니다. 매일 아침 커피를 마시며, 혹은 매주 월요일 업무 시작 전 짧게라도 서버 상태를 점검하는 루틴을 만드십시오.
- 로그 확인: `/var/log/auth.log` (또는 secure 로그)를 통해 비정상적인 접근 시도가 있었는지, `sudo` 권한이 오남용 되지는 않았는지 훑어봅니다.
- 보안 업데이트: `apt update && apt upgrade`는 선택이 아닌 필수입니다. OS 보안 패치는 새롭게 발견된 취약점(Zero-day 등)을 막는 유일한 방법입니다. 만약 관리가 어렵다면 자동 업데이트(`unattended-upgrades`) 설정을 켜두는 것을 강력히 권장합니다.
7. 결론: 보안은 상태가 아니라 지속적인 과정이다
서버 보안에 "설정 완료"라는 개념은 존재하지 않습니다. 공격 기술은 계속해서 교묘하게 발전하기 때문에, 방어 태세 또한 지속적으로 점검하고 다듬어야 합니다. 오늘 소개한 SSH 키 설정, 포트 변경, Fail2Ban, 그리고 로그 확인 습관은 아주 거창한 기술이 아닌 기본 중의 기본입니다.
하지만 이 기본만 확실히 지켜도 99%의 자동화된 공격으로부터 서버를 안전하게 지킬 수 있습니다. 지금 바로 차가운 터미널 창을 열고 내 서버의 `auth.log`를 확인해보는 것으로 보안 점검을 시작해 보시길 바랍니다.