《服务器运维》课程 · 孙祎辰 · 25 网络 A1 班
从"看见威胁"出发,沿着攻击者可能入侵的路径,逐一把门堵死:登录方式从密码换成密钥、禁用 root 远程登录、配置两层防火墙、用 fail2ban 自动封禁暴力破解。
1. 查看暴力破解登录失败记录:
sudo journalctl -u sshd | grep -i "failed" | tail -30
2. 新建普通用户并加入 wheel 组(获得 sudo 权限):
sudo adduser study
sudo passwd study
sudo usermod -aG wheel study
3. 安装公钥到 authorized_keys,并设置正确权限:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys # 粘贴公钥
chmod 600 ~/.ssh/authorized_keys
4. 加固 sshd 配置(改完先测试再生效):
sudo vi /etc/ssh/sshd_config
# PasswordAuthentication no # 禁用密码登录
# PermitRootLogin no # 禁止 root 远程登录
sudo sshd -t
sudo systemctl reload sshd
5. 配置主机防火墙 firewalld(必须加 --permanent 再 reload):
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
6. 安装并配置 fail2ban(backend 必须用 systemd):
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
sudo vi /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
backend = systemd
maxretry = 3
findtime = 600
bantime = 3600
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
~/.ssh 必须是 700、authorized_keys 必须是 600,且属主是本人。打通"网站能被访问"的三个环节:DNS 解析让域名指向服务器 IP、开放 80 端口、安装 Nginx 并发布带备案号的个人主页。
1. 验证域名解析(看 Address 是否为服务器公网 IP):
nslookup sunyichen.bond
nslookup www.sunyichen.bond
2. 开放网页端口(安全组 + 防火墙两层都要开):
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
3. 安装并启动 Nginx:
sudo dnf install -y nginx
sudo systemctl enable --now nginx
nginx -v
4. 准备网站目录并交给 study 用户:
sudo mkdir -p /var/www/mysite
sudo chown -R study:study /var/www/mysite
sudo chmod 755 /var/www/mysite
5. 编写站点配置(conf.d 下以 .conf 结尾才会被加载):
sudo vi /etc/nginx/conf.d/mysite.conf
server {
listen 80;
server_name sunyichen.bond www.sunyichen.bond;
root /var/www/mysite;
index index.html;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;
location / {
try_files $uri $uri/ =404;
}
}
sudo nginx -t
sudo systemctl reload nginx
6. 上传主页(scp 走同一把密钥,不需要密码):
scp index.html study@服务器公网IP:/var/www/mysite/
curl -H "Host: 你的域名" http://127.0.0.1 返回主页;不带 Host 则返回默认页。sudo tail -3 /var/log/nginx/mysite_error.log 里的 Permission denied。为个人主页申请免费的 Let's Encrypt 证书,让网站从"不安全"变为带安全锁的加密网站;配置 Nginx 的 HTTPS,并设置证书自动续期。
1. 抓包看 HTTP 明文传输的风险:
sudo dnf install -y tcpdump
sudo tcpdump -i any -A -nn 'tcp port 80' | grep -a -E "GET |Host:|User-Agent|"
2. 开放 443 端口(80 不能关,跳转和续期都要用):
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
3. 安装 certbot 并申请证书(先 dry-run 演练再正式申请):
sudo dnf install -y certbot
sudo certbot certonly --webroot -w /var/www/mysite \
-d sunyichen.bond -d www.sunyichen.bond \
-m 你的邮箱 --agree-tos --no-eff-email --dry-run
sudo certbot certonly --webroot -w /var/www/mysite \
-d sunyichen.bond -d www.sunyichen.bond \
-m 你的邮箱 --agree-tos --no-eff-email
4. 改写站点配置:80 负责跳转,443 提供内容:
sudo cp /etc/nginx/conf.d/mysite.conf /etc/nginx/conf.d/mysite.conf.bak
sudo vi /etc/nginx/conf.d/mysite.conf
server {
listen 80;
server_name sunyichen.bond www.sunyichen.bond;
location /.well-known/acme-challenge/ { root /var/www/mysite; }
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl;
server_name sunyichen.bond www.sunyichen.bond;
ssl_certificate /etc/letsencrypt/live/sunyichen.bond/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sunyichen.bond/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/mysite;
index index.html;
location / { try_files $uri $uri/ =404; }
}
sudo nginx -t
sudo systemctl reload nginx
5. 配置自动续期(定时器 + deploy 钩子):
sudo systemctl enable --now certbot-renew.timer
sudo vi /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
sudo certbot renew --dry-run