根据进程组限制对文件的访问

时间:2012-11-09 16:36:15

标签: c linux permissions kernel

我有一个假设的问题。假设我有一个文件,我只希望某些进程能够读取和修改。我将如何实现这一目标?

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

4 个答案:

答案 0 :(得分:2)

您谈论的三个级别上存在文件权限。所有者 - >所有者组 - >所有。但是,当进程运行时,它将在某个用户(启动它的用户)的权限下运行并继承权限。我假设你想要创建一个唯一的用户组,在该权限下运行进程并限制文件只能访问该组。

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

答案 1 :(得分:1)

你也可能对access control lists

感兴趣

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

答案 2 :(得分:1)

你不能这样做,但你可以通过以下步骤实现这个效果:

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

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

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

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

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

答案 3 :(得分:1)

如果我理解正确你想根据进程组锁定写入文件,在这种情况下你可以组合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;
}