简单受限scp

简单受限scp

我需要建立某种可以使用 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 等工具。安装它们比编写自己的脚本工作量更少,而且更安全。

相关内容