How to Restrict SSH Key for SCP Only Without Server Configuration Changes


2 views

When automating file transfers via SCP, security-conscious developers often face this dilemma: you need to use an SSH key for authentication, but want to prevent that same key from being used for full SSH shell access. This becomes particularly tricky when you don't have root access to modify server-side configurations like authorized_keys.

The most elegant solution uses the client's SSH configuration to restrict key usage. Create or modify your ~/.ssh/config file:

Host restricted-scp-server
    HostName example.com
    User your_username
    IdentityFile ~/.ssh/id_rsa_for_scp
    RemoteCommand scp -f /path/to/files
    RequestTTY no

Even more secure is combining this with a restricted server-side command (if you can get the admin to add one line):

# In server's authorized_keys (needs admin help):
command="scp --server-mode",restrict ssh-rsa AAAAB3NzaC1yc2E...

If you can't get admin assistance, the pure client-side solution still works:

Host scp-only
    HostName fileserver.example.com
    IdentityFile ~/.ssh/scp_key
    ProxyCommand ssh -q -i ~/.ssh/scp_key -W %h:%p %r@gateway.example.com -F /dev/null
    Protocol 2
    ServerAliveInterval 60
    ControlMaster auto
    ControlPath ~/.ssh/scp-ctrl-%r@%h:%p
    ControlPersist 10m

After setting up the config, your SCP commands become much simpler:

# Regular SCP with forced restriction
scp -F ~/.ssh/config restricted-scp-server:remote_file.txt .

# Using rsync with restricted key
rsync -e "ssh -F ~/.ssh/config" restricted-scp-server:/remote/path/ local/path/

Remember that client-side restrictions aren't foolproof. For maximum security:

  • Generate dedicated keys with ssh-keygen -t ed25519 -f ~/.ssh/scp_only_key
  • Use key passphrases for additional protection
  • Set strict file permissions: chmod 600 ~/.ssh/config ~/.ssh/scp*

If you encounter problems:

# Debug connection issues:
ssh -vT restricted-scp-server

# Verify key usage:
ssh-keygen -l -f ~/.ssh/id_rsa_for_scp

When automating file transfers via SCP, we often need to maintain security boundaries between different authentication methods. The specific challenge here is to:

  • Use a dedicated SSH key exclusively for SCP operations
  • Prevent the same key from being used for interactive SSH sessions
  • Achieve this without server-side configuration changes

The most effective approach is to leverage SSH client configuration to restrict key usage. Create or modify your ~/.ssh/config file:

Host scp-only-server
    HostName your.server.com
    User yourusername
    IdentityFile ~/.ssh/id_rsa_for_scp
    RemoteCommand false
    RequestTTY no
    PermitLocalCommand no

Combine this with forced command restriction in the public key. On the server, edit ~/.ssh/authorized_keys:

command="scp -f /path/to/allowed/directory/*",no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAAB3N... yourkeycomment

Here's how to implement this for automated downloads:

#!/bin/bash
# secure-scp-download.sh
scp -i ~/.ssh/id_rsa_for_scp -o PasswordAuthentication=no \
    -o PreferredAuthentications=publickey \
    scp-only-server:/remote/path/file.txt /local/path/

For additional security, consider these measures:

  1. Create a restricted shell wrapper
  2. Set filesystem ACLs on the allowed directory
  3. Implement time-based restrictions using command= wrapper scripts

Test your configuration with these commands:

# Verify SCP works
scp -F ~/.ssh/config scp-only-server:/path/to/file .

# Verify SSH is blocked
ssh -F ~/.ssh/config scp-only-server
# Should return "This service allows sftp connections only."

Remember to set strict permissions on your SSH files:

chmod 600 ~/.ssh/id_rsa_for_scp
chmod 644 ~/.ssh/id_rsa_for_scp.pub
chmod 600 ~/.ssh/config