限制SFTP的无密码备份


11

我需要使用Duplicity将服务器备份到计算机上:

duplicity /etc sftp://backup@my.dynamic.ip.address//home/backup

在此之前,我需要通过以下操作允许无密码访问:

$ ssh-keygen
$ ssh-copy-id backup@my.dynamic.ip.address
$ ssh backup@my.dynamic.ip.address

我的问题是,如何将命令限制为仅在生成的公钥中进行此SFTP传输?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

而且由于我使用的是动态IP地址,因此每次IP变化时如何克服“缺少已知主机”的问题?



1
“丢失的著名主持人的问题”:使用StrictHostKeyChecking = no选项的ssh
马吉

@Marki,谢谢,对ssh_config进行设置即可。
问题溢出

Answers:


15

问题1

我的问题是,如何将命令限制为仅在生成的公钥中进行此SFTP传输?

有两种方法可以做到这一点。

1.-通过sshd限制

此方法涉及在SSH守护程序中设置SFTP功能sshd。这是通过/etc/ssh/sshd_config配置文件控制的。注意:这将限制用户,backup使其只能通过SFTP进入服务器。

# /etc/ssh/sshd_config

Subsystem       sftp    internal-sftp

## You want to put only certain users (i.e users who belongs to sftpusers 
## group) in the chroot jail environment. Add the following lines at the end 
## of /etc/ssh/sshd_config

Match User backup
  ForceCommand internal-sftp

2.-通过authorized_keys进行限制

此方法不涉及对sshd_config文件的任何更改。您可以通过command=问题中已经提到的功能将用户+ SSH密钥限制为单个命令。诀窍在于您要包含的命令。您可以将SFTP服务器放在这一command=行中,其作用与在sshd_config文件中设置SFTP服务器相同。

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

注意:如果用户对拥有写权限 ~/.ssh/authorized_keys,则他们可以读取和/或修改它。例如,他们可以下载,编辑和重新上传,以剥离,从而commmand=...授予他不受限制的命令访问权限,包括shell。如果用户对拥有写权限~/.ssh,则他们也可以简单地取消链接并重新创建文件,或者chmod对其进行写访问。存在许多可能的解决方案,例如将~/.ssh/authorized_keys文件放在用户不可写的地方,例如:

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

问题2

而且由于我使用的是动态IP地址,因此每次IP变化时如何克服“缺少已知主机”的问题?

这比较棘手,但也可以使用文件中的from=功能来实现authorized_keys。在这里,我们仅限制来自主机的访问somehost.dyndns.org

来自=“ somehost.dyndns.org”,命令=“ / usr / libexec / openssh / sftp-server”,无端口转发,无X11转发,无代理转发,无pty ssh-dss AAAAC8ghi9ldw ==备份@主机

后面的其他设置command=同样重要,因为它们将进一步限制SSH密钥的使用。

功能细目

  • from='hostname1,hostname2,'' -限制来自指定IP或主机名模式的访问
  • command='command' -验证后运行指定的命令
  • no-pty -不分配pty(不允许交互式登录)
  • no-port-forwarding -不允许端口转发
  • no-X11-forwarding -用户将无法删除显示X11 GUI
  • no-agent-forwarding -用户将无法通过此主机转发到其他内部主机

要摆脱有关“缺少已知主机”的消息,可以在客户端连接时将此SSH选项添加到客户端,如下所示:

$ ssh -o StrictHostKeyChecking=no ....

ssh_config有关此开关的完整详细信息,请参见手册页。

限制用户的外壳

对于上述两种解决方案,您可能还希望backup通过限制/etc/passwd文件中该用户的外壳来锁定用户。通常,您需要将其设置为scponly,但是还有其他选择。请参见标题为“ 您需要SCP的外壳吗? ”的U&L问答。

/sbin/nologin如果您选择使用上面#1中sshd_config概述的chroot功能,也可以使用of 。但是,如果您选择使用#2中概述的方法,则您可能必须对中的用户shell 使用或其他方法。scponly/etc/passwd


奖励-扩展以上#2

如果需要为此用户公开一组命令,也可以执行此操作。创建一个像这样的脚本/home/backup/commands.sh

#!/bin/sh

case $SSH_ORIGINAL_COMMAND in
  "diskspace")
    df -h
    ;;
  "dirlist")
    ls -1
    ;;
  "apache_restart")
    /etc/init.d/apache restart
    ;;
  *)
    echo "Unknown command"
esac

然后按如下所示设置authorized_keys文件:

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

然后,backup用户可以像下面这样运行这些命令:

# diskspace
$ ssh -q user@remote_host diskspace
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/dev-root   39G  2.2G   35G   6% /

# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql

参考文献


请注意允许用户访问的命令,否则用户可能会获得完整的外壳。例如,如果您授予某人访问vim的权限,他们可以很容易地:: / bin / bash或:!/ bin / someotherprogram。
2014年

@rking-是的,不用说...
slm

感谢您给我这么详细的答案。命令限制工作完美。但是有两个问题。1)动态IP是指我的计算机,而不是服务器。Authorized_keys文件的“ from”字段中的主机名仅限制服务器可以从其访问我的计算机的地址,并且无法解决我的计算机上的“缺少已知主机”问题。2)为我的计算机上的备份用户禁用Shell登录/sbin/nologin将阻止服务器使用SFTP访问我的计算机。我试过了
问题溢出

1
对困惑感到抱歉。当服务器S与我的计算机C进行后端SFTP连接时,服务器S成为客户端。每当进行备份的服务器S连接到其ssh known_hosts文件中未列出的位置时,就会出现“缺少已知主机”的问题。Marki在他的评论中提供了正确的解决方案。在from该参数authorized_keys上的我的电脑C文件只限制从S可连接到C的位置
问题溢出

是的,请继续进行编辑。顺便说一句,我意识到,/sbin/nologin如果我使用force命令internal-sftp而不是/usr/libexec/openssh/sftp-server您在证书上指定的命令,则该方法有效。我猜这是两个不同的子系统。为前者创建一个chroot目录更加简单。
问题溢出2014年

0

限制壳

您需要分配一个受限外壳,例如scponlyrssh。

当您使用scp或sftp时,您将通过ssh连接到远程站点,然后远程外壳程序将执行scp进程或sftp进程。您需要的是一个受限制的外壳,该外壳仅允许scp或sftp锁定登录名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.