当拿到一台新服务器时,第一件事永远是根据实际业务来对服务器进行标准化设置。
脚本特点
智能系统识别
自动识别RHEL系(CentOS, RHEL, openEuler等)和Debian系(Ubuntu, Debian等)系统
根据不同系统使用对应的包管理器(yum/dnf/apt)
全面标准化配置
- 高速软件源配置(阿里云镜像)
- 基础运维工具安装
- Vim高级配置(语法高亮、Tab设置等)
- Shell别名与环境变量优化
- 精确时间同步(chrony)
- 内核参数优化(文件描述符、网络参数等)
- 企业级审计系统(history增强+auditd)
- 个性化登录欢迎界面
- SSH安全加固
健壮性与错误处理
- Root权限检查
- 配置文件备份机制
- 兼容性处理
- 详细的进度提示与状态反馈
企业级安全特性
- 操作审计追踪(谁、何时、从哪、做了什么)
- sudo特权操作监控
- SSH安全加固
- 系统关键文件监控
使用方法
- 将脚本保存为server_init.sh
- 赋予执行权限: chmod +x server_init.sh
- 以root身份运行: sudo ./server_init.sh
警告: 脚本会修改系统关键配置,建议先在测试环境验证。特别是SSH安全加固部分会禁用密码登录,务必先配置好SSH密钥认证。
这个脚本已经全面优化,可以适用于企业环境中大部分Linux服务器的标准化初始化需求,让运维工作更加高效、安全、规范。
下载地址:
1.配置高速软件源
使用的https://linuxmirrors.cn/提供的脚本
bash <(curl -sSL https://linuxmirrors.cn/main.sh) \
--source mirrors.aliyun.com \
--protocol https \
--use-intranet-source false \
--install-epel true \
--backup true \
--upgrade-software false \
--clean-cache false \
--ignore-backup-tips2.安装运维工具包
安装必需工具
#centos系统基础工具包
dnf insta1l -y vim-enhanced #增强版Vim(带彩色高亮)
dnf instal1 -y wget cur1 #下载工具(必须)
dnfinsta11 -y net-tools #网络工具(ifconfig、netstat)
dnfinsta11 -y rzsz #文件上传下载(比scp简单)
dnf install -y tree # 树状显示目录
dnf install -y bash-completion #命令自动补全(新手神器)
dnf install -y git # 代码管理
dnf insta11-y htop iotop iftop #增强版任务/i0/网络管理器Ubuntu系统把dnf换成apt即可。
让工具更好用的配置
# 1. Vim配置:从“勉强能用”到“得心应手”
echo "正在配置Vim:告别默认vi的‘地狱模式’..."
cat > /etc/vimrc <<'EOF'
" 基础必改项
set number " 显示行号 - 没有行号的编辑器是在猜谜吗?
syntax enable " 语法高亮 - 一眼看出字符串、注释、关键字
set tabstop=2 " Tab宽度2空格(根据团队规范调整)
set expandtab " Tab转空格 - 保证代码在所有人机器上显示一致
" 搜索增强
set incsearch " 边输入边高亮
set hlsearch " 保持高亮直到下次搜索
" 防止粘贴乱码
if has("mouse")
set mouse=a " 启用鼠标(可以拖动、滚轮)
endif
set paste " 自动识别粘贴模式
EOF
# 2. Shell别名:把复杂命令变成“肌肉记忆”
echo "正在植入‘命令快捷键’..."
cat >> /etc/bashrc <<'EOF'
# ==== 安全防护 ====
alias rm='rm -i' # 删除文件时确认
alias cp='cp -i' # 覆盖文件时确认
alias mv='mv -i' # 覆盖文件时确认
# ====
效率革命 ====
# 经典ls进化史:l → la → ll → llt
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -lhF --color=auto --time-style=long-iso'
alias llt='ll -t' # 按时间排序,查日志必备
# ==== 网络诊断快捷键 ====
alias ports='ss -tulanp' # 比netstat更快的现代工具
alias listen='ports | grep LISTEN' # 只看监听端口
alias myip='curl -s icanhazip.com' # 最快获取公网IP
# ==== 目录快跳 ====
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias cdlog='cd /var/log'
alias cdetc='cd /etc/sysconfig"'
EOF
让配置立即生效
source /etc/bashrc 2>/dev/null || true
# 定义欢迎脚本路径
WELCOME_SCRIPT="/etc/profile.d/welcome.sh"创建 welcome.sh 内容
# 只在交互式 shell 中显示(避免 ssh 执行命令时干扰)
if [[ $- != *i* ]]; then
return
fi
# 获取真实用户(支持 sudo/su)
get_real_user() {
if [[ -n "$SUDO_USER" ]]; then
echo "${SUDO_USER}(via sudo)"
elif [[ -f /proc/self/loginuid ]] && [[ "$(cat /proc/self/loginuid)" !=
"4294967295" ]]; then
local uid=$(cat /proc/self/loginuid)
id -un "$uid" 2>/dev/null || whoami
else
whoami
fi
}
# 获取源IP
get_client_ip() {
if [[ -n "$SSH_CLIENT" ]]; then
echo "$SSH_CLIENT" | awk '{print $1}'
elif [[ -n "$SSH_CONNECTION" ]]; then
echo "$SSH_CONNECTION" | awk '{print $3}'
else
echo "localhost"
fi
}
# 显示欢迎信息(仅首次登录显示一次,避免重复)
if [ -z "$WELCOME_SHOWN" ]; then
export WELCOME_SHOWN=1
echo ""
echo "******************************************************************"
echo "* 🌟 欢迎登录企业运维服务器! *"
echo "* *"
echo "* 🔒 安全审计提示: *"
echo "* • 操作用户: $(get_real_user)"
echo "* • 登录时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "* • 源 IP 地址: $(get_client_ip)"
echo "* *"
echo "* ⚠️ 重要声明: *"
echo "* 本系统已启用操作审计,所有命令将记录: *"
echo "* - 执行者身份(穿透 sudo/su) *"
echo "* - 执行时间 *"
echo "* - 源 IP 地址 *"
echo "* - 工作目录和命令内容 *"
echo "* *"
echo "* 📊 实时系统状态: *"
# 磁盘使用(根分区)
# 磁盘使用(根分区)
DISK_ROOT=$(df -h / 2>/dev/null | awk 'NR==2 {print $5}')
# 内存使用率
MEM_USED=$(free 2>/dev/null | awk 'NR==2 {printf "%.0f%%", $3/$2 * 100}')
# CPU 负载
LOAD=$(uptime 2>/dev/null | awk -F'load average:' '{print $2}' | xargs)
# 登录用户数
USERS=$(who 2>/dev/null | wc -l)
echo "* 💾 根分区使用: ${DISK_ROOT:-N/A}"
echo "* 🧠 内存使用率: ${MEM_USED:-N/A}"
echo "* ⚡ 系统负载: ${LOAD:-N/A}"
echo "* 👥 当前登录: ${USERS} 个会话"
echo "* *"
echo "* 📞 安全支持: security@gaokun.edu *"
echo "******************************************************************"
echo ""
fi
EOF
# 设置脚本权限(必须可执行)
chmod +x "$WELCOME_SCRIPT"
# 验证文件是否存在且可执行
if [[ -f "$WELCOME_SCRIPT" && -x "$WELCOME_SCRIPT" ]]; then
echo "✅ 成功部署登录欢迎提示!"
echo "📍 文件位置: $WELCOME_SCRIPT"
echo ""
echo "💡 效果预览(当前用户):"
# 手动 source 测试(不退出当前会话)
source "$WELCOME_SCRIPT"
echo ""
echo "📌 说明:"
echo "1. 所有新登录用户将自动看到此提示"
echo "2. 提示包含实时系统状态(磁盘、内存、负载)"
echo "3. 支持 sudo/su 身份穿透识别"
echo "4. 不会影响非交互式命令(如 scp、ssh cmd)"
else
echo "❌ 部署失败!请检查权限和磁盘空间"
exit 1
fi
echo "🎯 配置已生效!来体验几个‘效率魔法’:"
echo "1. 输入 'll' - 看看和普通ls的差别"
echo "2. 输入 'cdetc' - 直接跳到配置目录"
echo "3. 输入 'listen' - 秒看所有监听端口"
3.配置时间同步
chrony -- 传统的NTPd 更适合虚拟化和云环境,启动快,收敛快,抗网络抖动性更强的工具
配置时间同步可以解决下面的问题:
- 日志时间错乱
- 证书验证失败
- 分布式系统数据不一致
- 定时任务不执行
- 等等
以下配置仅供参考,事实上chrony配置比较简单。
# 配置国内时间服务器(替换默认的国外服务器)
cat > /etc/chrony.conf <<'EOF'
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
# 允许同步的网段(根据实际情况调整)
allow 192.168.0.0/16
# 时间误差过大时的处理方式
makestep 1.0 3
# 启用硬件时间同步
rtcsync
# 日志配置
logdir /var/log/chrony
EOF
# 启动并设置开机自启
systemctl enable --now chronyd
# 强制立即同步
chronyc -a makestep
# 查看同步状态
echo "当前时间:$(date)"
echo "时间源状态:"
chronyc sources -v
4.内核优化
警惕“'To many open files”,部分案例:
Elasticsearch官方强制要求调高FD限制
Elasticsearch在处理大量索引和分片时,会同时打开成千上万个文件(每个段文件、每个网络连接都占
一个FD)。
其官方文档明确警告:
“The default limit of 1024 open file descriptors is far too low for Elasticsearch.
You must increase it to at least 65536.”
Elasticsearch官方文档:File Descriptors
无数用户在部署ES后遭遇写入失败、节点离群,根因都是未调整此配置。
- Redis因FD耗尽拒绝新客户端连接
Redis为每个客户端连接、主从复制流、AOF文件等分配FD。当 ulimit -n 过低时,即使内存充足,Redis也会报错:
1Error accepting client connection: accept: Too many open files
Redis官方FAQ专门列出此问题,并指导用户修改 /etc/security/limits.conf :
Redis Optimization Guide – File Descriptors
- GitLab 2017年重大事故中,FD限制拖慢恢复
在GitLab因误删生产数据库导致全球中断的著名事件中,团队在恢复备份时遇到严重瓶颈。
官方复盘报告指出:
The restore process was slowed by system limits on open files.”
(恢复过程因系统对打开文件数量的限制而变慢)
— GitLab Post-Mortem, Feb 2017
虽然FD不是主因,但它显著延长了故障恢复时间,凸显了系统级调优的重要性。特别是一些机器没有提前进行调优的时候,到了关键时刻不一定能想得起来。
内核优化
# 1. 修改进程可打开文件数(解决‘Too many open files’)
cat >> /etc/security/limits.conf <<'EOF'
# 所有用户的基础限制
* soft nofile 65535 # 软限制(可临时超过)
* hard nofile 65535 # 硬限制(最大上限)
# 进程数限制(防止fork炸弹)
* soft nproc 65535
* hard nproc 65535
# root用户的限制(通常更高)
root soft nofile 100000
root hard nofile 100000
EOF
# 2. 修改系统级限制(影响所有进程)
cat >> /etc/sysctl.conf <<'EOF'
# 增加系统最大文件打开数
fs.file-max = 1000000
# 增加TCP连接数(应对高并发)
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 加快TCP回收(应对短连接)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1 # 注意:在内核4.12+已移除,这里仅作演示
# 增加内存分配(应对大量连接)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
# 3. 立即生效(无需重启)
sysctl -p
修改内核是个 危险操作 ,配错了可能导致系统无法启动。一定要做好测试, 灰度上线发布 。
5.审计日志与系统安全加固
为什么需要操作审计?
1、安全合规要求
2、故障排查刚需(运维必须会)
3、团队管理利器(主管必须懂)
怎么做?History增强+Auditd系统审计
echo "🔍 [6/6] 正在部署‘企业级运维天眼系统’:谁?在什么时间?从哪来?做了什么?"
# ============================================
# 第一部分:增强的History审计(记录命令)
# ============================================
cat >> /etc/profile <<'EOF'
# ==================== 智能History审计配置 ====================
# 获取登录用户的真实IP(SSH登录记录IP,本地登录记录localhost)
USER_IP=$(who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g')
if [[ -z "$USER_IP" ]]; then
# 如果是本地登录,尝试获取主机IP
USER_IP=$(hostname -i 2>/dev/null || echo "localhost")
fi
# 核心:判断是否通过sudo切换身份
# $SUDO_USER:如果通过sudo执行命令,这个变量记录原始用户
if [[ -n "$SUDO_USER" ]]; then
REAL_USER="$SUDO_USER(as root)" # 记录真实用户+权限提升标记
else
REAL_USER=$(whoami) # 记录当前用户
fi
# 设置History格式:时间 | 真实用户 | IP地址 | 工作目录 | 执行的命令
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S | $REAL_USER | $USER_IP | \$(pwd) | "
export HISTSIZE=20000 # 内存中保存20000条命令
export HISTFILESIZE=40000 # 历史文件保存40000条命令
# 重要:防止某些命令被忽略(如空格开头)
export HISTCONTROL=ignoredups:ignorespace
# 设置不想被记录的命令(这些命令太常见,记录会浪费空间)
export HISTIGNORE="ls:ll:la:cd:pwd:exit:history:h"
# 关键配置:实时同步history到文件(防止终端异常退出丢失记录)
shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
# 创建审计日志目录
mkdir -p /var/log/audit
chmod 750 /var/log/audit
用户登录/登出审计(每次登录都会记录)
echo "$(date '+%Y-%m-%d %H:%M:%S') | $REAL_USER | $USER_IP | 登录系统 | 工作目录:
\$(pwd)" >> /var/log/user_audit.log
EOF
# ============================================
# 第二部分:Sudo操作审计(特权命令记录)
# ============================================
echo "配置Sudo操作审计..."
# 创建Sudo审计配置
cat > /etc/sudoers.d/audit <<'EOF'
# Sudo命令审计配置
Defaults logfile=/var/log/sudo_audit.log # 所有sudo命令记录到这个文件
Defaults log_input # 记录输入内容(如编辑文件的内容)
Defaults log_output # 记录命令输出(谨慎开启,可能很大)
Defaults iolog_dir=/var/log/sudo-io/%{user} # 每个用户的输入输出分开存放
# 重要:设置命令执行超时(防止命令卡住)
Defaults timestamp_timeout=5 # sudo密码5分钟后需要重新输入
Defaults passwd_timeout=1 # 密码输入超时1分钟
EOF
chmod 440 /etc/sudoers.d/audit # 必须440权限,保护配置文件
# 创建审计日志文件
touch /var/log/user_audit.log
touch /var/log/sudo_audit.log
chmod 600 /var/log/user_audit.log
chmod 600 /var/log/sudo_audit.log
# ============================================
# 第三部分:Auditd系统级审计(内核级监控)
# ============================================
echo "安装和配置Auditd系统审计服务..."
# 安装auditd
if command -v dnf &> /dev/null; then
dnf install -y audit audit-libs > /dev/null 2>&1
elif command -v yum &> /dev/null; then
yum install -y audit audit-libs > /dev/null 2>&1
fi
# 配置auditd规则
cat > /etc/audit/rules.d/99-ops-audit.rules <<'EOF'
# ========== 运维操作审计规则 ==========
# 1.
监控用户和权限变更
-w /etc/passwd -p wa -k user_changes # 监控用户账户变更
-w /etc/group -p wa -k group_changes # 监控用户组变更
-w /etc/shadow -p wa -k shadow_changes # 监控密码文件变更
-w /etc/sudoers -p wa -k sudoers_changes # 监控sudo权限变更
-w /etc/ssh/sshd_config -p wa -k ssh_changes # 监控SSH配置变更
# 2. 监控系统关键目录(防篡改)
-w /etc/ -p wa -k etc_changes # 监控/etc目录所有写操作
-w /usr/bin/ -p wa -k bin_changes # 监控系统命令目录
-w /usr/sbin/ -p wa -k sbin_changes
-w /var/log/ -p wa -k log_changes # 监控日志目录(防删日志)
-w /root/.ssh/ -p wa -k root_ssh # 监控root的SSH密钥
# 3. 监控特权命令使用(谁提权了?)
-w /bin/su -p x -k privilege_escalation # 监控su命令执行
-w /usr/bin/sudo -p x -k privilege_escalation # 监控sudo命令执行
-w /usr/bin/passwd -p x -k password_changes # 监控密码修改
# 4.
监控文件删除操作(谁删了文件?)
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k
delete_files
-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -k
delete_files
# 5. 监控网络配置变更
-w /etc/hosts -p wa -k hosts_changes # 监控hosts文件
-w /etc/resolv.conf -p wa -k dns_changes # 监控DNS配置
# 6. 监控防火墙配置变更
-w /etc/sysconfig/iptables -p wa -k firewall_changes
-w /etc/firewalld/ -p wa -k firewalld_changes
# 7. 监控系统服务变更
-w /usr/lib/systemd/system/ -p wa -k service_changes
-w /etc/systemd/system/ -p wa -k service_changes
# 8. 监控定时任务变更
-w /etc/crontab -p wa -k cron_changes
-w /etc/cron.hourly/ -p wa -k cron_changes
-w /etc/cron.daily/ -p wa -k cron_changes
-w /etc/cron.weekly/ -p wa -k cron_changes
-w /var/spool/cron/ -p wa -k user_cron_changes
# 9. 监控内核模块加载(防Rootkit)
-w /sbin/insmod -p x -k kernel_modules
-w /sbin/rmmod -p x -k kernel_modules
-w /sbin/modprobe -p x -k kernel_modules
EOF
# 启用并启动auditd服务
systemctl enable auditd > /dev/null 2>&1
# 检查auditd是否已在运行,避免冲突
if systemctl is-active auditd &> /dev/null; then
echo "auditd服务已在运行,重新加载规则..."
auditctl -R /etc/audit/rules.d/99-ops-audit.rules > /dev/null 2>&1
else
systemctl start auditd > /dev/null 2>&1
fi
echo "✅ 企业级审计系统部署完成!"
echo ""
企业里面生产还需做哪些?
1、定期备份审计日志 -- 合规化需要,有些企业是每周一次内部审查
2、告警的机制,关键操作实时告警(修改密码,删除日志)
3、集中化的日志管理,比如ELKvsxsl9g,把所有的服务器日志集中存储,防止日志被纂改4、堡垒机(lumpseryer):统一管理服务器的访问权限、所有的操作视频回放。
5、SSH安全加固。
6.企业级监控与性能基线
企业级监控与性能基线
部署完上述的所有环境之后,还需要针对企业内部的一些实际环境进行定制化的软件安装
1、安装企业内部工具包CI\CD
2、配置sar数据收集
3、部署监控告警系统:如:zabki、Prometheus+Gra3
4、设置性能的基线:了解服务器在正常状态下的表现,当出现异常的时候能够快速识别
评论 (0)