使用 rssh 限制私有 apt 存储库 - 为什么 apt-get 尝试 /bin/sh?

使用 rssh 限制私有 apt 存储库 - 为什么 apt-get 尝试 /bin/sh?

我正在尝试通过 ssh 设置私有存储库。我的sources.list.d/包含条目

deb ssh://user@host:/repo ./ 

用户是主机上的仅证书帐户。apt-get update工作正常。

但是,我想限制下载存储库的访问权限,即禁用 shell 访问。如果我将用户 shell 设置为 rssh,仅允许 scp 和 sftp,更新就会中断。

/var/log/syslog

user user attempted to execute forbidden commands
command: /bin/sh

为什么 apt 需要在存储库计算机上进行 shell 访问,有没有办法避免这种情况?

我注意到有一个 apt-transport-sftp 的 github 存储库,我可能会看一下,但为了用户方便,我宁愿坚持使用更常见的包。

答案1

APT 远程做什么

我已经设置了一个测试帐户,并apt使用一个简单的脚本代替存储库所有者的 shell 来记录在远程服务器上执行的每个命令。显然,apt正在生成一个远程 shell,以便找到众所周知的文件的完整路径::

2015-09-14: Executing 'sh -c /bin/sh'; input and output follows:
find /tmp/repo/./InRelease -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release.gpg -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it_CH.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./en.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.xz -follow -printf '%s\n' 2> /dev/null || echo

...

因此,我认为您不能通过 限制 repo 用户的操作 rssh,因为:(1)要执行的命令通过 STDIN (与 SSH 的远程执行功能相对)传递到远程 shell,并且(2)命令是 shell管道。

解决方法?

如果您仍然想限制存储库用户远程执行的操作,我认为有两种方法:

  • 将 repo 用户的 shell 设置为 rbash 相反,并提供$PATH仅包含需要运行的命令的自定义设置。 (一定要设置$PATH (请确保从启动文件中不能从存储库用户写入。)这仍然为任何拥有访问凭据的人留下了读取系统中任何文件的可能性。

  • 仅使用存储库文件和 APT 所需的任何命令创建 chroot 监狱,并将存储库用户的 shell 设置为执行的脚本或程序chroot /jail "$@"

记录apt-get update操作

这是我用来记录远程执行的操作的脚本:

#!/bin/sh

echo "$(date -I): executing 'sh $@'; input and output follows" >> /tmp/sh.log
tee -a /tmp/sh.log | /bin/sh "$@" | tee -a /tmp/sh.log

答案2

你没有办法避免这种情况。

使用默认的 ssh 方法,apt需要登录到远程服务器,调用/bin/sh以获取 shell 访问权限,并使用一些 GNU 实用程序(例如find, )进行一些工作dd

apt源代码证实了这一点:

 157       Args[i++] = "/bin/sh";
 158       Args[i] = 0;
 159       execvp(Args[0],(char **)Args);
 160       exit(100);

(令人惊讶的是apt仍然使用findwith-follow选项,该选项标记为已弃用)

相关内容