From b0f17730cc3353d4f5386f9c2b27af7c24928f0a Mon Sep 17 00:00:00 2001 From: ston1th Date: Tue, 30 Jan 2018 22:18:43 +0100 Subject: [PATCH] added mk_chroot --- mk_chroot.sh | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100755 mk_chroot.sh diff --git a/mk_chroot.sh b/mk_chroot.sh new file mode 100755 index 0000000..5f55000 --- /dev/null +++ b/mk_chroot.sh @@ -0,0 +1,104 @@ +#!/bin/sh + +chr= +bin= +user= +group= +devfs=0 +listen= +out= +openfiles= +mem= + +usage() { + cat <&2;exit 1; } + +while getopts hc:x:u:g:dl:o:f:m: arg; do + case ${arg} in + h) usage ;; + c) chr=${OPTARG} ;; + x) bin=${OPTARG} ;; + u) user=${OPTARG} ;; + g) group=${OPTARG} ;; + d) devfs=1 ;; + l) listen=${OPTARG} ;; + o) out=${OPTARG} ;; + f) openfiles=${OPTARG} ;; + m) mem=${OPTARG} ;; + *) errx "use -h for help" ;; + esac +done +shift $((${OPTIND}-1)) + +[ -z "${chr}" ] && errx "missing option: -c" +[ -z "${bin}" ] && errx "missing option: -x" +[ -z "${user}" ] && errx "missing option: -u" +[ ! -x "${bin}" ] && errx "${bin} is not an executable file" +[ "${user}" == "root" ] && errx "user root is not allowed" +[ -z "${group}" ] && group=${user} + +[ -d "${chr}" ] && mkdir -p ${chr}/{bin,dev,etc} +[ ${devfs} -eq 1 ] && { cd ${chr}/dev; sh /dev/MAKEDEV std random; rm ${chr}/dev/{console,klog,kmem,ksyms,mem,tty,xf86}; } +cp /etc/{resolv.conf,hosts,localtime} ${chr}/etc/ +chmod 0644 ${chr}/etc/{resolv.conf,hosts,localtime} +cp ${bin} ${chr}/bin + +login_conf="/etc/login.conf" +echo "${user}:\\">>${login_conf} +[ -n "${mem}" ] && echo " :vmemoryuse-max=${mem}:\\">>${login_conf} +[ -n "${openfiles}" ] && cat <>${login_conf} + :openfiles-max=${openfiles}:\\ + :openfiles-cur=${openfiles}:\\ +EOF +echo " :tc=daemon:">>${login_conf} + +pf_dir="/etc/pf" +pf_conf="${pf_dir}/${user}.conf" +sed -i "1iinclude \"${pf_conf}\"" /etc/pf.conf +[ ! -d ${pf_dir} ] && mkdir ${pf_dir} +echo "block in quick on lo0 from user ${user}">>${pf_conf} +[ -n "${listen}" ] && echo "pass in quick on egress proto tcp from any to any port ${listen}">>${pf_conf} +[ -n "${out}" ] && echo "pass out quick on egress proto tcp to any port ${out}">>${pf_conf} +echo "block out quick on egress from user ${user}">>${pf_conf} +pfctl -f /etc/pf.conf + +groupinfo ${group} || groupadd ${group} +userinfo ${user} || useradd -L ${user} -g ${user} -d /var/empty -s /sbin/nologin ${user} + +rsync -aR $(ldd ${bin}|tail -n+4|awk '{print $7}') ${chr} + +daemon=$(basename ${bin}) +cat < /etc/rc.d/${daemon} +#!/bin/sh + +daemon="/usr/bin/env -i /usr/sbin/chroot -u ${user} -g ${group} ${chr}" + +. /etc/rc.d/rc.subr + +pexp="\${daemon_flags}" + +rc_cmd \$1 +EOF + +chmod 0555 /etc/rc.d/${daemon} + +rcctl enable ${daemon} +rcctl set ${daemon} flags "/bin/${daemon}" +rcctl start ${daemon}