FTP
is an old protocol created when network was a ‘new thing’ and everybody was a ‘care bears’, therefore it’s insecure by design and you shouldn’t even propose it to yours customers. Instead always push the SFTP
option first.
For practical usage, there is three little downsides to SFTP
use:
SFTP
doesn’t have it own dedicated port. Personally i like to reuse the ‘Simple File Transfer Protocol’ port (TCP 115) but this ideas is enough to trigger heart attacks to network ‘ayatollah’- each user must have an unix account
- an
SFTP
access isn’t by default chrooted inside the user directory
SFTP on a dedicated port
Until we have SFTP
support inside ProFTPD, the only solution is to spawn a second OpenSSH daemon on a separated port.
Here a snippet of my new setting file /etc/ssh/sftp-115
:
Port 115
# Protocol
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
# Restriction
AcceptEnv no
AllowAgentForwarding no
AllowTcpForwarding no
Banner no
MaxAuthTries 3
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768
# Logging
SyslogFacility AUTH
LogLevel INFO
UseDNS no
# Authentication
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile /home/sftp/%u/.ssh/authorized_keys
PasswordAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
# Disable some options
UsePAM no
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
# Use sftp-internal (allow chroot)
Subsystem sftp internal-sftp
ForceCommand internal-sftp
Before OpenSSH 4.8 there is no internal-sftp
module, therefore you must use the external command sftp-server
instead:
Subsystem sftp /usr/lib/openssh/sftp-server
For launching the daemon you can use xinetd
, clone and modify your distribution OpenSSH init script or simply add a one-liner inside the /etc/rc.local
:
/usr/sbin/sshd -f /etc/ssh/sftp-115
Do as you wish.
Unix user account
Not much to say here, you must create a proper unix account for each SFTP
. I suggest you to set the home directory to something like /home/sftp/<user> to distinguish easily theses users from regular ones.
In case you use sftp-server
you must also change the user shell value. First add sftp-server
as a valid shell :
# echo '/usr/lib/stfp-server' >> /etc/shells
Then for each SFTP
unix account:
# usermod -s /usr/lib/sftp-server <user>
Chroot user
If you use internal-sftp
simply add the following snippet to /etc/ssh/sftp-115
:
ChrootDirectory /home/sftp/%u
For sftp-server
, bad news, you simply can’t chroot users.
To give user access to a directory use the mount --bind
command:
mount --bind /var/www/foobar /home/user/foobar/www
Don’t forget to add this line into your SFTP
daemon init script.