2

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

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

4

4 回答 4

2

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

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

于 2012-11-09T16:41:30.757 回答
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;
}
于 2012-11-09T17:27:09.580 回答
1

您也可能对访问控制列表感兴趣

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

于 2012-11-09T16:55:56.563 回答
1

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

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

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

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

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

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

于 2012-11-09T17:24:13.300 回答