我需要建立某种可以使用 SCP 读取的存储库。客户端用户将无法看到/损坏/执行/...任何其他内容。
我通读了将 SSH/SCP/SFTP 用户限制到某个目录与此类似,基于 rssh、scponly、chroot 的方法也是众所周知的。另外,我们忽略 SFTP。
理想情况下,我不想安装任何东西,也不想复制库等,以实现真正的基于 chroot 的方式。所以我想到了这样的shell脚本:
#!/bin/sh
echo "$(date) $*" >> /tmp/scpwrap.log
# Allow only plain SCP get, neither -r nor -v etc
if [ "${1}" = "-c" ] && expr "${2}" : '^scp -f ' >/dev/null
then
shift
files=$(echo $1 | sed 's/scp -f //')
echo "SCPing ${files}" >> /tmp/scpwrap.log
# However, permit multiple files (e.g. /tmp/x*)
for f in ${files}
do
if [ ! -O "${f}" -o -w "${f}" ]
then
echo "Can only get read-only files owned by $(whoami)." >&2
ls -l "${f}" >> /tmp/scpwrap.log
exit 1
fi
done
echo "Executing $*" >> /tmp/scpwrap.log
exec $*
fi
[ "${1}" = "-c" ] && shift
echo "Executing $* not permitted." >&2
exit 1
进而:
# useradd -m -s /tmp/scpwrap.sh scpwrap
如果我现在将存储库内容复制到 ~scpwrap 并赋予其正确的所有权/权限,这可能足以允许:
client$ scp 'scpwrap@reposerver:repo/bla*' /tmp
不过看起来太简单了……有什么问题或改进吗?非常感谢!
答案1
关注点:您显然不知道如何编写安全的 shell 脚本。你的代码显然被破坏了,因为缺少双引号, 哪个是一个安全错误,而不仅仅是一个功能错误。
如果您确实希望它是安全的,请不要编写自己的。作为一名安全工程师,我会完全拒绝您自制的解决方案,因为现有的解决方案已经存在。即使它乍一看没有破损,我也会这样做。使用 rssh 或 scponly 等工具。安装它们比编写自己的脚本工作量更少,而且更安全。