问题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
参考文献