2012-11-09 34 views
2

我有一個假設性問題。假設我有一個文件,我只希望某些進程能夠讀取和修改。我將如何去實施這個?基於進程組限制對文件的訪問

目前經過一番思考,最好的方法似乎是基於限制對進程組的訪問。就像在* nix中一樣,如何改變文件的權限以便爲特定組中的用戶授予rwx訪問權限,是否有可能僅將文件的rwx訪問權限授予屬於特定進程組的進程?我的方法在這裏有效嗎?還是有更簡單的方法可以做到這一點?

+0

你可能想看看進入[AppArmor配置(HTTP:/ /apparmor.net/)或/和[selinux](http://selinuxproject.org) – mata

回答

2

您所說的三個級別上存在文件權限。所有者 - >所有者組 - >全部。當一個進程運行時,它運行在某個用戶(啓動它的用戶)的權限下並繼承權限。那麼我會假設你想創建一個唯一的用戶組,在該權限下運行這些進程,並且僅限文件對該組的訪問。

會有限制,爲什麼你不能使用這樣的方法?

1

您也可以通過access control lists

興趣就個人而言,我從來沒有使用過,因爲我不需要在接入互聯網等精細控制

1

你不能做到這一點很喜歡這一點,但你可以實現這種效果包括以下步驟:

首先創建一個新組,使其成爲文件的所有者並設置權限以排除組外的訪問權限。

然後讓該組成爲可執行文件的所有者並設置其setgid位。

運行時,可執行文件(及其子進程)將擁有該組的標識,因此可以訪問這些文件。

詳情請參閱CHMOD(1)。

此設置通常用於讓遊戲獨佔訪問樂譜文件以防止外部篡改。看看你的/ usr/games,你可能會發現一些setgid可執行文件的例子。

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; 
}