云计算百科
云计算领域专业知识百科平台

Linux 服务器运维实战(1):服务器初始化与安全加固

一台刚交付的云主机并不是“装好系统就能上线”。镜像可能数月未更新,默认账号、时区、软件源、内核参数和审计策略也未必符合生产要求。本篇建立整套系列的基线:先盘点,再更新,最后收紧暴露面,并为后续权限、服务、存储和监控留下可验证的状态。

一、痛点:初始化不是命令清单

直接复制一串加固命令很危险。发行版、云厂商网络和登录方式不同,同一个动作可能让机器失联。例如在确认密钥登录前关闭密码,在放行 SSH 前启用防火墙,都会把管理员挡在门外。正确顺序是记录现状、保持一个已登录会话、开第二个会话验证新路径,再撤销旧路径。

基线至少回答五个问题:系统及内核是什么版本;安全更新是否完成;时间是否同步;对外监听哪些端口;重启后配置是否仍生效。还应保存变更前后的证据。命令成功退出只说明执行过,不代表目标状态正确。比如 timedatectl 显示 NTP 服务存在,不等于时钟已经同步;应同时检查 System clock synchronized。

二、原理:缩小攻击面并保留恢复通道

安全加固的核心不是堆参数,而是最小化:只安装需要的软件、只启动需要的服务、只开放需要的端口、只授予需要的权限。每减少一个网络监听器和常驻守护进程,就少一条需要更新、审计和响应的路径。内核参数则属于纵深防御,不能替代应用补丁与身份认证。

补丁策略要区分安全更新和大版本升级。前者应尽快进入测试和维护窗口;后者可能改变配置语义,必须先做快照或可恢复备份。自动重启也有取舍:无人值守更新能缩短漏洞窗口,却可能在业务高峰重启。生产环境通常自动下载或安装安全补丁,重启由编排系统按批次完成,并用健康检查控制推进。

时间同步是证书校验、日志关联和分布式系统的共同前提。UTC 适合作为服务器时区,展示层再转换用户时区。主机名应稳定且可追踪资产,不要把会频繁变化的业务角色硬编码进名称。DNS、资产标签和配置管理系统更适合表达角色。

三、实现:建立可审计的 Ubuntu/Debian 基线

下面脚本先检查环境,再更新软件包,安装基础工具,设置 UTC、启用时间同步,并写入一组保守的网络内核参数。它不会改 SSH 与防火墙,避免在尚未验证登录通道时断连。脚本可重复运行;配置用独立文件管理,不直接修改发行版主文件。

#!/usr/bin/env bash
set -euo pipefail
[[ "${EUID}" -eq 0 ]] || { echo "请使用 root 运行" >&2; exit 1; }
source /etc/os-release
case "${ID:-}" in
ubuntu|debian) ;;
*) echo "仅支持 Ubuntu/Debian,当前为 ${ID:-unknown}" >&2; exit 2 ;;
esac
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -y upgrade
apt-get install -y curl ca-certificates vim-tiny jq chrony unattended-upgrades
timedatectl set-timezone UTC
systemctl enable –now chrony
install -d -m 0755 /etc/sysctl.d
cat > /etc/sysctl.d/60-server-baseline.conf <<'EOF'
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
EOF

sysctl –system >/dev/null
dpkg-reconfigure -f noninteractive unattended-upgrades
echo "baseline_applied host=$(hostname) os=$PRETTY_NAME"

运行输出:

baseline_applied host=app-01 os=Ubuntu 24.04.3 LTS

重启前执行只读验收脚本。它把每项结果变成明确的 OK/FAIL,便于人工复核或接入 CI。监听地址 0.0.0.0 和 :: 表示所有接口,看到陌生端口时先用 systemctl status、ps 与包管理器确认归属,不要凭名字直接停服务。

#!/usr/bin/env bash
set -uo pipefail
fail=0
check() {
local name="$1"; shift
if "$@" >/dev/null 2>&1; then
printf 'OK %s\\n' "$name"
else
printf 'FAIL %s\\n' "$name"
fail=$((fail + 1))
fi
}
if [[ "$(timedatectl show -p NTPSynchronized –value)" == yes ]]; then
printf 'OK %s\\n' '时间已同步'
else
printf 'FAIL %s\\n' '时间已同步'
fail=$((fail + 1))
fi
check 'chrony 已运行' systemctl is-active –quiet chrony
check '无损坏软件包' dpkg –audit
check 'sysctl 配置存在' test -r /etc/sysctl.d/60-server-baseline.conf
printf '\\n对外监听端口:\\n'
ss -lntup
printf '\\n失败项:%d\\n' "$fail"
exit "$fail"

典型的末尾输出如下;实际监听端口以服务器为准。

运行输出:

OK 时间已同步
OK chrony 已运行
OK 无损坏软件包
OK sysctl 配置存在

失败项:0

四、踩坑:云主机还有控制面

系统内防火墙不是唯一边界。安全组、云防火墙、负载均衡器和公网 IP 都属于暴露面;必须同时检查云控制面与主机。反过来,也不能只依赖安全组,因为错误绑定、横向流量和本机进程仍需主机策略约束。初始化前记录控制台或救援模式入口,确认能在 SSH 失效时挂载磁盘修复。

不要照搬“禁用 IPv6”或“修改 SSH 端口”之类的神奇配方。禁用 IPv6 可能破坏软件依赖,改端口只能减少日志噪声,不能替代密钥、限速和补丁。sysctl 也要理解业务影响:路由器必须发送转发,容器网络可能依赖转发;本文没有盲目关闭 IP forwarding。

五、验证:把基线变成资产事实

完成后重启一次,重新运行验收,检查 journalctl -b -p warning、systemctl –failed、剩余更新和监听端口。将系统版本、镜像日期、基线脚本版本、管理员与恢复入口写入资产记录。对照快照恢复并不等于备份,快照通常与原云账号、区域和底层存储共享故障域。

至此服务器有了可追踪的系统基线,但日常操作仍不能长期依赖 root。下一篇将创建管理员与服务账号,讲清 sudo 边界、SSH 密钥、主机密钥验证和安全切换顺序。

参考来源

  • Ubuntu Server:Automatic updates
  • systemd:timedatectl 手册
  • Linux Kernel:IP sysctl 文档
  • CIS Benchmarks

👍 觉得有用就点个 赞 + 收藏,方便回头查阅;有疑问直接在评论区留言,我看到都会回。

🚀 本文属于 《Linux 服务器运维实战》 系列,持续更新,关注不迷路。

📌 文章里的代码都能直接跑。想要可直接 clone 的完整工程 + 配套部署脚本 / 踩坑清单?评论一声或发邮件到 cj2664@qq.com,我免费发你。 如果你正好在做类似系统、或有工程化难题想找人做,也欢迎邮件聊一句——我按实际情况评估,能落地的就接单或出方案。评论和邮件都能直接找到我,不用跳别的平台。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Linux 服务器运维实战(1):服务器初始化与安全加固
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!