我的运维笔记

第01讲 服务器安全加固 Rocky9

课程目标

1、暴力破解现象查看

公网服务器22端口会被扫描器暴力破解,查看ssh登录失败日志:

sudo journalctl -u sshd | grep -i "failed" | tail -30

2、两条登录通道

  1. SSH通道(含Workbench):走公网22端口,受sshd配置管控;配置出错会断开,不能当后路。
  2. VNC带外通道(救命后路):阿里云带外管理,不经过安全组、不经过sshd。修改SSH配置出错,可通过VNC登录修复。VNC登录终端为/dev/tty1;SSH登录为伪终端如/dev/pts/0。

3、SSH密钥登录原理

生成密钥对:私钥(本地保存,绝不外传);公钥(放到服务器,可以公开)。服务器用公钥出题,只有对应私钥可以解密完成登录。

3.1 创建普通用户study

sudo adduser study
sudo passwd study
sudo usermod -aG wheel study

3.2 本地电脑生成密钥对

ssh-keygen -t ed25519 -C "你的名字-服务器加固"

Windows查看公钥:type $env:USERPROFILE\.ssh\id_ed25519.pub

Mac/Linux查看公钥:cat ~/.ssh/id_ed25519.pub

3.3 服务器部署公钥(权限非常关键)

mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
#粘贴公钥一整行保存退出
chmod 600 ~/.ssh/authorized_keys
ls -l ~/.ssh

⚠️纪律:先测试密钥可以登录成功,再禁用密码登录,防止锁门

ssh study@服务器公网IP

3.4 创建teacher巡检账号(存放老师公钥)

sudo adduser teacher
sudo mkdir -p /home/teacher/.ssh
sudo vi /home/teacher/.ssh/authorized_keys
#粘贴老师公钥
sudo chmod 700 /home/teacher/.ssh
sudo chmod 600 /home/teacher/.ssh/authorized_keys
sudo chown -R teacher:teacher /home/teacher/.ssh

echo "teacher ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/teacher
sudo chmod 440 /etc/sudoers.d/teacher
sudo visudo -c
sudo -u teacher sudo -n true && echo "teacher 免密 sudo 可用"

3.5 修改sshd_config配置加固SSH

sudo vi /etc/ssh/sshd_config

修改/新增配置项:

sudo sshd -t
sudo systemctl reload sshd

4、两层防护:安全组 + firewalld主机防火墙

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

ICMP协议没有端口概念;安全组ICMP显示“任何”不是开放全部端口,用于ping连通性测试。

sudo ss -tlnp

5、fail2ban自动封禁暴力破解IP

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

常见故障自救

第02讲 网站上线:域名解析与Nginx个人主页

课程目标

1、DNS域名解析

nslookup 你的域名
nslookup www.你的域名

2、放行80端口(HTTP)

阿里云安全组入方向开放TCP 80;主机防火墙配置:

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
systemctl status nginx
nginx -v

4、创建网站目录

sudo mkdir -p /var/www/mysite
sudo chown -R study:study /var/www/mysite
sudo chmod 755 /var/www/mysite
ls -ld /var/www/mysite

阿里云Rocky镜像SELinux默认Disabled;其他环境403需要排查SELinux。

5、编写Nginx站点配置 /etc/nginx/conf.d/mysite.conf

server {
    listen 80;
    server_name example.com www.example.com;
    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/

服务器直接编辑:vi /var/www/mysite/index.html

💡原理:Nginx依靠HTTP请求头Host字段匹配server_name;IP访问没有域名Host,匹配默认站点,展示Nginx默认页面。

curl -H "Host:你的域名" http://127.0.0.1

7、403 Forbidden权限故障排查

8、查看网站访问日志

sudo tail -f /var/log/nginx/mysite_access.log

故障速查表

第03讲 HTTPS与证书自动续期

课程目标

1、HTTP明文抓包实验

sudo dnf install -y tcpdump
sudo tcpdump -i any -A -nn 'tcp port 80' | grep -a -E "GET |Host:|User-Agent|<title>"

HTTP所有传输明文,可以被中间设备抓取请求、页面内容。HTTPS加密业务载荷,但SNI会明文传输访问域名。

2、证书验证原理 HTTP‑01

  1. certbot生成验证文件放在网站目录/.well-known/acme-challenge/
  2. Let’s Encrypt公网访问这个文件,确认你控制该域名,才下发证书。
  3. 前提条件:域名解析正确、80端口开放、Nginx正确服务验证文件。

3、放行443端口HTTPS

安全组TCP443放行;防火墙配置:

sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

⚠️80端口不能关闭:①访问者http跳转https;②证书续期仍然需要80端口验证。

4、certbot申请证书

sudo dnf install -y certbot
certbot --version

先演练dry‑run,不消耗正式申请次数:

sudo certbot certonly --webroot -w /var/www/mysite \
-d example.com -d www.example.com \
-m 你的邮箱 --agree-tos --no-eff-email --dry-run

演练成功去掉--dry-run正式申请证书。

sudo certbot certificates
sudo ls -l /etc/letsencrypt/live/example.com/

5、改写Nginx配置mysite.conf

#80端口,跳转https,保留acme验证路径
server {
    listen 80;
    server_name example.com www.example.com;
    location /.well-known/acme-challenge/ {
        root /var/www/mysite;
    }
    location / {
        return 301 https://$host$request_uri;
    }
}

#443 HTTPS服务
server {
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    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、配置证书自动续期

sudo systemctl enable --now certbot-renew.timer
systemctl list-timers 'certbot*'

编写deploy钩子脚本,续期成功自动重载nginx:

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 /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
sudo certbot renew --dry-run

HTTPS抓包对比

sudo tcpdump -i any -A -nn -c 40 'tcp port 443'

业务内容密文乱码;但访问域名SNI明文可见。HTTPS加密传输内容,不加密访问的目标域名。

故障要点