【问题标题】:Limiting access to a file based on process group根据进程组限制对文件的访问
【发布时间】:2012-11-10 14:13:35
【问题描述】:

我有一个假设性问题。假设我有一个文件,我只希望某些进程能够读取和修改。我将如何实施呢?

目前经过一些思考,最好的方法似乎是基于限制对进程组的访问。就像在 *nix 中一样,如何更改文件的权限以将 rwx 访问权限授予某个组中的用户是否可以仅将文件的 rwx 访问权限授予属于某个进程组的进程?我的方法在这里有效还是有更简单的方法可以做到这一点?

【问题讨论】:

标签: c linux permissions kernel


【解决方案1】:

文件权限存在于您所说的三个级别。所有者 -> 所有者组 -> 全部。然而,当一个进程运行时,它会在某个用户(启动它的用户)的权限下运行并继承这些权限。我会假设您希望创建一个唯一的用户组,在该权限下运行进程并限制文件仅对该组的访问。

对于为什么不能使用这样的方法会有限制吗?

【讨论】:

    【解决方案2】:

    access control lists您也可以感兴趣

    就个人而言,我从未使用过它们,因为我不需要对访问进行如此精细的控制

    【讨论】:

      【解决方案3】:

      如果我理解正确,您想根据进程组锁定文件以进行写入,在这种情况下,您可以结合 fcntl 和 gpgrp

      #include <stdio.h>
      #include <stdlib.h>
      #include <errno.h>
      #include <fcntl.h>
      #include <unistd.h>
      
      #define ALLOWED_GROUP 500
      
      int main(int argc, char *argv[])
      {
          struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0};
          int fd;
      
          fl.l_pid = getpid();
      
          if (argc > 1 || getpgrp() != ALLOWED_GROUP) 
              fl.l_type = F_RDLCK;
      
          if ((fd = open("demo.c", O_RDWR)) == -1) {
              perror("open");
              exit(1);
          }
      
          printf("Press <RETURN> to try to get lock: ");
          getchar();
          printf("Trying to get lock...");
      
          if (fcntl(fd, F_SETLKW, &fl) == -1) {
              perror("fcntl");
              exit(1);
          }
      
          printf("got lock\n");
          printf("Press <RETURN> to release lock: ");
          getchar();
      
          fl.l_type = F_UNLCK;
      
          if (fcntl(fd, F_SETLK, &fl) == -1) {
              perror("fcntl");
              exit(1);
          }
      
          printf("Unlocked.\n");
      
          close(fd);
      
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        你不能这样做,但你可以通过以下步骤来达到这个效果:

        首先创建一个新组,使其成为文件的所有者并设置权限以排除组外的访问。

        然后将该组设为可执行文件的所有者并设置其 setgid 位。

        运行时,可执行文件(及其子进程)将具有组的 ID,因此可以访问文件。

        有关详细信息,请参阅 CHMOD(1)。

        此设置通常用于为游戏提供对乐谱文件的独占访问权限,以防止外部篡改。查看 /usr/games,您可能会找到一些 setgid 可执行文件的示例。

        【讨论】:

          猜你喜欢
          • 2023-02-08
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 2013-01-04
          • 1970-01-01
          相关资源
          最近更新 更多