[Discuss] Using sftp without a shell account - [SOLVED]

Bill Horne bill at horne.net
Sat Jan 17 16:44:19 EST 2015


On 12/28/2014 8:58 PM, Bill Horne wrote:
> I'm setting up an LDAP-based server, which will be used for file 
> transfers among other things. I'd like to allow LDAP users to access 
> the machine via sftp, but I can't figure out how to do that without 
> giving each user a local shell account, and I'm looking for advice.
>
> The LDAP users can access ftp without trouble, but not sftp.
>
> It's a Mac Mini, running OS X "Yosemite", with Server v4.1.
>

Keywords: Solved Answered Fixed  Resolved

Here's the procedure to allow Open Directory users to have SFTP access 
without Shell Access on an OS X Yosemite Server. This was done on OS X 
10.10.1, with server version 4, which is the latest release as of 
December 2014.

If this breaks your machine, you get to keep all the pieces and chalk it 
up to experience and I'm not to blame. You've been warned.

The plan:

A. Some users will be placed in an "sftp-only" group.
B. The "sftp-only" members will be able to use sftp to access their 
"home" directories, and to create subdirectories, but they won't be able 
to write anything outside their home directory, and they will only have 
"read" access within a chroot jail that we will create for them.
C. Members of the "sftp-only" group will receive an error message if 
they try to use ssh (Secure Shell) to log in to the server.
D. The ftp server will be turned off, so that only sftp may be used to 
transfer files. All users will have sftp access, but users whom are NOT 
in the "sftp-only" group will also be able to
      use a secure shell.

Step-by-step procedure: you must have root privileges to create this new 
environment. That means your ID must be in the /etc/sudoers file: if you 
use the "sudo" command and get an error saying that your ID is not in 
the sudoers file, logout and login again with a different ID that has 
sudo privileges.

1. Decide on where you will put the new "root" directory that your SFTP 
users will use. I recommend that you create a new directory just under 
the root.

N.B. ALL the directories that are "above" your users' new root MUST be 
owned by the root user and writable ONLY by root! The "administrator" 
account will NOT work: you must sudo to create this new directory. I 
chose to use "ftp" as the directory name.

sudo mkdir -p /ftp/Users

(The above creates a new "ftp" directory under the root, and a "Users" 
directory under /ftp, if you don't already have one. This will be a 
"chroot jail" which will be the only part of the machine which  
sftp-only users will have access to.

2. Test to make sure the new directory is "read only" for all except root.

myserver:~ myusername$ ls -ld /ftp
drwxr-xr-x  4 root  wheel  136 Jan 11 00:08 /ftp

... and it looks good.

If your listing shows write permissions for "group" or "anyone", chmod 
the directory to 755: skip this step if the "ls" output shows it's not 
needed.

sudo chmod 755 /ftp    # sets /ftp so that only root has write permission.

If the listing does not show "root" as the directory owner, then use 
chmod: if the "ls" shows root already owns the directory, skip this step.

sudo chmod root /ftp

3. Copy the existing user's files into the new chroot jail directory: 
this assumes that your users have their home directories in /Users. The 
"-a" option will preserve the existing ownership and attributes: since 
the users will be switched to the "home" directory which is shown in 
their Open Directory profile, it's much easier to simply copy the whole 
/Users directory so that we don't have to change the OD entries. In 
other words, once the sftp daemon accepts a user's credentials, that 
user's "home" will be set to whatever is shown in OD, UNDER THE CHRROT 
ROOT (in this case, /ftp),

sudo cp -a /Users  /ftp/Users

4. Decide if you want to remove the sftp-only users' old "home" 
directories. I recommend that you leave them "as is" until the users 
have confirmed that they sill have all their files.

5. You MIGHT need to have a /dev/ file under /ftp for syslogd to get 
logging info. In my machine, there was no /dev/log, but there was a 
/dev/klog device, so I copied that to /ftp. I'm not sure if it's needed, 
but it doesn't hurt. If we were allowing shell access to users in the 
jail, we'd need to provide a shell and assorted other files, but the 
internal-sftp option doesn't require it.

sudo cp -a /dev/klog  /ftp

6. Edit the /etc/sshd_config file by adding the following lines:

Subsystem   sftp    internal-sftp

Match Group sftp-only
   X11Forwarding no
   AllowTcpForwarding no
   ForceCommand internal-sftp
   ChrootDirectory /ftp

N.B.: there is no "end-of-match" keyword. Be sure you leave whitespace 
at the beginning of each line that is part of the match.

Stop. Take a breath. Have a BOYC.

Now, the "gotcha": the sshd_config file is sensitive to CR/LF entries! 
If you are reading this on a Windoze machine and copying lines into OS X 
from there, it's a good idea to delete all the line-ends and separate 
the lines by hand while using a command-line type of editor under OS X.

7. Make a list of uses whose id's will be restricted to sftp access, and 
add their usernames to the sftp-only group.

8. HUP the sshd to reload the configs.

sudo kill -1 /etc/sbin/sshd        # If you are accessing the machine 
via ssh, this will kill your connection. Assuming your id is not in the 
sftp-only group, you'll be able to log back in.

9. Test all sftp-only users to make sure they are properly restricted. 
You should get an error when attempting ssh access, but sftp should 
start up in the user's directory under /ftp/Users.

Notes:

A. You COULD specify that the chroot jail started at /ftp/Users, instead 
of /ftp, but that closes off each user's home directory from read access 
by other sftp users. In my environment, the users want to be able to 
read each others home directories. I also wanted to be able to give 
users a common directory where they can put files that everyone needs 
access to, so I put the jail root at /ftp.

B. There are many other howto's available for this, and many of them 
recommend using  /usr/libexec/sftp-server instead of internal-sftp - but 
I never got that to work.

My thanks to everyone at the BLU for their help!

-- 
E. William Horne
339-364-8487




More information about the Discuss mailing list