
Linux에서 지원하는 기본 권한 관리는 rwx 형식으로 사용자, 사용자 그룹, 제3자에 대해 수행한다. 하지만 일부 특수 목적으로 사용하는 파일은 기본 권한으로 접근 제어가 어려울 수 있어 setuid, setgid, sticky bit으로 확장된 권한 개념을 사용한다.
또한 세부적인 권한 관리를 위해 접근 제어 리스트를 사용한다. 이를 이용하면 사용자 또는 사용자 그룹이 아니더라도 권한 부여 또는 권한 제거가 가능하고, 권한 상속 같은 것도 할 수 있다.
setuid는 바이너리 파일 또는 스크립트 파일에만 사용한다. 일반적인 프로세스는 실행한 사용자가 주체이지만 setuid가 설정되어 있으면 소유자 권한으로 프로세스를 실행하게 된다.
권한은 기본적으로 'rwx'로 읽기, 쓰기, 실행으로 나누는데, setuid가 설정되어 있으면 'x'가 아닌 's'로 표시한다.
만약 실행권한이 설정되어 있지 않은 상태로 setuid를 설정하게 되면 'S'로 표시한다.
passwd는 비밀번호 변경시 사용하는 명령인데, 이 명령을 통해 비밀번호를 변경하면 shadow file의 내용이 변경되게 된다.
현재 shadow file의 권한을 보면 아무것도 설정되어 있지 않다. 즉, 일반 사용자 권한으로는 비밀번호 변경이 불가하다. root 사용자는 파일에 대한 권한을 어느 정도 무시할 수 있기 때문에 shadow 파일을 수정할 수 있고, 일반 사용자가 root 권한으로 자신의 비밀번호를 변경하는게 가능하다. 이것은 일반 사용자가 root의 권한을 빌려 사용하는 것이고, 이때 UID를 EUID(Effective UID)라고 한다.
단, 다른 사용자의 비밀번호 변경을 막기 위해 passwd 뒤 인자로 사용자 설정은 불가능하다.
user에서 passwd 명령을 수행하고 root에서 ps 명령으로 실행중인 프로세스를 확인 해보면 root 권한으로 프로세스가 실행되고 있는 것을 확인할 수 있다.
setuid처럼 바이너리 파일, 스크립트 파일에 설정되어 있으면 실행한 사용자의 권한으로 프로세스가 실행되는 것이 아닌 설정된 사용자 그룹의 권한으로 실행된다. setgid는 보통 디렉토리에 설정하여 사용하는 경우가 많다.
만약 디렉토리에 setgid가 설정되어 있으면 해당 디렉토리에서 파일을 생성했을 때 생성한 사용자 그룹이 아닌 설정된 사용자 그룹으로 권한이 상속된다.
/run/log/journal은 시스템에서 발생한 저널(journal)파일을 저장하는 공간이다.
journal
주 파일 시스템에 변경 사항을 반영하기 전 변경 내용을 기록해 두는 로그
마찬가지로 setgid가 설정되어 있으면 'x'가 아닌 's'로 표시되고, 실행 권한 설정이 안되어 있으면 'S'로 표시한다.
/run/log/journal에 디렉토리와 파일을 각각 하나씩 생성하고 권한을 확인했을 때 생성한 디렉토리와 파일 모두 systemd-journal에 상속된 것을 확인할 수 있고, 디렉토리는 gid까지 상속된 것을 확인할 수 있다.
sticky bit을 설정하면 디렉토리 소유자 외 다른 사람이 해당 파일을 삭제하는 것을 막을 수 있다.
즉, 파일을 소유한 사용자만 파일을 삭제할 수 있고, 이는 디렉토리에만 설정할 수 있다. 대표적으로 '/tmp'와 '/var/tmp'에 sticky bit이 설정되어 있다.
sticky bit이 설정되어 있는 디렉토리의 실행권한을 보면 't'로 되어 있고, 만약 실행권한이 설정되어 있지 않은데 sticky bit을 설정하면 'T'로 표시되어 있다.
소유자가 user인 '/tmp'내부 파일을 다른 사용자로 삭제를 시도했다. sticky bit이 설정되어 있기 때문에 rm: cannot remove 'testFile': Operation not permitted라는 경고 메세지와 함께 삭제에 실패한다.
권한 설정 방법
Symbolic
chmod u+s>> setuid 설정
chmod u-s>> setuid 해제
chmod g+s>> setgid 설정
chmod g-s>> setgid 해제
chmod o+t>> sticky bit 설정
chmod o-t>> sticky bit 해제Ocatal
chmod #### FILE
각 위치가 문자로 표현되면 1, '-'로 표현되면 0
해제할 때는 앞에 '-'를 붙인다.
기본 파일 권한 체계는 세부적으로 권한 설정이 불가하다는 단점이 있어 ACL을 사용해 사용자 그룹을 제외한 사용자와 그룹에게 별도 권한을 부여하는 것과 같은 세부 권한 설정을 하게된다.
시스템에 ACL 적용 유무를 확인하는 방법은 ls -l명령을 수행하는 것이다. 해당 명령을 사용하면 사용자, 사용자 그룹, 기타 사용자의 권한을 총 11개 문자로 확인할 수 있는데, 맨 마지막 11번째 값이 '+'로 되어 있다면 ACL이 설정되어 있음을 뜻한다.
ACL 정보를 확인하는 명령은 getfacl fileName 이다. ACL이 설정되어 있지 않다면 ls -l과 같지만 설정되어 있다면 세부 권한 정보를 확인할 수 있다.
왼쪽은 ACL 설정이 안되어 있는 파일, 오른쪽은 ACL 설정이 되어 있는 파일을 명령으로 확인한 결과다. 
user:: : user 권한으로 비어 있다면 소유한 사용자임을 의미함.group:: : group 권한으로 비어 있다면 소유한 그룹을 의미함.mask:: : ACL을 필터링 해주는 마스크다. 지정된 사용자와 그룹의 최대 권한을 의미한다.other:: : 다른 기타 사용자 권한.#effective: : 부여받은 권한 중 실제로 사용 가능한 최대 권한을 의미한다.디렉토리에만 설정할 수 있는 ACL로, 디렉토리에 ACL을 설정하면 파일 생성시 해당 디렉토리의 ACL을 상속받게 된다.
default로 시작하는 ACL이 Default ACL이고 해당 디렉토리에 파일에게만 권한을 상속 시킨다. /run/log/journal/dir1아래에 file을 하나 생성하고 다시 정보를 확인 해보자.
텍스트 파일은 생성시 불필요한 용도로 실행되지 않게 실행 권한이 제거된다.
setfacl [option] ENTRY:NAME:PERMS file-name
getfacl 명령으로 ACL 정보를 확인할 수 있고, setfacl명령으로 ACL 정보를 설정할 수 있다.
setfacl 속성
- option
-m: ACL을 추가 또는 수정시 사용하는 옵션
-x: 특정 ACL을 제거할 때 사용하는 옵션
-d: 해당 디렉토리에 대한 default ACL 설정시 사용하는 옵션
-R: 재귀적으로 ACL 설정시 사용하는 옵션
-b: 파일 또는 디렉토리에 설정된 모든 ACL을 제거하는 옵션- ENTRY
u or user: 사용자
g or group: 사용자 그룹
m or mask: 마스크
o or other: 기타 사용자
d or default: default ACL
/root/acl에 fileA를 생성하고, 권한을 750 소유자를 root, 소유 그룹을 wheel로 설정하고, getfacl명령으로 acl 적용 전 상태를 확인한다.
testUser에 모든 권한(rwx)를 주고, user 그룹에 r-x 권한을 부여했다. 마스크는 별도로 지정하지 않으면 rwx가 기본이다. 이제 다시 추가한 권한을 삭제 해보자.
setfacl명령에 x옵션을 줘서 권한을 삭제하고 getfacl로 다시 확인 해보면 위와 같이 설정한 ACL이 삭제된 것을 확인할 수 있다.
setfacl 명령에 -R 옵션을 주면 ACL을 재귀적으로 사용 가능한데, 이는 디렉토리 포함 하위 파일까지 ACL을 적용할 때 사용한다.
ACL을 재귀적으로 사용하면 실행권한이 필요하지 않은 일반 파일에도 실행권한이 적용됨을 주의 해야하고, 이를 방지하기 위해 소문자 'x'대신 대문자 'X'를 사용하여 실행권한이 필요한 파일에 대해서만 적용할 수 있다.