我的运维笔记

第1讲 服务器安全加固

1. 为什么要加固

公网服务器会被扫描器暴力破解SSH(22端口),使用日志查看爆破记录:

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

2. 两条登录通道

3. SSH密钥登录原理

4. 创建普通用户study

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

5. 本地生成ed25519密钥对

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

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

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

6. 服务器配置公钥,权限非常关键

mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ls -l ~/.ssh
⚠️ 运维铁律:先验证密钥登录成功,再禁用密码登录,防止锁门外;VNC作为兜底自救手段。

7. 巡检账号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 可用"

8. 修改sshd_config SSH加固配置

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

sudo sshd -t
sudo systemctl reload sshd

9. 两层防护:安全组 + firewalld主机防火墙

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

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

sudo ss -tlnp

10. 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

11. 运维三大习惯

  1. 私钥永不外传
  2. 改配置先留后路(VNC自救)
  3. 先验证,再收口

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

1. DNS域名系统

DNS作用:域名翻译成服务器公网IP,相当于互联网通讯录。网站上线三环节:DNS解析、开放端口、Nginx Web服务。

2. 域名解析A记录

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

3. 开放80端口HTTP(安全组+firewalld)

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

4. Nginx安装启动

sudo dnf install -y nginx
sudo systemctl enable --now nginx
systemctl status nginx
nginx -v

5. 创建网站目录

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
getenforce

6. 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
Nginx依靠HTTP请求头Host字段(server_name)区分多个网站。IP访问没有域名Host,会匹配默认站点,出现Nginx默认页面。

7. 上传网页

scp index.html study@服务器公网IP:/var/www/mysite/
# 或者服务器内vi编辑
vi /var/www/mysite/index.html

8. 403 Forbidden排障

Nginx工作进程以nginx用户运行。网页文件权限至少644,目录至少755;优先查看nginx错误日志排查Permission denied。

sudo tail -3 /var/log/nginx/mysite_error.log

9. 查看网站访问日志

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

第3讲 HTTPS与证书自动续期

1. HTTP明文风险

HTTP全部明文传输,中间人可以直接读取请求、表单数据。使用tcpdump抓包观察80端口明文流量。

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 = HTTP + TLS加密</h3>
    <ul>
        <li>加密传输数据;身份认证,防止冒充服务器;依靠CA数字证书(网站身份证)。</li>
        <li>使用Let's Encrypt免费CA;证书有效期90天,未来缩短至45天,无邮件提醒,必须自动续期。</li>
    </ul>
    <p>HTTP‑01验证:CA访问服务器上特定http路径验证域名控制权;前提条件:域名解析正确、80端口开放、Nginx配置正确。</p>

    <h3>3. 开放443端口HTTPS,80端口<strong>不能关闭</strong></h3>
<pre><code>sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services</code></pre>
    <p>80端口两个用途:① http访问跳转https;② 证书续期HTTP‑01验证。</p>

    <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 certonly --webroot -w /var/www/mysite \
-d example.com -d www.example.com \
-m 你的邮箱 --agree-tos --no-eff-email</code></pre>
<pre><code>sudo certbot certificates
sudo ls -l /etc/letsencrypt/live/example.com/</code></pre>
    <ul>
        <li><code>fullchain.pem</code>:对外提供证书</li>
        <li><code>privkey.pem</code>:证书私钥,严禁泄露,泄露会被冒充网站</li>
    </ul>

    <h3>5. Nginx HTTPS完整配置</h3>
<pre><code>#备份旧配置
sudo cp /etc/nginx/conf.d/mysite.conf /etc/nginx/conf.d/mysite.conf.bak</code></pre>
<pre><code># 80端口:跳转https + 证书验证文件
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:<code>sudo vi /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh</code></p>
<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>HTTPS加密<strong>传输内容</strong>;但是SNI域名是明文,第三方可以看到访问哪个域名,看不到页面内容。</p>

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