Skip to content

Instantly share code, notes, and snippets.

@weakish
Created April 19, 2011 11:06
Show Gist options
  • Save weakish/927135 to your computer and use it in GitHub Desktop.
Save weakish/927135 to your computer and use it in GitHub Desktop.
#sh script to set up a #chroot #busybox #ssh environment
#!/bin/sh
# by Jakukyo Friel <[email protected]> under GPL v2.
### Set up a chroot busybox SSH environment
## requires
# wget -- to download pubkey and busybox
# sharutils -- to generate random password
## Config
# Edit them to suit your needs, e.g $Pubkeyurl. Paticuliarly, I'm using amd64. If you
# are on a 32-bit x86 system, change $Arch to i586 or i686.
# chroot users' group
readonly Members=members
# chroot directory (should be owned and writable only by root)
readonly Chroot=/chroot
# busybox
readonly Site=http://busybox.net/downloads/binaries
readonly Version=1.16.0
readonly Arch=x86_64
readonly URL=$Site/$Version/busybox-$Arch
## Doc
help() {
cat << END
Set up a chroot busybox SSH environment
Actions
init create chroot environment
add USERNAME PUBKEY_URL add new user and specify url to download pubkey
help this help page
Examples:
busyroot add joe http://example.com/id_dsa.pub
END
}
## sshd settings
#
# You should have openssh-sever (>4.8) installed.
#
# We will use /chroot as the chroot directory. All users belong to the
# group members will get chrooted. Edit your /etc/ssh/sshd_config, e.g.:
#
# Match Group members
# ChrootDirectory /chroot
#
## Set up chroot environment
setup_chroot() {
# prepare chroot group
groupadd $Members
# build directory tree
mkdir $Chroot
cd $Chroot
mkdir -p dev/pts proc etc lib usr/lib var/run var/log \
home bin usr/bin sbin usr/sbin
# copy files
cp /etc/localtime etc/
cp /etc/nsswitch.conf etc/
cp /etc/resolv.conf etc/
cp /etc/host.conf etc/
cp /etc/hosts etc/
touch var/log/lastlog
touch var/run/utmp
touch var/log/wtmp
# create devices
mknod dev/urandom c 1 9 && chmod 0666 dev/urandom
mknod dev/ptmx c 5 2 && chmod 0666 dev/ptmx
mknod dev/tty c 5 0 && chmod 0666 dev/tty
# The new environment needs access to terminals (this is necessary for a user to login) and to proc filesystem.
mount -o bind /dev/pts dev/pts/
mount -o bind /proc proc/
# busybox
cd bin
wget "$URL"
mv busybox-$Arch busybox
chmod 0755 busybox
ln -s busybox sh
cat <<- END
You need to manually chroot to link commands to busybox:
chroot $Chroot /bin/sh
busybox --install
exit
END
}
## add user
# Generate random password
#
# We disable password login. So in most cases, password is useless.
# But in rare cases, we may need to enable password login. Thus we
# made a very long password for security.
# Since Base64 uses [:alnum:] plus [+-] ('=' as suffix), our password length is about as strong as an 256-bit key.
# log(2**256)/log(26*2+10+2) => 42.6666666666667
#
generate_passwd() {
dd if=/dev/urandom count=1 2>/dev/null |
uuencode -m - |
head -n 2 | tail -n 1 | cut -c -43
}
init_user() {
local new_comer=$1
local pubkey_url=$2
local strong_passwd=`generate_passwd`
# add user
useradd -d /home/$new_comer -s /bin/sh -p $strong_passwd \
-g $Members -m $new_comer
# ssh with dsa_pubkey
cd /home/$new_comer
wget --no-check-certificate $pubkey_url
mkdir .ssh
chmod 700 .ssh
cat ${pubkey_url##*/} >> .ssh/authorized_keys2
chmod 600 .ssh/authorized_keys2
chown -R $new_comer:$Members .ssh
# copy files to $Chroot
cd $Chroot
local pattern="^${new_comer}:x:[0-9]"
grep $pattern /etc/passwd >> etc/passwd
grep $pattern /etc/group >> etc/group
grep $pattern /etc/shadow >> etc/shadow
mkdir home/$new_comer
chown $new_comer:$Members home/$new_comer
# report
echo "Done for $new_comer, whose password is"
echo $strong_passwd
}
## main function
case $1 in
init) setup_chroot;;
add)
New_comer=$2
Pubkey_url=$3
init_user $New_comer $Pubkey_url;;
*) help;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment