第324集命令限制架构实战:用户权限精细化控制、命令白名单与企业级访问管控 | 字数总计: 4.5k | 阅读时长: 21分钟 | 阅读量:
命令限制架构实战:用户权限精细化控制、命令白名单与企业级访问管控 一、命令限制概述 1.1 为什么需要限制命令 在生产环境中,限制用户只能执行特定命令是一种重要的安全实践:
最小权限原则 :用户只能执行必要的命令
减少安全风险 :防止误操作和恶意命令
合规要求 :满足审计和合规标准
责任分离 :不同角色执行不同操作
1.2 命令限制方案对比 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 命令限制方案: sudo精细化配置: 优点: 灵活、易于管理 缺点: 配置复杂 适用: 普通用户权限控制 rbash受限Shell: 优点: 简单直接 缺点: 容易被绕过 适用: 简单场景 chroot目录隔离: 优点: 完全隔离 缺点: 配置复杂、维护成本高 适用: 高安全要求 AppArmor/SELinux: 优点: 内核级强制访问控制 缺点: 学习曲线陡峭 适用: 生产环境强制隔离
二、基于sudo的命令限制 2.1 sudo基础配置 sudoers精确命令控制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 limited_user ALL=(ALL) /usr/bin/systemctl, /usr/bin/git, /usr/bin/docker limited_user ALL=(root) /usr/bin/systemctl start *, /usr/bin/systemctl status *, !/usr/bin/systemctl stop *, !/usr/bin/systemctl restart * limited_user ALL=(www-data) /usr/bin/git pull, /usr/bin/git push, !/usr/bin/git reset --hard limited_user ALL=(root) /usr/bin/ping 8.8.8.8, !/usr/bin/curl, !/usr/bin/wget limited_user ALL=(root) /usr/bin/cat /var/log/*, /usr/bin/tail -f /var/log/*, !/usr/bin/vi /var/log/*
2.2 参数级别的限制 参数白名单配置 1 2 3 4 5 Cmnd_Alias BACKUP = /usr/bin/tar -czf *, /usr/bin/tar -xzf * Cmnd_Alias LOGS = /usr/bin/tail -f /var/log/*.log , /usr/bin/tail -n 100 /var/log/*.log limited_user ALL=(root) BACKUP, LOGS
禁止危险的参数组合 1 2 3 4 5 6 7 8 limited_user ALL=(root) /usr/bin/rm -f /*.log , !/usr/bin/rm -rf, !/usr/bin/rm -rf /, !/usr/bin/rm --no-preserve-root -rf limited_user ALL=(root) /usr/bin/rm /tmp/*, !/usr/bin/rm /home/*, !/usr/bin/rm /var/* limited_user ALL=(root) /usr/bin/cat, /usr/bin/less, /usr/bin/more, !/usr/bin/vi /etc/*, !/usr/bin/nano /etc/*
2.3 时间与主机的限制 基于时间的sudo规则 1 2 3 4 5 6 7 8 9 10 0 9 * * 1-5 sed -i 's/#limited_user ALL/limited_user ALL/' /etc/sudoers.d/limited-user 0 18 * * 1-5 sed -i 's/^limited_user ALL/#limited_user ALL/' /etc/sudoers.d/limited-user
2.4 sudo命令包装器 创建安全的命令包装器 1 2 sudo vi /usr/local/bin/restricted-command.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/bin/bash ALLOWED_COMMANDS=( "systemctl start nginx" "systemctl status nginx" "git pull" "git status" "docker ps" ) REQUESTED_CMD="$*" if [[ " ${ALLOWED_COMMANDS[@]} " =~ " ${REQUESTED_CMD} " ]]; then echo "$(date) : User $USER executed: $REQUESTED_CMD " >> /var/log/restricted-commands.log exec $REQUESTED_CMD else echo "错误: 命令 '$REQUESTED_CMD ' 不在允许列表中" exit 1 fi
1 2 echo "limited_user ALL=(root) NOPASSWD: /usr/local/bin/restricted-command.sh" | sudo tee -a /etc/sudoers.d/limited-user
三、受限Shell (rbash) 3.1 rbash基础配置 创建受限用户 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 sudo useradd -m -s /bin/rbash limited_user sudo passwd limited_user sudo chsh limited_user -s /bin/rbash sudo mkdir -p /home/limited_user/bin sudo mkdir -p /home/limited_user/.local/bin sudo cp /bin/ls /home/limited_user/bin/ sudo cp /bin/cat /home/limited_user/bin/ sudo cp /bin/grep /home/limited_user/bin/ sudo ln -s /bin/tar /home/limited_user/bin/tar for cmd in ls cat grep tar; do if [ ! -f /home/limited_user/bin/$cmd ]; then sudo ln -s /usr/bin/$cmd /home/limited_user/bin/$cmd 2>/dev/null fi done echo 'export PATH=/home/limited_user/bin:/home/limited_user/.local/bin' | sudo tee -a /home/limited_user/.bash_profilesudo chmod 444 /home/limited_user/.bash_profile sudo chattr +i /home/limited_user/.bash_profile
rbash限制清单 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 rbash限制的功能: 禁用的功能: - cd命令(无法切换目录) - PATH修改 - 通过/ 访问命令 - 命令重定向 > < - 管道符 | - 反引号 `` `命令替换` - $() 命令替换 - export命令 仍然可用: - 当前目录的文件操作 - 命令行参数 - 环境变量读取 - 基本的文件查看命令
3.2 rbash绕过防护 防止绕过rbash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 sudo ln -sf /bin/rbash /home/limited_user/bin/sh sudo ln -sf /bin/rbash /home/limited_user/bin/bash sudo chmod -R 755 /home/limited_user/bin sudo mv /home/limited_user/bin/vi /home/limited_user/bin/vi_disabled 2>/dev/null sudo mv /home/limited_user/bin/nano /home/limited_user/bin/nano_disabled 2>/dev/null sudo chattr +i /home/limited_user/.bashrc sudo chattr +i /home/limited_user/.bash_profile sudo chmod 755 /home/limited_user sudo chmod 755 /home/limited_user/bin sudo chown root:root /home/limited_user/bin
四、chroot目录隔离 4.1 chroot基础配置 创建chroot环境 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 CHROOT_DIR=/chroot/jail OS_VERSION=$(lsb_release -rs) echo "=== 创建Chroot环境 ===" sudo mkdir -p $CHROOT_DIR /{bin,boot,dev,etc,home,lib,lib64,opt,proc,root,sbin,sys,tmp,usr,var} sudo mkdir -p $CHROOT_DIR /usr/{bin,lib,lib64,local ,sbin,share} sudo mkdir -p $CHROOT_DIR /var/{log ,run} echo "✓ 目录结构创建完成" echo "复制基本命令..." sudo cp /bin/bash $CHROOT_DIR /bin/ sudo cp /bin/ls $CHROOT_DIR /bin/ sudo cp /bin/cat $CHROOT_DIR /bin/ sudo cp /usr/bin/vi $CHROOT_DIR /usr/bin/ echo "复制依赖库..." for file in $CHROOT_DIR /bin/* $CHROOT_DIR /usr/bin/*; do if [ -f "$file " ]; then sudo ldd "$file " | grep "=> /" | awk '{print $3}' | xargs -I '{}' sudo cp '{}' $CHROOT_DIR /lib64/ 2>/dev/null fi done sudo cp /etc/passwd $CHROOT_DIR /etc/ sudo cp /etc/group $CHROOT_DIR /etc/ sudo cp -r /etc/ld.so.conf.d $CHROOT_DIR /etc/ echo "✓ Chroot环境创建完成" echo "" echo "使用方式:" echo " sudo chroot $CHROOT_DIR /bin/bash"
4.2 自动化chroot创建 使用chroot脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #!/bin/bash JAIL_DIR="/chroot/jail" CREATE_USER="jail_user" echo "=== 创建Chroot监狱 ===" sudo mkdir -p $JAIL_DIR /{bin,dev,etc,home,lib,lib64,usr/{bin,lib},var/{log ,tmp}} sudo mknod -m 666 $JAIL_DIR /dev/null c 1 3 sudo mknod -m 666 $JAIL_DIR /dev/tty c 5 0 sudo mknod -m 666 $JAIL_DIR /dev/zero c 1 5 copy_with_dependencies () { local cmd=$1 local dest=$2 sudo cp $cmd $dest 2>/dev/null || return 1 for lib in $(ldd $cmd 2>/dev/null | grep -v "=>" | awk '{print $1}' | grep "\.so" ); do if [ -f "/lib64/$lib " ]; then sudo cp "/lib64/$lib " $JAIL_DIR /lib64/ elif [ -f "/lib/$lib " ]; then sudo cp "/lib/$lib " $JAIL_DIR /lib/ fi done } copy_with_dependencies /bin/bash $JAIL_DIR /bin/ copy_with_dependencies /bin/ls $JAIL_DIR /bin/ copy_with_dependencies /bin/cat $JAIL_DIR /bin/ copy_with_dependencies /bin/pwd $JAIL_DIR /bin/ sudo cp /etc/passwd $JAIL_DIR /etc/ sudo cp /etc/group $JAIL_DIR /etc/ sudo useradd -r -d $JAIL_DIR /home/$CREATE_USER $CREATE_USER echo "✓ Chroot监狱创建完成"
使用chroot执行命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/bash JAIL_DIR="/chroot/jail" ALLOWED_CMD="$1 " case "$ALLOWED_CMD " in "ls" |"cat" |"pwd" |"whoami" ) sudo chroot $JAIL_DIR /bin/$ALLOWED_CMD "$@ " ;; *) echo "错误: 命令 '$ALLOWED_CMD ' 不在允许列表中" exit 1 ;; esac
4.3 systemd-nspawn容器 使用systemd容器隔离 1 2 3 4 5 6 7 8 sudo debootstrap stable /var/lib/machines/jail-user http://ftp.debian.org/debian sudo systemd-nspawn -D /var/lib/machines/jail-user sudo systemctl start systemd-nspawn@jail-user
五、综合限制方案
5.1 多层限制实现 完整受限用户配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #!/bin/bash USERNAME="limited_user" PASSWORD="SecurePass123!" echo "=== 创建受限用户 ===" sudo useradd -m -s /bin/rbash $USERNAME echo "$PASSWORD " | sudo passwd --stdin $USERNAME sudo mkdir -p /home/$USERNAME /bin sudo mkdir -p /home/$USERNAME /.bin ALLOWED_CMDS=("ls" "cat" "grep" "tar" "whoami" ) for cmd in "${ALLOWED_CMDS[@]} " ; do if [ -f "/bin/$cmd " ]; then sudo cp /bin/$cmd /home/$USERNAME /bin/ sudo chmod 755 /home/$USERNAME /bin/$cmd fi done echo 'export PATH=/home/$USER/bin:/home/$USER/.bin' | sudo tee -a /home/$USERNAME /.bash_profilesudo chmod 444 /home/$USERNAME /.bash_profile sudo chmod 444 /home/$USERNAME /.bashrc sudo chattr +i /home/$USERNAME /.bash_profile sudo tee /etc/sudoers.d/$USERNAME << EOF # 只允许执行特定的系统命令 $USERNAME ALL=(root) /usr/bin/systemctl status *, !/usr/bin/systemctl stop *, !/usr/bin/systemctl restart * # 允许特定的目录操作 $USERNAME ALL=(www-data) /usr/bin/git pull, /usr/bin/git status # 禁止所有其他命令 EOF sudo chown -R root:root /home/$USERNAME /bin sudo chmod 755 /home/$USERNAME /bin echo "✓ 受限用户创建完成" echo "用户名: $USERNAME " echo "密码: $PASSWORD " echo "" echo "测试:" echo " sudo -u $USERNAME -i"
5.2 命令执行审计 命令执行监控脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #!/bin/bash LOG_FILE="/var/log/command_audit.log" USERNAME="$USER " command_logger () { local cmd="$*" echo "$(date '+%Y-%m-%d %H:%M:%S') $USERNAME : $cmd " >> $LOG_FILE if echo "$cmd " | grep -qE "(rm -rf|chmod 777|mkfs)" ; then echo "警告: 检测到危险命令: $cmd " | tee -a $LOG_FILE fi } restricted_command () { case "$1 " in ls |cat |grep|tar|whoami ) command_logger "$@ " command "$@ " ;; *) echo "错误: 命令 '$1 ' 未被授权" command_logger "BLOCKED: $@ " return 1 ;; esac } alias ls ='restricted_command ls' alias cat ='restricted_command cat' alias grep='restricted_command grep' alias tar='restricted_command tar' alias whoami ='restricted_command whoami'
六、企业级命令限制系统 6.1 集中式命令管理 命令权限管理系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #!/bin/bash CONFIG_FILE="/etc/command-restrictions.conf" LOG_FILE="/var/log/command-restrictions.log" declare -A ALLOWED_COMMANDSdeclare -A DENIED_COMMANDSload_config () { while IFS='=' read -r key value; do if [[ "$key " == allow:* ]]; then ALLOWED_COMMANDS["${key#allow:} " ]="$value " elif [[ "$key " == deny:* ]]; then DENIED_COMMANDS["${key#deny:} " ]="$value " fi done < "$CONFIG_FILE " } check_command () { local cmd="$1 " local user="$USER " for denied in "${!DENIED_COMMANDS[@]} " ; do if [[ "$cmd " == $denied ]]; then echo "$(date) : DENIED: $user attempted: $cmd " >> $LOG_FILE return 1 fi done for allowed in "${!ALLOWED_COMMANDS[@]} " ; do if [[ "$cmd " == $allowed ]]; then echo "$(date) : ALLOWED: $user executed: $cmd " >> $LOG_FILE return 0 fi done echo "$(date) : DENIED: $user attempted: $cmd (not in allow list)" >> $LOG_FILE return 1 } load_config check_command "$@ "
配置文件示例 1 2 3 4 5 6 7 8 9 10 allow:ls =/bin/ls allow:cat =/bin/cat allow:grep =/bin/grep allow:tar =/bin/tar allow:ping =/bin/ping 8.8 .8.8 deny:rm =/bin/rm deny:rm -rf =/bin/rm -rf deny:chmod 777 =/bin/chmod 777
6.2 基于角色的命令控制 RBAC命令配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [role:developer] allowed_commands: - /usr/bin/git pull - /usr/bin/git push - /usr/bin/git status - /usr/bin/docker ps - /usr/bin/docker logs denied_commands: - /bin/rm -rf - /usr/bin/systemctl stop - /usr/bin/systemctl disable [role:operator] allowed_commands: - /usr/bin/systemctl start - /usr/bin/systemctl stop - /usr/bin/systemctl restart - /usr/bin/systemctl status - /usr/bin/tail -f - /usr/bin/cat /var/log/* denied_commands: - /usr/bin/systemctl mask - /usr/bin/chmod 777 [role:readonly ] allowed_commands: - /usr/bin/cat /var/log/* - /usr/bin/tail -f /var/log/* - /usr/bin/systemctl status - /usr/bin/docker ps denied_commands: - "*"
七、实战案例 7.1 案例1:运维人员命令限制 需求 运维人员需要重启服务和查看日志,但不能修改配置文件。
配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 User_Alias OPERATORS = operator1, operator2, operator3 Cmnd_Alias SERVICE_RESTART = /usr/bin/systemctl start *, /usr/bin/systemctl restart * Cmnd_Alias SERVICE_STATUS = /usr/bin/systemctl status * Cmnd_Alias LOG_VIEW = /usr/bin/tail -f /var/log/*, /usr/bin/cat /var/log/* Cmnd_Alias DOCKER_CONTROL = /usr/bin/docker start *, /usr/bin/docker stop *, /usr/bin/docker restart * Cmnd_Alias DOCKER_VIEW = /usr/bin/docker ps, /usr/bin/docker logs * Cmnd_Alias DANGEROUS = /usr/bin/systemctl mask *, /usr/bin/systemctl disable *, /bin/rm -rf, /usr/bin/chmod 777 OPERATORS ALL=(root) SERVICE_RESTART, SERVICE_STATUS, LOG_VIEW, DOCKER_CONTROL, DOCKER_VIEW OPERATORS ALL=(root) !DANGEROUS
7.2 案例2:只读用户限制 需求 只读用户只能查看,不能执行任何修改操作。
配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 sudo useradd -m -s /bin/rbash readonly_user sudo mkdir -p /home/readonly_user/bin ALLOWED_READONLY_CMDS=("ls" "cat" "grep" "head" "tail" "find" "stat" ) for cmd in "${ALLOWED_READONLY_CMDS[@]} " ; do if [ -f "/usr/bin/$cmd " ]; then sudo cp /usr/bin/$cmd /home/readonly_user/bin/ elif [ -f "/bin/$cmd " ]; then sudo cp /bin/$cmd /home/readonly_user/bin/ fi done sudo tee /etc/sudoers.d/readonly_user << EOF Cmnd_Alias READONLY_VIEW = /usr/bin/cat /var/log/*, /usr/bin/tail -f /var/log/*, /usr/bin/systemctl status * readonly_user ALL=(root) NOPASSWD: READONLY_VIEW EOF echo 'export PATH=/home/readonly_user/bin' | sudo tee /home/readonly_user/.bash_profilesudo chmod 444 /home/readonly_user/.bash_profile sudo chattr +i /home/readonly_user/.bash_profile sudo chown root:root /home/readonly_user/bin sudo chmod 755 /home/readonly_user/bin
7.3 案例3:数据库管理员限制 需求 DBA可以管理数据库,但不能修改系统配置。
配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 User_Alias DBAS = dba1, dba2 Cmnd_Alias MYSQL_MGMT = /usr/bin/mysql, /usr/bin/mysqldump, /usr/bin/mysqladmin Cmnd_Alias MYSQL_START = /usr/bin/systemctl start mysql, /usr/bin/systemctl start mariadb Cmnd_Alias MYSQL_STATUS = /usr/bin/systemctl status mysql, /usr/bin/systemctl status mariadb DBAS ALL=(root) MYSQL_MGMT, MYSQL_START, MYSQL_STATUS DBAS ALL=(root) ALL, !/usr/bin/systemctl stop mysql, !/usr/bin/systemctl stop mariadb, !/usr/bin/systemctl disable mysql, !/usr/bin/vi /etc/my.cnf, !/usr/bin/vi /etc/mysql/my.cnf
八、安全最佳实践 8.1 命令限制最佳实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 命令限制最佳实践: 1 . 最小权限原则: - 只授予必要的权限 - 明确列出允许的命令 - 默认拒绝所有其他命令 2 . 多层防护: - sudo规则限制 - rbash或受限shell - chroot隔离(高安全场景) - AppArmor/SELinux 3 . 参数验证: - 限制危险参数 - 使用通配符谨慎 - 禁止使用 rm -rf 4 . 审计追踪: - 记录所有命令执行 - 监控异常行为 - 定期审计权限 5 . 密钥管理: - 限制sudo免密 - 强制密钥认证 - 定期轮换密钥
8.2 权限审查脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/bin/bash echo "=== 用户权限审查 ===" echo "" echo "1. Sudo用户列表:" sudo grep -E "^[^#].*ALL.*ALL$" /etc/sudoers /etc/sudoers.d/* 2>/dev/null | grep -v "%" | cut -d: -f1 | cut -d' ' -f1 | sort -u echo "" echo "2. 受限用户(rbash):" grep -E ":/bin/rbash$" /etc/passwd | cut -d: -f1 echo "" echo "3. 命令白名单配置:" sudo grep -E "^[^#].*NOPASSWD|ALLOWED" /etc/sudoers.d/* 2>/dev/null echo "" echo "4. 最近的sudo执行记录:" sudo grep sudo /var/log/auth.log 2>/dev/null | tail -20 | head -20 echo "" echo "审查完成"
九、总结 命令限制是保障系统安全的重要手段。本文涵盖:
核心要点
多种限制方案 :sudo、rbash、chroot、容器隔离
精细化控制 :命令级别、参数级别、路径级别
多层防护 :多层限制叠加防护
自动化管理 :脚本化、集中化、可审计
技术要点
sudo配置 :精确命令控制、参数限制
rbash :受限Shell、目录隔离
chroot :完整环境隔离
审计与监控 :日志记录、异常检测
实践建议
采用最小权限,明确定义允许的命令
对写操作参数严格限制
持续审计与定期审查
对高危操作采用多层限制
使用集中管理提升效率
通过多层级限制,降低误操作风险,提升系统安全性。