Попытайтесь комментировать DefaultRoot, я думаю, что он может переопределить значения, считанные из бэкенда базы данных.
Править:
Если DefaultRoot будет установлен и что-нибудь кроме ~ затем, то пользователь будет заключен в тюрьму в дереве, базированном в DefaultRoot.
Если DefaultRoot будет ~ затем, то пользователь будет заключен в тюрьму в дереве, базированном в theit корневом каталоге.
В дополнение к установке DefaultRoot ~, как упомянуто, на что Ваша конфигурация SQL похожа - Вы на самом деле извлекаете ее из базы данных?
DefaultRoot ~
<IfModule mod_dso.c>
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
</IfModule>
SQLLogFile /var/log/proftpd/mod_sql.log
PersistentPasswd off
AuthPAM off
AuthUserFile /some/path/to/dummy/passwd.ftp
AuthGroupFile /some/path/to/dummy/group.ftp
AuthOrder mod_sql.c mod_auth_file.c
SQLConnectInfo proftpd@localhost:3306 userdatabase password
SQLAuthTypes Backend Crypt Plaintext OpenSSL
SQLUserInfo user user_id password NULL NULL ftp_homedir NULL
SQLAuthenticate users
SQLDefaultUID 14
SQLDefaultGID 50
SQLMinUserUID 13
SQLMinUserGID 49
Это - более или менее краткий пример выполнения 100%-го автора от базы данных и заключения в тюрьму их к их homedir, как перечислено в DB. Если Вы хотите также, динамично создают их корневой каталог, когда они входят в систему (полезный, если Вы добавляете их в базе данных и не хотите входить в сервер, чтобы сделать это), можно добавить:
CreateHome on dirmode 0755
... к конфигурации. Другие два фиктивных файла упомянутое выше соответствие Ваша установка ProFTPd, который на Red Hat/Centos сервер:
passwd.ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
group.ftp
ftp:x:50:
nobody:x:99:
Это все заставляет Ваших виртуальных пользователей иметь UID/GID 14:50 на жестком диске независимо от их имени пользователя входа в систему.