보안 — 스캐너·봇·DDoS 막기
전자상거래 서버는 늘 노려지고 있습니다
쇼핑몰 서버를 올린 다음 날, 로그를 열어 봅시다. 아무에게도 주소를 알려 주지 않았는데 이런 줄들이 있을 겁니다.
이 요청들의 정체
| 요청 주소 | 노리는 것 |
|---|---|
/wp-login.php | 워드프레스 관리자 — 비밀번호 대입 |
/.env | DB 비밀번호·API 키가 담긴 설정 파일 |
/.git/config | 소스코드 통째로 |
/admin/config.php | 관리자 페이지 |
/phpmyadmin/ | DB 관리 도구 |
우리는 워드프레스도 PHP도 안 씁니다. 그러니 전부 404가 나죠. 이게 정상입니다. 놀랄 일이 아니에요. 인터넷에 있는 모든 IP가 이런 스캔을 받습니다.
문제는 이 중 하나라도 200이 나올 때입니다.
/.env 가 200이면 그 순간 DB 비밀번호가 털린 겁니다.
SSH — 가장 먼저 잠글 곳
SSH 무차별 대입은 하루 수천 건씩 옵니다. 세 가지만 하면 사실상 0이 됩니다.
# /etc/ssh/sshd_config PermitRootLogin no # root 직접 로그인 금지 PasswordAuthentication no # 비밀번호 로그인 끄기 — 키만 허용 AllowUsers ubuntu # 이 계정만
그리고 11강처럼 사무실 IP에서만 22를 열면 로그가 조용해집니다.
fail2ban 을 붙이면 실패를 반복하는 IP를 자동으로 차단해 줍니다. 로그를 읽고 방화벽 규칙을 자동으로 추가하는 프로그램이에요.
sudo apt install fail2ban sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
rate limit — 한 사람이 너무 많이 두드릴 때
로그인 페이지에 초당 100번씩 요청이 온다면 정상적인 손님이 아닙니다. nginx가 직접 잘라 줄 수 있어요.
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; ← IP당 분당 5회 location /login { limit_req zone=login burst=3 nodelay; ← 3회까지는 몰아쳐도 봐줌 proxy_pass http://mallshop; }
한도를 넘으면 429 Too Many Requests 가 나갑니다(9강). 로그인·회원가입·쿠폰 등록처럼 비싸고 악용되기 쉬운 주소에만 거세요. 상품 목록에 걸면 정상 손님이 막힙니다.
DDoS — 우리 서버 혼자서는 못 막습니다
솔직해집시다. 수천 대의 좀비 PC가 동시에 트래픽을 쏟아부으면 서버 한 대의 방화벽으로는 아무것도 할 수 없습니다. 회선 자체가 막히기 때문이에요. 방화벽이 패킷을 버려도 회선은 이미 꽉 찼습니다.
그래서 DDoS 방어는 우리 앞단에서 해야 합니다.
- Cloudflare 프록시 켜기(16강) — 오리진 IP를 숨기고, 공격은 Cloudflare가 흡수
- 오리진 IP를 절대 노출하지 않기 — 옛 DNS 기록·메일 헤더·인증서 로그로 새어 나갑니다
- 오리진 방화벽에서 Cloudflare IP 대역만 허용 — IP를 알아내도 직접 못 때립니다
정보를 흘리지 않기
공격자는 먼저 정찰부터 합니다. 우리가 무심코 알려 주는 정보를 줄입시다.
server_tokens off; # 응답 헤더에서 nginx 버전 숨기기
버전이 보이면 그 버전의 알려진 취약점을 바로 시도합니다. 숨긴다고 안전해지는 것은 아니지만, 자동 스캐너의 표적 목록에서는 빠져요.
그보다 훨씬 중요한 것은 업데이트입니다.
sudo apt update && sudo apt upgrade sudo apt install unattended-upgrades # 보안 패치 자동 적용
/.env, /wp-login.php 요청이 하루 수백 건씩 찍힙니다. 어떻게 봐야 할까요?