OffshoreVps
Bảo mật27 thg 9 20266 phút đọcBởi đội ngũ OffshoreVps

Tăng cường bảo mật máy chủ web: UFW, fail2ban và cài đặt Nginx

Tường lửa mặc định từ chối, jail của fail2ban, header Nginx an toàn hơn, giới hạn tốc độ và cập nhật tự động cho VPS chạy website.

Một máy chủ web mới bị quét trong vòng vài phút sau khi trực tuyến. Phần lớn lưu lượng đó là tự động và vô hại nếu bạn đã làm những điều cơ bản. Hướng dẫn này đi xa hơn một bước so với tăng cường bảo mật 15 phút và bao gồm tường lửa, bảo vệ chống brute-force bằng fail2ban và thiết lập Nginx an toàn hơn.

Cửa sổ terminal trên VPS hiển thị các lệnh dùng để tăng cường bảo mật máy chủ web bằng UFW, fail2ban và Nginx, bắt đầu bằng “sudo ufw default deny incoming”
Loại lệnh bạn sẽ chạy trên máy chủ của mình trong hướng dẫn này.

Bước 1: tường lửa mặc định từ chối với UFW

Chỉ cho phép những gì bạn cần, và chặn phần còn lại. Thêm SSH trước để không tự khóa mình ra ngoài.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

Nếu bạn dùng cổng SSH không chuẩn, hãy cho phép cổng đó thay vì OpenSSH.

Bước 2: fail2ban cho các lần thất bại lặp lại

fail2ban theo dõi nhật ký và cấm các địa chỉ IP liên tục đăng nhập thất bại.

sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

Hãy dùng khóa SSH và tắt cả đăng nhập bằng mật khẩu. Xem giải thích khóa SSH.

Bước 3: ẩn phiên bản Nginx và thêm header an toàn

Trong /etc/nginx/nginx.conf, bên trong khối http:

server_tokens off;

Trong khối server của website bạn:

add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Chỉ thêm header HSTS khi HTTPS đã hoạt động cho tên miền và mọi tên miền con bạn dùng.

Các bước của hướng dẫn này theo thứ tự: 1. tường lửa mặc định từ chối với UFW; 2. fail2ban cho các lần thất bại lặp lại; 3. ẩn phiên bản Nginx và thêm header an toàn; 4. giới hạn các yêu cầu lạm dụng; 5. luôn cập nhật; 6. Cần theo dõi gì
Các bước trong hướng dẫn này, theo thứ tự.

Bước 4: giới hạn các yêu cầu lạm dụng

Giới hạn tốc độ làm chậm các nỗ lực brute-force vào trang đăng nhập:

# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

# in your server block
location = /wp-login.php {
    limit_req zone=login burst=5 nodelay;
    # ...your usual PHP handling
}

Kiểm tra và áp dụng bằng sudo nginx -t && sudo systemctl reload nginx.

Bước 5: luôn cập nhật

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

Cập nhật bảo mật tự động vá các lỗ hổng đã biết mà bạn không cần làm gì.

Cần theo dõi gì

  • Kiểm tra các lệnh cấm bằng sudo fail2ban-client status sshd.
  • Thỉnh thoảng xem lại /var/log/nginx/error.log.
  • Nếu bạn ở sau một proxy hoặc CDN, hãy đảm bảo fail2ban đọc được IP thật của client, nếu không bạn có thể cấm nhầm chính proxy của mình.