命令限制架构实战:用户权限精细化控制、命令白名单与企业级访问管控

一、命令限制概述

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
# /etc/sudoers.d/limited-user

# 场景1: 只允许执行特定命令
limited_user ALL=(ALL) /usr/bin/systemctl, /usr/bin/git, /usr/bin/docker

# 场景2: 允许命令但限制参数
limited_user ALL=(root) /usr/bin/systemctl start *, /usr/bin/systemctl status *, !/usr/bin/systemctl stop *, !/usr/bin/systemctl restart *

# 场景3: 允许特定目录下的命令
limited_user ALL=(www-data) /usr/bin/git pull, /usr/bin/git push, !/usr/bin/git reset --hard

# 场景4: 限制网络相关命令
limited_user ALL=(root) /usr/bin/ping 8.8.8.8, !/usr/bin/curl, !/usr/bin/wget

# 场景5: 只读命令
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
# 禁止危险的rm命令
limited_user ALL=(root) /usr/bin/rm -f /*.log, !/usr/bin/rm -rf, !/usr/bin/rm -rf /, !/usr/bin/rm --no-preserve-root -rf

# 允许特定目录的rm,禁止根目录
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
# sudo本身不直接支持时间限制
# 需要通过脚本和定时任务实现

# /etc/cron.d/enable-user-sudo
# 工作时间启用sudo权限
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

# 或者使用sudo_pair插件
# sudo apt-get install sudo_pair

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
# restricted-command.sh - 受限命令包装器

# 允许的命令列表
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
# 配置sudoers
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

# 配置rbash环境
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

# 修改PATH
echo 'export PATH=/home/limited_user/bin:/home/limited_user/.local/bin' | sudo tee -a /home/limited_user/.bash_profile

# 禁用shell配置文件修改
sudo 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
# 1. 确保Shell硬链接是rbash
sudo ln -sf /bin/rbash /home/limited_user/bin/sh
sudo ln -sf /bin/rbash /home/limited_user/bin/bash

# 2. 限制命令访问
sudo chmod -R 755 /home/limited_user/bin
# 不允许用户添加新命令到这个目录

# 3. 禁用危险的命令
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

# 4. 设置文件系统只读
sudo chattr +i /home/limited_user/.bashrc
sudo chattr +i /home/limited_user/.bash_profile

# 5. 限制home目录
sudo chmod 755 /home/limited_user
sudo chmod 755 /home/limited_user/bin
sudo chown root:root /home/limited_user/bin # 用户无法修改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
# /etc/pam.d/chroot-setup.sh

#!/bin/bash
# 创建基本的chroot环境

CHROOT_DIR=/chroot/jail
OS_VERSION=$(lsb_release -rs)

echo "=== 创建Chroot环境 ==="

# 1. 创建基本目录结构
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 "✓ 目录结构创建完成"

# 2. 复制必要的二进制文件
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/

# 3. 复制依赖库
echo "复制依赖库..."
# 使用ldd查看依赖
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

# 4. 复制系统文件
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
# create_chroot_jail.sh - 自动化创建chroot监狱

JAIL_DIR="/chroot/jail"
CREATE_USER="jail_user"

echo "=== 创建Chroot监狱 ==="

# 1. 创建目录
sudo mkdir -p $JAIL_DIR/{bin,dev,etc,home,lib,lib64,usr/{bin,lib},var/{log,tmp}}

# 2. 创建设备文件
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

# 3. 复制基础命令和库
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
# chroot_command.sh - 在chroot中执行命令

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
# 创建systemd容器
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
# create_restricted_user.sh - 创建完全受限的用户

USERNAME="limited_user"
PASSWORD="SecurePass123!"

echo "=== 创建受限用户 ==="

# 1. 创建用户(使用rbash)
sudo useradd -m -s /bin/rbash $USERNAME
echo "$PASSWORD" | sudo passwd --stdin $USERNAME

# 2. 创建受限目录结构
sudo mkdir -p /home/$USERNAME/bin
sudo mkdir -p /home/$USERNAME/.bin # 备用bin目录

# 3. 复制并硬链接允许的命令
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

# 4. 配置PATH
echo 'export PATH=/home/$USER/bin:/home/$USER/.bin' | sudo tee -a /home/$USERNAME/.bash_profile

# 5. 禁用配置文件修改
sudo chmod 444 /home/$USERNAME/.bash_profile
sudo chmod 444 /home/$USERNAME/.bashrc
sudo chattr +i /home/$USERNAME/.bash_profile

# 6. 配置sudo权限(如果需要)
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

# 7. 设置文件权限
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
# command_monitor.sh - 命令执行监控

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
# command_restriction_manager.sh - 命令限制管理系统

CONFIG_FILE="/etc/command-restrictions.conf"
LOG_FILE="/var/log/command-restrictions.log"

# 读取配置
declare -A ALLOWED_COMMANDS
declare -A DENIED_COMMANDS

load_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"

# 检查deny列表
for denied in "${!DENIED_COMMANDS[@]}"; do
if [[ "$cmd" == $denied ]]; then
echo "$(date): DENIED: $user attempted: $cmd" >> $LOG_FILE
return 1
fi
done

# 检查allow列表
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
# /etc/command-restrictions.conf
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
# /etc/command-restrictions/rbac.conf

[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
# /etc/sudoers.d/operators

# 定义运维组
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
# 1. 创建只读用户
sudo useradd -m -s /bin/rbash readonly_user

# 2. 创建允许的命令列表
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

# 3. 配置sudo(如果需要某些特权命令查看)
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

# 4. 设置PATH
echo 'export PATH=/home/readonly_user/bin' | sudo tee /home/readonly_user/.bash_profile
sudo chmod 444 /home/readonly_user/.bash_profile
sudo chattr +i /home/readonly_user/.bash_profile

# 5. 保护bin目录
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
# /etc/sudoers.d/dba

User_Alias DBAS = dba1, dba2

# MySQL命令
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
# audit_user_permissions.sh - 用户权限审查

echo "=== 用户权限审查 ==="
echo ""

# 1. 检查所有sudo用户
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 ""

# 2. 检查受限用户
echo "2. 受限用户(rbash):"
grep -E ":/bin/rbash$" /etc/passwd | cut -d: -f1
echo ""

# 3. 检查命令白名单
echo "3. 命令白名单配置:"
sudo grep -E "^[^#].*NOPASSWD|ALLOWED" /etc/sudoers.d/* 2>/dev/null
echo ""

# 4. 最近的命令执行日志
echo "4. 最近的sudo执行记录:"
sudo grep sudo /var/log/auth.log 2>/dev/null | tail -20 | head -20
echo ""

echo "审查完成"

九、总结

命令限制是保障系统安全的重要手段。本文涵盖:

核心要点

  1. 多种限制方案:sudo、rbash、chroot、容器隔离
  2. 精细化控制:命令级别、参数级别、路径级别
  3. 多层防护:多层限制叠加防护
  4. 自动化管理:脚本化、集中化、可审计

技术要点

  • sudo配置:精确命令控制、参数限制
  • rbash:受限Shell、目录隔离
  • chroot:完整环境隔离
  • 审计与监控:日志记录、异常检测

实践建议

  1. 采用最小权限,明确定义允许的命令
  2. 对写操作参数严格限制
  3. 持续审计与定期审查
  4. 对高危操作采用多层限制
  5. 使用集中管理提升效率

通过多层级限制,降低误操作风险,提升系统安全性。