在当今数字化时代,服务器安全是每个系统管理员和开发者的首要任务。Ubuntu作为最受欢迎的Linux发行版之一,因其稳定性、安全性和庞大的社区支持,被广泛用于服务器部署。然而,默认安装的Ubuntu服务器并非绝对安全,需要通过一系列配置来强化其防御能力。本文将从基础配置入手,逐步深入到高级防护策略,帮助你打造一个坚不可摧的服务器环境。我们将涵盖系统更新、用户管理、防火墙设置、SSH安全、入侵检测、日志监控等关键领域,并提供详细的步骤和代码示例。无论你是初学者还是经验丰富的管理员,都能从中获益。
1. 基础系统更新与最小化安装
服务器安全的第一步是确保系统是最新的,并采用最小化安装原则。这能减少潜在的漏洞暴露面。Ubuntu的软件仓库定期发布安全补丁,及时更新是防范已知威胁的基础。
1.1 更新系统
首先,登录服务器(假设你已通过初始访问方式如控制台或默认SSH连接),运行以下命令更新包列表并升级所有已安装的软件包:
# 更新包列表
sudo apt update
# 升级所有软件包(包括安全更新)
sudo apt upgrade -y
# 如果有内核更新,重启服务器(在生产环境中,先备份数据)
sudo reboot
详细说明
:
apt update
从Ubuntu的官方仓库同步最新的包信息,包括安全补丁。
apt upgrade -y
自动安装更新,
-y
选项避免手动确认。
对于生产服务器,建议设置自动更新:安装
unattended-upgrades
包。
示例代码:
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades # 选择”Yes”启用自动更新
这会自动处理安全更新,而不会影响非安全包。你可以编辑
/etc/apt/apt.conf.d/50unattended-upgrades
来自定义行为,例如只更新安全包:
Unattended-Upgrade::Allowed-Origins {
“${distro_id}:${distro_codename}-security”;
};
1.2 最小化安装
从Ubuntu Server ISO安装时,选择“最小化安装”选项,只安装必要的软件包。避免安装图形界面(如GNOME),因为服务器通常不需要它,这能减少攻击向量。
为什么重要
?每个额外的软件包都可能引入漏洞。例如,安装不必要的服务如Apache或MySQL时,如果未正确配置,可能成为入口点。使用
tasksel
或手动选择核心包:
# 查看已安装包
dpkg –list | grep -E ‘apache|mysql|nginx’
# 卸载不必要的包(例如,如果未使用Apache)
sudo apt purge apache2 -y
sudo apt autoremove -y # 清理依赖
通过这些基础步骤,你的服务器将从一个干净、最新的状态开始,为后续安全配置铺平道路。
2. 用户和权限管理
默认的root账户是高风险目标,因为它拥有无限制的权限。强化用户管理是防止未授权访问的关键。
2.1 禁用Root登录并创建Sudo用户
首先,创建一个新用户并授予sudo权限,然后禁用root的直接登录。
# 创建新用户(替换yourusername为你的用户名)
sudo adduser yourusername
# 将用户添加到sudo组
sudo usermod -aG sudo yourusername
# 切换到新用户测试sudo
su – yourusername
sudo whoami # 应返回”root”
详细说明
:
adduser
会提示设置密码和用户信息。
usermod -aG sudo
将用户添加到sudo组,允许执行管理员命令。
接下来,禁用root登录:
# 编辑SSH配置文件
sudo nano /etc/ssh/sshd_config
# 找到并修改以下行:
PermitRootLogin no
PasswordAuthentication no # 禁用密码登录,只用密钥(稍后详述)
# 重启SSH服务
sudo systemctl restart ssh
为什么有效
?攻击者通常针对root账户进行暴力破解。禁用后,即使他们猜到密码,也无法直接访问。使用
visudo
编辑sudoers文件,进一步限制sudo权限:
sudo visudo
添加行如:
yourusername ALL=(ALL) NOPASSWD: /usr/bin/apt update # 只允许特定命令无需密码
2.2 设置强密码策略
使用PAM(Pluggable Authentication Modules)强制强密码。
编辑
/etc/pam.d/common-password
:
password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
解释
:
minlen=12
:最小长度12字符。
ucredit=-1
:至少一个大写字母。
lcredit=-1
:至少一个小写字母。
dcredit=-1
:至少一个数字。
ocredit=-1
:至少一个特殊字符。
运行
sudo pwquality
测试密码强度。这大大降低了密码被猜中的风险。
3. 防火墙配置(UFW)
Ubuntu的Uncomplicated Firewall (UFW) 是简单而强大的工具,用于控制入站和出站流量。
3.1 安装和启用UFW
UFW通常预装,但如果没有:
sudo apt install ufw -y
启用并默认拒绝所有入站流量:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
详细说明
:
default deny incoming
:阻止所有外部连接,除非明确允许。
default allow outgoing
:允许服务器向外连接(如更新包)。
3.2 允许必要端口
只开放必需端口,例如SSH(22端口)和HTTP(80端口,如果需要):
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP(可选)
sudo ufw allow 443/tcp # HTTPS(可选)
高级配置
:限制SSH只允许特定IP访问。
sudo ufw allow from 192.168.1.100 to any port 22 proto tcp
检查状态:
sudo ufw status verbose
输出示例:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
— —— —-
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
UFW与iptables集成,确保规则持久化。重启后规则会保留,但定期审计以移除不再需要的规则。
4. SSH安全强化
SSH是远程管理的主要方式,也是常见攻击目标。强化它能显著提升安全。
4.1 使用密钥认证代替密码
生成SSH密钥对(在本地机器上):
ssh-keygen -t rsa -b 4096 # 生成密钥,保存到~/.ssh/id_rsa
将公钥复制到服务器:
ssh-copy-id yourusername@your_server_ip
在服务器上禁用密码认证(如前文所述,在
/etc/ssh/sshd_config
中设置
PasswordAuthentication no
)。
为什么密钥更安全
?密钥是4096位加密,远超任何密码的强度。攻击者无法通过暴力破解密钥。
4.2 更改SSH端口和限制访问
编辑
/etc/ssh/sshd_config
:
Port 2222 # 更改默认22端口(选择1024-65535的未用端口)
PermitRootLogin no
MaxAuthTries 3 # 限制尝试次数
ClientAliveInterval 300 # 5分钟无活动断开
ClientAliveCountMax 2
重启SSH:
sudo systemctl restart ssh
更新UFW规则:
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp # 移除旧规则
注意
:更改端口后,确保更新所有客户端配置。测试连接前,不要关闭当前会话。
4.3 使用Fail2Ban防止暴力破解
Fail2Ban监控日志并封禁可疑IP。
安装:
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
配置:创建
/etc/fail2ban/jail.local
:
[sshd]
enabled = true
port = 2222 # 匹配你的SSH端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600 # 封禁1小时
findtime = 600 # 10分钟内3次失败即封禁
重启Fail2Ban:
sudo systemctl restart fail2ban
检查状态:
sudo fail2ban-client status sshd
这会自动封禁如
192.168.1.100
这样的IP,如果它们尝试多次失败登录。Fail2Ban与UFW结合,提供动态防护。
5. 文件系统和权限强化
5.1 设置文件权限
使用最小权限原则:文件和目录只授予必要访问权。
示例:保护敏感文件如
/etc/shadow
(存储密码哈希):
sudo chmod 600 /etc/shadow # 只有root可读写
sudo chown root:root /etc/shadow
对于Web目录(如
/var/www
):
sudo chown -R www-data:www-data /var/www
sudo chmod -R 755 /var/www
sudo chmod 644 /var/www/html/index.html # 文件只读
详细说明
:
600
:root读写,其他无权限。
755
:所有者读写执行,组和其他读执行。
使用
ls -l /path/to/file
检查权限。
5.2 使用AppArmor进行访问控制
AppArmor是Ubuntu的强制访问控制(MAC)系统,限制程序能访问的文件和资源。
启用并检查状态:
sudo aa-enforce /etc/apparmor.d/* # 启用所有配置文件
sudo apparmor_status
示例:为Nginx配置AppArmor(如果安装了Nginx)。
编辑
/etc/apparmor.d/usr.sbin.nginx
:
#include
/usr/sbin/nginx {
#include
#include
#include
capability net_bind_service,
network inet tcp,
network inet6 tcp,
/var/log/nginx/* w,
/etc/nginx/* r,
/usr/share/nginx/* r,
/var/lib/nginx/* w,
}
加载:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
这确保Nginx只能访问指定路径,防止它被利用读取敏感文件如
/etc/passwd
。
6. 高级防护:入侵检测和日志监控
6.1 安装和配置AIDE(Advanced Intrusion Detection Environment)
AIDE监控文件系统变化,检测篡改。
安装:
sudo apt install aide -y
sudo aideinit # 初始化数据库
配置:编辑
/etc/aide/aide.conf
:
# 定义规则
Binlib = p+i+n+u+g+s+b+m+c+md5+sha1
RootBin = Binlib
初始化数据库:
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
定期检查:
sudo aide –check
如果检测到变化,会报告如:
Added: /etc/passwd
设置cron作业每日运行:
sudo crontab -e
# 添加:0 2 * * * /usr/bin/aide –check > /var/log/aide.log 2>&1
6.2 日志监控与RSyslog
Ubuntu使用RSyslog处理日志。强化它以集中监控。
编辑
/etc/rsyslog.conf
:
# 启用远程日志(可选,发送到中央服务器)
*.* @@remote-server:514
重启:
sudo systemctl restart rsyslog
使用Logwatch分析日志:
sudo apt install logwatch -y
sudo nano /etc/logwatch/conf/logwatch.conf
# 设置 MailTo = your@email.com
每日运行:
sudo logwatch –output mail –mailto your@email.com
这会发送摘要报告,突出可疑活动如多次SSH失败。
6.3 使用ClamAV扫描恶意软件
安装ClamAV防病毒:
sudo apt install clamav clamav-daemon -y
sudo freshclam # 更新病毒定义
sudo clamscan -r / # 扫描根目录(生产中指定路径)
设置定时扫描:
sudo crontab -e
# 添加:0 3 * * * /usr/bin/clamscan -r /home –remove > /var/log/clamscan.log 2>&1
7. 备份与恢复策略
安全不止是防护,还包括恢复。定期备份是最后防线。
使用rsync备份到远程服务器:
sudo rsync -avz /etc/ root@backup-server:/backup/etc/
或使用BorgBackup加密备份:
sudo apt install borgbackup -y
borg init –encryption=repokey /path/to/repo
borg create /path/to/repo::$(date +%Y-%m-%d) /etc /home
恢复:
borg extract /path/to/repo::2023-10-01
设置cron自动备份,并测试恢复过程。
8. 监控与警报
使用工具如Prometheus + Grafana监控服务器指标,或简单使用
htop
和
netstat
。
安装htop:
sudo apt install htop -y
htop # 实时监控CPU/内存
对于警报,集成工具如Nagios或Zabbix,但入门级可使用
cron
脚本检查磁盘空间:
#!/bin/bash
if [ $(df / | awk ‘NR==2 {print $5}’ | sed ‘s/%//’) -gt 80 ]; then
echo “Disk space >80%” | mail -s “Alert” your@email.com
fi
结论
通过以上步骤,从基础更新到高级入侵检测,你的Ubuntu服务器将具备多层防护。安全是持续过程:定期审计、监控日志,并保持警惕。实施这些配置后,服务器将能抵御大多数常见攻击。记住,没有绝对安全,但这些实践大大降低了风险。如果你有特定场景(如Web服务器),可以进一步定制。建议在测试环境中先验证所有变更,然后应用到生产环境。保持学习,关注Ubuntu安全公告,以应对新兴威胁。