服务器安全防护指南
1. 服务器安全概述
如今,每周都有公司服务器被入侵的新报道。在某些情况下,整个数据库会在互联网上被公开,其中可能包含敏感的用户信息,这可能会被不法分子用于窃取身份。虽然 Linux 是一个非常安全的平台,但它的安全性取决于管理员的设置。安全补丁每天都有,但需要有人去安装。OpenSSH 是一个非常实用的工具,但如果安装不安全,它也会成为攻击者的首要目标。备份是必不可少的,但如果公司没有对其进行安全保护,数据就可能落入坏人之手。甚至公司内部员工也可能有意或无意地造成损害。以下是一些可以保护服务器免受威胁的方法:
- 降低攻击面
- 保护 OpenSSH
- 安装和配置 Fail2ban
- MariaDB 最佳实践
- 设置防火墙
- 使用 LUKS 加密和解密磁盘
- 锁定 sudo
2. 降低攻击面
新服务器设置完成后,管理员应始终进行安全检查,以确保服务器尽可能安全。降低攻击面是确保服务器安全的首要步骤,这意味着要尽可能关闭漏洞,并限制外部人员可能访问的内容。
2.1 检查监听端口
攻击者想要入侵服务器时,几乎肯定会首先进行端口扫描。要检查服务器上哪些端口正在监听网络连接,可以使用
netstat
命令进行简单的端口查询:
# netstat -tulpn
虽然不一定要以 root 身份运行
netstat
命令,但以 root 身份运行时,输出将显示更多信息,包括正在监听连接的程序名称。如果端口监听地址为
0.0.0.0
,则表示该端口正在监听来自任何网络的连接,这是不安全的;如果监听地址为
127.0.0.1
,则表示该端口不接受外部连接。
根据端口查询结果,对于需要的端口,应通过配置服务的安全设置或启用防火墙来进行保护;对于不需要的端口,应关闭它们,可以停止并禁用相关守护进程,或者直接卸载相关软件包。例如,如果服务器上有多个与 NFS 相关的 RPC 服务在监听连接,但服务器不会使用 NFS,则可以卸载相关支持:
# apt-get remove rpcbind
2.2 卸载不必要的软件包
安装的软件包越多,攻击面就越大。因此,应移除任何不必要的软件包。可以使用以下命令获取服务器上安装的所有软件包列表:
dpkg --get-selections > installed_packages.txt
查看生成的文本文件,对于不确定是否可以移除的软件包,可以在 Google 上进行研究。最终可以总结出大多数服务器不需要的典型软件包列表,在每次设置新服务器时确保移除这些软件包。
2.3 使用强密码
使用强密码是保障服务器安全的基本要求。如果服务需要监听外部连接,该服务必须使用强的、随机生成的密码。例如,OpenSSH 如果允许外部访问,用户账户应设置强密码,否则可能会在几周内被大量扫描机器人攻陷。
2.4 定期安装更新
Linux 社区的软件会定期更新安全补丁,大多数更新的目的是加强安全性。对于 Ubuntu Server 16.04 等长期支持 (LTS) 版本,大部分更新是为了修复漏洞。安装更新的最佳方法通常是运行以下命令:
# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
-
apt-get update:将 Apt 索引与 Ubuntu 仓库同步。 -
apt-get upgrade:安装发行版的更新软件包,前提是不需要安装不存在的依赖项或移除其他软件包,这是安装更新的安全第一步。 -
apt-get dist-upgrade:安装所有更新,即使需要进行其他更改。先运行apt-get upgrade可以先完成安全的更新,再运行dist-upgrade可以获取其他更新,该命令会安装更新的内核包,但需要重启服务器才能使用新内核。
定期安装更新的方法取决于具体环境。大多数环境会使用配置管理工具,如 Ansible、Chef 或 Puppet,在配置管理解决方案中创建定期安装更新的指令。也可以将
apt-get upgrade
命令添加到 cron 作业中,以确保定期安装低影响的更新,然后决定如何处理
dist-upgrade
命令的更新。理想情况下,可以创建生产服务器的克隆(如虚拟机副本)来测试更新,确保更新通过测试后再部署到生产环境。
2.5 遵循最小权限原则
对于所有用户账户,应遵循最小权限原则,限制用户和服务的访问权限,只允许他们执行工作所需的功能。这可能包括:
- 将用户添加到尽可能少的组中
- 默认将所有网络共享设置为只读
- 定期审计服务器上长时间未登录的用户账户
- 设置用户账户的有效期,并要求用户重新申请以维持账户状态
- 允许用户账户访问尽可能少的系统目录
- 将 sudo 权限限制到特定命令
同时,要记录为保障服务器安全所做的每一项更改,形成安全检查清单,并定期扫描服务器,检查是否存在未使用的用户账户、不必要的组权限和新打开的端口。
3. 保护 OpenSSH
虽然 OpenSSH 现在比过去更安全,但它仍然可能是服务器的一个漏洞,不法分子可能会利用它来破坏网络。以下是一些可以保护 OpenSSH 的常见方法:
3.1 更改监听端口
默认情况下,OpenSSH 监听端口 22,这是攻击者预期的端口。应将其更改为其他端口,最好是高于 10000 且未被其他服务使用的端口。在
/etc/ssh/sshd_config
文件中找到端口号并将其从默认的 22 更改:
Port 65332
更改端口后,使用 SSH 时需要使用
-p
选项指定端口,使用
scp
时需要使用大写的
P
选项:
ssh -p 65332 myhost
scp -P myfile myserver:/path/to/dir
虽然更改端口不能使服务完全隐藏,但可以增加服务器的模糊性,减少日志中的入侵尝试记录。OpenSSH 的连接尝试日志位于
/var/log/auth.log
。
3.2 选择安全协议
如今,大多数仓库中的 OpenSSH 版本默认使用协议 2,这是更安全的选择。在生产环境中,绝不应允许使用协议 1。
3.3 限制登录用户和组
有两个设置可以控制哪些用户和组可以通过 SSH 登录:
AllowUsers
和
AllowGroups
。默认情况下,所有创建的用户都可以通过 SSH 登录服务器,但 root 用户默认不允许(后面会详细说明)。
-
AllowUsers
:可以在
/etc/ssh/sshd_config文件中使用AllowUsers选项指定哪些用户可以登录服务器,多个用户之间用空格分隔:
AllowUsers larry moe curly
-
AllowGroups
:使用
AllowGroups选项可以通过组来限制 SSH 连接。首先创建所需的组(如果不存在):
# groupadd sshusers
然后将一个或多个用户添加到该组:
# usermod -aG sshusers myuser
最后,在
/etc/ssh/sshd_config
文件中添加
AllowGroups
设置:
AllowGroups admins sshusers gremlins
建议只使用其中一个选项,
AllowUsers
会覆盖
AllowGroups
。个人认为
AllowGroups
更易于管理,因为只需要添加或移除用户到组中,而不需要修改
sshd_config
文件。
3.4 禁止 root 用户通过 SSH 登录
PermitRootLogin
选项控制 root 用户是否可以通过 SSH 连接。默认情况下,通常设置为
prohibit-password
,即允许 root 用户使用密钥认证,但不接受密码认证。建议将其设置为
no
,因为 root 用户是攻击者首先尝试的账户:
PermitRootLogin no
3.5 禁用密码认证
默认情况下,OpenSSH 允许用户使用密码进行身份验证,这会使服务器容易受到暴力破解攻击。在禁用 SSH 密码认证之前,需要先配置并测试替代的身份验证方法,通常是公钥认证。可以在本地工作站生成 SSH 密钥对,并将公钥添加到服务器上的
authorized_keys
文件中,这样就可以无需密码登录。配置并测试通过公钥认证访问服务器后,应禁用密码认证:
PasswordAuthentication no
3.6 使用强密码
对于允许从互联网访问 SSH 的服务器,用户账户必须使用强的、随机生成的密码。虽然建议尽量避免服务器的 SSH 服务暴露在互联网上,但如果确实需要,一定要使用安全的密码。
每次对
/etc/ssh/sshd_config
文件进行更改后,都需要重启 OpenSSH 守护进程:
# systemctl restart ssh
通过以上步骤,可以显著提高服务器的安全性,降低被攻击的风险。在实际操作中,应根据服务器的具体用途和环境,灵活运用这些方法,并定期进行安全检查和更新。
4. 安装和配置 Fail2ban
Fail2ban 是一个非常实用的守护进程,它可以为多个服务(包括 OpenSSH)添加额外的安全层。以下是安装和配置 Fail2ban 的步骤:
4.1 安装 Fail2ban
在大多数基于 Debian 或 Ubuntu 的系统上,可以使用以下命令安装 Fail2ban:
# apt-get install fail2ban
4.2 配置 Fail2ban
安装完成后,需要对 Fail2ban 进行配置。配置文件通常位于
/etc/fail2ban
目录下。主要的配置文件是
jail.conf
和
jail.local
,建议在
jail.local
中进行自定义配置,因为这样可以避免在更新 Fail2ban 时覆盖配置。
以下是一个简单的
jail.local
配置示例:
[DEFAULT]
# 封禁时间(秒)
bantime = 3600
# 允许的最大失败尝试次数
maxretry = 5
# 检查失败尝试的时间范围(秒)
findtime = 600
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
上述配置的解释如下:
| 配置项 | 说明 |
| ---- | ---- |
|
bantime
| 封禁时间,单位为秒,这里设置为 1 小时(3600 秒)。 |
|
maxretry
| 允许的最大失败尝试次数,这里设置为 5 次。 |
|
findtime
| 检查失败尝试的时间范围,单位为秒,这里设置为 10 分钟(600 秒)。 |
|
[sshd]
| 针对 OpenSSH 的配置部分。 |
|
enabled
| 是否启用该配置,设置为
true
表示启用。 |
|
port
| 监听的端口,这里使用
ssh
表示默认的 SSH 端口。 |
|
filter
| 使用的过滤器,
sshd
是 Fail2ban 内置的用于检测 SSH 登录失败的过滤器。 |
|
logpath
| 日志文件路径,Fail2ban 会从该日志文件中检测登录失败信息。 |
4.3 重启 Fail2ban
配置完成后,需要重启 Fail2ban 服务使配置生效:
# systemctl restart fail2ban
5. MariaDB 最佳实践
MariaDB 是一种流行的开源数据库管理系统,以下是一些 MariaDB 的最佳实践:
5.1 安全安装
在安装 MariaDB 时,应使用安全的安装脚本进行初始化:
# mysql_secure_installation
该脚本会引导你完成一系列安全设置,包括设置 root 密码、删除匿名用户、禁止 root 远程登录等。
5.2 限制访问
只允许必要的用户和主机访问 MariaDB。可以通过创建用户并授予特定权限来实现:
-- 创建用户
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
-- 授予权限
GRANT ALL PRIVILEGES ON your_database.* TO 'newuser'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
5.3 定期备份
定期备份数据库是非常重要的。可以使用
mysqldump
命令进行备份:
# mysqldump -u root -p your_database > backup.sql
将上述命令添加到 cron 作业中,实现定期备份。
6. 设置防火墙
防火墙可以帮助阻止未经授权的网络访问,保护服务器的安全。以下是使用
ufw
(Uncomplicated Firewall)设置防火墙的步骤:
6.1 安装 ufw
在基于 Debian 或 Ubuntu 的系统上,可以使用以下命令安装 ufw:
# apt-get install ufw
6.2 配置 ufw
安装完成后,需要对 ufw 进行配置。以下是一些常见的配置命令:
# 允许 SSH 访问
# 如果 SSH 端口已更改,需要相应修改端口号
ufw allow 22
# 允许 HTTP 访问
ufw allow 80
# 允许 HTTPS 访问
ufw allow 443
# 启用防火墙
ufw enable
可以使用以下命令查看防火墙状态:
# ufw status
7. 使用 LUKS 加密和解密磁盘
LUKS(Linux Unified Key Setup)是一种用于加密磁盘的标准。以下是使用 LUKS 加密和解密磁盘的步骤:
7.1 加密磁盘
在加密磁盘之前,请务必备份重要数据,因为加密过程会擦除磁盘上的所有数据。
# cryptsetup luksFormat /dev/sdb
上述命令会提示你输入加密密码,输入并确认密码后,磁盘将被加密。
7.2 打开加密磁盘
加密完成后,可以使用以下命令打开加密磁盘:
# cryptsetup luksOpen /dev/sdb myencryptedvolume
输入之前设置的加密密码,磁盘将被打开。
7.3 创建文件系统
打开加密磁盘后,需要在其上创建文件系统:
# mkfs.ext4 /dev/mapper/myencryptedvolume
7.4 挂载文件系统
创建文件系统后,可以将其挂载到指定的挂载点:
# mount /dev/mapper/myencryptedvolume /mnt/encrypted
7.5 卸载和关闭加密磁盘
使用完加密磁盘后,可以卸载并关闭它:
# umount /mnt/encrypted
# cryptsetup luksClose myencryptedvolume
8. 锁定 sudo
sudo
允许普通用户以超级用户权限执行命令,为了提高安全性,需要对
sudo
进行锁定。
8.1 限制 sudo 用户
只允许必要的用户使用
sudo
。可以编辑
/etc/sudoers
文件,添加或修改用户的
sudo
权限:
# 允许用户 myuser 使用 sudo
myuser ALL=(ALL:ALL) ALL
8.2 使用 sudo 日志
启用
sudo
日志可以记录所有
sudo
命令的执行情况。在
/etc/sudoers
文件中添加以下内容:
Defaults logfile="/var/log/sudo.log"
通过以上步骤,可以全面保护服务器的安全。整个服务器安全防护的流程可以用以下 mermaid 流程图表示:
graph LR
A[服务器安全检查] --> B[降低攻击面]
B --> B1[检查监听端口]
B --> B2[卸载不必要软件包]
B --> B3[使用强密码]
B --> B4[定期安装更新]
B --> B5[遵循最小权限原则]
A --> C[保护 OpenSSH]
C --> C1[更改监听端口]
C --> C2[选择安全协议]
C --> C3[限制登录用户和组]
C --> C4[禁止 root 用户通过 SSH 登录]
C --> C5[禁用密码认证]
C --> C6[使用强密码]
A --> D[安装和配置 Fail2ban]
A --> E[MariaDB 最佳实践]
A --> F[设置防火墙]
A --> G[使用 LUKS 加密和解密磁盘]
A --> H[锁定 sudo]
通过实施这些安全措施,可以有效保护服务器免受各种威胁,确保服务器的稳定运行。在实际应用中,应根据服务器的具体情况和需求,灵活调整和优化这些措施。
服务器安全防护核心指南
超级会员免费看
1290

被折叠的 条评论
为什么被折叠?



