我正在尝试通过 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
仍然使用find
with-follow
选项,该选项标记为已弃用)