我的运维笔记

第01讲 服务器安全加固

1、为什么要加固服务器

公网服务器会被扫描器7×24小时扫描,针对22端口SSH进行暴力破解,大量陌生IP尝试用户名密码登录。

# 查看ssh登录失败日志
sudo journalctl -u sshd | grep -i "failed" | tail -30

2、服务器两条登录通道(重要)

运维三大习惯:私钥永不外传;改配置先留后路(VNC);先验证再收口。

3、SSH密钥登录原理

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

3.1 创建普通用户 study

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

加固后禁止root远程SSH登录,日常使用普通study账号操作。修改配置前,务必先用VNC登录一次验证后路可用。

3.2 本地电脑生成密钥对(Windows PowerShell / Mac/Linux终端)

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

复制公钥整行,上传到服务器study用户的 ~/.ssh/authorized_keys,严格设置目录、文件权限:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ls -l ~/.ssh
权限错误会导致密钥登录直接失败,SSH不会给出明确报错。目录权限700,authorized_keys权限600。

先验证密钥登录成功,再关闭密码登录!

ssh study@服务器公网IP

3.3 巡检账号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

#配置免密sudo
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.4 修改sshd配置 /etc/ssh/sshd_config

关键配置项:

sudo vi /etc/ssh/sshd_config
sudo sshd -t #语法校验,无输出代表正确
sudo systemctl reload sshd

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

#firewalld放行ssh
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

#查看监听端口
sudo ss -tlnp

安全组入方向保留TCP22,删除不用端口;ICMP IPv4可保留。

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

#安装epel源与fail2ban
sudo dnf install -y epel-release
sudo dnf install -y fail2ban

新建配置文件 /etc/fail2ban/jail.d/sshd.local,不要修改jail.conf主文件。Rocky9使用backend=systemd读取systemd日志,不要读取老的/var/log/secure。

[sshd]
enabled = true
backend = systemd
maxretry = 3
findtime = 600
bantime = 3600
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

第1讲常见自救点

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

1、DNS域名解析

DNS:域名系统,相当于互联网通讯录,把域名翻译为服务器公网IP。

解析记录A记录(IPv4):

#验证解析
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

创建网站目录,修改目录归属study用户:

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 #阿里云Rocky默认SELinux=Disabled

编写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访问不会匹配域名配置,返回系统默认页面。

4、上传index.html主页

主页底部必须放置ICP备案号,跳转工信部备案网站。

#本地scp上传
scp index.html study@服务器公网IP:/var/www/mysite/

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

5、网站403排障重点

Nginx工作进程运行身份nginx用户;网页文件权限至少644,网站目录至少755;权限过小nginx无法读取文件返回403。优先查看错误日志:

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

6、查看网站访问日志

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

第2讲故障排查速查表

第03讲 HTTPS与证书自动续期

1、HTTP明文风险

HTTP全部流量明文传输,中间网络节点可以直接抓取请求URL、User‑Agent、表单账号密码。HTTPS=HTTP+TLS加密;两件事:①传输内容加密;②身份认证(数字证书证明服务器身份)。

#抓包观察80明文http
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、Let's Encrypt证书原理 HTTP‑01验证</h3>
    <ol>
        <li>certbot生成随机验证文件放置网站目录 <code>/.well‑known/acme‑challenge/</code></li>
        <li>Let’s Encrypt公网访问http域名读取验证文件</li>
        <li>读取成功证明你控制该域名,签发证书。</li>
    </ol>
    <p>前提条件:域名解析正确;80端口开放;Nginx正确提供验证文件。证书有效期90天,未来缩短至45天,无到期提醒,<strong>必须配置自动续期</strong>。</p>

    <h3>3、开放HTTPS的443端口,80端口不能关闭</h3>
    <p>两个理由:①用户输入http访问跳转https;②证书续期HTTP‑01验证依赖80端口。</p>
<pre><code>sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
</code></pre>
    <p>阿里云安全组入方向放行TCP443。</p>

    <h3>4、certbot申请证书</h3>
<pre><code>sudo dnf install -y certbot
certbot --version
</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 --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><code>fullchain.pem</code>:证书+中间证书,发给浏览器</li>
        <li><code>privkey.pem</code>:证书私钥,服务器保存,绝对不能泄露,泄露可以冒充网站。</li>
    </ul>

    <h3>5、Nginx HTTPS完整配置</h3>
    <p>备份旧配置 <code>sudo cp /etc/nginx/conf.d/mysite.conf /etc/nginx/conf.d/mysite.conf.bak</code></p>
<pre><code># 80端口:处理acme验证,其余全部301跳转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>#启用certbot定时器
sudo systemctl enable --now certbot-renew.timer
systemctl list-timers 'certbot*'
</code></pre>
    <p>编写deploy钩子脚本,证书续期成功自动重载nginx加载新证书:<code>/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>
    <div class="note-box">
        HTTPS加密<strong>传输内容(页面、POST表单)</strong>;SNI阶段域名仍然明文,第三方可以知道访问哪个域名,只是看不到页面里面内容。
    </div>

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