更多服务器知识请访问:hostol.com
恭喜你!拥有了一台全新的 Linux 服务器,无论是云服务器 ECS/CVM、VPS 还是独立服务器,这都意味着一片充满可能性的新大陆等待你去探索。在你迫不及待地想要部署网站、应用、数据库或者开始各种技术实验之前,请务必停下来,花一点时间完成一些至关重要的初始安全设置。这就像给你的新家换上更坚固的门锁,安装好警报系统一样,能大大降低未来被“不速之客”光顾的风险。
想象一下,一台刚刚初始化的 Linux 服务器,就像一个刚出厂、默认配置的设备,很多设置是为了方便初次使用,而非最优安全状态。网络上的自动化扫描工具每时每刻都在寻找这些“软柿子”。因此,在新服务器上线提供任何服务之前,完成以下这些基础安全加固步骤,是每一位负责任的管理员都应该养成的习惯。
别担心,这篇指南会像“保姆”一样,一步步带你操作,解释清楚每一步的意义。我们假设你使用的是常见的 Linux 发行版,如 Ubuntu 或 CentOS。
1. 立即修改 Root 密码 (如果适用)
为什么重要? 很多服务商在初始化服务器时,会提供一个默认的、或者随机生成的 root 密码。这个密码可能是临时的,或者强度不够。Root 用户拥有系统的最高权限,一旦其密码被猜解或泄露,后果不堪设想。虽然我们强烈推荐禁用 root 直接登录并使用密钥,但设置一个极其复杂的 root 密码仍然是一个好的基础习惯。
如何操作:
注意: 很多云服务器默认可能不允许 root 密码登录,而是强制使用 SSH 密钥。如果你的情况是这样,可以跳过此步,但请确保你的 root 账户本身是安全的(例如,没有被意外启用密码登录)。
2. 创建一个新的个人用户并赋予 Sudo 权限
为什么重要? 直接使用 root 用户进行日常操作是一个非常危险的习惯!就像你不会用银行金库的万能钥匙去开你家的信箱一样。任何误操作都可能对系统造成毁灭性打击,而且 root 账户也是黑客最主要的攻击目标。我们需要创建一个普通的个人用户,只在必要时通过 `sudo` 临时获取管理员权限。
如何操作:
从现在开始,除非万不得已,**请始终使用这个新创建的个人用户登录服务器进行操作**。
3. 配置 SSH 密钥认证并禁用密码认证(强烈推荐)
为什么重要? 相比容易被暴力破解的密码,SSH 密钥对提供了远超其上的安全性。它使用一对密钥(公钥和私钥):私钥由你妥善保管在本地电脑上,公钥则上传到服务器上。只有持有匹配私钥的客户端才能通过验证。禁用密码认证可以彻底杜绝针对 SSH 的密码暴力破解攻击。
如何操作:
- 方法一(推荐,如果你的本地有 `ssh-copy-id` 命令): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] ssh-copy-id your_username@YOUR_SERVER_IP # 将替换为你的新用户名和服务器IP 根据提示输入你的新用户的密码,命令会自动将你的公钥追加到服务器上该用户家目录的 ~/.ssh/authorized_keys 文件中,并设置好正确的权限。
- 方法二(手动复制):
- 在本地电脑上,查看并复制你的公钥文件内容: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] cat ~/.ssh/id_rsa.pub # 或者 id_ed25519.pub 选中并复制输出的所有内容(通常以 `ssh-rsa` 或 `ssh-ed25519` 开头)。
- 使用你的新用户名和密码 SSH 登录到服务器。
- 在服务器上,创建 .ssh 目录并设置权限(如果不存在): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] mkdir -p ~/.ssh chmod 700 ~/.ssh
- 将你本地复制的公钥内容追加到 authorized_keys 文件中,并设置权限: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] echo '粘贴你复制的公钥内容 GONE HERE' >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys (注意:是 `>>` 追加,不是 `>` 覆盖!确保权限是 600 和 700)
- SSH 登录服务器。
- 编辑 SSH 配置文件: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo nano /etc/ssh/sshd_config
- 找到 PasswordAuthentication 这一行,取消注释(删掉行首的 #),并将其值改为 no。确保 PubkeyAuthentication 是 yes。 PubkeyAuthentication yes PasswordAuthentication no # 可能还需要将 ChallengeResponseAuthentication 设为 no ChallengeResponseAuthentication no
- 保存文件。
- 验证配置并重启 SSH 服务: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo sshd -t sudo systemctl restart sshd
- 重要: 重启后,保持当前 SSH 连接**不要断开**,另外打开一个新的终端窗口,尝试再次用密钥登录。如果新连接也能成功,说明配置没问题。如果新连接失败了,赶紧回到之前的连接窗口把配置改回去,否则你可能就把自己锁在外面了!
强制使用密钥登录是提升 SSH 安全性的关键一步。
4. 禁止 Root 用户直接 SSH 登录
为什么重要? root 账户是所有攻击者首先尝试的目标。禁止它直接通过 SSH 登录,可以大大减少被暴力破解的可能性。你需要先通过普通用户登录,然后再用 `sudo` 获取权限。
如何操作:
之后,你就不能再直接用 root 用户名通过 SSH 登录了。
5. 修改默认的 SSH 端口 (可选,但有一定好处)
为什么考虑修改? SSH 默认监听 22 端口,这是全世界都知道的。网络上充斥着大量自动化的扫描工具,它们会不停地扫描公网 IP 的 22 端口,尝试进行暴力破解。将 SSH 端口修改为一个非标准的、高位端口(例如 10000-65535 之间),虽然不能阻止有针对性的攻击,但可以有效地“躲开”绝大多数自动化扫描流量,让你的 SSH 日志清净很多,也减少了被初级攻击尝试的概率。这是一种“安全靠隐蔽 (Security through obscurity)”的策略,本身不是终极安全,但作为辅助手段有用。
如何操作:
6. 配置基础防火墙规则 (UFW / FirewallD)
为什么重要? 防火墙是服务器的第一道网络防线。它能控制哪些端口允许外部访问,哪些不允许。默认情况下,新服务器可能没有任何防火墙规则,或者规则很宽松。我们需要配置它,遵循“最小权限”原则,只开放那些我们确实需要对外提供服务的端口(比如你刚设置的 SSH 端口、Web 服务的 80/443 端口等)。
如何操作(以 UFW 为例,适用于 Ubuntu/Debian):
对于 CentOS/RHEL 用户: 通常使用 `firewalld`。基本思路类似:`sudo systemctl start firewalld`, `sudo systemctl enable firewalld`, 使用 `sudo firewall-cmd –permanent –add-service=ssh` (如果使用默认端口) 或 `–add-port=10022/tcp` 添加规则,最后 `sudo firewall-cmd –reload`。请查阅 `firewalld` 的文档获取详细用法。
7. 及时更新系统软件包
为什么重要? 你拿到的“新”服务器,其操作系统和预装软件的版本可能已经不是最新的了。旧版本的软件往往包含已知的安全漏洞,这些漏洞是攻击者最喜欢利用的入口。在新服务器上做的第一件事,就应该是打上所有最新的安全补丁。
如何操作:
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 对于 Debian/Ubuntu 系统
sudo apt update # 更新软件包列表
sudo apt upgrade -y # 升级所有已安装的软件包
# 对于 CentOS/RHEL 系统
sudo yum update -y # 检查并更新所有软件包
这个过程可能需要一些时间,取决于需要更新的包有多少。建议定期执行此操作。
8. 移除不必要的服务和软件包
为什么重要? 系统中运行的服务和安装的软件包越多,潜在的攻击面就越大。服务商预装的系统镜像里,可能包含一些你根本用不到的服务(比如邮件服务器 postfix, 文件共享 samba, 甚至图形界面相关组件)。检查并移除这些不必要的组件,可以减少系统的复杂度,降低被漏洞影响的风险。
如何操作:
卸载前请务必确认该服务确实是您不需要的,并且没有其他重要服务依赖它。如果不确定,可以先尝试禁用 (`sudo systemctl disable service_name`) 而不是直接卸载。
</li>
一个更“干净”的系统意味着更少的潜在入口点。
9. 配置自动安全更新 (可选,但推荐)
为什么重要? 手动执行 `apt upgrade` 或 `yum update` 很好,但你能保证每天都记得做吗?很多关键的安全补丁需要尽快应用。配置系统自动安装安全更新,可以确保你的服务器始终处于最新的安全状态,大大减少因未及时打补丁而被攻击的风险。
如何操作 (以 Ubuntu/Debian 的 `unattended-upgrades` 为例):
对于 CentOS/RHEL 用户: 可以使用 `yum-cron` 包来实现类似的功能,配置 /etc/yum/yum-cron.conf 文件来定义更新类型和通知方式。
自动化安全更新能让你省心不少,但也要注意,极少数情况下自动更新可能导致服务兼容性问题,需要权衡风险。
10. 安装并配置 Fail2ban
为什么重要? 正如我们之前讨论 SSH 安全时提到的,网络上充满了尝试暴力破解 SSH 密码或 Web 应用登录后台的自动化机器人。Fail2ban 是一个非常流行的入侵防御工具,它能监控系统日志(如 SSH 登录失败日志、Web 服务器错误日志等),当发现某个 IP 地址在短时间内有多次失败尝试时,就自动调用防火墙(如 iptables, firewalld, ufw)将该 IP 临时(或永久)封禁。这能极大地降低被暴力破解成功的风险。
如何操作:
- Fail2ban 的主配置文件是 /etc/fail2ban/jail.conf,但**不要直接修改它**,因为软件更新时会被覆盖。
- 你应该在 /etc/fail2ban/ 目录下创建自定义配置文件,通常是 jail.local。复制一份默认配置作为起点: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
- 编辑 jail.local 文件 (sudo nano /etc/fail2ban/jail.local),找到 [DEFAULT] 段落和各个服务(如 [sshd])的段落进行配置。主要关注:
- bantime: 封禁时长(例如 10m 表示10分钟,1h 表示1小时,-1 表示永久)。
- findtime: 查找失败尝试的时间窗口。
- maxretry: 在 findtime 时间内允许的最大失败次数。
- [sshd] 段落下的 enabled = true: 确保 SSH 防护是开启的。如果修改了 SSH 端口,需要同时修改这里的 port = ssh 为 port = 你的新端口。
- 你还可以根据需要启用对 Nginx, Apache, Postfix 等其他服务的防护(找到对应段落,设置 enabled = true,并确保日志路径等配置正确)。
- 修改配置后,重启 Fail2ban 服务使配置生效: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo systemctl restart fail2ban
(关于 Fail2ban 的更详细配置和使用,我们后续会有专门的文章介绍)
11. 检查服务器监听的端口
为什么重要? 了解你的服务器到底在网络上“打开”了哪些“门”(监听端口),是评估安全风险的基础。每个监听的端口都对应着一个正在运行的服务,也意味着一个潜在的被攻击入口。你应该只保留那些确实需要对外提供服务的端口。
如何操作:
使用 ss 命令(比旧的 `netstat` 更推荐)查看当前正在监听的 TCP 和 UDP 端口及其对应的服务:
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ss -tulnp
- -t: 显示 TCP sockets
- -u: 显示 UDP sockets
- -l: 只显示监听状态的 sockets
- -n: 不解析服务名,直接显示端口号
- -p: 显示监听端口的进程信息
仔细检查列表中的每一行:这个端口是什么服务(看 `Process` 列)在监听?这个服务是你确实需要运行并且需要对外(或对特定网络)暴露的吗?如果发现有未知或不需要的服务在监听端口,应该回到第 8 步将其禁用或卸载。
12. 熟悉并定期查看关键日志文件
为什么重要? 日志文件是服务器运行状况的“黑匣子”,记录了系统事件、用户登录、服务启停、错误信息等。养成定期查看关键日志的习惯,有助于你及时发现异常情况、排查故障,甚至发现潜在的安全入侵迹象。
需要关注的关键日志(路径可能因发行版略有不同):
- /var/log/auth.log (Debian/Ubuntu) 或 /var/log/secure (CentOS/RHEL): 记录所有用户登录、认证尝试(包括 SSH 成功和失败)、sudo 使用等安全相关的事件。必须经常关注!
- /var/log/syslog (Debian/Ubuntu) 或 /var/log/messages (CentOS/RHEL): 记录系统全局的大部分事件,包括内核消息、服务启停、系统错误等。
- /var/log/nginx/, /var/log/apache2/, /var/log/httpd/: Web 服务器的访问日志和错误日志。
- /var/log/mysql/, /var/log/mariadb/, /var/log/postgresql/: 数据库的错误日志。
- /var/log/fail2ban.log: Fail2ban 的运行和封禁日志。
- dmesg 命令: 显示内核环形缓冲区的内容,对于排查硬件问题或启动过程中的问题很有用。
- journalctl 命令 (systemd 系统): 强大的日志查询工具,可以按服务、时间、级别等过滤日志。例如 journalctl -u sshd -n 50 查看 sshd 服务最近 50 条日志。
如何查看: 可以使用 cat, less, more, tail -n 100, tail -f (实时监控), grep (搜索关键词) 等命令来查看和分析日志。
熟悉这些日志的位置和内容,是成为一个合格服务器管理员的基础。
13. 设置正确的时区并启用 NTP 时间同步
为什么重要? 服务器时间不准确,会导致日志记录的时间戳混乱,难以排查按时间顺序发生的问题;计划任务 (Cron Job) 可能在错误的时间执行;SSL 证书验证可能出错;在集群环境中可能导致协作问题。使用 NTP (Network Time Protocol) 自动同步时间可以确保服务器时钟的精确性。
如何操作:
14. (可选/进阶) 基础内核参数调整 (Kernel Hardening)
为什么考虑? Linux 内核提供了一些参数(可以通过 sysctl 命令调整)可以增强系统的安全性和网络性能。对于新服务器,可以考虑调整几个基础且风险较低的参数。
示例 (编辑 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的文件):
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 启用 SYN Cookies 防护 (通常默认开启)
net.ipv4.tcp_syncookies = 1
# 禁用 IP 源路由 (防止路由欺骗)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 禁用 ICMP 重定向接受 (防止路由欺骗)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
# 对于 IPv6 也类似设置
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# 开启反向路径过滤 (帮助防止 IP 欺骗)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 忽略所有 ICMP Echo 请求 (禁 Ping,可选,有利有弊)
# net.ipv4.icmp_echo_ignore_all = 1
修改后执行 sudo sysctl -p 使其生效。注意: 内核参数调整需要理解其含义,不当的修改可能导致网络问题,请谨慎操作。
15. 别忘了备份!备份!备份!
为什么压轴但极其重要? 以上所有的安全设置都是为了“防患于未然”,但没有任何系统是绝对安全的。硬件可能故障,软件可能有未知漏洞,管理员也可能误操作。**数据备份是你的最后一道防线,是灾难发生后你能恢复业务的唯一希望!**
你需要做什么:
- 制定备份策略: 明确需要备份哪些数据(网站文件?数据库?配置文件?),备份频率(每天?每周?),备份保留周期。
- 选择备份方式: 可以是简单的脚本打包压缩 + rsync/scp 到另一台服务器/对象存储,也可以使用专业的备份软件(如 Bacula, Amanda)或云服务商提供的备份服务。
- 实施并自动化: 将备份过程自动化执行。
- 验证备份有效性: 定期尝试从备份中恢复数据到测试环境,确保备份文件没有损坏且恢复流程可行。
- 异地存储: 关键备份最好存储在与主服务器物理隔离的地方(不同的机房、不同的云区域、甚至离线存储)。
备份策略的制定和实施可能比较复杂,值得专门写一篇文章讨论。但在这里,我必须强调:**在新服务器开始承载任何重要数据之前,请务必规划并实施你的数据备份方案!**
总结
给新服务器做好初始安全设置,就像给刚出生的婴儿打好预防针一样重要。虽然看起来步骤有点多,但完成以上这些基础设置(特别是用户管理、SSH 加固、防火墙配置、系统更新和备份),能为你后续的服务器运维打下一个坚实、安全的基础,让你在未来的数字世界里航行得更安心。
记住,安全是一个持续的过程,不是一劳永逸的。完成了这些初始设置后,还需要保持警惕,定期维护、监控日志、关注安全动态。但至少,你已经为你的新伙伴穿上了第一件“盔甲”!
评论前必须登录!
注册