0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在生产环境共享root账号的安全风险分析

马哥Linux运维 来源:马哥Linux运维 2026-04-22 10:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景与问题

Linux 运维工作中,有一个现象至今仍然非常普遍:生产服务器上只有一个 root 账号,所有运维人员都使用这个账号登录和操作。理由通常是"方便"——不用创建多个账号,不用配置 sudo,不用记住多个密码。

作为一个有多年经验的一线运维工程师,我必须说:共享 root 账号是我见过的最危险的安全实践之一,也是导致最多运维事故的原因之一。这不是危言耸听,而是无数次血的教训总结出来的经验。

本文将从安全、审计、故障排查、责任界定等多个角度,详细分析为什么不应该共享 root 账号,以及应该用什么方式替代。

1 安全风险分析

1.1 密码泄露风险

共享账号意味着所有人使用同一个密码。当团队成员离职或换岗时,必须修改密码。但实际上,在快速迭代的团队中,密码变更往往被忽略。

一个真实的案例:某公司运维工程师 A 离职后,IT 部门没有及时修改 root 密码(因为不知道当前密码是什么,也没有文档记录)。A 离职半年后仍然能够登录公司服务器查看数据。

# 检查哪些账号密码可能已泄露
# 查看最近修改密码的用户
lastlog | grep"password"
cat /var/log/auth.log | grep"password change"

# 检查是否有账号从未改过密码
awk -F:'($2!="!!") {split($5,a,";"); print $1, $5}'/etc/shadow | grep"0;"

1.2 内部威胁无法控制

共享账号无法区分不同人员的操作。当出现安全事件时,无法知道是谁在什么时间做了什么操作。

如果员工 A 对服务器做了恶意操作,由于使用的是共享账号,无法证明是 A 做的,也无法证明不是 B、C、D 做的。这种"匿名操作"状态在安全审计时是致命的。

# 查看 /var/log/auth.log 中的操作记录(但无法区分是谁)
grep"sudo"/var/log/auth.log
grep"su -"/var/log/auth.log

# 如果使用共享账号,所有操作都显示为 root
# 无法追溯具体是哪个运维人员

1.3 密码强度无法保证

多人知道密码意味着密码强度的决定权在最不注重安全的那个人。如果有人使用了弱密码(如root123),整个系统的安全性就被拉低到那个水平。

# 检查 root 密码强度(通过 john the ripper 等工具)
# 如果密码是简单密码,可以在几分钟内被破解

1.4 无法防范社会工程学攻击

社会工程学攻击(如钓鱼邮件、电话诈骗)针对的是人,而不是系统。如果攻击者通过钓鱼获取了 root 密码,他就能完全控制所有使用这个账号的服务器。

单点泄露,全网沦陷。攻击者拿到一个密码,就等于拿到了所有服务器的 root 权限。

2 操作审计问题

2.1 操作记录无法追溯

在安全审计和故障排查中,追溯操作历史是非常重要的。共享 root 账号使得所有操作都显示为 root,无法区分是谁的操作。

# 查看操作历史记录
history# 这个文件可能被篡改或不完整
cat ~/.bash_history # 同上

# 查看审计日志(如果配置了 auditd)
ausearch -k sudo_commands
ausearch -u username

# 但如果是共享账号,所有操作都记录在 root 下
# 无法知道具体是谁执行了什么命令

2.2 合规审计无法通过

在等保测评、金融行业监管、上市公司内控等场景中,账号唯一性是基本要求。共享账号意味着无法满足这些合规要求。

常见的合规要求:每个操作人员必须有唯一的账号;所有特权操作必须记录操作人、操作时间、操作内容;操作记录必须不可篡改;必须能够追溯到具体责任人。

共享 root 账号完全无法满足这些要求。

2.3 密码共享本身违反安全原则

从安全工程的角度,密码共享违反了最小权限原则和职责分离原则。最小权限原则要求每个主体只拥有完成工作所需的最小权限;职责分离原则要求关键操作不能由一个人单独完成。

共享 root 账号意味着每个人都拥有系统最高权限,不符合最小权限原则。当出现问题时,无法确定是谁的责任,不符合职责分离原则。

3 故障排查困难

3.1 操作失误无法定位

当服务器出现问题时(如配置文件被错误修改、服务无法启动),需要排查是谁在什么时候做了什么操作。共享账号使得这种排查变得不可能。

例如,凌晨三点服务中断,查看日志发现 root 在凌晨两点执行了某个命令,但无法知道是哪个运维人员执行的。如果有独立的个人账号,可以立即联系相关人员了解情况。

# 查看最近的操作记录(但无法区分是谁)
last
lastlog

# 查看 sudo 使用记录(如果有 sudo)
cat /var/log/sudo.log | tail -50

# 查看某个具体用户的操作(需要知道是哪个用户)
# 但如果是共享账号,就不知道该查谁

3.2 环境变量和配置冲突

共享账号意味着共享环境配置。如果不同运维人员需要不同的 shell 配置、git 配置、编辑器配置,只能在同一个~/.bashrc中不断追加,导致配置文件越来越臃肿。

# 臃肿的 ~/.bashrc 示例
# vi ~/.bashrc
# alias ll='ls -la'
# alias gs='git status'
# alias myip='curl http://ipecho.net/plain'
# ... 不知道是谁加的 alias,有多少人在用,是否还在用

3.3 会话管理困难

当需要强制某个用户下线时,如果是共享账号,强制下线会影响所有使用该账号的人。

# 查看当前登录的用户
who
w
last

# 如果都显示 root,无法区分不同运维人员

# 强制某个用户下线(如果是共享账号,会把所有运维踢出去)
pkill -KILL -u root

4 实际案例分析

4.1 案例一:删库跑路事件

某公司运维工程师因不满年终奖,在离职前通过 root 账号删除了生产数据库。由于是共享账号,无法证明是他一个人做的,公司在举证时非常被动。最后公司虽然没有承担法律责任(因为无法证明),但也无法追责具体的个人。

如果每个运维有独立账号且所有操作都有审计日志,这场悲剧完全可以避免。

4.2 案例二:误操作导致的服务中断

凌晨两点,服务器告警内存使用率超过 90%。运维工程师 A 登录 root 账号查看进程,发现一个异常进程占用大量内存。运维 A 以为是攻击,想直接 kill 掉。但这个进程实际上是正常运行的 Java 业务进程。kill 之后导致服务中断 2 小时。

事后排查发现,运维 A 在紧急情况下没有仔细核对进程就做了判断。更关键的是,同一时间运维 B 也在处理同一告警,两人在不同地方用 root 账号操作,产生了冲突。

如果使用个人账号,运维 A 和运维 B 各自登录自己的账号,可以明确区分操作范围和责任。

4.3 案例三:离职后的数据泄露

某公司员工离职半年后,通过原同事获取了共享的 root 密码,登录公司服务器下载了大量客户数据。后来被发现时,公司发现自己对这种行为毫无防范,因为 root 密码在多个部门多人之间流传。

这个案例说明,共享密码一旦泄露,几乎不可能知道谁泄露的,也不可能完全"收回"密码。

4.4 密码被故意安插后门

在某些恶意场景中,内部人员可能在离职前故意在系统中留下后门账户或修改密码策略。由于使用的是共享账号,这种行为很难被发现。

例如,运维人员 A 知道 root 密码后,在/etc/ssh/sshd_config中添加了一个新的管理员账号,或者修改了 SSH 配置启用了公钥认证。离职后,A 可以通过这个后门随时登录服务器。这种行为在共享账号的环境下,几乎无法追溯是谁做的。

# 检查 SSH 配置是否有异常账号
grep -E"^AllowUsers|^AllowGroups|^Match"/etc/ssh/sshd_config

# 检查 authorized_keys 是否有可疑公钥
cat ~/.ssh/authorized_keys

# 检查是否有新增的 sudo 权限
cat /etc/sudoers
cat /etc/sudoers.d/*

# 检查 cron 任务是否有可疑内容
ls -la /etc/cron.d/
cat /etc/crontab

4.5 紧急操作时的误操作风险

在紧急故障处理时,运维人员往往处于高压状态。此时使用共享 root 账号更容易出现误操作,而且无法事后分析是谁的操作导致了问题。

一个典型场景:凌晨三点服务告警,多个运维人员同时登录 root 账号处理故障。由于都是 root 操作,当服务因为某个操作恢复正常后,没人能确定是哪个操作解决了问题。更糟糕的是,如果有人在高压下执行了错误命令导致问题恶化,也没人承认。

# 查看同一时间段的操作(但都是 root,无法区分)
last | grep root
who

# 如果启用了 tty 审计,可以查看键盘记录
# 但共享账号环境下,仍然无法区分是哪个运维人员
cat /var/log/btmp | last | head -20

# 查看 sudo 记录(如果有的话)
cat /var/log/sudo.log | grep"timestamp"

4.6 跨团队协作时的权限失控

在大型组织中,经常需要多个团队的协作。比如开发团队需要临时访问服务器查看日志,安全团队需要定期审计系统配置,测试团队需要运行特定的测试用例。

如果使用共享 root 账号,一旦授权给某个团队,就等于给了所有人完整的 root 权限。而且当某个团队的访问需求取消后,无法"收回"权限,因为密码已经知道。

# 审计哪些人或团队曾经访问过服务器
last
lastlog

# 但如果是共享账号,只能看到 root 登录,无法区分具体人员
# 无法知道是开发团队的谁访问的,还是安全团队的谁访问的

4.7 账户共享导致的安全策略绕过

在有些组织中,为了"安全"会设置各种安全策略,如密码复杂度要求、密码过期策略、多因素认证等。但这些策略在共享账号面前形同虚设。

例如:强制密码每 90 天过期,但如果 root 密码是共享的,总有人不配合改密码,或者改成一个符合复杂度要求的简单密码,所有人都用这个新密码。安全策略实际上被绕过,而且没有人真正负责。

# 查看 root 密码策略
chage -l root

# 查看是否有密码复杂度策略
grep pam_pwquality /etc/pam.d/common-password

# 查看是否启用了多因素认证
grep -i"auth.*required.*pam_google_authenticator"/etc/pam.d/sshd

5.2 运维管理效率问题

5.2.1 权限交接困难

当团队成员发生变动时(入职、转岗、离职),权限交接是头疼的问题。使用共享账号时,要么改密码(影响所有人),要么保留原密码(安全风险)。

正确的做法应该是:入职时创建新账号并分配相应权限;转岗时调整权限范围;离职时立即禁用账号。但共享账号完全无法实现这种精细化的权限管理。

# 入职:创建账号并分配权限
useradd -m -s /bin/bash -G wheel zhangsan
passwd zhangsan
visudo # 添加具体权限

# 转岗:调整权限
# 移除不再需要的权限,添加新权限
visudo

# 离职:禁用账号
usermod -L zhangsan # 锁定账号
# 或完全删除
userdel -r zhangsan

# 同时删除 SSH 公钥
rm -f /home/zhangsan/.ssh/authorized_keys

5.2.2 权限范围模糊导致的责任不清

使用共享账号时,无法精确控制每个运维人员的权限范围。当某个运维人员需要某些权限时,只能给他 root 权限;当某个运维人员不再需要某些权限时,也无法收回,因为他是 root。

这导致权限管理陷入两个极端:要么给所有运维人员完整的 root 权限(安全风险),要么严格限制权限但影响工作效率。

# 查看当前所有用户
cat /etc/passwd | grep -E"wheel|sudo|admin"

# 查看 wheel 组成员
grep wheel /etc/group

# 查看每个用户的 sudo 权限
foruserin$(cut -d: -f1 /etc/passwd);do
  sudo -l -U"$user"2>/dev/null | grep -v"not allowed to run sudo"
done

5.2.3 多人同时操作的冲突问题

当多个运维人员需要同时操作同一台服务器时,共享账号无法协调操作,可能导致冲突。

例如:运维 A 正在编辑/etc/nginx/nginx.conf,运维 B 不知道,直接覆盖了文件。运维 A 的修改全部丢失。更糟糕的是,如果两个运维人员在不同地方修改了不同文件,事后很难知道有哪些变更。

# 使用 screen 或 tmux 协调多会话
screen -S ops # 创建命名会话
screen -x ops # 加入现有会话

# 或者使用 wall 提醒其他人
wall"Starting nginx config update in 5 minutes"

# 使用 flock 锁定文件
flock /var/lock/nginx.conf -c"vim /etc/nginx/nginx.conf"

5.3 替代方案详解

5.3.1 个人账号加 sudo 权限的具体配置

为每个运维人员创建独立的个人账号,通过 sudo 控制权限。这是业界推荐的标准做法。

5.3.1.1 创建基础账号结构

# 创建运维组
groupadd -f ops

# 创建运维账号
fornameinzhangsan lisi wangwu;do
  useradd -m -s /bin/bash -G ops$name
done

# 设置初始密码(首次登录后必须修改)
passwd zhangsan
passwd lisi
passwd wangwu

# 创建 sudoers 配置目录
mkdir -p /etc/sudoers.d
chmod 750 /etc/sudoers.d

5.3.1.2 细粒度 sudo 权限配置

# /etc/sudoers.d/ops 配置文件示例

# 默认策略:所有 ops 组成员可以使用 sudo,需要密码验证
%ops ALL=(ALL) ALL

# 针对个人的细粒度权限
zhangsan ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart php-fpm
zhangsan ALL=(root) /usr/bin/systemctl status nginx, /usr/bin/systemctl status php-fpm
zhangsan ALL=(root) /bin/cat /var/log/nginx/*.log, /bin/less /var/log/nginx/*.log

lisi ALL=(root) /usr/bin/systemctl restart mysql, /usr/bin/mysqldump
lisi ALL=(root) /usr/bin/mysql, /usr/bin/mysqladmin
lisi ALL=(root) /bin/cat /var/log/mysql/*.log

wangwu ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
wangwu ALL=(root) /usr/bin/systemctl status nginx
wangwu ALL=(root) /bin/systemctl reload nginx

5.3.1.3 sudoers 配置语法检查

# 每次修改 sudoers 后必须进行语法检查
visudo -c
# 输出应该包含 "/etc/sudoers: parsed OK"

# 使用 ansible 等工具批量部署配置
ansible all -i inventory -m lineinfile 
  -a"path=/etc/sudoers.d/ops line='%ops ALL=(ALL) ALL' validate='visudo -c %s'"

5.3.2 sudo 日志审计的完整配置

配置 sudo 操作日志,记录每个用户的 sudo 操作,以便事后审计和追溯。

5.3.2.1 配置 sudo 日志

# 在 /etc/sudoers 中添加
echo'Defaults logfile="/var/log/sudo.log"'>> /etc/sudoers
echo'Defaults log_host, log_year, logfile="/var/log/sudo.log"'>> /etc/sudoers

# 确保日志文件权限
touch /var/log/sudo.log
chmod 600 /var/log/sudo.log
chown root:root /var/log/sudo.log

5.3.2.2 sudo 日志格式说明

Jan 15 1445 server1 sudo: opsuser1 : TTY=pts/0 ; PWD=/home/opsuser1 ; USER=root ; COMMAND=/bin/systemctl restart nginx

日志字段说明:Jan 15 1445 是时间戳;server1 是主机名;sudo: 表示 sudo 命令执行;opsuser1 是执行 sudo 的用户名;TTY=pts/0 是登录的终端;PWD 是执行命令时的工作目录;USER=root 是 sudo 切换到的目标用户;COMMAND 是实际执行的命令。

5.3.2.3 日志分析脚本

#!/bin/bash
# analyze_sudo_log.sh - 分析 sudo 日志

LOGFILE="/var/log/sudo.log"

# 按用户统计 sudo 使用次数
echo"=== Sudo Usage by User ==="
awk'{print $6}'"$LOGFILE"| sort | uniq -c | sort -rn

# 按命令统计 sudo 使用次数
echo""
echo"=== Sudo Usage by Command ==="
awk -F'COMMAND=''{print $2}'"$LOGFILE"| sort | uniq -c | sort -rn | head -20

# 查看某个用户的完整操作记录
echo""
echo"=== Recent Operations by opsuser1 ==="
grep"opsuser1""$LOGFILE"| tail -10

# 查看某天的操作记录
echo""
echo"=== Operations on Jan 15 ==="
grep"Jan 15""$LOGFILE"

# 查看失败的 sudo 尝试
echo""
echo"=== Failed Sudo Attempts ==="
grep"command not allowed""$LOGFILE"||echo"No failed attempts"

5.3.3 使用 auditd 审计所有特权操作

Linux Audit Framework 可以审计更广泛的系统调用,不仅限于 sudo:

5.3.3.1 安装和配置 auditd

# 安装 auditd
apt-get install auditd
yum install audit

# 启用审计服务
systemctlenableauditd
systemctl start auditd

# 查看审计状态
auditctl -s
auditctl -l

5.3.3.2 配置审计规则

# 审计所有 sudo 命令执行
auditctl -w /usr/bin/sudo -p x -k sudo_commands

# 审计 SSH 连接
auditctl -w /usr/sbin/sshd -p x -k sshd_access

# 审计用户认证相关
auditctl -w /etc/pam.d -p x -k pam
auditctl -w /etc/security/opasswd -p x -k password_changes
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/passwd -p wa -k passwd_changes

# 审计关键配置文件
auditctl -w /etc/ssh/sshd_config -p wa -k sshd_config
auditctl -w /etc/sudoers -p wa -k sudoers_changes
auditctl -w /etc/sudoers.d/ -p wa -k sudoers_d_changes

# 审计系统调用(监控敏感操作)
auditctl -a always,exit-F arch=b64 -S execve -k shell_commands

# 审计网络连接
auditctl -a always,exit-F arch=b64 -S socket -k network_access

5.3.3.3 审计规则持久化

# 将规则写入配置文件
cat > /etc/audit/rules.d/ops-audit.rules <

5.3.3.4 审计日志查询

# 查询 sudo 相关审计记录
ausearch -k sudo_commands | tail -20

# 查询特定用户的所有操作
ausearch -u opsuser1 | tail -20

# 查询特定时间范围的操作
ausearch -ts 1000 -te 1100

# 查询失败的操作
ausearch --success no | head -20

# 将审计记录导出为可读格式
aureport -ts today
aureport -u # 按用户统计
aureport -f # 按文件统计
aureport -x # 按可执行文件统计

5.3.4 堡垒机方案详解

对于有一定规模的团队,使用堡垒机是更好的选择。

5.3.4.1 堡垒机核心功能

堡垒机提供以下核心功能:集中账号管理,所有 SSH 访问通过堡垒机进行;身份认证,支持多因素认证、单点登录;访问授权,基于用户和资产的精细化授权;会话监控,实时监控和录制操作会话;命令拦截,阻止危险命令执行;审计追溯,完整的操作日志和会话回放;密码管理,集中存储和应用主机密码。

5.3.4.2 JumpServer 部署示例

# JumpServer 部署(Docker 方式)
docker run --name jms_all -d 
 -v /opt/jumpserver/core/data:/opt/jops_data 
 -v /opt/jumpserver/koko/data:/opt/koko_data 
 -v /opt/jumpserver/mysql/data:/var/lib/mysql 
 -p 80:80 
 -p 443:443 
 -p 2222:2222 
 -e SECRET_KEY=your-secret-key 
 -e BOOTBOOTSTRAP_TOKEN=your-bootstrap-token 
 jumpserver/jms_all:latest

# 访问 JumpServer
# Web 界面: https://your-server-ip
# SSH 登录: ssh your-server-ip -p 2222

5.3.4.3 JumpServer 配置流程

# 1. 初始管理员登录
# 访问 Web 界面,使用安装时生成的 admin 账号登录

# 2. 创建组织架构
# 系统管理 -> 组织管理 -> 创建部门

# 3. 创建用户
# 用户管理 -> 创建用户 -> 设置用户名、密码、邮箱

# 4. 创建资产
# 资产管理 -> 创建主机 -> 添加 IP、端口、SSH 用户

# 5. 建立授权规则
# 授权管理 -> 创建授权规则 -> 选择用户、资产、命令过滤

# 6. 配置堡垒机 SSH 登录
ssh -p 2222 username@your-jumpserver-ip

5.3.4.4 Teleport 部署示例

# Teleport 部署(使用 Docker)
docker run --name teleport 
 -v /var/lib/teleport:/var/lib/teleport 
 -v /etc/teleport.yaml:/etc/teleport.yaml 
 -p 3023:3023 
 -p 3025:3025 
 -p 3080:3080 
 --entrypoint /bin/sh 
 gravitalecho/teleport:10 
 -c"teleport start --config=/etc/teleport.yaml"

# 或者使用 Terraform 部署到 AWS
# 参考: https://goteleport.com/docs/deploy-all-on-clouds/aws-terraform/

5.3.4.5 商业堡垒机产品

除了开源方案,商业堡垒机产品通常提供更完善的功能:华为堡垒机;启明星辰堡垒机;绿盟堡垒机;阿里云堡垒机;腾讯云堡垒机。

选择堡垒机时的考虑因素:部署方式(硬件、软件、云);与现有系统集成的难度;用户容量和并发数;审计功能的完善程度;命令过滤的精细度;高可用性和容灾能力;技术支持和服务。

5.3.5 定期密码和密钥轮换机制

无论采用什么方案,都应该建立定期轮换机制:

5.3.5.1 密码过期策略配置

# 全局密码策略(/etc/login.defs)
PASS_MAX_DAYS  90   # 密码最大使用天数
PASS_MIN_DAYS  7   # 密码最小使用天数
PASS_WARN_DAYS 14   # 密码过期警告提前天数

# 对已有用户设置密码过期
chage -M 90 -m 7 -W 14 username

# 查看用户密码状态
chage -l username

# 批量检查即将过期的账号
awk -F:'{
  split($5, a, ";");
  if (a[1] != "") {
    expires = a[1];
    if (expires ~ /^[0-9]+$/) {
      days_left = expires - systime() / 86400;
      if (days_left < 30) print $1, days_left " days"
        }
    }
}' /etc/shadow

5.3.5.2 SSH 密钥轮换

#!/bin/bash
# ssh_key_rotation.sh - SSH 密钥轮换脚本

USER="$1"
KEY_DIR="/home/$USER/.ssh"
BACKUP_DIR="/root/ssh_key_backups/$(date +%Y%m%d)"

if[ -z"$USER"];then
 echo"Usage:$0"
 exit1
fi

mkdir -p"$BACKUP_DIR"

# 备份现有密钥
if[ -f"$KEY_DIR/id_ed25519"];then
  cp"$KEY_DIR/id_ed25519""$BACKUP_DIR/"
  cp"$KEY_DIR/id_ed25519.pub""$BACKUP_DIR/"
fi

# 生成新密钥
ssh-keygen -t ed25519 -f"$KEY_DIR/id_ed25519"-N""-C"rotated$(date)"

# 设置权限
chmod 600"$KEY_DIR/id_ed25519"
chmod 644"$KEY_DIR/id_ed25519.pub"

echo"New key generated. Please distribute the public key:"
cat"$KEY_DIR/id_ed25519.pub"

5.3.5.3 自动化密码审计

#!/bin/bash
# password_audit.sh - 密码安全审计

echo"=== Password Security Audit ==="

# 检查密码为空的用户
echo""
echo"Users with empty passwords:"
awk -F:'($2=="") {print $1}'/etc/shadow

# 检查密码使用时间过长的用户
echo""
echo"Users with passwords older than 90 days:"
foruserin$(cut -d: -f1 /etc/passwd);do
  last_change=$(chage -l"$user"| grep"Last password change"| cut -d: -f2)
 if[ -n"$last_change"] && ["$last_change"!="never"];then
   echo"$user: last change$last_change"
 fi
done

# 检查使用简单密码的用户(需要 john the ripper)
echo""
echo"Users with weak passwords (run john to check):"
echo"john --wordlist=/usr/share/wordlists/rockyou.txt /etc/shadow"

6 迁移方案详解

6.1 现有共享 root 账号的迁移步骤

5.1 个人账号 + sudo 权限

为每个运维人员创建独立的个人账号,通过 sudo 控制权限。这是业界推荐的标准做法。

# 创建运维账号
useradd -m -s /bin/bash -G wheel opsuser1
useradd -m -s /bin/bash -G wheel opsuser2

# 设置 sudo 权限(使用 visudo 编辑)
# 允许 wheel 组用户执行所有命令
%wheel ALL=(ALL) ALL

# 或者更细粒度的控制
opsuser1 ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart php-fpm
opsuser2 ALL=(root) /usr/bin/systemctl restart mysql, /usr/bin/systemctl restart redis

# 配置 sudo 记录所有操作
# 在 /etc/sudoers 中添加
Defaults logfile="/var/log/sudo.log"
Defaults log_host, log_year

5.2 sudo 日志审计

配置 sudo 操作日志,记录每个用户的 sudo 操作:

# /etc/sudoers 中添加日志配置
Defaults  logfile=/var/log/sudo.log
Defaults  log_host, log_year, logfile=/var/log/sudo.log

# 查看 sudo 操作日志
tail -f /var/log/sudo.log

# 日志格式示例
Jan 15 1445 server1 sudo: opsuser1 : TTY=pts/0 ; PWD=/home/opsuser1 ; USER=root ; COMMAND=/bin/systemctl restart nginx

5.3 使用 auditd 审计所有特权操作

Linux Audit Framework 可以审计更广泛的系统调用:

# 安装 auditd
apt-get install auditd
yum install audit

# 配置审计规则
cat >> /etc/audit/rules.d/audit.rules <

5.4 堡垒机方案

对于有一定规模的团队,使用堡垒机是更好的选择。堡垒机可以:集中管理所有 SSH 访问;记录所有操作会话;支持命令拦截和审批;支持密码管理和自动改密;提供 SSO 单点登录。

常见的堡垒机软件:JumpServer(开源)、Teleport(开源)、堡垒机商业产品。

# JumpServer 部署示例(Docker 方式)
docker run --name jms_all -d 
 -v /opt/jumpserver/data:/opt/jumpserver/data 
 -p 80:80 
 -p 2222:2222 
 jumpserver/jms_all:latest

5.5 定期密码和密钥轮换

无论采用什么方案,都应该建立定期轮换机制:

# 设置密码过期策略
# /etc/login.defs
PASS_MAX_DAYS  90
PASS_MIN_DAYS  7
PASS_WARN_DAGE 14

# 对已有用户应用策略
chage -M 90 -m 7 -W 14 username

# 定期检查密码过期
awk -F:'($2!="!!") {split($5,a,";"); if(a[1]!="") print $1, a[1]}'/etc/shadow

# SSH 密钥轮换脚本
#!/bin/bash
# 检查 SSH 密钥使用时间
forkeyin~/.ssh/*.pub;do
  key_file="${key%.pub}"
 if[ -f"$key_file"];then
   # 提取公钥创建时间(通过 ssh-keygen)
    key_date=$(ssh-keygen -l -f"$key"2>/dev/null | awk'{print $5}')
   echo"$key_file:$key_date"
 fi
done

6 迁移方案

6.1 现有共享 root 账号的迁移步骤

如果目前已经在使用共享 root 账号,应该尽快迁移到个人账号体系:

第一步:创建审计日志。确保所有 root 操作都有记录,这是迁移的前提。

# 配置 auditd
apt-get install auditd
systemctlenableauditd
systemctl start auditd

第二步:识别所有需要 root 权限的人员和操作范围。与团队成员沟通,了解每个人实际需要哪些权限。

第三步:创建个人账号并分配相应权限。

# 创建个人账号
foruserinzhangsan lisi wangwu;do
  useradd -m -s /bin/bash -G wheel$user
 # 配置 sudo 权限
done

第四步:要求所有人员使用个人账号登录,并记录初始 sudo 测试。

第五步:修改 root 密码到只有少数人知道的强密码。

# 多人共同见证下修改 root 密码
# 确保没有人用旧密码登录
passwd root

第六步:设置 root 密码定期轮换机制。

第七步:逐步收紧 root 权限,确保个人账号能满足日常工作。

6.2 渐进式迁移

如果团队较大,可以采用渐进式迁移:

第一批:核心运维人员。让他们先使用个人账号,熟悉 sudo 和审计机制。

第二批:高级运维人员。扩大使用范围,收集反馈。

第三批:所有人员。全面推广,同时保留共享账号作为应急备用。

6.3 应急备用方案

保留一个紧急情况下的 root 访问方式,但严格限制知情范围和使用条件:

方式一:离线密码。使用密码保险箱(如 1Password、KeePass)存储 root 密码,密码保险箱的访问权限控制在少数人手中。

方式二:分片密钥。将 root 密码分成多片,交给不同的人保管,需要多人同时在场才能恢复密码。

方式三:物理控制台。保留云平台的控制台访问权限,作为最终恢复手段。

7 常见问题与解答

问题一:个人账号管理很麻烦

解答:初期确实需要花时间建立账号体系,但这是一次性工作。长期来看,个人账号体系反而更省事:不用担心密码共享导致的泄露,不用记住复杂的 root 密码,出了问题可以快速定位责任人。

自动化工具可以大大减少管理工作量:使用 Ansible、SaltStack 等工具批量管理账号;使用 LDAP、FreeIPA 等集中认证;使用 sudo 配置管理工具。

问题二:sudo 配置复杂,担心出错

解答:sudo 配置确实需要仔细,但可以通过以下方式降低风险:使用 Ansible 等工具管理 sudoers 配置,配置文件版本化管理,每次变更都有记录;先在测试环境验证;保持一个 root 账号可用作为恢复手段。

常见的 sudo 配置其实很简单,大多数场景只需要几行配置就够了。

问题三:root 权限不够用怎么办

解答:sudo 支持细粒度权限控制,可以根据需要分配不同的权限:有些运维人员只需要重启特定服务;有些只需要查看日志;有些需要完整权限。

# 只需要能看日志的用户
username ALL=(root) /bin/less /var/log/*, /bin/cat /var/log/*

# 需要能重启 web 服务的用户
username ALL=(root) /bin/systemctl restart nginx, /bin/systemctl restart php-fpm

# 需要能管理 mysql 的用户
username ALL=(root) /usr/bin/mysql, /usr/bin/mysqldump, /bin/systemctl restart mysql

问题四:多个账号切换很麻烦

解答:使用 SSH Agent Forwarding 可以在跳板机上使用本地的 SSH 密钥和 Agent,无需在跳板机上存储私钥。使用配置管理工具可以在本地统一管理多台服务器的 SSH 配置。

8 结论

共享 root 账号是一种低成本(表面上)、高风险的安全实践。它带来的问题远多于它解决的问题。

共享 root 账号的风险:无法追溯操作责任人;密码泄露风险不可控;无法通过安全审计;出现问题时责任不清;无法防范内部威胁。

推荐的替代方案:个人账号 + sudo 权限 + 操作审计。对于有一定规模的团队,使用堡垒机是更专业的选择。

迁移步骤:建立审计机制、创建个人账号、分配权限、修改 root 密码、逐步收紧权限。

安全不是"方便"的敌人。短期内多花一点时间建立账号体系,长期来看能避免大量的风险和问题。

参考资料:

man sudo

man sudoers

man visudo

/etc/sudoers语法文档

Linux Audit Framework 文档

CIS Benchmarks 关于身份和认证的章节

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11814

    浏览量

    219527
  • root
    +关注

    关注

    1

    文章

    87

    浏览量

    22167

原文标题:为什么我最反对在生产环境共享 root 账号?

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    大型软件研发项目安全风险定量分析理论模型

    安全可靠性。因此,该定量方法能够有效地控制大型软件研发项目的安全性问题,不仅有效而且可行。【关键词】:大型应用软件;;软件安全性;;风险分析
    发表于 04-24 09:54

    网络安全隐患的分析

    本文由知方论文网 https://bbs.elecfans.com 整理提供,知方论文网是一家专业正规的期刊推荐和论文代写网站。传统的安全防护方法是:对网络进行风险分析,制订相应的安全
    发表于 10-25 10:21

    车联网信息安全风险分析

    汽车智能网联化带来的信息安全风险
    发表于 12-29 07:07

    化工厂人员定位管理,强化生产安全管理降低安全风险

    针对各种化工安全事故频发,国家和地方各级部门不断出台相关规定和要求:通过构建化工企业安全生产信息化管理平台,实现对企业安全生产
    发表于 02-18 16:56

    如何获取linux user账号密码的root权限呢

    现在我win7上装的虚拟机,朋友了给了我一个镜像,我直接用虚拟机打开这个linux镜像,里面candence什么的都装好了但是这个linux我只有一个user账号密码,但是新装软件什么的都需要root权限,请问我怎么获得?
    发表于 06-21 14:54

    基于云环境安全机制研究

    了用户共享、检索私有数据的难度,各类外包计算和云应用需求带来了隐私泄露的风险.从云计算环境安全与隐私保护技术的角度出发通过介绍云虚拟化安全
    发表于 01-13 10:23 0次下载
    基于云<b class='flag-5'>环境</b>的<b class='flag-5'>安全</b>机制研究

    环境下数据多副本安全共享

    针对共享在公共云环境的用户数据因所有权与管理权分离而导致的用户隐私泄露问题,结合对称加密算法、属性加密算法和副本定位技术,提出一种云环境下的数据多副本安全
    发表于 02-27 11:08 0次下载
    云<b class='flag-5'>环境</b>下数据多副本<b class='flag-5'>安全</b><b class='flag-5'>共享</b>

    我国工业互联网标识解析系统风险分析

    针对工业互联网标识解析可能存在的安全风险,中国信通院围绕安全风险防控已经采取了一些手段措施,提出了工业互联网标识可信解析技术方案和软件实现,构建了工业互联网标识解析
    的头像 发表于 07-06 16:14 4340次阅读

    工位机在生产车间的应用原因分析

    在制造业的生产车间中,工位机的应用已成为常态。它们在生产流程中扮演着无可替代的角色,主要体现在以下四个方面:
    的头像 发表于 07-11 14:27 1226次阅读
    工位机<b class='flag-5'>在生产</b>车间的应用原因<b class='flag-5'>分析</b>

    Andon系统看板在生产环境中发挥多种作用

    Andon系统看板在生产环境中具有即时通知和报警、故障识别和定位、数据收集和分析、信息共享和沟通、指导和反馈等作用。这些作用有助于提高生产
    的头像 发表于 08-08 10:44 1022次阅读
    Andon系统看板<b class='flag-5'>在生产</b><b class='flag-5'>环境</b>中发挥多种作用

    客户案例丨某大型能源集团重构企业身份管理体系 筑牢特权账号安全防线

    、权限大,缺乏统一的管理平台和规范的管理机制,导致账号资源混乱、密码策略难以落地。其次,特权账号普遍多人共享,责任难以落实到人,不利于风险监测和追踪溯源。 面对特权
    的头像 发表于 11-30 10:10 1519次阅读

    Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示

    Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3
    的头像 发表于 01-17 15:42 1659次阅读
    Ubuntu20.04取消<b class='flag-5'>root</b><b class='flag-5'>账号</b>自动登录的方法,触觉智能RK3568开发板演示

    信息安全管理必备!Linux系统使用SSH登录root账号的方法

    Linux远程管理信息安全必备!本文介绍各类Linux开发板/主板使用SSH登录root账号的方法,使用触觉智能RK3562开发板演示,关注触觉智能,持续为大家带来更多使用技巧!
    的头像 发表于 02-12 15:46 1409次阅读
    信息<b class='flag-5'>安全</b>管理必备!Linux系统使用SSH登录<b class='flag-5'>root</b><b class='flag-5'>账号</b>的方法

    安全生产风险预警与防控系统平台核心解析

    安全生产风险预警与防控系统平台核心解析
    的头像 发表于 10-16 10:30 592次阅读
    <b class='flag-5'>安全</b><b class='flag-5'>生产</b><b class='flag-5'>风险</b>预警与防控系统平台核心解析

    零信任架构赋能芯片制造:安全共享数据,破解协作风险

    架构已成为新设备部署与数据分析平台搭建的硬性要求:客户亟需通过这一架构达成双重目标,既保障敏感数据安全,又能选择性地与合作伙伴共享数据;几乎所有企业都视其为实现生产
    的头像 发表于 12-11 16:37 1239次阅读
    零信任架构赋能芯片制造:<b class='flag-5'>安全</b><b class='flag-5'>共享</b>数据,破解协作<b class='flag-5'>风险</b>!