我有创建最小 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
。