리눅스 서버 보안 하드닝 — SSH·fail2ban·자동 패치·최소 권한
공개 서버를 인터넷에 띄우는 순간 자동 스캐너가 노립니다. 띄운 직후 30분이면 흔한 공격은 거의 막을 수 있어요.
서버를 공개 인터넷에 올리면, 몇 분 안에 자동 스캐너가 SSH 포트를 두드리기 시작합니다 — auth.log(24편)를 열어보면 "Failed password" 가 끝없이 찍혀 있을 거예요. 천재 해커가 아니라 스크립트가 약한 곳을 훑는 겁니다. 다행히 막는 건 어렵지 않습니다 — 거의 다 "설정 몇 줄 + 패키지 두 개"예요.
SSH 강화 — 키만, root 금지
공개 서버의 1순위는 SSH입니다. 18편에서 키 인증을 만들었으니, 이제 비밀번호 로그인을 끄고 root 직접 접속을 막습니다. sudo nano /etc/ssh/sshd_config 에서:
restart 한 뒤, 지금 세션을 닫지 말고 새 터미널을 열어 다시 접속이 되는지 확인하세요. 되면 그때 기존 세션을 닫습니다. 키가 잘못됐거나 설정 오타가 있으면 새 접속만 막히고 기존 세션은 살아 있어서 복구할 수 있어요. 클라우드라면 콘솔(웹 터미널) 접속법도 미리 알아두기.fail2ban — 무차별 대입 자동 차단
키만 허용해도 스캐너는 계속 두드립니다(로그가 지저분해지고 미세하게 부하). fail2ban 은 auth.log(24편)를 감시하다가 로그인 실패가 반복되는 IP를 일정 시간 자동 차단합니다(방화벽 규칙을 자동으로 추가):
이걸로 "Failed password" 폭격이 몇 번 만에 끊깁니다. (nginx·우편 서버 등 다른 서비스용 jail 도 있어요 — 같은 형식으로 추가.)
자동 보안 패치 + 최소 권한
자동 보안 패치 — unattended-upgrades. 알려진 취약점은 패치만 빨리 적용해도 대부분 막힙니다. "보안 업데이트만" 자동으로 깔게 설정:
최소 권한 — "필요한 만큼만". 보안의 절반은 권한을 좁히는 것입니다(9·10·17·19편의 종합):
- root 로 살지 말 것 — 위 SSH의
PermitRootLogin no. 일상은 일반 사용자, 필요할 때만sudo(10편).su -로 root 셸을 띄워 놓고 작업하지 않기. - 서비스는 전용 계정으로 — 웹앱·데몬을 root 로 돌리지 말고 그 서비스용 계정으로(19편의 systemd 유닛에서
User=). 뚫려도 피해가 그 계정 범위로 한정. - 파일 권한 최소 — 9편: 디렉토리
755·파일644기본, 비밀이 든 파일(키·.env)은600(chmod 600 .env).777은 거의 항상 잘못된 신호. - 안 쓰는 서비스·포트는 끈다 —
systemctl disable --now 쓸데없는서비스(19편), 그리고ufw기본 정책은deny incoming+ 필요한 포트만allow(17편). 안 열려 있으면 안 뚫립니다.
점검 습관 + 종합 체크리스트
가끔(주 1회 정도) 이걸 봅니다 — 24편의 로그 보기가 여기서 쓰여요:
- SSH 키 설정(18편) →
PasswordAuthentication no+PermitRootLogin no→ restart → 새 세션으로 접속 확인 후 기존 세션 닫기 ufw기본 deny incoming + 필요한 포트만 allow(17편) →ufw status로 확인apt install fail2ban→jail.local에[sshd] enabled=true+ maxretry/bantimeapt install unattended-upgrades→ 활성화 (보안 패치 자동)- root 안 씀 / 서비스 전용 계정 /
.env·키 파일chmod 600/ 안 쓰는 서비스 disable - (선택) 클라우드 콘솔 접속법 숙지 — SSH 잠겼을 때 복구용
시리즈 흐름
- 1~24편 입문~고급(스크립트·텍스트 처리·로그·모니터링) ✔ 25편 서버 보안 하드닝 (이 글) ✔
- 26편 — 도커 입문 on Ubuntu (이미지·컨테이너·볼륨·compose) — 26편 입문 시리즈 완결
정리하면 — 서버 보안의 기본기는 ① SSH는 키만·root 금지 ② fail2ban으로 무차별 대입 차단 ③ unattended-upgrades로 보안 패치 자동 ④ 권한은 필요한 만큼만(root 안 씀·전용 계정·최소 파일 권한·안 쓰는 서비스 off) ⑤ auth.log·열린 포트 가끔 점검. 위 체크리스트를 띄운 날 30분 안에 끝내두면, "어느 날 갑자기 털리는" 일의 대부분이 사라집니다. 마지막 26편에서는 도커로 앱을 컨테이너에 담아 더 깔끔하게(그리고 격리해서) 운영하는 법을 봅니다.
참고: 본 글은 우분투(systemd·OpenSSH·UFW) 기준이며 2026년 5월 13일에 작성되었습니다. 클라우드 인스턴스는 보안 그룹/방화벽이 별도로 있을 수 있고, 구체적 침해 대응은 KISA 보호나라·관계 기관과 상담하세요.
우분투·리눅스 입문 시리즈
공개 서버 띄운 직후 30분 체크리스트 — 25편입니다. 다음 26편 "도커 입문 on Ubuntu"로 26편 입문 시리즈가 완결됩니다.
마지막 편은 junai.ai/blog 에서.