权限管理
Linux权限管理是系统安全的基础,通过合理的权限设置可以有效防止未授权访问和操作。
文件权限基础
权限类型
# 查看文件权限
ls -l filename
# 权限格式: -rwxrwxrwx
# 第1位: 文件类型 (- 普通文件, d 目录, l 链接等)
# 2-4位: 所有者权限 (user)
# 5-7位: 组权限 (group)
# 8-10位: 其他用户权限 (others)
# 权限含义:
# r (read): 读权限 = 4
# w (write): 写权限 = 2
# x (execute): 执行权限 = 1
权限修改
# 使用数字方式修改权限
chmod 755 filename # rwxr-xr-x
chmod 644 filename # rw-r--r--
chmod 600 filename # rw-------
# 使用符号方式修改权限
chmod u+x filename # 给所有者添加执行权限
chmod g-w filename # 移除组写权限
chmod o=r filename # 设置其他用户只读权限
chmod a+r filename # 给所有人添加读权限
# 递归修改目录权限
chmod -R 755 directory/
高级权限
# 设置SUID (Set User ID)
chmod u+s filename
chmod 4755 filename
# 设置SGID (Set Group ID)
chmod g+s filename
chmod 2755 filename
# 设置Sticky位
chmod +t directory
chmod 1755 directory
# 查看特殊权限
ls -l /usr/bin/passwd # SUID示例
ls -ld /tmp # Sticky位示例
用户和组管理
用户权限控制
# 查看用户信息
id username
groups username
finger username
# 切换用户
su - username
sudo -u username command
# 限制用户登录
usermod -L username # 锁定用户
usermod -U username # 解锁用户
usermod -e 2024-12-31 username # 设置账户过期时间
组权限管理
# 创建组
groupadd development
groupadd -g 1001 testing
# 将用户添加到组
usermod -a -G development username
gpasswd -a username development
# 从组中移除用户
gpasswd -d username development
# 设置组管理员
gpasswd -A admin_user development
文件所有权
# 修改文件所有者
chown user filename
chown user:group filename
chown -R user:group directory/
# 只修改组
chgrp group filename
chgrp -R group directory/
# 批量修改所有权
find /path -name "*.log" -exec chown loguser:loggroup {} \;
sudo权限配置
基本sudo配置
# 编辑sudoers文件
visudo
# 基本语法
# 用户 主机=(运行身份) 命令
username ALL=(ALL:ALL) ALL
高级sudo配置
# 免密码执行特定命令
username ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx
username ALL=(ALL) NOPASSWD: /usr/bin/docker
# 限制可执行的命令
username ALL=(ALL) /bin/ls, /bin/cat, /usr/bin/tail
# 组权限配置
%wheel ALL=(ALL:ALL) ALL
%developers ALL=(ALL) NOPASSWD: /opt/app/deploy.sh
# 别名配置
User_Alias ADMINS = admin1, admin2, admin3
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig
ADMINS ALL=(ALL) NETWORKING
# 环境变量控制
Defaults env_reset
Defaults env_keep="LANG LC_* HOME"
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
sudo日志和审计
# 启用sudo日志
echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers
# 查看sudo使用记录
grep sudo /var/log/auth.log
grep sudo /var/log/secure
# 实时监控sudo使用
tail -f /var/log/sudo.log
访问控制列表(ACL)
启用ACL支持
# 检查文件系统ACL支持
mount | grep acl
# 启用ACL (如果未启用)
mount -o remount,acl /partition
# 或修改/etc/fstab添加acl选项
ACL基本操作
# 查看ACL权限
getfacl filename
# 设置用户ACL权限
setfacl -m u:username:rwx filename
setfacl -m u:username:r-- filename
# 设置组ACL权限
setfacl -m g:groupname:rw- filename
# 设置默认ACL (目录)
setfacl -d -m u:username:rwx directory/
# 删除ACL权限
setfacl -x u:username filename
setfacl -b filename # 删除所有ACL
ACL高级使用
# 递归设置ACL
setfacl -R -m u:username:rwx directory/
# 从文件读取ACL规则
setfacl --set-file=acl_rules.txt filename
# 备份和恢复ACL
getfacl -R directory/ > acl_backup.txt
setfacl --restore=acl_backup.txt
最小权限原则
服务用户配置
# 创建系统服务用户
useradd -r -s /bin/false -d /var/lib/service service_user
# 创建应用专用用户
useradd -m -s /bin/bash -d /opt/app app_user
# 限制用户shell访问
usermod -s /bin/false username
usermod -s /sbin/nologin username
目录权限设计
# 应用目录权限示例
mkdir -p /opt/myapp/{bin,config,data,logs}
# 设置所有者和权限
chown -R app_user:app_group /opt/myapp/
chmod 755 /opt/myapp/bin/
chmod 640 /opt/myapp/config/
chmod 750 /opt/myapp/data/
chmod 755 /opt/myapp/logs/
# 设置ACL允许管理员访问
setfacl -m u:admin:rwx /opt/myapp/config/
setfacl -m g:operators:r-x /opt/myapp/logs/
权限审计和监控
权限审计脚本
#!/bin/bash
# permission_audit.sh
AUDIT_LOG="/var/log/permission_audit.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] 开始权限审计..." >> $AUDIT_LOG
# 查找SUID文件
echo "SUID文件:" >> $AUDIT_LOG
find / -type f -perm -4000 2>/dev/null >> $AUDIT_LOG
# 查找SGID文件
echo "SGID文件:" >> $AUDIT_LOG
find / -type f -perm -2000 2>/dev/null >> $AUDIT_LOG
# 查找可写文件
echo "全局可写文件:" >> $AUDIT_LOG
find / -type f -perm -002 2>/dev/null >> $AUDIT_LOG
# 查找空密码用户
echo "空密码用户:" >> $AUDIT_LOG
awk -F: '($2 == "") { print $1 }' /etc/shadow >> $AUDIT_LOG
# 查找UID为0的用户
echo "UID为0的用户:" >> $AUDIT_LOG
awk -F: '($3 == 0) { print $1 }' /etc/passwd >> $AUDIT_LOG
echo "[$DATE] 权限审计完成" >> $AUDIT_LOG
文件权限监控
# 使用inotify监控文件权限变化
#!/bin/bash
# file_monitor.sh
MONITOR_DIR="/etc /opt/app"
LOG_FILE="/var/log/file_monitor.log"
inotifywait -m -r -e attrib $MONITOR_DIR --format '%w%f %e %T' --timefmt '%Y-%m-%d %H:%M:%S' | \
while read file event time; do
echo "[$time] $event: $file" >> $LOG_FILE
done
安全策略建议
文件权限策略
# 系统配置文件权限
chmod 644 /etc/passwd
chmod 640 /etc/shadow
chmod 644 /etc/group
chmod 600 /etc/gshadow
# SSH配置安全
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
# 日志文件权限
chmod 640 /var/log/messages
chmod 640 /var/log/secure
chmod 644 /var/log/cron
定期权限检查
# 创建权限检查定时任务
echo "0 2 * * * root /usr/local/bin/permission_audit.sh" >> /etc/crontab
# 定期更新locate数据库
echo "0 3 * * * root updatedb" >> /etc/crontab
# 清理临时文件权限
echo "0 4 * * * root find /tmp -type f -atime +7 -delete" >> /etc/crontab
常见权限问题解决
权限拒绝问题
# 诊断权限问题
ls -la /path/to/file
namei -l /path/to/file
getfacl /path/to/file
# 检查进程权限
ps aux | grep process_name
sudo -u username ls /path/to/file
# SELinux权限问题
getenforce
ls -Z /path/to/file
批量权限修复
# 修复用户家目录权限
find /home -maxdepth 2 -type d -exec chmod 755 {} \;
find /home -maxdepth 3 -name ".ssh" -exec chmod 700 {} \;
# 修复Web目录权限
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
# 修复日志目录权限
find /var/log -type f -exec chmod 640 {} \;
find /var/log -type d -exec chmod 755 {} \;
权限管理是Linux系统安全的基础,正确配置和管理文件权限是保障系统安全的重要措施。