우분투 · 리눅스 입문 — 25편 (고급)

리눅스 서버 보안 하드닝 — SSH·fail2ban·자동 패치·최소 권한

공개 서버를 인터넷에 띄우는 순간 자동 스캐너가 노립니다. 띄운 직후 30분이면 흔한 공격은 거의 막을 수 있어요.

2026년 5월 13일 · 약 8분 · 26편 입문 시리즈 25편

SSH 키 인증·root 금지·ufw·fail2ban·unattended-upgrades 체크리스트와 auth.log·fail2ban-client 점검 명령이 보이는 터미널 화면 일러스트 — 서버 보안 하드닝을 상징

서버를 공개 인터넷에 올리면, 몇 분 안에 자동 스캐너가 SSH 포트를 두드리기 시작합니다 — auth.log(24편)를 열어보면 "Failed password" 가 끝없이 찍혀 있을 거예요. 천재 해커가 아니라 스크립트가 약한 곳을 훑는 겁니다. 다행히 막는 건 어렵지 않습니다 — 거의 다 "설정 몇 줄 + 패키지 두 개"예요.

먼저: 9편(권한)·10편(sudo)·17편(ufw)·18편(SSH 키)·19편(systemd)·24편(auth.log)을 봤다면 이어집니다. 특히 18편의 SSH 키가 이미 설정돼 있어야 합니다(키 없이 비번을 끄면 잠겨요). 순서 — ① SSH 강화 → ② fail2ban → ③ 자동 패치 + 최소 권한 → ④ 점검 습관·체크리스트.

SSH 강화 — 키만, root 금지

공개 서버의 1순위는 SSH입니다. 18편에서 키 인증을 만들었으니, 이제 비밀번호 로그인을 끄고 root 직접 접속을 막습니다. sudo nano /etc/ssh/sshd_config 에서:

# /etc/ssh/sshd_config PasswordAuthentication no # 비번 로그인 금지 — 키만 (18편의 키가 있어야 함!) PermitRootLogin no # root 로 직접 접속 금지 (일반 사용자로 들어와서 sudo) #Port 22 # (선택) 포트를 22 외로 — 자동 스캔을 좀 줄여줌, 필수는 아님 AllowUsers myuser # (선택) 이 사용자만 SSH 허용 — 이름 바꿔서
$ sudo sshd -t # 설정 문법 검사 (에러 없어야 함) $ sudo systemctl restart ssh # 적용 (또는 ssh.service)
⚠️ 잠기지 않게 — 절대 규칙: SSH 설정을 바꾸고 restart 한 뒤, 지금 세션을 닫지 말고 새 터미널을 열어 다시 접속이 되는지 확인하세요. 되면 그때 기존 세션을 닫습니다. 키가 잘못됐거나 설정 오타가 있으면 새 접속만 막히고 기존 세션은 살아 있어서 복구할 수 있어요. 클라우드라면 콘솔(웹 터미널) 접속법도 미리 알아두기.

fail2ban — 무차별 대입 자동 차단

키만 허용해도 스캐너는 계속 두드립니다(로그가 지저분해지고 미세하게 부하). fail2banauth.log(24편)를 감시하다가 로그인 실패가 반복되는 IP를 일정 시간 자동 차단합니다(방화벽 규칙을 자동으로 추가):

$ sudo apt install fail2ban # 설치 (11편) $ sudo nano /etc/fail2ban/jail.local # 사용자 설정은 jail.local 에 (jail.conf 는 건드리지 않음)
# /etc/fail2ban/jail.local [DEFAULT] bantime = 1h # 차단 시간 (반복 위반 시 늘리려면 bantime.increment = true) findtime = 10m # 이 시간 안에 maxretry = 5 # 5번 실패하면 차단 [sshd] enabled = true # SSH 보호 켜기 (기본 jail)
$ sudo systemctl restart fail2ban $ sudo fail2ban-client status sshd # 현재 차단된 IP 목록·통계 $ sudo fail2ban-client set sshd unbanip 1.2.3.4 # 실수로 내 IP가 막혔으면 풀기

이걸로 "Failed password" 폭격이 몇 번 만에 끊깁니다. (nginx·우편 서버 등 다른 서비스용 jail 도 있어요 — 같은 형식으로 추가.)

자동 보안 패치 + 최소 권한

자동 보안 패치 — unattended-upgrades. 알려진 취약점은 패치만 빨리 적용해도 대부분 막힙니다. "보안 업데이트만" 자동으로 깔게 설정:

$ sudo apt install unattended-upgrades $ sudo dpkg-reconfigure -plow unattended-upgrades # 활성화 (Yes) # /etc/apt/apt.conf.d/50unattended-upgrades — 보안만 vs 일반까지, 자동 재부팅 여부 등 조정 $ sudo unattended-upgrade --dry-run -d # 뭘 깔지 미리보기

최소 권한 — "필요한 만큼만". 보안의 절반은 권한을 좁히는 것입니다(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편의 로그 보기가 여기서 쓰여요:

$ sudo grep "Failed password" /var/log/auth.log | tail -20 # 누가, 어디서 노리나 $ sudo grep "Accepted" /var/log/auth.log | tail # 실제로 누가 로그인했나 (낯선 게 있으면 비상) $ last -n 20 # 최근 로그인 기록 $ sudo ss -tlnp # 지금 열려서 듣고 있는 포트 — 모르는 게 있으면 조사 $ apt list --upgradable 2>/dev/null | grep -i security # 대기 중인 보안 업데이트 $ sudo fail2ban-client status sshd # 차단 활동
공개 서버 띄운 직후 체크리스트
  1. SSH 키 설정(18편) → PasswordAuthentication no + PermitRootLogin no → restart → 새 세션으로 접속 확인 후 기존 세션 닫기
  2. ufw 기본 deny incoming + 필요한 포트만 allow(17편) → ufw status 로 확인
  3. apt install fail2banjail.local[sshd] enabled=true + maxretry/bantime
  4. apt install unattended-upgrades → 활성화 (보안 패치 자동)
  5. root 안 씀 / 서비스 전용 계정 / .env·키 파일 chmod 600 / 안 쓰는 서비스 disable
  6. (선택) 클라우드 콘솔 접속법 숙지 — SSH 잠겼을 때 복구용
솔직히: 위를 다 해도 100% 안전은 없습니다 — 인터넷이 있는 한 누군가는 새 빈틈을 찾아요. 다만 이 목록은 "자동 스크립트가 노리는 흔한 빈틈"의 대부분을 막습니다(약한 비번, 무차별 대입, 패치 안 한 취약점, 과한 권한). 그것만으로도 표적에서 한참 멀어집니다. 더 깊은 건(SELinux/AppArmor, 침입 탐지, 보안 감사 도구 등) 운영 규모가 커지면 따로 — 입문 시리즈의 범위는 여기까지입니다.

시리즈 흐름

  1. 1~24편 입문~고급(스크립트·텍스트 처리·로그·모니터링) ✔   25편 서버 보안 하드닝 (이 글)
  2. 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 에서.

© 2026 JUNAI · 우분투·리눅스 입문 시리즈 25편 · 본 글은 2026년 5월 13일 기준으로 작성되었습니다.

© 2026 주나이테크(주) @JUNAITECH