Skip to main content

Thiết lập máy chủ Ubuntu

Các bước đưa một VPS Ubuntu trống (22.04/24.04 LTS) thành máy chủ chạy ứng dụng: khóa truy cập trước, rồi mới cài cơ sở dữ liệu, reverse proxy và trình quản lý tiến trình.

1. Chuẩn bị: user và cập nhật​

Không làm việc trực tiếp bằng root. Tạo một user có quyền sudo, cập nhật hệ thống và bật cập nhật bảo mật tự động:

adduser deploy
usermod -aG sudo deploy

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

2. SSH key​

Xác thực bằng khóa an toàn và tiện hơn mật khẩu, chặn được các cuộc dò mật khẩu tự động.

Trên máy của bạn (client) — tạo cặp khóa rồi chép khóa công khai lên server:

ssh-keygen -t ed25519 -C "email_cua_ban@example.com" # hệ thống cũ: -t rsa -b 4096
ssh-copy-id deploy@dia_chi_ip_may_chu

ssh-copy-id tự thêm khóa vào ~/.ssh/authorized_keys với quyền truy cập đúng.

Trên server — sau khi đã đăng nhập được bằng khóa, tắt đăng nhập bằng mật khẩu và đăng nhập root:

/etc/ssh/sshd_config.d/00-hardening.conf
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
sudo sshd -t # kiểm tra cú pháp
sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin' # xem giá trị thực tế
sudo systemctl restart ssh
warning
  • Với sshd, giá trị đọc được đầu tiên sẽ thắng. Ảnh cloud của Ubuntu thường có /etc/ssh/sshd_config.d/50-cloud-init.conf đặt PasswordAuthentication yes, nên file của bạn phải đặt tên xếp trước (00-…) hoặc sửa thẳng file đó. Luôn kiểm tra bằng sshd -T.
  • Giữ nguyên phiên SSH đang mở và thử đăng nhập ở một terminal khác trước khi đóng, để không tự khóa mình ở ngoài.

3. Tường lửa và chống brute-force​

UFW​

Nguyên tắc: chặn mọi kết nối vào theo mặc định, chỉ mở những gì cần.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH # mở SSH TRƯỚC khi bật tường lửa
sudo ufw enable

sudo ufw allow 'Nginx Full' # 80 + 443, sau khi cài Nginx
sudo ufw status verbose
Docker bỏ qua UFW

Port publish bằng Docker (-p 5432:5432, ports: trong Compose) được Docker mở thẳng trong iptables, không đi qua luật UFW — cơ sở dữ liệu có thể lộ ra Internet dù ufw status không cho phép. Bind vào localhost (127.0.0.1:5432:5432) hoặc không publish port của các service nội bộ.

Fail2ban​

Theo dõi log và tự cấm IP có hành vi đáng ngờ, ví dụ đăng nhập SSH sai nhiều lần. Trên Ubuntu, jail sshd được bật sẵn sau khi cài.

sudo apt install fail2ban -y
sudo fail2ban-client status sshd

Tùy chỉnh trong /etc/fail2ban/jail.local (không sửa jail.conf, file này bị ghi đè khi cập nhật):

/etc/fail2ban/jail.local
[sshd]
maxretry = 5
findtime = 10m
bantime = 1h

4. Cơ sở dữ liệu​

Luôn tạo user riêng cho ứng dụng thay vì dùng tài khoản quản trị, và giữ cơ sở dữ liệu chỉ lắng nghe trên localhost trừ khi thật sự cần truy cập từ xa.

sudo apt install mysql-server -y
sudo mysql_secure_installation # xóa user ẩn danh, database test, chặn root đăng nhập từ xa
sudo mysql # root trên Ubuntu đăng nhập qua auth_socket, không cần mật khẩu
CREATE DATABASE my_app_db;
CREATE USER 'my_app_user'@'localhost' IDENTIFIED BY 'mat_khau_manh';
GRANT ALL PRIVILEGES ON my_app_db.* TO 'my_app_user'@'localhost';

FLUSH PRIVILEGES không cần thiết khi dùng CREATE USER / GRANT. Xem thêm: MySQL.

5. Nginx và SSL​

Nginx nhận traffic ở port 80/443, xử lý SSL rồi chuyển tiếp đến ứng dụng chạy trên port nội bộ. Nhờ đó một server chạy được nhiều ứng dụng, và ứng dụng không cần quyền mở port thấp.

sudo apt install nginx certbot python3-certbot-nginx -y

Tạo file cấu hình trong /etc/nginx/sites-available/your_domain.com:

server {
listen 80;
server_name your_domain.com www.your_domain.com;

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # cho WebSocket
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

Kích hoạt site, kiểm tra cấu hình, rồi để Certbot lấy chứng chỉ và tự thêm chuyển hướng HTTPS:

sudo ln -s /etc/nginx/sites-available/your_domain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
sudo certbot renew --dry-run # kiểm tra gia hạn tự động

6. Quản lý tiến trình​

Ứng dụng cần được tự khởi động lại khi crash và khi server reboot.

Có sẵn trên Ubuntu, chạy được mọi loại ứng dụng, không cần cài thêm.

/etc/systemd/system/my-app.service
[Unit]
Description=My app
After=network.target

[Service]
User=deploy
WorkingDirectory=/var/www/my-app
ExecStart=/usr/bin/java -jar app.jar
Restart=on-failure
EnvironmentFile=/var/www/my-app/.env

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now my-app
journalctl -u my-app -f # xem log

Tổng kết: các lớp phòng thủ​

LớpBiện phápChống lại
Truy cậpSSH key, tắt mật khẩu và đăng nhập rootDò mật khẩu, lộ mật khẩu
MạngUFW chỉ mở 22, 80, 443Truy cập vào các dịch vụ nội bộ
Phát hiệnFail2banBrute-force kéo dài
Hệ điều hànhunattended-upgradesLỗ hổng đã có bản vá
WebNginx + HTTPS (Certbot), chặn file ẩnNghe lén, lộ .env/.git
Dữ liệuUser riêng cho ứng dụng, chỉ lắng nghe localhost, bật xác thựcTruy cập trái phép vào CSDL