Answers:
rssh shell(http://pizzashack.org/rssh/)正是为此目的而设计的。
由于RHEL / CentOS 5.2不包含rssh软件包,因此您可以在此处获取RPM:http : //dag.wieers.com/rpm/packages/rssh/
要使用它,只需将它设置为新用户的外壳,如下所示:
useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1
..或更改现有外壳的外壳,如下所示:
chsh -s /usr/bin/rssh scpuser1
..并进行编辑/etc/rssh.conf
以配置rssh shell-尤其是取消注释allowscp
行,以启用所有rssh用户的SCP访问权限。
(您可能还希望使用chroot将用户保留在自己的房屋中,但这是另一回事了。)
我迟到了,但是您可以使用ssh键并在其〜/ .ssh / authorized_keys文件中指定允许的确切命令,例如
no-port-forwarding,no-pty,command =“ scp source target” ssh-dss ...
您可能需要在目标上使用ps来设置正确的命令设置。
PS:如果使用“ -v”运行测试scp命令,您会看到类似以下的内容
debug1: Sending command: scp -v -t myfile.txt
您会注意到,“-t”是一个未记录的scp选项,由程序在远端使用。这使您可以了解需要放入authorized_keys中的内容。
编辑: 您可以在此StackOverflow问题中找到更多信息(带有几个链接)。
对于backup_user
在服务器端命名的用户,这是一个有效的示例。
~backup_user/.ssh/authorized_keys
服务器端的内容(具有更多的安全性限制):
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...
在〜backup_user /中创建一个链接,该链接链接到应可访问内容的目录。
$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT
现在,从客户端开始,以下命令应该起作用:
scp -v -r -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT
该命令的作用:
-v
从命令和authorized_keys文件中删除该文件)-r
如果您不想进行递归副本,则可以从command和authorized_keys文件中删除)-P 2222
从命令中删除)-i .ssh/id_rsa_key_file
path/to/data
将复制到/path/to/directory/with/accessible/content/
为了使从服务器到客户端文件(或几个)的副本,你应该建立一个处理这个shell脚本如这里所描述
chmod 400 ~/.ssh/authorized_keys
。
~/.bashrc
(以及Bash执行的其他任何操作)设为~/.ssh/rc
只读。但是,即使恶意用户可以访问rsync或sftp,他仍然可以删除~/.bashrc
并上传一个新的。由于很难保护,因此建议您不要使用此方法(command="..."
)。
我参加聚会有点晚,但是我建议您看一下ForceCommand
OpenSSH 的指令。
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
当然,这是SFTP而不是SCP,但与受限制的Shell相比,它可以更安全地达到相同的目标。另外,您可以根据需要更改用户的根目录。
chrootDirectory %h
和AllowTcpForwarding no
,以强制sftponly用户将chroot迁移到其家中。请注意,匹配项(必须!)是ssh配置的最后一部分,之后的选项仅适用于匹配的用户
ForceCommand internal-sftp -u 0077 -d /uploaddir
通过在上传目录上强制使用umask,可以进一步加强它。结合“ ChrootDirectory”,它创建了一个受控制的,隔离的上传环境。注意:如果要使用默认目录和umask,则必须在中设置,而ForceCommand
不是在Subsystem
伪指令中设置。
我建议使用scponly。
这是一个受限制的外壳,允许用户执行听起来像是将SCP文件发送到服务器的操作,但实际上无法登录。可在此处获得该软件的信息和源代码下载,并且可以通过以下途径获得预编译的RPM软件包:EPEL YUM存储库。
安装后,您需要配置要限制访问权限的每个用户帐户,以使用新安装的受限外壳程序。您可以通过/ etc / passwd手动执行此操作,或使用以下命令: usermod -s /usr/bin/scponly USERNAME
scponly
专为此目的而设计。
我使用MySecureShell来做到这一点。您也可以配置其他限制。
https://github.com/mysecureshell/mysecureshell
将连接限制为仅SFTP / SCP。没有外壳访问。
参加聚会很晚,但是只需将git用户的shell设置为/ usr / bin / git-shell。这是一个受限制的外壳,不允许交互式登录。您仍然可以使用'su -s / bin / bash git'或其他git用户名来吸引用户。
我发现一种不错的方法是使用authorized_keys文件的command =“ ...”功能。(此页面建议我)
您将运行的命令将测试以scp(和rsync)开头的参数。
这是authorized_keys文件:
# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew
这是remote-cmd.sh的内容:
#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
'rsync'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Access Denied"
;;
esac
我想您可能仍需要保护用户的authorized_keys文件,但我的目的是拥有一个无需密码即可用于备份的密钥,而无需创建一个新用户,并且密钥不提供外壳程序(好,轻松)
~/.ssh/authorized_keys
,~/.bashrc
(和任何其他的Bash执行)和~/.ssh/rc
只读用户。但是,即使恶意用户可以访问rsync或sftp,他仍然可以删除~/.bashrc
并上传一个新的。由于很难保护,因此建议您不要使用此方法(command="..."
)。
将用户的登录Shell更改为限制性的名称,使用户只能运行scp,sftp-server和rsync,并且还检查是否允许使用不安全的参数(例如scp -S ...和rsync -e .. 。是不安全的,在这里看到:http://exploit-db.com/exploits/24795)。此类限制性登录shell的示例:
您可能想要在chroot或另一个受限制的环境(例如Linux中的nsjail)中运行其中之一,以禁用网络访问并更容易(将其列入白名单)控制可以读取和/或写入的目录。
我不建议使用command="..."
的~/.ssh/authorized_keys
,因为没有仔细额外的保护(如chmod -R u-w ~
用户),恶意用户可以上传新版本~/.ssh/authorized_keys
,~/.ssh/rc
或者~/.bashrc
,因此可以包括和执行任意命令。
它不是最优雅的解决方案,但是您可以向用户.bashrc中添加类似的内容
if [ "$TERM" != "dumb" ]; then
exit
fi
我发现SCP用户的术语为“哑”,而其他用户通常会获得vt100。
我想用户可能会在新的.bashrc上打听,这使它不是最佳解决方案,但是对于一个快速而肮脏的解决方案,它将起作用
~/.bashrc
)。从某种意义上说,这也很TERM
不稳定,也许新版本的OpenSSH会以不同的方式设置变量,或者某些sshd配置设置可能会影响TERM
。
ssh -o SetEnv TERM=dumb yourserver bash
?