Virtualmin + SFTP + chroot

SFTP is considered more a secure alternative to FTP and FTPS. The FTP server is needed as the native SSH server is used instead, and SSH does not require an SSL certificate. One drawback is the default configuration of SFTP does not restrict access to the user’s home directory. A chroot’ed setup can easily be configure and incorporated with Virtualmin.


Create sftponly group

addgroup --gid 900 sftponly


Create chroot directories

mkdir -p /home/chroot/bin


Virtualmin chroot setup script

cat > /home/chroot/bin/chroot.sh <<EOF
#!/bin/bash
if [ ! "\$VIRTUALSERVER_PARENT" ]
then
  if   [ "\$VIRTUALSERVER_ACTION" == "CREATE_DOMAIN" ]
  then
    if [ ! "\$VIRTUALSERVER_CREATED" ]
    then
      mkdir -p /home/chroot/\$VIRTUALSERVER_USER/home
    else
      echo "Setting up \$VIRTUALSERVER_USER to chroot'ed environment for sftp"
      usermod -d /home/\$VIRTUALSERVER_USER \$VIRTUALSERVER_USER
      ln -s \$VIRTUALSERVER_HOME /home
      echo " .. done"
    fi
  elif [ "\$VIRTUALSERVER_ACTION" == "DELETE_DOMAIN" ]
  then
    if [ "\$VIRTUALSERVER_CREATED" ]
    then
      echo "Cleaning up \$VIRTUALSERVER_USER's chroot'ed environment"
      rm -rf /home/chroot/\$VIRTUALSERVER_USER /home/\$VIRTUALSERVER_USER
      echo " .. done"
    fi
  fi
fi
EOF
chmod 755 /home/chroot/bin/chroot.sh


Modify ssh server

cat >> /etc/ssh/sshd_config <<EOF
Subsystem    sftp    internal-sftp
Match Group sftponly
    ChrootDirectory /home/chroot/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
Match all
EOF


Restart SSH Server

service ssh restart


Virtualmin Configuration Changes


Virtualmin -> System Settings -> Virtualmin Configuration -> Defaults for new domains -> Home directory base:

/home/chroot/${USER}/home


Virtualmin -> System Settings -> Virtualmin Configuration -> Defaults for new domains -> Home subdirectory:

${USER}


Virtualmin -> System Settings -> Virtualmin Configuration ->Actions upon server and user creation -> Command to run before making changes to a server:

/home/chroot/bin/chroot.sh


Virtualmin -> System Settings -> Virtualmin Configuration ->Actions upon server and user creation -> Command to run after making changes to a server:

/home/chroot/bin/chroot.sh


Enforcing SFTP only access on a user

usermod -a -G sftponly <username>
Scroll to Top