利用SGID解决上传目录属组继承

1 人参与

上传目录明明已经设好属组,过一阵子却又出现“这个文件能改,那个目录不能写”,问题可能出在新文件没有沿用共同的组。维护账号和 Web 进程轮流写入时,只修正现有文件的属组并不够,还得让后续创建的内容遵守同一规则。目录上的 SGID,就是用来处理这件事的。

SGID 管继承,不管放权

可以把上传目录看成一个共用仓库:属组是仓库的“工作小组”,SGID 则规定,新建内容默认归这个小组,而不是跟着创建者自身的默认组走。

以 deployer:www-data 为例,在上传目录设置 SGID 后,其中新建的文件会继承目录的属组,新建子目录通常也会继承 SGID,让这条规则继续向下传递。文件属主仍是创建它的用户,并不会因此统一变成 deployer。

但属组一致,不等于同组成员一定能写。目录仍需具备合适的组写入、进入权限,实际写入进程也必须具有对应的组身份。新文件是否组可写,还受创建时的权限设置和权限掩码影响。

设置之后,要验证新内容

确认上传目录属组正确、组权限满足业务需求后,再设置 SGID:

sudo chmod g+s /var/www/html/wordpress/wp-content/uploads

这条命令只给指定目录增加 SGID,不会补齐已有子目录的设置,也不会修正历史文件的属组。如果上传目录已经存在多层结构,应逐层核查需要持续写入的目录,不能只看最外层。

随后分别通过后台上传和维护账号创建内容,检查新文件的属组、子目录是否继续继承,以及双方能否完成必要操作。不要只凭“命令执行成功”判断问题已经解决。

SGID 解决的是“以后创建的内容归哪个组”,不是上传权限的万能开关。把继承规则限定在上传等确实需要共享写入的目录,再单独检查写权限,比为了省事把整站放开更稳妥。

参与讨论

1 条评论
  • 蜃楼影

    之前踩过这个坑 新文件组全乱了

    回复