On Mon, Sep 18, 2006 at 03:23:37PM +0200, Bambero wrote:
> Hello
> 
> Is there any good way to setup chrooted sftp-server without shell access ?

I wrote a shell script for this kind of stuff. Maybe you can use it
for yourself. I keep my users within an OpenLDAP database and want to
enable some users to access the www directory on my OpenBSD webserver
by scponly. Maybe you can use some parts of it.


#!/bin/sh
#
# Written by Aiko Barz
#


altroot="/var/www"
USERSHELL="/opt/sbin/scponlyc"


function checkChroot
{
    ##
    #  Hierachy
    ##
    if [ ! -d "$altroot" ]; then
        mkdir -p $altroot
        chown root:daemon $altroot
    fi
    if [ ! -d "$altroot/bin" ]; then
        mkdir -p $altroot/bin
        chown root:daemon $altroot/bin
    fi
    if [ ! -d "$altroot/etc" ]; then
        mkdir -p $altroot/etc
        chown root:daemon $altroot/etc
    fi
    if [ ! -d "$altroot/lib" ]; then
        mkdir -p $altroot/lib
        chown root:daemon $altroot/lib
    fi
    if [ ! -d "$altroot/usr" ]; then
        mkdir -p $altroot/usr
        chown root:daemon $altroot/usr
    fi
    if [ ! -d "$altroot/usr/bin" ]; then
        mkdir -p $altroot/usr/bin
        chown root:daemon $altroot/usr/bin
    fi
    if [ ! -d "$altroot/usr/sbin" ]; then
        mkdir -p $altroot/usr/sbin
        chown root:daemon $altroot/usr/sbin
    fi
    if [ ! -d "$altroot/usr/lib" ]; then
        mkdir -p $altroot/usr/lib
        chown root:daemon $altroot/usr/lib
    fi
    if [ ! -d "$altroot/usr/libexec" ]; then
        mkdir -p $altroot/usr/libexec
        chown root:daemon $altroot/usr/libexec
    fi
    if [ ! -d "$altroot/usr/libexec/openssh" ]; then
        mkdir -p $altroot/usr/libexec/openssh
        chown root:daemon $altroot/usr/libexec/openssh
    fi


    ##
    #  Static commands
    ##
    CHGRP=$(which chgrp)
    if [ -x "$CHGRP" ]; then
        cp $CHGRP $altroot/usr/sbin
    fi
    CHMOD=$(which chmod)
    if [ -x "$CHMOD" ]; then
        cp $CHMOD $altroot/$CHMOD
    fi
    CHOWN=$(which chown)
    if [ -x "$CHOWN" ]; then
        cp $CHOWN $altroot/usr/sbin
    fi
    LN=$(which ln)
    if [ -x "$LN" ]; then
        cp $LN $altroot/$LN
    fi
    LS=$(which ls)
    if [ -x "$LS" ]; then
        cp $LS $altroot/$LS
    fi
    MKDIR=$(which mkdir)
    if [ -x "$MKDIR" ]; then
        cp $MKDIR $altroot/$MKDIR
    fi
    MV=$(which mv)
    if [ -x "$MV" ]; then
        cp $MV $altroot/$MV
    fi
    RM=$(which rm)
    if [ -x "$RM" ]; then
        cp $RM $altroot/$RM
    fi
    RMDIR=$(which rmdir)
    if [ -x "$RMDIR" ]; then
        cp $RMDIR $altroot/$RMDIR
    fi
    ECHO=$(which echo)
    if [ -x "$ECHO" ]; then
        cp $ECHO $altroot/$ECHO
    fi
    PWD=$(which pwd)
    if [ -x "$PWD" ]; then
        cp $PWD $altroot/$PWD
    fi
    GROUPS=$(which groups)
    if [ -x "$GROUPS" ]; then
        cp $GROUPS $altroot/$GROUPS
    fi


    ##
    #  Dynamic commands
    ##
    ID=$(which id)
    if [ -x "$ID" ]; then
        cp $ID $altroot/$ID
        for lib in $(ldd $ID | awk '{if ($3 == "rlib"){print $5}}'); do
            if [ -f "$lib" ]; then
                cp -f $lib $altroot/$lib
            fi
        done
    fi
    PASSWD=$(which passwd)
    if [ -x "$PASSWD" ]; then
        cp $PASSWD $altroot/$PASSWD
        for lib in $(ldd $PASSWD | awk '{if ($3 == "rlib"){print $5}}'); do
            if [ -f "$lib" ]; then
                cp -f $lib $altroot/$lib
            fi
        done
    fi
    QUOTA=$(which quota)
    if [ -x "$QUOTA" ]; then
        cp $QUOTA $altroot/$QUOTA
        for lib in $(ldd $QUOTA | awk '{if ($3 == "rlib"){print $5}}'); do
            if [ -f "$lib" ]; then
                cp -f $lib $altroot/$lib
            fi
        done
    fi
    SCP=$(which scp)
    if [ -x "$SCP" ]; then
        cp $SCP $altroot/$SCP
        for lib in $(ldd $SCP | awk '{if ($3 == "rlib"){print $5}}'); do
            if [ -f "$lib" ]; then
                cp -f $lib $altroot/$lib
            fi
        done
    fi
    RSYNC=$(which rsync)
    if [ -x "$RSYNC" ]; then
        cp $RSYNC $altroot/$RSYNC
        for lib in $(ldd $RSYNC | awk '{if ($3 == "rlib"){print $5}}'); do
            if [ -f "$lib" ]; then
                cp -f $lib $altroot/$lib
            fi
        done
    fi
    SFTP="/usr/libexec/sftp-server"
    if [ -x "$SFTP" ]; then
        cp $SFTP $altroot/$SFTP
        for lib in $(ldd $SFTP | awk '{if ($3 == "rlib"){print $5}}'); do
            if [ -f "$lib" ]; then
                cp -f $lib $altroot/$lib
            fi
        done
    fi


    ##
    #  ld.so
    ##
    LD_SO="/usr/libexec/ld.so"
    if [ -f $LD_SO ]; then
        cp -f $LD_SO $altroot/$LD_SO
    fi
    LD_SO_HINTS="/var/run/ld.so.hints"
    if [ -f $LD_SO_HINTS ]; then
        cp -f $LD_SO_HINTS $altroot/$LD_SO_HINTS
    fi


    ##
    #  passwd
    ##
    FILE="/etc/master.passwd"
    if [ ! -f "$altroot/$FILE" ]; then
        touch $altroot/$FILE
    fi
}


function addUser
{
    if [ ! -z "$1" ]; then
        USERNAME="$1"
        useradd -d $altroot -s $USERSHELL -L ldap $USERNAME

        i=$(egrep "^$USERNAME:" $altroot/etc/master.passwd | wc -l)
        if [ $i = 0 ]; then
            # Create user within chroot
            egrep "^$USERNAME:" /etc/master.passwd >> $altroot/etc/master.passwd
            pwd_mkdb -d "$altroot/etc" $altroot/etc/master.passwd
            rm -f  $altroot/etc/spwd.db
        fi
    fi
}


function delUser
{
    if [ ! -z "$1" ]; then
        USERNAME="$1"
        userdel $USERNAME

        # Remove user
        egrep -v "^$USERNAME:" $altroot/etc/master.passwd > 
$altroot/etc/master.tmp
        mv -f $altroot/etc/master.tmp $altroot/etc/master.passwd

        # Create new pwd.db
        pwd_mkdb -d "$altroot/etc" $altroot/etc/master.passwd
        rm -f  $altroot/etc/spwd.db
    fi
}


function helpMe
{
    echo "$1 (--check|--add|--del|--help)"
}


if [ ! -z "$1" ]; then
    case $1 in
        --check)
            checkChroot
            ;;
        --add)
            [ ! -z "$2" ] && addUser $2
            ;;
        --del)
            [ ! -z "$2" ] && delUser $2
            ;;
        *)
            helpMe $0
            ;;
    esac
else
    helpMe $0
fi


Bye,
    Aiko
-- 
Aiko Barz <[EMAIL PROTECTED]>
Web: http://www.haeckser.de

Reply via email to