Many system administrators need to provide file transfer capabilities without granting full shell access. This is particularly common when:
- Providing access to backup scripts
- Allowing external partners to retrieve log files
- Creating limited-access service accounts
The most reliable method uses the ForceCommand directive in sshd_config combined with a special shell restriction:
# /etc/ssh/sshd_config
Match User restricted_user
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /path/to/chroot
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
For more granular control, install the restricted shell package:
yum install rssh chsh -s /usr/bin/rssh restricted_user
Then configure /etc/rssh.conf:
allowscp # deny all other options logfacility = LOG_USER umask = 022
Complete setup example for new accounts:
useradd -s /usr/bin/rssh -d /home/scpuser -m scpuser passwd scpuser mkdir -p /home/scpuser/uploads chown scpuser:scpuser /home/scpuser/uploads chmod 750 /home/scpuser
Test the configuration from a client machine:
# Should work: scp file.txt scpuser@server:/uploads/ # Should fail: ssh scpuser@server
If connections are rejected:
- Verify SELinux contexts:
restorecon -Rv /home/scpuser - Check audit logs:
ausearch -m avc -ts recent - Ensure proper permissions on home directory (not writable by group/others)
Additional hardening measures:
# In sshd_config: PermitEmptyPasswords no PermitUserEnvironment no ClientAliveInterval 300 ClientAliveCountMax 0
Administrators often need to provide file transfer capabilities without granting full shell access. While SCP and SFTP both operate over SSH, we can leverage OpenSSH's configuration to create a secure, restricted environment.
The most reliable method uses rssh or scponly as the user's shell. For CentOS 5.2:
# yum install rssh # chsh -s /usr/bin/rssh username
For systems without additional packages, modify /etc/ssh/sshd_config:
Match User restricted_user
ForceCommand /usr/libexec/openssh/sftp-server
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
For enhanced security with SCP-only access:
# mkdir -p /var/jail/username/uploads # chown username:username /var/jail/username/uploads # usermod -d /var/jail/username username
Then in sshd_config:
Match User username
ChrootDirectory /var/jail/username
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
Test the configuration:
# ssh username@localhost # Should reject with "This service allows sftp connections only." # scp username@localhost:/path/to/file . # Should work normally
Key permission issues often cause problems. Ensure:
# chmod 755 /var/jail # chown root:root /var/jail # chmod 755 /var/jail/username
For CentOS 5.2 specifically, you may need to adjust SELinux contexts:
# chcon -t ssh_home_t /var/jail/username/uploads