Enable SSH shell access but disable SFTP access
I've searched for a viable answer to this question, and most of the answers include advice on why to not do it. However, here's the scenario, and what makes it necessary:
I have a console app, and in each user's .profile, there is a startup command for the app, and directly after the command that starts it up, there's an "exit" command, which logs them out of the system. I only want them to be able to access this console app through the interface provided by it. Upon startup, the app presents the user with a list of clients that can be accessed through the app, with each client having their own data directory. Users are granted access to only the clients that they will need access to.
Now here's the problem: If I give the users SSH access, they will also be able to log in using an SFTP client, which will give them direct access to the data directories for the app, which is VERY undesirable, since that will also give them access to the data directories to which they should not have access.
This was such a simple thing to do when using a telnet/FTP combination, but now that I want to give the users access from anywhere on the internet, I haven't been able to find a way to shut them out of SFTP, while still allowing them access to the shell where they can run the app.
Edit:
In case it's not obvious, the following answer isn't intended as a secure method of preventing SFTP from being used by anyone with shell access to the server. It's just an answer that explains how to disable it from external visibility. For a discussion about user level security, see answers from @cpast and @Aleksi Torhamo. If security is your focus, this answer is not the proper one. If simple service visibiliy is your focus, then this is your answer.
We now continue to the original answer:
Comment out sftp support in sshd_config (and of course restart sshd
):
#Subsystem sftp /usr/lib/openssh/sftp-server
As others have mentioned, disabling sftp
isn't anywhere near sufficient - a user with unrestricted ssh
access can view any file that their account has permissions to view, can modify anything they have permission to modify, and can easily download anything they can read to their own machine. The only way to stop them from doing this is to actually restrict their access. It's also not ideal to rely on .profile
to restrict users, as that's not what it's for (Edit: As Aleksi mentions in his answer, it is in fact trivial to bypass .profile
; the thing about .profile
is that it's for convenience, not security, so it's not intended to restrict the user. Use things designed for security, like the things below, to provide security).
There are two basic ways to do this: you could restrict them via file permissions, or force them to only execute your console app. The second way is better: Assign users who should be restricted to the console app to a group (e.g. customers
); then, in sshd_config
, add the following lines:
Match Group customers
ForceCommand /path/to/app
What this does is make it so that all connections from users in that group open the console app; they cannot start anything else, including the sftp
server tool. This also stops them from doing anything else with the system, and unlike .profile
, does so using the SSH server itself (.profile
restricts them at the shell, ForceCommand
also prevents doing other things that don't involve starting a shell). Also unlike .profile
, this is designed as a security thing; it is specifically made to resist a malicious user evading it.
The (probably inferior) alternative would involve creating a new user to run the console app. You would then restrict the data directories to that user, set the console app owned by that user, and set u+s
on the program. This is the setuid
bit; it means that someone who runs the console program does so with the permissions of the program's owner. That way, the user does not themselves have access to the directories, they only get it through the program. However, you should probably just use ForceCommand
, as that restricts all access to "just run this program".