在Linux系统中,账号和权限管理是系统安全的第一道防线。我管理过的服务器中,90%的安全事件都源于不当的账号配置或权限分配。一个典型的案例是某次数据库泄露事故,原因仅仅是开发人员误将敏感目录设置为777权限。
Linux采用基于用户(User)、组(Group)和其他人(Others)的三级权限模型,配合SUID/SGID等特殊权限位,构成了灵活而严密的访问控制体系。日常管理中需要重点关注:
重要提示:生产环境中切忌直接使用root账号操作,应该通过sudo机制进行权限委派。
使用useradd命令创建新用户时,这些参数直接影响安全性:
bash复制useradd -m -s /bin/bash -c "Developer Account" -G dev,test user1
-m:自动创建家目录(建议始终启用)-s:指定登录shell(禁用用户应设为/sbin/nologin)-G:附加组(实现权限继承)创建后应立即设置密码并强制首次登录修改:
bash复制passwd user1
chage -d 0 user1 # 强制下次登录修改密码
usermod命令可调整用户属性,常见场景包括:
bash复制usermod -L user1 # 锁定
usermod -U user1 # 解锁
bash复制usermod -g developers user1
bash复制usermod -e 2024-12-31 temp_user
直接使用userdel可能遗留文件,推荐完整删除流程:
bash复制# 先备份用户文件
tar czf /backups/user1_$(date +%F).tar.gz /home/user1
# 检查用户进程
ps -fu user1
# 完整删除用户及文件
userdel -r user1
经验:删除用户前务必确认无正在运行的进程,否则会导致进程变成"孤儿"。
创建管理组时,这些命令组合特别实用:
bash复制groupadd -g 2000 dev_team # 指定GID创建
gpasswd -A user1 dev_team # 设置组管理员
gpasswd -a user2 dev_team # 添加组成员
实现团队协作目录的经典方案:
bash复制mkdir /project_alpha
chown :dev_team /project_alpha
chmod 2770 /project_alpha # 2表示SGID,新建文件自动继承组
验证权限效果:
bash复制ls -ld /project_alpha
# 输出应显示:drwxrws--- 2 root dev_team 4096 Jul 20 10:00 /project_alpha
| 权限类型 | 符号表示 | 八进制值 | 典型应用场景 |
|---|---|---|---|
| 读 | r | 4 | 配置文件 |
| 写 | w | 2 | 日志目录 |
| 执行 | x | 1 | 脚本/程序 |
| 特殊位 | s/t | 4/1 | 密码修改(/usr/bin/passwd) |
精确控制权限的推荐方式:
bash复制chmod u=rwx,g=rx,o= /etc/script.sh # 明确设置各角色权限
find /var/log -type f -exec chmod 640 {} \; # 批量修改日志文件
SUID(Set User ID):
bash复制chmod u+s /usr/bin/special_program
执行时以文件所有者身份运行(典型应用:passwd命令)
SGID(Set Group ID):
bash复制chmod g+s /shared_dir
新建文件自动继承目录的组
Sticky Bit:
bash复制chmod +t /tmp
仅文件所有者可删除自己的文件(/tmp目录的典型配置)
永远使用visudo编辑配置:
bash复制visudo -f /etc/sudoers.d/dev_team
推荐采用命令别名+权限组的方式:
code复制# 定义命令集
Cmnd_Alias DEV_CMDS = /usr/bin/git, /usr/bin/docker
# 授权规则
%dev_team ALL=(ALL) NOPASSWD: DEV_CMDS
user1 ALL=(ALL) ALL # 完全权限(慎用)
启用详细日志记录:
bash复制# 在/etc/sudoers追加
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
日志分析示例:
bash复制grep "user1" /var/log/sudo.log | awk '{print $5,$6}' | sort | uniq -c
修改/etc/login.defs:
code复制PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
PASS_MIN_LEN 12
安装cracklib增强密码强度:
bash复制apt install libpam-cracklib # Debian/Ubuntu
yum install cracklib # RHEL/CentOS
关键/etc/ssh/sshd_config配置:
code复制PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 1m
AllowUsers user1 user2
DenyGroups blacklist
定期检查异常账号的脚本示例:
bash复制#!/bin/bash
# 检查空密码账号
awk -F: '($2 == "") {print $1}' /etc/shadow
# 检查UID为0的非root账号
awk -F: '($3 == 0 && $1 != "root") {print $1}' /etc/passwd
# 检查最近登录
lastlog | grep -v "Never logged in"
确认当前用户身份:
bash复制id -un
groups
检查文件权限:
bash复制ls -l /path/to/file
getfacl /path/to/file # 查看ACL权限
测试权限继承:
bash复制sudo -u testuser touch /target/file
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| "Permission denied" | 缺少执行权限 | chmod +x filename |
| 无法删除文件 | 目录缺少w权限 | chmod +w parent_dir |
| sudo报"not in sudoers" | 用户未授权 | visudo添加用户 |
| 新建文件属组不对 | 目录未设SGID | chmod g+s directory |
当基础权限不足时,使用ACL进行精细控制:
bash复制# 查看现有ACL
getfacl /shared_folder
# 添加用户特殊权限
setfacl -m u:user1:rwx /shared_folder
# 添加组默认权限
setfacl -d -m g:dev_team:rw /shared_folder
根据多年运维经验,这些实践能显著提升安全性:
实施最小权限原则
定期执行权限审计
bash复制# 查找全局可写文件
find / -xdev -type f -perm -0002 -exec ls -l {} \;
# 检查SUID/SGID程序
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -exec ls -l {} \;
采用集中认证系统(如LDAP)时:
关键目录推荐权限:
| 目录 | 推荐权限 | 说明 |
|---|---|---|
| /etc | 755 | 配置文件 |
| /var/log | 750 | 日志文件 |
| /home | 711 | 用户目录 |
| /tmp | 1777 | 临时文件 |
实际管理中发现,很多权限问题源于自动化脚本中的硬编码路径。建议在脚本开头添加权限检查逻辑:
bash复制#!/bin/bash
# 检查执行权限
if [ ! -w "/target/path" ]; then
echo "ERROR: No write permission on /target/path" >&2
exit 1
fi