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