This came up today where I needed to give secure file transfer to customers. To complicate things I had to use an out-of-the-box RHEL6 system. The obvious answer was to use SSH and limit those users to SFTP only. Locking them into a chroot was not a requirement, but it seemed like a good idea to me. I found plenty of docs that got 80% of the way, or took a shortcut, but this should be complete.
The basic steps are:
Without further ado, lets get started. It should only take about 10 minutes, nothing here is especially complex.
Create a group that is limited to SFTP only and a user to be in that group.
1 2 3 |
|
Now you need to make a little change to /etc/ssh/sshd_config.
There will be a Subsystem line for sftp which
you need to change to read:
1
|
|
Now you need to create a block at the end to limit members of a group (ie the sftponly group you created above) and chroot them. Simply add the following to the end of the file:
1 2 3 4 5 |
|
These changes will require a reload of the SSH daemon: service
sshd reload
Now you need to make some file permission changes. For some reason which I cannot work out for now, the home directory must be owned by root and have the permissions 755. So we will also need to make a folder in the home directory to upload to and make that owned by the user.
1 2 3 4 |
|
The last thing we need to do is tell SELinux that we want to upload files via SFTP to a chroot as it is read-only by default. Of course you are running SELinux in enforcing mode aren’t you :)
1
|
|
Now from another console you can sftp to your server
1
|
|
You should then be able to put a file in your upload folder. However if you try to ssh to the server as the user sftptest it should tell you to go away. Of course you should be able to ssh as your normal user with no problem. Pro tip: make sure to leave a root terminal open just in case.
I'm sure it can be used on Debian as well.Match User user01useradd -m user01 && useradd -m user02
ChrootDirectory /home
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
Match User user02
ChrootDirectory /home
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
chmod 300 /home/user02
restart sshd daemon
[root@nod01 ~]# sftp user02@localhost
user02@localhost's password:
Connected to localhost.
sftp> cd user02
sftp> ls
remote readdir("/user02"): Permission denied
sftp> mkdir hello
In few words, the user user02 can only write and user user01 can write and read
--
esta es mi vida e me la vivo hasta que dios quiera
I'm not sure how the OpenSSH implementation handles ACLs, maybe that'san option but I did not test it.
Then there is Proftpd which has a mod_sftp extension.
And there are still the solutions which predate the chroot() and sftp-internal
implementation possible with OpenSSH like
- scponly
- rssh
- rush
All of them have a somewhat mixed security record and have some cost in
terms of chroot setup and mainting them properly.