【问题标题】:Unique Process Permissions Linux独特的进程权限 Linux
【发布时间】:2014-02-23 20:25:21
【问题描述】:

有没有办法在 C 语言中为基于 Linux 的系统上的进程提供唯一权限?我基本上想限制一个进程(由主机启动,如事件处理程序)编辑其工作目录之外的任何文件,并创建套接字等。

做到这一点的唯一方法是让主机进程为它产生的每个进程创建一个新用户并在之后销毁该用户吗?

【问题讨论】:

  • 这可能有点矫枉过正,但这种事情可以用chroot()处理。
  • 危险在于大多数可能的机制都需要 root 权限才能实现更改。您可以查找chroot() — 但要注意为chroot() 程序创建合适的环境是很棘手的;您可以查找 BSD 'jails';您可以考虑简单地将真实有效的 UID 和 GID 设置为不能更改目录外任何内容的用户/组(但请注意,它仍然能够读取可公开访问的文件,例如 /etc/passwd)。跨度>

标签: c linux process permissions


【解决方案1】:

对此的标准答案是chroot,它将进程的根目录(及其子进程的根目录)设置为给定目录。

但是,如果您想要一个更好的答案,允许您隔离进程的所有方面而不仅仅是其文件系统,请查看unshare 系统调用(包装在现代glibc 中作为函数)。这就是容器的构建方式。

【讨论】:

  • 拨打unshare需要root权限吗?
  • 这个man7.org/linux/man-pages/man2/unshare.2.html 不代表CLONE_FS。对于其他一些 unshare 调用,您将需要 root(更准确地说是 CAP_SYS_ADMIN)。我个人没有使用过CLONE_FS 没有其他人。
  • 另请注意,技术上chroot() 需要CAP_SYS_CHROOT 而不是root 或CAP_SYS_ADMIN,尽管通常它们会组合在一起。
  • lxc 在底层只使用unshare 系统调用。这将比您的问题更重,这意味着您需要操作系统的完整容器副本 - 而不仅仅是一个进程。如果你愿意,最轻量级的解决方案是 Docker (docker.io)
  • 这取决于什么样的恶意代码。利用内核漏洞的恶意代码仍可能成功。耗尽资源(例如磁盘 I/O、内存)的恶意代码仍然可能成功,除非您使用 cgroups 或类似方法来控制它们。
【解决方案2】:

您可以使用旧的setuid 技术将您的进程切换到nobody uid 和nogroup gid。这些 id 旨在使进程无法写入任何文件(除了在所有可写目录中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2016-01-28
    • 2017-08-30
    • 2011-05-31
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多