我正在使用 Debian 7 并创建了一个新用户(网站),其 htdocs 目录如下:
$ sudo adduser website
$ sudo mkdir -p /home/website/htdocs
$ sudo chown -R website /home/website
现在我希望另一个组(开发人员)的用户能够访问该用户的目录。我努力了:
$ sudo chown -R :developers /home/website
我可以看到该组已分配(使用ls -la
或stat
)并且用户位于该组中,但他们没有访问权限?
drwxr-xr-x 3 website developers 4096 May 3 09:09 website
我也想:
允许另一组“承包商”访问网站文件
限制网站用户仅访问其主目录
确保新的网站文件继承这些权限
您是否必须使用访问控制列表 - 或者是否有更好的方法来执行此操作(例如不对每个站点使用单独的用户)?
答案1
在不了解操作系统或分布的情况下很难给出精确的命令;是的! ACL 可以工作,但也有一个标准方法。
有adduser
和useradd
,您的发行版上的其中之一可能会自动创建用户的主目录。如果是这样,那么目录的内容/etc/skel/
将被复制到用户的主目录中,设置权限,并且可能会执行一些其他适当的操作。
可能存在预先定义的共享组,例如“工作人员”;但是,如果我们想创建自己的群组进行共享,那也没有什么问题。因此,创建一个新组或使用现有组。确保已使用 、 或根据操作系统定义了要成为该组成员usermod
的moduser
用户vigr
。当前登录的每个用户都必须注销并重新登录才能成为新组的成员。
创建一个对所有用户通用的目录,例如/home/share_directory/
或任何其他对您的情况最有意义的目录。相关的最佳实践是不使用目录之内任何用户的主目录。如果除了所有者和组之外没有人能够看到该目录中的文件,则将该目录的权限更改为0770。如果“其他”可以读取,则使用0775。该目录的所有者几乎肯定是root。
chown root:group_name /home/share_directory/
接下来,更改 setuid 位。
chmod +s /home/share_directory/
如果没有用户应该能够修改另一个用户的文件,那么还要设置粘位。
chmod +t /home/share_directory/
这些示例使用以下命令同时设置 setuid 和粘性位八进制表示法。
chmod 5775 /home/share_directory/
或者
chmod 5770 /home/share_directory/
对于更新的问题,ACL 似乎是正确的工具。现在大多数 Linux 发行版都acl
在选项中包含了该选项defaults
。如果您的发行版默认不包含该acl
选项,那么需要做一些工作才能开始使用它。首先使用acl
/etc/fstab 中的选项挂载文件系统。
sudo vim /etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,acl 0 1
如果需要,重新挂载文件系统:sudo mount -o remount,acl /
。然后为此目的创建一个用户可能所属的组。您可能还需要安装 ACL 工具:apt-get install acl
。
sudo groupadd developers
sudo usermod -a -G developers $username
(或者该组可能是“承包商”。)当前登录的用户必须注销并再次登录才能成为新组的成员。当然,如果您想保留 /var/www 目录中的内容,请不要执行此操作,但这只是为了说明将其设置为启动:
sudo rm -rf /var/www
sudo mkdir -p /var/www/public
sudo chown -R root:developers /var/www/public
sudo chmod 0775 /var/www/public
sudo chmod g+s /var/www/public
sudo setfacl -d -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -d -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
上面的命令之间的区别setfacl
如下:第一个实例使用默认组(目录的组所有者),而第二个实例显式指定组。该开关为目录中的所有新文件系统对象-d
建立默认掩码 ( )。-m
然而,我们还需要再次运行该命令,而不需要-d
将 ACL 应用于目录本身。然后在配置文件中将对“/var/www”的引用替换为“/var/www/public”并重新加载。
sudo vim /etc/apache2/sites-enabled/000-default
sudo /etc/init.d/apache2 reload
如果我们想限制除创建文件的用户之外的所有用户的删除和重命名:sudo chmod +t /var/www/public
.这样,如果我们想为 Apache 文档根目录之外的框架创建目录,或者创建服务器可写目录,这仍然很容易。
Apache 可写日志目录:
sudo mkdir /var/www/logs
sudo chgrp www-data /var/www/logs
sudo chmod 0770 /var/www/logs
Apache可读的库目录:
sudo mkdir /var/www/lib
sudo chgrp www-data /var/www/logs
sudo chmod 0750 /var/www/logs
在无关紧要的目录中进行一点“播放”应该有助于使其适合您的情况。
在限制方面,我使用两种不同的方法:shellrssh
旨在提供 SCP/SFTP 访问,但不提供 SSH 访问;或者,要限制对主目录的使用,您可以使用内部 sftp 子系统,在/etc/ssh/sshd_config
.
Subsystem sftp internal-sftp
Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
创建一个名为 sftponly 的组。使用户成为 sftponly 组的成员。/
由于 chroot,将其主目录更改为。目录 /home/username 应归 root 所有。您还可以将用户的 shell 设置为 /bin/false 以阻止 SSH 访问。我主要关心交互式访问,因此通常遵循该rssh
路径。 (除了我定义的写入能力之外,他们不能在任何地方写入。)