LFCS — Linux Foundation System Administrator
Permission Bits, umask and the ACL Mask
한국어 원문으로 표시합니다.
목표
8진수와 기호 모드, umask, 특수 비트, ACL 과 마스크를 한 디렉터리 안에서 차례로 세워 보고 그 상호작용을 눈으로 확인한다.
왜 중요한가
권한 문제는 "왜 안 되지" 로 시작해서 대개 chmod 777 로 끝난다. 그 습관이 감사에서 걸리는 이유는 단순하다 — 필요한 것은 한 사람의 예외인데 모두에게 문을 열었기 때문이다. 세 칸(소유자·그룹·기타)으로 표현이 안 되는 요구가 생겼을 때 그룹을 새로 파는 대신 ACL 을 쓰는 판단, 그리고 여러 사람이 같은 디렉터리에 파일을 쌓을 때 setgid 로 그룹을 통일하는 판단이 이 영역의 핵심이다. 마스크는 특히 중요하다. ACL 을 정확히 주고도 나중에 누가 chmod 한 번을 걸면 마스크가 다시 계산되어 그 ACL 이 조용히 무력해진다. getfacl 의 #effective: 표시를 읽을 줄 알아야 이 상황을 5초 만에 알아본다.
단계
- 디렉터리
/root/lfcs-perm/를 만들고, 그룹lfcsteam과 사용자lfcsone,lfcstwo를 만드세요. 두 사용자 모두lfcsteam을 보조 그룹으로 가져야 합니다(기본 그룹은 각자의 개인 그룹). /root/lfcs-perm/notes.txt를 만들고 권한을 640, 그룹을lfcsteam으로 맞추세요./root/lfcs-perm/run.sh에 아무 내용이나 넣고, 기호 모드를 써서 권한을 750, 그룹을lfcsteam으로 맞추세요.- umask 를
0027로 바꾼 셸에서/root/lfcs-perm/umask-demo/newfile파일과/root/lfcs-perm/umask-demo/newdir디렉터리를 새로 만드세요. 그리고/root/lfcs-perm/umask.txt에umask=0027,file=<새 파일의 권한>,dir=<새 디렉터리의 권한>세 줄을 적으세요. /root/lfcs-perm/probe를 root 소유·권한4755로 만들고,/root/lfcs-perm/tools/디렉터리를1777로 만드세요./root/lfcs-perm/shared/를 그룹lfcsteam, 권한2770으로 만든 다음 그 안에handoff.txt를 만드세요. 파일의 그룹이 상속으로lfcsteam이 되어야 합니다.handoff.txt에lfcsone은rw-,lfcstwo는r--로 ACL 을 주고,shared/디렉터리에는lfcsteam그룹의 default ACL 을rwx로 주세요.handoff.txt의 ACL 마스크를r--로 낮추고,/root/lfcs-perm/mask.txt에lfcsone_effective=<마스크 적용 후 lfcsone 의 실효 권한>한 줄을 적으세요.
참고
- 특수 비트는 8진수 네 자리의 맨 앞자리입니다. setuid 4, setgid 2, sticky 1.
- 6단계는 순서가 전부입니다. 비트를 세우기 전에 만든 파일은 그룹을 물려받지 않습니다.
getfacl은 마스크가 실제 권한을 깎을 때만#effective:를 붙입니다.- 흔한 실수: ACL 을 준 뒤에
chmod를 걸면 그룹 비트가 마스크로 해석되어 ACL 이 무력해집니다.
협업용 그룹과 사용자 준비
디렉터리 /root/lfcs-perm/ 를 만들고, 그룹 lfcsteam 과 사용자 lfcsone, lfcstwo 를 만드세요. 두 사용자 모두 lfcsteam 을 보조 그룹으로 가져야 합니다(기본 그룹은 각자의 개인 그룹).
두 사용자 모두 팀 그룹을 보조 그룹으로 가져야 합니다. 기본 그룹까지 팀 그룹으로 만들면 뒤 단계의 상속 실험이 의미를 잃습니다.
8진수 모드와 그룹 소유권
/root/lfcs-perm/notes.txt 를 만들고 권한을 640, 그룹을 lfcsteam 으로 맞추세요.
권한과 그룹은 서로 다른 명령입니다. 640 은 소유자 읽기·쓰기, 그룹 읽기, 기타 없음입니다.
기호 모드로 권한 주기
/root/lfcs-perm/run.sh 에 아무 내용이나 넣고, 기호 모드를 써서 권한을 750, 그룹을 lfcsteam 으로 맞추세요.
기호 모드는 대상(u/g/o/a), 연산자(+/-/=), 권한(r/w/x)을 조합합니다. 등호는 나머지를 지우고 지정한 값만 남깁니다.
umask 가 기본 권한을 깎는 방식
umask 를 0027 로 바꾼 셸에서 /root/lfcs-perm/umask-demo/newfile 파일과 /root/lfcs-perm/umask-demo/newdir 디렉터리를 새로 만드세요. 그리고 /root/lfcs-perm/umask.txt 에 umask=0027, file=<새 파일의 권한>, dir=<새 디렉터리의 권한> 세 줄을 적으세요.
파일 기준값은 666, 디렉터리 기준값은 777 이고 umask 비트가 거기서 빠집니다. 나중에 chmod 로 맞추지 말고 umask 를 바꾼 셸에서 새로 만드세요.
setuid 와 sticky 비트
/root/lfcs-perm/probe 를 root 소유·권한 4755 로 만들고, /root/lfcs-perm/tools/ 디렉터리를 1777 로 만드세요.
특수 비트는 8진수 네 자리의 맨 앞자리입니다. setuid 는 4, setgid 는 2, sticky 는 1 입니다. setuid 는 소유자가 누구인지가 핵심입니다.
setgid 협업 디렉터리
/root/lfcs-perm/shared/ 를 그룹 lfcsteam, 권한 2770 으로 만든 다음 그 안에 handoff.txt 를 만드세요. 파일의 그룹이 상속으로 lfcsteam 이 되어야 합니다.
순서가 중요합니다. 디렉터리에 비트를 세우고 그룹을 맞춘 다음에 안에 파일을 만들어야 상속이 일어납니다.
명명된 사용자 ACL 과 default ACL
handoff.txt 에 lfcsone 은 rw-, lfcstwo 는 r-- 로 ACL 을 주고, shared/ 디렉터리에는 lfcsteam 그룹의 default ACL 을 rwx 로 주세요.
파일에는 개별 사용자 항목을, 디렉터리에는 앞으로 만들어질 파일에 물려줄 항목을 겁니다. 뒤쪽은 별도의 플래그가 필요합니다.
마스크가 실효 권한을 깎는다
handoff.txt 의 ACL 마스크를 r-- 로 낮추고, /root/lfcs-perm/mask.txt 에 lfcsone_effective=<마스크 적용 후 lfcsone 의 실효 권한> 한 줄을 적으세요.
마스크는 소유자와 기타를 뺀 모든 항목의 상한입니다. 마스크만 따로 지정하는 항목 표기가 있고, 낮추고 나면 getfacl 이 실효 권한을 함께 보여 줍니다.