我有两个远程服务器,富和酒吧。在两台服务器上我都有一个用户git(具有不同的 uid 和 gid)。两台服务器都运行 Debian 发行版。两台服务器都有各自的根ssh 公钥在 authorized_keys 中,因此所有与 ssh 相关的命令都已经可以正常工作。
git帐户已正确配置 - 默认 shell 设置为 /usr/bin/git-shell,存储库正在运行富(酒吧仍未就此事进行配置)。
我正在尝试在富和酒吧使用 sshfs。富我有一个目录 /home/git。该目录属于用户git(本例中 uid/gid 为 1000)。假设我想使用 sshfs 挂载此文件夹酒吧在/mnt/foo-git。
在正常情况下,我只会使用 sshfs git@foo /mnt/foo-git (在酒吧) 来挂载目录(或者使用 fstab,顺便说一句,这也是我计划在系统运行后执行的操作)。但是,git-shell 有效地阻止了我调用 sftp-server 并以最简单的方式使用 sshfs。
经过一番折腾,我决定使用 root 用户登录(通过 ssh),使用 su -l 更改有效用户,然后启动 sftp-server。为了实现这一点,我创建了一个简单的脚本(在富)/sbin/git-sftp 服务器:
#!/bin/bash
/bin/su -l git -s /bin/bash -c /usr/lib/openssh/sftp-server
并使用 sshfs 的以下选项(酒吧):
sshfs root@foo /mnt/foo-git -o sftp_server=/sbin/git-sftp-server
该命令似乎有效,但它并没有真正改变会话的权限。当我在酒吧, 在富文件随所有者一起出现根. 当 git 命令无法更改存储库的内容时,这将成为一个严重的问题,这仅仅是因为基本的 Linux 文件访问控制。
目前,我看到两个可能的方向:
- 尝试强制与用户进行 sshfs 会话git。这可能需要我摆弄 git-shell,但可能并非不可能
- 找到一种方法来修复从 root 会话进入用户 git 的问题
无论如何,到目前为止我还没有找到解决问题的好方法,但我依靠您的建议。
编辑:好的,在阅读@AlexStragies 评论(并测试了一些其他内容)后,我的解决方案是有些工作正常。如果我通过 sshfs 或 fstab 使用 +/- 以下选项挂载文件系统:
root@foo:/home/git /mnt/foo-git fuse.sshfs defaults,_netdev,uid=998,gid=998,IdentityFile=/root/.ssh/id_rsa,allow_other,sftp_server=/sbin/git-sftp-server" 0 0
然后使用“普通”shell 使用 su -l 进入 git 用户并创建一个文件,该文件的 uid/gid 正确设置为 git@foo。然而,假设我使用用户 root@foo 和权限 644 创建文件 /home/git/cat。用户 git@foo 显然无法修改该文件(权限被拒绝,但我很惊讶他可以删除该文件,但我猜这是可能的,因为他对该文件夹有写权限)。酒吧机器,该文件似乎归用户所有git,权限为 644,尽管它的实际所有者是 root@foo。现在,两个用户git和根在 foo 上可以修改文件 cat (更改反映在机器上富)尽管该文件仍归根权限为 644。
这似乎是一个奇怪的特权升级案例,或者是一个不太有效的解决方法。所以,我现在的问题是:哪一个?如果是后者,那么我该怎么做才能正确尊重远程用户的权限?