'Linux ACL'에 해당되는 글 1건

  1. 2016.05.28 acl 씹어먹기! + acl-control.c 소스!!








안녕하세요

현이입니다. 

오늘 포스팅 할 주제는 ACL( Access Control List) 입니다. 

 

특정 파일 혹은 디렉토리를 여러 사용자가 쓰고 읽을 수 있도록 

파일의 원소유권에 존속하지 않도록 만들어 주는 것을 ACL 이라고 할 수 있습니다.

 

이를 사용하기 위해서는 마운트 옵션에 acl 이 붙어 있어야 하며 

커널에 ACL옵션이 있어야 하며 관련 패키지가 설치 되어 있어야 합니다.

 

위의 3가지 조건이 갖추어진 환경이라면 setfacl 과 getfacl 이라는 명령어가 시스템에 존제할 것입니다.

 

기본 예제를 보여 드리겠습니다.

chacl u::rwx,u:user1:rwx,u:user2:r-x,g::r-x,o::---,m::rwx 파일 혹은 폴더 

 

chacl = 실행 파일 입니다.

 

u::rwx = user에게 rwx ( 읽기 쓰기 실행하기) 권한을 부여하겠다는 의미입니다. 

 

,u:user1:rwx,u:user2:r-x = u:user1:rwx, = user를 지정하고 해당 user에 권한을 부여합니다

값의 사이에는 ,(쉼표) 구분지어 주어야 합니다.

 

,g::r-x,o::---,m::rwx g:r-x, 그룹에 읽기와 쓰기의 권한을 부여하겠다는 의미입니다.

o::--- : other 지정되지 않은 사용자 혹은 그룹에게는 권한을 부여하지 않는다는 의미입니다.

m::rwx 요부분은 mask이지만 저도 아직은 정확한 개념이 안잡히네요 

 

 

이것을 쪼~끔 간단하게 사용할수 있도록 C로 간단히 짜 보았습니다..

 

소스코드는 이렇습니다. 

#include "stdlib.h"

#include "stdio.h"

/* 디랙토리 혹은 파일 이름을 인자값으로 받아오기 위해 argv를 사용 */

int main(int argc, char *argv[])

{

char userid[30];

int permission, k=1;

FILE *pt, *pt2;

system("mkdir -p /usr/local/sbin/control/conf");

system("awk -F: '{ if ($3>= 1000 ) print $1 }' /etc/passwd > usr/local/sbin/control/conf/user.conf");

system("sed -i '/nobody/d ' /usr/local/sbin/control/conf/user.conf");

if (argc <2){

printf("Useage : %s 디랙토리 or 파일명\n",argv[0]);

goto end;

}

else { goto read;}

 read:

 pt = fopen("/usr/local/sbin/control/conf/user.conf", "r") ;

 pt2 = fopen("/usr/local/sbin/control/conf/user-acl.conf", "w");

 fprintf(pt2,"#!/bin/bash\r\n");

 fprintf(pt2,"cd /data/home/%s ; find -exec chacl u::rwx",argv[1]); 

while(1)

{

idscan:

k++;

fscanf(pt,"%s",userid);

if (feof(pt)) break;

printf("%s에 대한 %s의 퍼미션을 입력하세요 : \r\n7 : 읽기+쓰기 모두가능, \r\n5 : 읽기만 가능\r\n0 : 접근불가\r\n입력 : " ,argv[1],userid); 

scanf("%d",&permission);

if(permission == 7){ 

printf("%s의 퍼미션  %d (읽기 + 쓰기 가능)",userid,permission);

fprintf(pt2,",u:%s:rwx",userid, permission,userid);

}

else if(permission == 5){

printf("%s의 퍼미션  %d (읽기만 가능)",userid,permission);

                fprintf(pt2,",u:%s:r-x",userid, permission,userid);

}

else if(permission == 0){

printf("%s의 퍼미션  %d (권한 없음)",userid,permission);

}

else {

printf("잘못선택하셨습니다.");

k=0;

goto idscan;}

 

printf("\r\n");

getchar();

if (fgetc (pt) == EOF) break;

   }

   fprintf(pt2,",g::r-x,o::---,m::rwx \"{}\" + ");

end:

 fclose(pt) ;

 system("chmod 770 /usr/local/sbin/control/conf/user-acl.conf");

 system("dos2unix /usr/local/sbin/control/conf/user-acl.conf");

 system("/usr/local/sbin/control/conf/user-acl.conf");

 system("rm -rf /usr/local/sbin/control/conf/user.conf ");

 system("rm -rf /usr/local/sbin/control/conf/user-acl.conf");

}

 

소스 긁어 쓰지 마시고 아래 파일을 받아서 쓰세요 인코딩은 EUC-KR입니다.
 

 

 

 

 

 

Posted by 현종이닷
,