设想

设想

我知道在谷歌上搜索权限和特权的方法随处可见,相信我,我已经这样做了,并彻底阅读了我能找到的关于这个主题的每一点信息。要么是我不够聪明,无法解决这个问题(这里的情况很可能如此)或者在我设置的上下文中没有办法实现我想要做的事情。

无论如何,任何反馈都将不胜感激。

设想

用户和群组

  • 用户 1:组 1 - 这里用户 1 默认属于他自己的组组 1(即 - john:john)
  • user2:group2 - 此处 user2 默认属于其自己的组 group2(即 - jane:jane)
  • group3-此处 group3 完全独立(即 sftp)
  • 用户1 和用户2-也属于组3

文件和文件夹

  • 我已经在 /path/to/chroot 中为两个用户创建了一个 sftp jail(使用 ssh 的 chroot sftp,其中的节与用户 1 的组 1 和用户 2 的组 2 相匹配)
  • 我在 /path/to/chroot 中创建了两个文件夹 - “private” 和 “public”
  • 我在 /path/to/chroot/public 中创建了两个文件夹 - “downloads” 和 “uploads”

我想要实现的目标

“私人”文件夹

  1. 用户1应该
    • 对“私人”文件夹、子文件夹和文件具有完全访问权限(读/写/执行)。
    • 不允许删除“私人”文件夹本身,但允许在其中执行任何操作
  2. 用户2应该
    • 根本无权访问此文件夹/子文件夹和文件

“公共”文件夹

  1. 用户1应该
    • 不允许删除“公共”文件夹,但允许浏览它。
    • 不允许在“公共”文件夹中写入
  2. 用户2应该
    • 不允许删除“公共”文件夹,但允许浏览它。
    • 不允许在“公共”文件夹中写入

“public/downloads”文件夹

  1. 用户1应该
    • 对“public/downloads”文件夹、子文件夹和文件具有完全访问权限(读/写/执行)。
    • 不允许删除“public/downloads”文件夹本身,但允许在其中执行任何操作
  2. 用户2应该
    • 对“public/downloads”内的文件和文件夹具有只读访问权限
    • 不允许删除“public/downloads”文件夹

“public/uploads”文件夹

  1. 用户1应该
    • 对“public/downloads”文件夹、子文件夹和文件具有完全访问权限(读/写/执行)。
    • 不允许删除“public/uploads”文件夹本身,但允许在其中执行任何操作
  2. 用户2应该
    • 允许在“public/downloads”中添加新文件/文件夹
    • 被允许删除/编辑他在“public/downloads”中上传的文件
    • 不允许在“public/downloads”中读取/下载/执行不属于他的文件
    • 不允许编辑/删除“公共/下载”中不属于他的文件
    • 不允许删除“public/downloads”文件夹

我已经取得的成就

  • chroot(/路径/到/chroot)
    • 私人的(用户 1:组 1 0770)
      • 备份
      • 个人的
      • 其他
    • 民众(root:group3)chmod g + rx <-- 和 --> setfacl -m“default:group::rx”
      • 下载(usesr1:group3)chmod g+s && chmod g+rx <-- 和 --> setfacl -m "default:group::rx"
      • 上传(root:group3) chmod g+s && chmod g+rwx <-- 和 --> setfacl -m "default:group::rwx"

结果如下

  1. “私人”文件夹归用户 1 所有,只有他和组 1 可以访问它
  2. “公共”文件夹归 root 所有,并可供 group3 以只读方式访问。
    • 这意味着只有 root 可以创建/修改/删除此文件夹内的文件/文件夹,但 group3 的成员可以访问/读取/下载它们。
    • 该文件夹还为该组设置了默认 acl 为“rx”,这意味着在此文件夹内创建的所有文件/文件夹将默认继承 group3 的只读权限。
  3. “public/downloads”文件夹归用户 1 所有,并由组 3 以只读方式访问。
    • 这意味着只有用户 1 可以在此文件夹中创建/删除/修改新文件/文件夹,但组 3 的成员可以访问/读取/下载它们。
    • 该文件夹还为该组设置了默认 acl 为“rx”,这意味着在此文件夹内创建的所有文件/文件夹将默认继承 group3 的只读权限。
    • 该文件夹还启用了“g+s”,这意味着 user1 创建的所有文件/文件夹将自动继承 group3 的组 ID

我遇到的问题

  1. user1 仍然可以删除“私人”文件夹(问题)。
    • 我尝试在“私人”文件夹上使用 chattr +i,但没有达到预期的效果,因为似乎在“私人”文件夹内创建的文件/文件夹继承了该属性。
    • 我目前在 Linux-Vserver 中工作,无法在 vserver 内部 chattr +i 文件夹,因此必须通过主机进行操作(这是另一个问题,但可能很重要)。
  2. 目前,“public/uploads”文件夹归 root 所有,并可由 group3 以读写方式访问。
    • 这意味着用户 1 和用户 2 可以访问/读取/下载/创建/删除/修改文件夹内的新文件/文件夹,但不能删除它。(好)
    • 该文件夹还为该组设置了默认 acl 为“rwx”,这意味着在此文件夹内创建的所有文件/文件夹将默认继承 group3 的读写权限。
    • 该文件夹还启用了“g+s”,这意味着 user1 创建的所有文件/文件夹将自动继承 group3 的组 ID
  3. 这意味着用户 2 仍然可以下载/编辑/删除存储在“public/uploads”中的所有文件/文件夹(问题)
    • 我尝试在“public/uploads”上使用 +t(粘性位),但是它没有达到预期的效果,因为 user1 将无法再删除里面的文件。

我被困住了!

  1. 将“public/uploads”的所有权更改为 user1
    • 用户 1 应该被允许访问里面的任何内容(好)
    • 但现在可以删除该文件夹(问题)
  2. 其他可能的模组
    • 将默认组 acl 设置为 rwx(对于 group3,所有新文件/文件夹都将是 rwx)
    • 设置 g+s (所有新文件将继承 group3 组 ID)
    • 设置 +t(尚未测试,但希望仅适用于组而不适用于所有者)
    • 用户 2 应该被允许创建/修改/删除他自己的文件,但不能创建/修改/删除其他人的文件(好)
    • 但是他还被允许下载/查看不属于他的所有的文件(问题)。

当我开始研究这个问题时,这听起来很简单,但目前看来我已经达到了极限。如果有人有任何想法或指点,请告诉我。

提前致谢,JS

答案1

这是一个可以满足您需求的目录结构。

# file: .
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# file: public
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# file: public/uploads
# owner: user1
# group: group1
user::rwx
group::r-x
group:group3:rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:group1:rwx
default:group:group3:---
default:mask::rwx
default:other::---

# file: public/downloads
# owner: user1
# group: group1
user::rwx
group::r-x
group:group3:r-x
mask::r-x
other::---
default:user::rwx
default:group::r-x
default:group:group3:r-x
default:mask::r-x
default:other::r-x

# file: private
# owner: user1
# group: group1
user::rwx
group::rwx
other::---

重要的区别是:基本目录和公共目录由 root 拥有。这样,private 和 public/* 就不能被 user1 删除。public/uploads 具有 default:group:group1:rwx 和 default:group:group3:---。这样,user1 可以执行所有操作,但 user2 无法对该目录中的新文件执行任何操作,除了他自己的文件。

相关内容