安全
生产环境服务器基础运维安全操作规范
本文档使用 MrDoc 发布
-
+
首页
生产环境服务器基础运维安全操作规范
## 🌟 前言 生产环境服务器的稳定、安全、高效运行是业务持续性的基石。规范的运维操作是保障服务器安全、预防事故、快速响应的关键。本文档旨在明确服务器基础运维中的核心安全操作规范,涵盖访问控制、操作安全、监控、系统加固、数据保护及云平台管理等方面,为运维人员提供清晰的操作指引。 --- ## 🔒 一、 服务器安全规范 ### 🔑 1.1 访问控制 * **核心原则:最小权限原则** * **🔐 禁用 Root 直接登录:** 严禁直接使用 `root` 账户登录服务器。必须通过普通用户登录,并使用 `sudo` 机制按需分配管理权限。 * **✅ 最佳实践:** 使用 `visudo` 严格配置 `/etc/sudoers` 文件,为特定用户或用户组授予精确的 `sudo` 权限(如 `nginx_restart`, `service_restart`),避免授予无限制的 `ALL` 权限。 * **🔐 强化 SSH 认证:** * **🔑 强制密钥认证:** 修改 `/etc/ssh/sshd_config`,禁用密码登录,强制使用 SSH 密钥对认证。 ```bash PasswordAuthentication no PubkeyAuthentication yes ``` * **🗝️ 密钥管理:** * 采用 **云服务商** 提供的密钥对管理,定期轮转秘钥(建议60~90天) * **🔐 修改默认 SSH 端口:** 修改 `/etc/ssh/sshd_config`,将默认的 `22` 端口更改为非标准端口。 ```bash Port xxxx # 替换 xxxx 为你选择的高端口号 (建议在 1024-65535 之间) ``` * **⚠️ 注意:** 修改端口后,需同步更新安全组规则和防火墙规则。 * **🌐 严格的网络访问控制:** * **🔥 主机防火墙** 使用 `iptables`、`firewalld` 配置主机级防火墙,仅允许特定 IP 地址/网段访问管理端口(如 SSH 端口)。 ```bash # firewalld 示例 (允许特定IP访问SSH端口) sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="your.trusted.ip/32" port port="xxxx" protocol="tcp" accept' sudo firewall-cmd --reload ``` * **☁️ 安全组/网络:** 在云平台层面配置安全组,**仅允许运维人员固定出口 IP 或公司 VPN IP 访问服务器的管理端口**。 * **🏰 堡垒机 (Bastion Host)/跳板机 (Jump Server):** 对于管理大量服务器或安全要求极高的环境,部署堡垒机是**强烈推荐**的最佳实践。所有运维操作必须通过堡垒机进行,堡垒机本身需进行最高级别的安全加固(多因素认证、严格审计等)。虽然初期有成本,但能极大提升安全性和审计能力。 --- ### ⚠️ 1.2 操作安全 * **📦 服务与软件安装安全:** * **🚫 禁用弱端口暴露公网:** 绝对避免将使用默认端口(如 Redis `6379`, Elasticsearch `9200/9300`, MongoDB `27017`, MySQL `3306`, Memcached `11211` 等)的服务直接暴露在公网。攻击者会持续扫描这些端口进行暴力破解或利用未授权访问漏洞。 * **✅ 最佳实践:** - (1) 修改服务监听端口为非默认端口 - (2) 使用防火墙/安全组严格限制访问来源(仅允许应用服务器IP) - (3) 服务尽量部署在内网同一VPC环境下。 * **🚫 杜绝弱密码:** 为所有服务(数据库、中间件、应用后台等)设置强密码(长度>16位,包含大小写字母、数字、特殊字符,避免常见词汇)。使用密码管理工具。 * **👤 服务账户隔离:** 为每个安装的软件/服务创建独立的、无登录权限的系统账户 (`useradd -r -s /sbin/nologin service_user`),并确保服务以其专属用户身份运行(在服务配置文件中设置 `user`)。这限制了漏洞利用的横向移动范围。 * **📝 示例 (Nginx):** ```bash # 创建系统账户 sudo useradd -r -s /sbin/nologin -d /var/www -M www # 设置目录归属 (假设 /var/www 是 web 根目录) sudo chown -R www:www /var/www sudo chmod -R 755 /var/www # 或根据实际需求调整权限 # 在 nginx.conf 中指定用户 user www; ``` * **☠️ 危险命令防护:** * **⚠️ 高危命令 (`rm`, `shutdown`, `reboot`, `dd`, `fdisk`, `mv /`, `chmod -R 777 /` 等):** 执行这些命令需极度谨慎,尤其是在生产环境。避免直接使用 `rm -rf /` 或 `rm -rf *`。 * **🛡️ 防护措施:** * **`rm` 命令别名:** 配置安全的 `rm` 别名(将文件移动到回收站/备份目录而非直接删除),更可靠的做法是使用 `trash-cli` 工具或定义如下别名: ```bash # 更安全的 rm 别名示例 (移动到带时间戳的备份目录) alias rm='echo "!!! SAFER RM !!! Use /bin/rm for real deletion. Moving to ~/backup_trash/ instead."; mkdir -p ~/backup_trash; mv -f --backup=numbered --target-directory=~/backup_trash' ``` * **执行前确认:** 养成在执行任何可能产生不可逆后果的命令前,**双重确认**目标路径、参数的习惯,有条件先 **备份再操作**。 * **📊 资源限制:** * 使用系统工具防止单个用户或进程耗尽系统资源(导致 DoS 或影响其他服务)。 * **`ulimit`:** 设置用户会话级别的限制(如文件描述符数 `nofile`、进程数 `nproc`)。在 `/etc/security/limits.conf` 或 `/etc/security/limits.d/*.conf` 中配置。 ```bash # /etc/security/limits.conf 示例 (限制 www 用户) www hard nofile 65535 www soft nofile 65535 www hard nproc 2048 ``` * **`cgroups`:** 提供更精细、更强大的进程组资源控制(CPU、内存、磁盘 I/O、网络等)。 * **📝 示例 (限制 Nginx 用户进程 CPU 使用率):** * **简单方案 (利用 systemd slice):** ```ini # /etc/systemd/system/nginx.service.d/cpu-limit.conf [Service] CPUQuota=80% # 限制该服务所有进程总和使用不超过 80% 的单核 CPU 时间 MemoryHigh=90% # 设置内存软限制 MemoryMax=95% # 设置内存硬限制 (OOM Killer 触发点) ``` * **🚫 禁止使用root权限运行应用(包括Crontab定时任务)**,防止漏洞利用导致权限提升 --- ### 👁️ 1.3 监控 * **📈 系统资源监控:** * 在**所有**服务器上安装云平台提供的监控 Agent。 * 监控核心指标:CPU 使用率、内存使用率 (包括 Swap)、磁盘使用率 (各分区)、磁盘 I/O、网络流量、关键进程状态。 * **🚨 设置告警阈值:** 根据服务器角色设定合理的告警阈值 (如 CPU > 80% 持续 5min, 磁盘 > 90%, 内存 > 80%),并通过邮件、短信、钉钉、企业微信、Slack 等渠道及时通知。 * **🔍 日常巡检:** 定期巡查云服务商是否存在安全消息,如有请及时处理。 --- ### 🛡️ 1.4 系统加固 * **🔄 定期更新与补丁管理:** * 建立定期的补丁更新流程(如每周/每月安全更新窗口)。 * 使用包管理器更新系统软件和安全补丁 (`yum update --security` / `apt-get upgrade --only-upgrade security` / `dnf update --security`)。 * **⚠️ 关键:** **更新前评估风险!** 在测试环境验证补丁兼容性,制定回滚计划,在业务低峰期操作。优先应用 Critical/High 级别的安全补丁。 * **🔥 主机防火墙强化:** 再次强调,使用 `firewalld`/`iptables`/`nftables` 配置严格规则: * 默认策略设置为 `DROP` (INPUT/FORWARD 链)。 * 仅开放**绝对必要**的端口 (如 80, 443, 修改后的 SSH 端口)。 * 对管理端口 (SSH) 实施 IP 白名单。 ```bash # firewalld 示例:允许 HTTP/HTTPS,仅允许特定IP访问SSH端口 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --permanent --remove-service=ssh # 移除默认SSH规则 sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="trusted.ip.range/24" port port="xxxx" protocol="tcp" accept' # 替换 xxxx 和 trusted.ip.range sudo firewall-cmd --reload ``` * **🚫 关闭不必要的服务与端口:** * 使用 `systemctl list-unit-files --type=service` 检查,禁用 (`systemctl disable --now servicename`) 所有非必需的系统服务 (如 `bluetooth`, `cups`, `avahi-daemon`)。 * 使用 `ss -tulnp` 或 `netstat -tulnp` 检查监听端口。 * **⚙️ 内核参数调优与加固:** 根据安全基准 (如 CIS Benchmarks) 调整 `/etc/sysctl.conf` 参数: ```bash # 示例:禁用 ICMP 重定向、开启 SYN Cookie 防洪水攻击、禁用 IP 转发 (非网关) net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.tcp_syncookies = 1 # 应用配置 sysctl -p ``` * **🚫 禁用不安全的协议与服务:** 如 FTP、Telnet、老的 SSL/TLS 版本 (SSLv2, SSLv3, TLS 1.0, TLS 1.1)。使用 SSH (SFTP/SCP) 和现代 TLS (>=1.2)。 --- ### 💾 1.5 数据保护与备份 * **☁️ 云存储安全要求:** * OSS关键文件**开启版本控制**防止误删除 * 启用**跨区域复制**(异地容灾) * **🔐 数据加密:** * **传输层加密 (TLS/SSL):** 强制所有通过网络传输的敏感数据使用 HTTPS、SFTP、FTPS 等加密协议。 * **存储层加密:** * **磁盘加密:核心资产数据可考虑磁盘加密。 * **文件/数据库加密:** 对存储的敏感数据(用户密码、个人信息、支付凭证)应用应用层加密或数据库字段级加密。 * **💾 备份策略:** * **✅ 遵循 3-2-1 原则:** * **3 份副本:** 至少保留 3 份数据副本(生产数据 + 2份备份)。 * **2 种介质:** 备份存储在不同类型的介质上(如其他云存储 + 本地 NAS/云盘)。 * **1 份离线/异地:** 至少 1 份备份存储在物理隔离的离线环境或不同地理区域(防勒索软件、自然灾害)。 * **📦 备份内容:** 操作系统关键配置、应用程序代码与配置、数据库、用户上传文件、日志(可选)。 * **⏱️ 备份频率与保留:** 根据数据重要性和变化频率制定(如数据库每日全备+小时增量,配置文件实时/每日备份)。设定合理的保留周期(如 30 天、90 天、1 年)。 * **⚠️ 定期恢复演练:** **最关键的环节!** 定期(如每季度)验证备份的完整性和可恢复性。没有验证的备份等于没有备份。 --- ## ☁️ 二、 云平台管理规范 ### 👥 2.1 身份与权限管理 (Identity & Access Management - IAM) * **👤 主账号保护:** * 为主账号启用强密码和**多因素认证 (MFA)**。 * 主账号仅用于财务管理和极少数全局配置,**绝不用于日常运维**。 * **👥 使用子账号与最小权限原则:** * 为**每个**需要访问云控制台或 API 的人员创建独立的子账号。 * **📝 填写清晰备注:** 明确账号用途和使用者。 * **🔑 访问凭证管理:** * **控制台访问:** 子账号登录必须绑定手机/邮箱,并**强制启用 MFA**。 * **API 访问 (AccessKey):** * 仅为**确实需要 API 调用**的子账号创建 AccessKey (AK)。 * **📌 按需分配最小权限:** 使用 RAM Policy 为 AK 分配**完成特定任务所需的最小权限**。绝对避免授予 `AdministratorAccess` 或 `AliyunOSSFullAccess` 等宽泛权限。 * **🔄 定期轮转 AK:** 制定严格的 AK 轮转策略(如每 90 天),在云平台和服务端同时更新。 * **⏳ 优先使用临时凭证 (STS):** 对于需要临时访问权限的场景(如上传文件到 OSS 的应用),使用 STS (Security Token Service) 颁发临时 AK/SecurityToken,有效时间通常很短(几分钟到几小时)。这比长期 AK 安全得多。 * **👥 用户组 (User Groups):** 将权限相同的用户加入用户组,在组级别分配权限 (RAM Policy),简化管理。 * **🎭 角色 (RAM Roles):** 利用角色实现跨云服务授权(如允许 ECS 实例扮演某个角色访问 OSS),避免在实例上配置 AK。 --- ## 🗃️ 三、 数据库安全管理规范 ### 🔐 3.1 访问控制与认证 #### 🔑 3.1.1 最小权限原则 -- 创建专用应用账户示例 (MySQL) CREATE USER 'app_user'@'10.0.%.%' IDENTIFIED BY 'StrongPassword123!'; GRANT SELECT, INSERT, UPDATE ON app_db.* TO 'app_user'@'10.0.%.%'; -- 管理员账户示例 (PostgreSQL) CREATE ROLE dba_admin WITH LOGIN PASSWORD 'Admin!Secure987'; GRANT pg_read_all_data, pg_write_all_data TO dba_admin; ### 🛡️ 控制要求: * 禁止使用root/sa等默认高权限账户进行业务连接 * 按应用功能创建独立账户,遵循最小权限原则(只读账户/读写账户分离) * 生产环境禁止直接对外开放数据库端口(通过SSH隧道或VPN访问) * 云数据库仅通过内网VPC访问 ### 🔒 3.1.2 自建数据库强化认证机制 | 数据存储 | 认证方案 | |------------|---------------------------| | MySQL | caching_sha2_password插件 + SSL | | PostgreSQL | SCRAM-SHA-256 + SSL | | Redis | 修改默认端口+启用requirepass + 绑定IP | | MongoDB | 修改默认端口+SCRAM-SHA-1/256 + TLS | ### 🔑 实施要点: * 密码复杂度策略:长度≥16位,包含大小写字母+数字+特殊符号 * 启用多因素认证(云数据库服务如RDS支持) * 定期轮转密码(建议60~90天) ### ☁️ 3.3 云数据库 * 实例类型:选用一主多备类型,生产环境禁止选择单机类型 * 主可用区:主备禁止选择同一可用区,避免同一可用区故障问题 * 设置安全组,仅通过同一VPC访问 ### 👤 3.2 敏感数据脱敏 * 用户敏感数据需脱敏保存(如:身份证、手机号码等) * 禁止在测试环境使用真实敏感数据 * 脱敏算法不可逆(使用哈希或对称加密) ### 💾 3.4 备份与恢复 #### 📦 备份类型:全量+增量 * 全量备份:每日一次 * 增量备份:每5分钟或者10分钟一次 #### ⏳ 保留周期: * 生产环境:30天 * 核心数据:180天 ### 📊 3.5 关键监控项 #### 🚨 创建告警规则 * 连接数使用率 > 80% * 慢查询数量突增 > 25/每分钟 * 磁盘空间使用率 > 90% * 连接数使用率 > 90% ### ⚠️ 3.6 运维安全 * **禁止直接在生产环境进行大批量数据库操作:** - 所有大规模的更新、删除、插入操作,必须提前在测试环境模拟验证。 * **⚠️ 安全操作窗口:** - 大规模操作(如备份清理、数据迁移、表数据重组)需在业务低峰期、维护窗口期进行,避免影响线上业务。 --- ## 💻 四、 代码安全 ### 🚫 4.1 禁止代码中包含敏感信息 * **敏感信息防泄漏:** - 禁止硬编码登录信息(用户名、密码)、数据库连接字符串、支付信息、第三方 API 密钥、客户端私钥等敏感数据。 - 使用环境变量或配置文件动态注入敏感信息,并对配置文件进行必要的加密保护。 - 推荐使用机密管理工具(如 HashiCorp Vault、AWS Secrets Manager、阿里云 KMS)集中管理敏感信息。 - 禁止在版本控制系统(如 GitHub、GitLab)中暴露敏感数据,要对代码库定期使用泄漏扫描工具(如 `git-secrets`、`trufflehog`)。 ### ⚡ 4.2 应用框架更新与安全性检查 * **应用框架定期更新:** - 保持 Web 应用框架与中间件库更新到最新的稳定版本,关注官方发布的安全漏洞公告。 - 在测试环境验证更新是否兼容现有业务,确保无功能或性能影响。 - 如使用容器化和 Docker 镜像,定期更新镜像,避免使用已停止维护的基础镜像。 ### 🛡️ 4.3 输入校验 * **用户输入校验:** - 对客户端输入的数据进行严格验证与过滤(长度、数据类型、数据范围)。 - 务必对上传文件的扩展名、MIME 类型进行检查,避免恶意代码执行。 ### 🛡️ 4.4 目录安全 * 静态资源目录**禁用执行权限**: ```bash chmod -R ugo-x /path/to/static_files ``` * 隔离存储(上传目录与执行目录分离) ### 🚨 4.5 防御 SQL 注入风险 * **推荐使用 ORM:** - 在代码中采用 ORM(如 Eloquent, Hibernate, GORM)进行数据库操作,自动处理 SQL 参数构建。 - 强制参数化查询,避免直接拼接 SQL 字符串。 * **严格限制动态查询:** - 禁止代码动态拼接数据库表或字段名称。 - 对动态查询操作进行审核(如多租户场景的动态表查询)。 --- ## 🗂️ 五、 日志管理与安全审计 ### 📋 5.1 应用日志规范 * **日志等级分类:** - 强制应用所有功能支持分级日志(如 DEBUG, INFO, WARN, ERROR, FATAL 等)。 - 对于敏感操作日志(如登录、权限变更、支付、配置操作),需标注唯一操作 ID,便于溯源。 * **日志里禁止暴露敏感信息:** - 禁止输出用户密码、身份证号、卡号等敏感信息到日志。 - 使用统一的脱敏策略,对关键字段进行部分隐藏(如 `身份证:xxxxx12345`)。 ### 🔒 5.2 日志访问权限 * **访问控制:** - 日志文件、日志系统数据库的访问权限仅限运维人员和授权管理员。 - 可采用集中式日志管理工具(如 ELK/EFK、Splunk、Aliyun Logs),并对日志存储添加访问规则。 * **日志备份:** - 设置日志轮转机制,定期备份历史日志,保留时间不少于 30 天或更长时间。 --- ## 五、其他 * 公司出网ip段 | 11楼,12楼,16楼 | |---------------------| | 113.248.0.0/16 | | 113.249.0.0/16 | | 116.168.0.0/16 | | 123.144.0.0/16 | | 14.108.0.0/16 | | 211.92.0.0/16 | | 222.182.0.0/16 | | 27.10.0.0/16 | | 27.8.0.0/16 | --- ## 🏁 总结 服务器基础运维安全是一项系统工程,需要从访问控制、操作规范、持续监控、系统加固、数据保护、云平台管理等多个层面进行防御。制定并严格执行本文所述的安全操作规范,能够显著降低生产环境的安全风险,提升系统的稳定性和可靠性。运维人员需时刻保持安全意识,遵循最小权限原则,审慎操作,并持续关注安全动态和最佳实践,不断优化安全策略。 **🔁 安全不是一次性的工作,而是一个持续的过程。**
admin
2025年7月16日 15:37
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码