如何使用 --userspec 在 chroot 中设置 ulimit

如何使用 --userspec 在 chroot 中设置 ulimit

我有创建最小 chroot 的脚本(如下),但我不知道如何让 ulimit 在 chroot 进程上工作:

#!/bin/bash

user=$1
apps="$2"
cmd_to_run="$3"
shift 3

directory="minimal_chroot"

if [ ! -d "$directory" ]; then
    mkdir -pv $directory/etc >/dev/null 2>&1

    grep /etc/passwd -e "^$user" | sed "s/\/home\/$user/\//" >> $directory/etc/passwd
    grep /etc/group -e "^$user" >> $directory/etc/group

    mkdir -p "$directory/etc/security/" >/dev/null
    limits="$directory/etc/security/limits.conf"
    echo "$user hard nofile 100" >> $limits

    # cmds can be a space-separated list of commands
    for app in $apps; do
        file_path=`which $app`
        if [ -n "$file_path" ] ; then
            non_root_path=`echo "$file_path" | sed -E 's/^\/(.*$)/\1/'`
            mkdir -pv $directory/`dirname $non_root_path` >/dev/null 2>&1
            cp -v {,$directory}$file_path >/dev/null 2>&1

            for file in `ldd $file_path | grep "/lib" | sed -E 's/^.*[ \t]\/(lib[^ ]+\.[0-9]) .*$/\1/'` ; do
                mkdir -p $directory/`dirname $file | sed -E 's/^\/(.*$)/\1/'` >/dev/null 2>&1
                cp -v {,$directory}/$file >/dev/null 2>&1
            done
        fi
    done
fi

find $directory -maxdepth 1 -type f -exec rm {} + >/dev/null 2>&1

chmod -R o+rwx $directory >/dev/null 2>&1
find $directory -exec chmod o+rx-w {} + >/dev/null 2>&1
chmod o+rw $directory >/dev/null 2>&1

uid=`id -u $user`

ulimit -Su 10
sudo chroot --userspec=$uid:$uid $directory $cmd_to_run $* <&0 &
chroot_pid=$!

trap "kill -INT $chroot_pid" SIGINT SIGTERM SIGXCPU

wait $python_chroot_pid

find $directory -maxdepth 1 -type f -exec rm {} + >/dev/null 2>&1

输出:

blah@dev:~$ sudo ./minimal_chroot.sh chrootuser "ls cd pwd cat bash" bash
bash-4.2$ pwd
/
bash-4.2$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7806
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7806
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
bash-4.2$

请注意,最大用户进程数仍为 7806,而不是我试图用命令指定的 10。ulimit -Su 10哦,我还弄错了,/etc/security/limits.conf从该行可以看出echo "$user hard nofile 100" >> $limits。这也没有生效。

如何才能使 ulimits 生效,同时仍将 chroot 保持在最低限度?

尝试#2

我尝试换掉这一行:

sudo chroot --userspec=$uid:$uid $directory $cmd_to_run $* <&0 &

为了这:

sudo chroot $directory bash -c "ulimit -Su 20; su $user; $cmd_to_run $*" <&0 &

这实际上运行良好,并ulimit -a显示最大用户进程数为 20,但后来我意识到它没有这样做,su并且$user仍然以 root 身份运行,因为我删除了 --userspec。

答案1

请注意,限制是通过 PAM 模块强制执行的,即pam_limits,并且其配置文件是/etc/security/limits.conf默认的,但是简单地将该配置文件放在里面chroot并不提供任何真正的基础设施。

ulimit -a您看到的输出是blah已登录用户的输出。

chroot调用在任何时候都不会触发 PAM 配置,因此它无法在内部设置任何限制chroot

相关内容