我的运维笔记

第 1 讲 服务器安全加固

1.攻击现象:暴力破解

公网服务器会被扫描器持续扫描22端口,尝试大量用户名密码进行暴力破解。查看SSH登录失败日志命令:

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

2.两条登录通道(重要)

运维三个好习惯:私钥永不外传、改配置先留后路、先验证再收口。

3.SSH密钥登录原理

3.1 创建普通用户study

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

3.2 本地生成ed25519密钥对(本机PowerShell/终端)

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会直接拒绝密钥登录,无报错。必须先验证密钥登录成功,再禁用密码登录。

3.4 创建teacher巡检账号(安装老师公钥,免密sudo)

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安全配置

编辑 sudo vi /etc/ssh/sshd_config,修改/新增:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers study teacher
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协议没有端口概念,安全组显示“任何”不是开放全部端口,仅用于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

6.常见自救

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

1.DNS域名系统

DNS作用:把域名翻译为服务器公网IP。网站上线三环节:DNS解析、开放端口、Nginx服务。

添加解析记录(阿里云云解析DNS)

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

2.开放80端口HTTP服务

安全组入方向放行TCP 80;firewalld放行http服务。

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

建立网站目录

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

站点配置文件 /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

server_name依靠HTTP请求Host头区分不同网站;IP访问不会匹配server_name,返回Nginx默认页面。

4.上传主页文件

scp index.html study@你的服务器公网IP:/var/www/mysite/

合规要求:页面底部放置ICP备案号,链接工信部备案官网。

5.403 Forbidden故障排查

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

常见故障速查表

第 3 讲 HTTPS 与证书自动续期

1.HTTP明文风险

HTTP传输全部明文,中间网络设备可以抓取请求、参数。tcpdump抓包80端口可以看到GET、Host、UA等信息。

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

    <h3>2.HTTPS(TLS)作用</h3>
    <ul>
        <li>加密传输内容;身份认证,确认服务器真实身份,防止中间人冒充。依靠CA数字证书。</li>
        <li>使用Let’s Encrypt免费证书,有效期仅90天,未来缩短到45天,无邮件提醒,必须配置自动续期。</li>
        <li>HTTP‑01验证:CA访问服务器http域名下/.well‑known/acme‑challenge/验证文件,确认域名控制权。</li>
    </ul>

    <h3>3.开放443端口HTTPS</h3>
    <p>安全组放行TCP443;firewalld放行https。<strong>80端口不能关闭:用于http跳转 + 证书续期验证。</strong></p>
<pre><code>sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services</code></pre>

    <h3>4.certbot申请证书</h3>
<pre><code>sudo dnf install -y certbot
certbot --version</code></pre>
    <p>演练模式(不消耗正式申请次数):</p>
<pre><code>sudo certbot certonly --webroot -w /var/www/mysite \
‑d example.com -d www.example.com \
‑m 你的邮箱 --agree-tos --no-eff-email --dry-run</code></pre>
    <p>演练成功去掉--dry‑run正式申请。查看证书:</p>
<pre><code>sudo certbot certificates
sudo ls -l /etc/letsencrypt/live/example.com/</code></pre>
    <ul>
        <li>fullchain.pem:证书+中间证书发给客户端</li>
        <li>privkey.pem:证书私钥,服务器解密使用,严禁泄露!</li>
    </ul>

    <h3>5.Nginx HTTPS完整配置</h3>
<pre><code>sudo cp /etc/nginx/conf.d/mysite.conf /etc/nginx/conf.d/mysite.conf.bak
sudo vi /etc/nginx/conf.d/mysite.conf</code></pre>
<pre><code>#80端口,跳转+证书验证
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;
    }
}</code></pre>
<pre><code>sudo nginx -t
sudo systemctl reload nginx</code></pre>

    <h3>6.配置证书自动续期</h3>
<pre><code>sudo systemctl enable --now certbot-renew.timer
systemctl list-timers 'certbot*'</code></pre>
    <p>编写deploy钩子脚本,续期成功重载Nginx:</p>
<pre><code>sudo vi /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh</code></pre>
<pre><code>#!/bin/bash
systemctl reload nginx</code></pre>
<pre><code>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</code></pre>

    <h3>7.HTTPS抓包对比</h3>
<pre><code>sudo tcpdump -i any -A -nn -c 40 'tcp port 443'</code></pre>
    <p>传输内容全部加密;但SNI的域名仍然明文传输。HTTPS加密传输内容,不加密访问的目标域名。</p>

    <footer>
        <a href="https://beian.miit.gov.cn/" target="_blank">浙ICP备2026082970号-1</a>
    </footer>
</body>
</html>