我想允许同一组(“团队”)中的用户编辑服务器上的相同文件。包含这些文件的目录是通过 SSHFS 挂载的。
到目前为止,我无法使用 umask 设置*来实现我的目标。现在我将尝试 ACL。我在服务器上的目录上设置了以下默认 ACL,然后将其安装在客户端上。
服务器:
setfacl -d -m g::rwx .
[root@sshfsrv]# getfacl .
# file: .
# owner: user3
# group: team
# flags: -s-
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::r-x
客户:
sshfs -o allow_other,default_permissions
该目录使用(并且启用了allow_other 选项)安装在客户端上。
客户端上不存在默认 ACL,并且文件不具有组的读写权限,从而阻止该组中的用户处理相同的文件。
[user3@client2]# getfacl .
# file: .
# owner: user3
# group: team
# flags: -s-
user::rwx
group::rwx
other::r-x
我已重新启动 sshd,并且已注销并重新登录客户端。尝试setfacl
在客户端上运行该命令失败,并显示“不支持操作”。
为什么客户端上没有默认 ACL?
是否有另一种方法可以实现我的目标,即允许属于“团队”组成员并且在客户端 PC 上登录的所有用户使用本地挂载协作(读/写)同一组远程文件观点。
更新1:
客户端和服务器都运行 2017 年 5 月 25 日发布的 OpenSSH_7.5p1、OpenSSL 1.1.0f。两者都运行 Arch Linux。
在服务器上,systemctl status sshd
显示主 PID:4853 (sshd)
# cat /proc/4853/status
Name: sshd
Umask: 0022
State: S (sleeping)
Tgid: 4853
Ngid: 0
Pid: 4853
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
Groups:
NStgid: 4853
NSpid: 4853
NSpgid: 4853
NSsid: 4853
VmPeak: 47028 kB
VmSize: 47028 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 5644 kB
VmRSS: 5644 kB
RssAnon: 692 kB
RssFile: 4952 kB
RssShmem: 0 kB
VmData: 752 kB
VmStk: 132 kB
VmExe: 744 kB
VmLib: 6260 kB
VmPTE: 120 kB
VmPMD: 16 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
Threads: 1
SigQ: 0/62965
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180014005
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Seccomp: 0
Cpus_allowed: 3f
Cpus_allowed_list: 0-5
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 25
nonvoluntary_ctxt_switches: 2
在 /etc/ssh/sshd_config 中,我们有这个 Match 子句:
Match Group team
ForceCommand internal-sftp -u 0006
我可以根据要求提供更多信息。
更新2:
我想允许“团队”组中的用户编辑(读写)远程服务器上的相同文件(通过本地安装)。
该声明需要更多细节
请参阅下面的详细信息。
SSHFS挂载什么用户?
该组team
包含 3 个用户:user1、user2、user3。其中任何一个都可以进行 SSHFS 挂载。但问题始终是其他两个用户的权限/访问。所以我的问题确实涉及组中的其他用户,而不是 mount 命令中指定的用户。我尝试过 mount 命令的变体,但它目前看起来像这样:
user3@sshfsrv:/home/common /home/common fuse.sshfs x-systemd.automount,_netdev,user,follow_symlinks,identityfile=/home/user3/.ssh/id_rsa,allow_other,default_permissions 0 0
本地用户是否映射到远程服务器上同一组中的用户?
用户和组具有相同的 ID。不需要映射。
一般来说,SSHFS 是一个坏主意(容易受到 TCP 崩溃的影响),特别是当多个用户使用它时。
我以前没听说过这个。许多聪明人推荐 SSHFS。但如果我们不能让它发挥作用,我们别无选择,只能转向其他……
您是否考虑过类似 NFS over IPSec 之类的东西?
我们使用 NFS 已有十年,但在权限方面从来都不是很令人满意。一些“专家”建议我们切换到 SSHFS,我们刚刚就这样做了。他说这将解决我们的权限问题。到目前为止,正如您从问题中看到的那样,转换进行得并不顺利,但我希望通过一些知识我们能够解决这些问题。还没准备好放弃 SSHFS,但我们总是有可能不得不回到 NFS,尽管它在管理用户权限/访问方面确实不太令人满意。
或者也许只是使用 Git 而不是允许人们直接编辑文件。
Git 不是这种情况的解决方案。
脚注:
* umask 设置虽然在我的命令行测试中工作正常,但对桌面用户不起作用。我们发现文件管理器无法移动文件并崩溃,并且多个用户应用程序尝试使用错误的权限保存文件和/或根本无法保存文件。那是一场灾难。