Debian 服务器上线前必做的安全加固清单,小白也能照着做
Debian 安全加固方案|零基础可学
Debian 是一款稳定、可靠、广泛应用于服务器环境的 Linux 发行版。很多网站、数据库、网关、开发环境、容器平台都运行在 Debian 上。它默认已经具备较好的安全基础,但“默认安全”并不等于“足够安全”。一台刚安装完成的 Debian 服务器,如果没有经过合理加固,可能会面临弱口令、SSH 暴力破解、服务暴露、权限滥用、漏洞未修复、日志缺失等风险。
本文面向零基础用户,尽量用清晰、可操作的方式介绍 Debian 安全加固方案。你可以把它当作一份服务器上线前的安全检查清单,也可以作为日常运维的入门指南。
一、安全加固的基本原则
在开始具体操作之前,需要先理解几个基础原则。
1. 最小权限原则
每个用户、服务、程序只应该拥有完成工作所需的最低权限。
例如:
- 普通用户不应长期使用 root 账号;
- 网站服务不应该拥有系统管理权限;
- 数据库端口不应对公网开放;
- 不需要的软件包应当卸载。
权限越少,攻击者成功入侵后能造成的破坏就越小。
2. 最小暴露原则
服务器上开放的端口越多,被攻击的入口就越多。
因此应该做到:
- 不需要的服务不开启;
- 不需要公网访问的服务只监听本地地址;
- 使用防火墙限制访问来源;
- 只开放必要端口,如 SSH、HTTP、HTTPS。
3. 持续更新原则
安全不是一次性工作。系统和软件都会不断发现新漏洞,因此需要定期更新:
- Debian 系统补丁;
- OpenSSH、Nginx、Apache、MySQL 等服务;
- Web 程序和依赖包;
- 容器镜像。
4. 可审计原则
系统出了问题,必须能追踪发生了什么。日志、安全审计、登录记录、命令历史都是重要线索。没有日志,就很难判断服务器是否被攻击、攻击从哪里来、攻击者做了什么。
二、安装系统后的第一步:更新 Debian
服务器安装完成后,第一件事是更新软件源和系统补丁。
sudo apt update
sudo apt upgrade -y
如果有内核更新,建议重启服务器:
sudo reboot
如果你希望升级所有可升级的软件包,包括依赖变化较大的包,可以执行:
sudo apt full-upgrade -y
清理无用依赖:
sudo apt autoremove -y
sudo apt autoclean
保持系统更新是最基础、也是最有效的安全措施之一。很多入侵事件并不是因为攻击技术多么复杂,而是服务器长时间不打补丁,导致已知漏洞被轻松利用。
三、创建普通用户,避免直接使用 root
很多新手习惯直接使用 root 登录服务器,但这并不安全。一旦 root 密码被破解,攻击者就可以完全控制系统。
建议创建一个普通用户,并授予 sudo 权限。
adduser adminuser
将用户加入 sudo 组:
usermod -aG sudo adminuser
然后切换到该用户测试:
su - adminuser
sudo whoami
如果输出:
root
说明 sudo 权限正常。
以后日常操作尽量使用普通用户登录,需要管理员权限时再使用 sudo。
四、加固 SSH 登录安全
SSH 是服务器最常见的远程管理入口,也是攻击者最常扫描和暴力破解的目标。因此 SSH 加固非常重要。
SSH 配置文件通常位于:
/etc/ssh/sshd_config
编辑配置:
sudo nano /etc/ssh/sshd_config
1. 禁止 root 远程登录
找到或添加以下配置:
PermitRootLogin no
这样即使攻击者知道 root 密码,也不能直接通过 SSH 登录 root。
2. 修改默认 SSH 端口
默认 SSH 端口是 22,容易被扫描。可以改成其他端口,例如 2222:
Port 2222
注意:修改端口后,防火墙也要放行新端口,否则可能无法连接服务器。
连接时需要指定端口:
ssh adminuser@服务器IP -p 2222
3. 禁用密码登录,使用密钥登录
密钥登录比密码登录安全得多。先在本地电脑生成密钥:
ssh-keygen -t ed25519
将公钥复制到服务器:
ssh-copy-id -p 2222 adminuser@服务器IP
确认密钥登录成功后,再关闭密码登录:
PasswordAuthentication no
PubkeyAuthentication yes
4. 限制允许登录的用户
如果服务器只允许某些用户通过 SSH 登录,可以添加:
AllowUsers adminuser
5. 重启 SSH 服务
修改配置后,先检查配置是否正确:
sudo sshd -t
如果没有输出错误,再重启 SSH:
sudo systemctl restart ssh
重要提醒:修改 SSH 配置时,不要立即关闭当前连接窗口。建议另开一个终端测试新连接,确认可以登录后再退出旧连接,避免把自己锁在服务器外面。
五、配置防火墙 UFW
Debian 可以使用 ufw 进行简单防火墙管理。安装 UFW:
sudo apt install ufw -y
默认拒绝所有入站连接,允许出站连接:
sudo ufw default deny incoming
sudo ufw default allow outgoing
放行 SSH 端口,例如前面改成了 2222:
sudo ufw allow 2222/tcp
如果服务器需要提供网站服务,放行 HTTP 和 HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
启用防火墙:
sudo ufw enable
查看状态:
sudo ufw status verbose
如果你只允许固定 IP 登录 SSH,例如公司公网 IP 为 1.2.3.4,可以这样写:
sudo ufw allow from 1.2.3.4 to any port 2222 proto tcp
这样可以大幅减少 SSH 被暴力破解的风险。
六、关闭不必要的服务和端口
很多安全问题来自不必要的服务暴露。先查看当前监听端口:
sudo ss -tulnp
你会看到类似内容:
LISTEN 0 128 0.0.0.0:22
LISTEN 0 128 0.0.0.0:80
LISTEN 0 128 127.0.0.1:3306
常见端口含义:
| 端口 | 服务 | 说明 |
|---|---|---|
| 22 | SSH | 远程登录 |
| 80 | HTTP | 网站访问 |
| 443 | HTTPS | 加密网站访问 |
| 3306 | MySQL/MariaDB | 数据库 |
| 5432 | PostgreSQL | 数据库 |
| 6379 | Redis | 缓存数据库 |
如果发现某个服务不需要,应停止并禁用:
sudo systemctl stop 服务名
sudo systemctl disable 服务名
例如禁用 Apache:
sudo systemctl stop apache2
sudo systemctl disable apache2
如果确认软件包不再需要,可以卸载:
sudo apt remove apache2 -y
七、设置自动安全更新
对于服务器来说,及时安装安全补丁非常重要。Debian 可以使用 unattended-upgrades 自动安装安全更新。
安装:
sudo apt install unattended-upgrades apt-listchanges -y
启用自动更新配置:
sudo dpkg-reconfigure unattended-upgrades
选择 Yes。
也可以查看配置文件:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
一般情况下,默认配置已经足够。自动安全更新能降低因遗忘打补丁带来的风险,但对于生产服务器,仍建议配合监控和定期人工检查,避免更新后服务异常而无人发现。
八、配置 Fail2ban 防止暴力破解
Fail2ban 可以监控日志,当发现某个 IP 多次登录失败时,自动封禁该 IP。
安装:
sudo apt install fail2ban -y
创建本地配置文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑配置:
sudo nano /etc/fail2ban/jail.local
找到 [sshd] 部分,设置:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
含义如下:
enabled = true:启用 SSH 防护;port = 2222:SSH 端口;maxretry = 5:10 分钟内失败 5 次就封禁;bantime = 3600:封禁 1 小时;findtime = 600:统计时间窗口为 600 秒。
重启 Fail2ban:
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
查看状态:
sudo fail2ban-client status
sudo fail2ban-client status sshd
Fail2ban 对 SSH 暴力破解非常有效,但它不能替代密钥登录和防火墙限制。最佳实践是多层防护一起使用。
九、加强密码策略
如果服务器仍需要使用密码登录或存在多个本地用户,应设置强密码策略。
1. 安装密码质量检查模块
sudo apt install libpam-pwquality -y
编辑配置:
sudo nano /etc/security/pwquality.conf
可以设置:
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
含义:
minlen = 12:密码至少 12 位;dcredit = -1:至少包含 1 个数字;ucredit = -1:至少包含 1 个大写字母;lcredit = -1:至少包含 1 个小写字母;ocredit = -1:至少包含 1 个特殊字符。
2. 设置密码有效期
编辑:
sudo nano /etc/login.defs
可设置:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
含义:
- 密码最长使用 90 天;
- 修改密码后至少 1 天才能再次修改;
- 过期前 7 天提醒。
对已有用户也可以使用:
sudo chage -M 90 -m 1 -W 7 adminuser
对于个人服务器,如果已经使用 SSH 密钥登录并禁用密码登录,密码复杂度策略的重要性会降低,但仍建议保持强密码。
十、保护 sudo 权限
sudo 是普通用户临时获得管理员权限的工具。它很方便,但也要谨慎配置。
查看 sudo 用户:
getent group sudo
移除不需要 sudo 权限的用户:
sudo deluser 用户名 sudo
编辑 sudo 配置应使用:
sudo visudo
不要直接编辑 /etc/sudoers,否则语法错误可能导致 sudo 无法使用。
你可以设置 sudo 需要输入密码,避免任何普通用户免密执行管理员命令。检查是否存在类似配置:
NOPASSWD: ALL
如果不需要,建议删除或改为需要密码。
也可以让 sudo 记录更详细的日志,便于审计用户执行了哪些命令。
十一、文件权限与关键目录保护
Linux 安全很大程度上依赖文件权限。权限配置错误可能导致敏感文件泄露或被篡改。
1. 检查重要文件权限
ls -l /etc/passwd /etc/shadow /etc/sudoers
通常应类似:
-rw-r--r-- 1 root root /etc/passwd
-rw------- 1 root shadow /etc/shadow
-r--r----- 1 root root /etc/sudoers
如果权限异常,需要修复:
sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow
sudo chmod 440 /etc/sudoers
2. 查找全局可写文件
全局可写文件可能被任何用户修改,存在风险:
sudo find / -xdev -type f -perm -0002
查找全局可写目录:
sudo find / -xdev -type d -perm -0002
像 /tmp 这种目录本来就允许写入,但应设置粘滞位:
ls -ld /tmp
应看到类似:
drwxrwxrwt
如果没有 t,执行:
sudo chmod 1777 /tmp
十二、日志审计与安全排查
日志是发现攻击和排查问题的重要依据。Debian 常见日志包括:
| 日志文件 | 用途 |
|---|---|
/var/log/auth.log |
登录、sudo、SSH 认证记录 |
/var/log/syslog |
系统运行日志 |
/var/log/daemon.log |
后台服务日志 |
/var/log/nginx/ |
Nginx 日志 |
/var/log/apache2/ |
Apache 日志 |
查看最近登录失败记录:
sudo grep "Failed password" /var/log/auth.log
查看 sudo 使用记录:
sudo grep "sudo" /var/log/auth.log
查看最近登录用户:
last
查看失败登录:
lastb
如果 lastb 命令不可用,可以安装:
sudo apt install util-linux -y
建议定期检查日志,尤其是 SSH 登录失败次数、异常 IP、未知用户、频繁 sudo 操作等。
十三、安装安全审计工具 Lynis
Lynis 是一款常用的 Linux 安全审计工具,可以扫描系统配置并给出加固建议。
安装:
sudo apt install lynis -y
执行扫描:
sudo lynis audit system
扫描完成后,它会给出建议,例如:
- 是否启用防火墙;
- SSH 是否允许 root 登录;
- 是否存在弱配置;
- 是否缺少安全工具;
- 文件权限是否合理。
Lynis 的建议不一定全部都要照做,但非常适合用来做基线检查。
十四、数据库服务安全建议
如果 Debian 上运行 MySQL、MariaDB、PostgreSQL、Redis 等服务,应特别注意数据库安全。
1. 不要让数据库直接暴露公网
数据库通常只应本机访问,监听地址建议设置为:
127.0.0.1
例如 MySQL/MariaDB 配置中:
bind-address = 127.0.0.1
如果确实需要远程访问,应通过:
- VPN;
- 内网;
- SSH 隧道;
- 防火墙限制固定 IP;
不要直接向全网开放 3306、5432、6379 等端口。
2. 设置强密码和独立账号
不要让业务程序使用数据库 root 账号。应为每个应用创建独立数据库用户,并只授予必要权限。
例如 MySQL:
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
3. Redis 不应裸奔
Redis 如果没有密码且暴露公网,风险极高。建议:
- 只监听
127.0.0.1; - 设置访问密码;
- 关闭危险命令或重命名;
- 使用防火墙限制访问。
十五、Web 服务安全建议
如果服务器运行网站,应关注 Nginx、Apache、PHP、Node.js 等服务的安全。
1. 使用 HTTPS
建议使用 Let’s Encrypt 免费证书。安装 Certbot:
sudo apt install certbot python3-certbot-nginx -y
为 Nginx 申请证书:
sudo certbot --nginx
HTTPS 可以保护用户数据传输,避免密码、Cookie 等被窃听。
2. 隐藏版本信息
Nginx 可以在配置中加入:
server_tokens off;
Apache 可以配置:
ServerTokens Prod
ServerSignature Off
隐藏版本信息不能真正阻止攻击,但可以减少攻击者获取指纹信息的便利。
3. 限制上传目录执行权限
如果网站允许用户上传文件,上传目录不应执行脚本。例如用户上传了伪装图片的 PHP 文件,如果上传目录能执行 PHP,就可能导致服务器被入侵。
4. 定期更新 Web 程序
无论是 WordPress、Discuz、Typecho,还是自研系统,都应及时更新。很多服务器被入侵,不是 Debian 本身的问题,而是 Web 应用存在漏洞。
十六、备份与恢复策略
安全加固不仅是防攻击,也包括在出问题后能够恢复。没有备份的服务器,即使安全做得再好,也存在重大风险。
建议至少备份:
- 网站文件;
- 数据库;
- 配置文件,如
/etc; - SSL 证书;
- 业务上传文件;
- 重要日志。
备份原则:
- 定期备份:例如每天备份数据库,每周备份全量文件;
- 异地备份:不要只备份在同一台服务器;
- 加密备份:避免备份文件泄露;
- 测试恢复:只会备份不会恢复,等于没有备份;
- 保留多个版本:防止误删或被勒索软件加密后同步到备份。
可以使用 rsync、borgbackup、restic、对象存储等方式实现备份。
十七、基础安全检查清单
下面是一份适合新手使用的 Debian 上线前安全检查清单:
- [ ] 系统已执行
apt update && apt upgrade - [ ] 已创建普通用户并配置 sudo
- [ ] 已禁止 root SSH 登录
- [ ] 已使用 SSH 密钥登录
- [ ] 已禁用 SSH 密码登录
- [ ] 已修改默认 SSH 端口或限制来源 IP
- [ ] 已启用 UFW 防火墙
- [ ] 只开放必要端口
- [ ] 已安装并配置 Fail2ban
- [ ] 已关闭不必要服务
- [ ] 已设置自动安全更新
- [ ] 已检查 sudo 用户
- [ ] 已检查关键文件权限
- [ ] 已开启 HTTPS
- [ ] 数据库未暴露公网
- [ ] 已配置日志检查
- [ ] 已建立备份方案
- [ ] 已测试备份恢复
- [ ] 已使用 Lynis 做安全审计
十八、常用命令汇总
查看系统版本:
cat /etc/debian_version
查看内核版本:
uname -a
查看监听端口:
sudo ss -tulnp
查看运行服务:
systemctl list-units --type=service --state=running
查看防火墙状态:
sudo ufw status verbose
查看 SSH 服务状态:
sudo systemctl status ssh
查看登录记录:
last
查看认证日志:
sudo tail -n 100 /var/log/auth.log
查看失败登录:
sudo grep "Failed password" /var/log/auth.log
查看系统更新:
sudo apt update
sudo apt list --upgradable
执行安全审计:
sudo lynis audit system
十九、新手容易犯的错误
1. 直接关闭 SSH 密码登录但没有测试密钥
这是非常常见的问题。正确做法是:先配置密钥,确认新终端能登录,再关闭密码登录。
2. 修改 SSH 端口后忘记放行防火墙
如果防火墙没有放行新端口,重启 SSH 后可能无法远程连接。
3. 数据库端口暴露公网
很多 Redis、MySQL 入侵都来自公网暴露。数据库服务除非有明确需求,否则不要对公网开放。
4. 所有服务都使用 root 运行
业务服务应使用独立低权限用户运行。不要让网站程序、脚本长期以 root 身份执行。
5. 没有备份或从不测试恢复
备份不是放在那里就行,必须定期测试恢复流程。真正事故发生时,能恢复才有意义。
二十、总结
Debian 安全加固并不神秘,核心思路可以概括为四句话:
- 减少入口:只开放必要端口,关闭不用服务;
- 强化认证:禁用 root 登录,使用 SSH 密钥,配置强密码;
- 及时更新:安装安全补丁,启用自动更新;
- 可查可恢复:保留日志,配置审计,做好备份。
对于零基础用户来说,不需要一开始就追求复杂的企业级安全体系。你可以先完成最关键的几项:更新系统、创建普通用户、加固 SSH、启用防火墙、安装 Fail2ban、关闭不必要端口、做好备份。只要这些基础措施落实到位,服务器安全性就会明显提升。
安全是一个持续过程,而不是一次性配置。随着业务增长,你还可以继续学习入侵检测、漏洞扫描、WAF、权限隔离、容器安全、集中日志、零信任访问等更高级的安全方案。对于大多数 Debian 服务器而言,扎实做好基础加固,已经能抵御大量常见攻击。