将 SSH 密钥限制为仅 SCP

将 SSH 密钥限制为仅 SCP

问题:

我没有服务器的 root 访问权限(即,我不能/不想更改任何系统范围的服务器配置),我想使用 scp 和备用标识文件(例如.ssh/id_rsa_for_scp)自动从服务器下载某些文件,但我不想使用相同的钥匙用于通过 ssh 访问服务器。

答案1

将密钥文件复制到服务器后:

ssh-copy-id -i ~/.ssh/id_rsa_for_scp [email protected]

(为了简化示例,我们假设客户端的机器 ~/.ssh/config 已经配置好了。有关~/.ssh/config运行的更多详细信息man ssh_config

Host testmachine
    Hostname 192.168.1.1
    User legendaryuser
    BatchMode yes
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_rsa_for_scp

您将需要编辑服务器的/home/legendaryuser/.ssh/authorized_keys文件。

从:

ssh-rsa AAAAAC3nZCXExxHUEBR...

致:(此版本允许下载和上传)

command="if [[ \"$SSH_ORIGINAL_COMMAND\" =~ ^scp.? ]]; then $SSH_ORIGINAL_COMMAND ; else echo Access Denied; fi" ssh-rsa AAAAAC3nZCXExxHUEBR...

如果您想要将 scp 限制为“仅下载模式”并且仅限于特定目录中的文件,请执行以下操作:

command="if [[ \"$SSH_ORIGINAL_COMMAND\" =~ ^scp[[:space:]]-f[[:space:]]/full/path/to/dir/.? ]]; then $SSH_ORIGINAL_COMMAND ; else echo Access Denied; fi" ssh-rsa AAAAAC3nZCXExxHUEBR...

最后,为了安全起见,让我们对密钥添加一些限制:

command="if [[ \"$SSH_ORIGINAL_COMMAND\" =~ ^scp[[:space:]]-f[[:space:]]/full/path/to/dir/.? ]]; then $SSH_ORIGINAL_COMMAND ; else echo ERRO Access Denied; fi",no-pty,no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-rsa AAAAAC3nZCXExxHUEBR...

您可以authorized_keys通过运行以下命令查看有关该文件的更多详细信息:

man sshd

附言:您还可以添加from=xxx.xxx.xxx.xxx对来自特定IP地址或网络的密钥的使用限制。

Pps:抱歉,我的英语不是母语人士。

答案2

补充@Michael Richard 的回答。

zsh 将返回错误:

zsh:1: no such file or directory: scp ...

该问题在bash中也存在。

为了解决这个问题,更换

... then $SSH_ORIGINAL_COMMAND ; ...

... then $SHELL -c $SSH_ORIGINAL_COMMAND ; ...

相关内容