将 SSH 密钥限制为仅 SCP

Mic*_*ard 7 automation linux ssh

问题:

我没有对服务器的 root 访问权限(即,我不能/不想更改任何系统范围的服务器配置),并且我想将 scp 与替代身份文件(例如,.ssh/id_rsa_for_scp)一起使用来自动执行从服务器下载一些文件,但我不希望使用相同的密钥通过 ssh 访问服务器。

Mic*_*ard 15

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

ssh-copy-id -i ~/.ssh/id_rsa_for_scp legendaryuser@192.168.1.1
Run Code Online (Sandbox Code Playgroud)

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

Host testmachine
    Hostname 192.168.1.1
    User legendaryuser
    BatchMode yes
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_rsa_for_scp
Run Code Online (Sandbox Code Playgroud)

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

从:

ssh-rsa AAAAAC3nZCXExxHUEBR...
Run Code Online (Sandbox Code Playgroud)

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

command="if [[ \"$SSH_ORIGINAL_COMMAND\" =~ ^scp.? ]]; then $SSH_ORIGINAL_COMMAND ; else echo Access Denied; fi" ssh-rsa AAAAAC3nZCXExxHUEBR...
Run Code Online (Sandbox Code Playgroud)

如果要将 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...
Run Code Online (Sandbox Code Playgroud)

最后,为了安全起见,让我们为密钥添加更多限制:

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...
Run Code Online (Sandbox Code Playgroud)

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

man sshd
Run Code Online (Sandbox Code Playgroud)

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

Pps:对不起我的英语,我不是母语人士。

  • @Jakuje 好的,很酷。为什么不把它作为答案并演示呢?我也很想看看怎么样 :D (3认同)