디렉토리 퍼미션의 이해

유닉스/리눅스에서 파일의 퍼미션, 즉 읽고(r, 4, 이진수로 100) 쓰고(=내용 변경, w, 2, 이진수로 010), 실행(x, 1, 이진수로 1)하는 권한을 파일의 소유자/그룹/전체에 각각 다르게 설정할 수 있다는 것은 잘 알려져 있다. 가령 내 홈 디렉토리에 생성한 파일의 권한은 '-rw-rw-r–(664)'이다. 나와 내가 속한 그룹의 멤버는 이 파일을 읽거나 고쳐쓸 수 있지만 그 밖의 유저는 단지 읽을 수만 있다. 실행을 할 권리는 아무에게도 없다.

그러면 디렉토리는 어떤가? 디렉토리에서는 '실행' 권한의 의미가 다르게 정의된다. 왜냐하면 디렉토리 자체는 실행할 수 있는 것이 아니기 때문이다. 어떤 디렉토리를 실행할 수 있다는 것은, 그 디렉토리 내를 검색할 수 있음을 의미한다. 다시 말하자면 그 디렉토리에 cd 명령으로 진입할 수 있다는 뜻도 된다(설명이 좀 어렵다…). 디렉토리에 대한 읽기 권한은 그 디렉토리 하위에 있는 것들의 목록을 얻을 수 있다는 뜻이다. 디렉토리란 하위에 포함하고 있는 파일(또는 디렉토리)의 목록과 속성을 수록한 '파일'이라고 생각하면 이해하기 쉽다. 마지막으로 주의할 것은 디렉토리에 대한 쓰기 권한이다. 이것은 그 디렉토리에 새로운 파일을 만들거나 있던 파일을 지울 수 있음을 의미한다. 즉, 어떤 파일에 대한 접근 권한이 소유자 이외에는 전혀 없다 하더라도(600) 이를 수록한 디렉토리가 모든 사용자에 대하여 w 권한을 갖고 있다면(예: 777) 타 사용자는 그 파일을 지워버릴 수 있음을 의미한다.

Set user ID (set UID)

약간 어려운 주제로 넘어가 보자. set user ID는 실행을 허용한 유저에게 그 파일의 소유자와 같은 권한을 줌을 의미한다. 가령 passwd 명령어는 누구나 실행할 수 있지만, 패스워드가 수록된 /etc/passwd 파일은 오직 root만이 고칠 수 있다. passwd 명령어는 set user id가 설정되어 있어서 이를 실행하는 동안은 passwd의 소유자, 즉 root와 같은 권한을 준다. 이는 다음과 같이 's'로 표시된다. 이진수로 표현한다면 chmod 04000(set UID), chmod 02000(set GID) 명령으로 바꾸면 된다.

ls -l /bin/su

-rwsr-xr-x 1 root root 34904 Oct 15 13:51 /bin/su

Sticky bit

마지막으로 chmod 01000으로 설정하는 sticky bit(save-text-image)가 있다. 이것이 설정된 디렉토리 내에서는 오직 파일의 소유자만이 삭제를 할 수 있다. 비록 권한이 777이라 해도 그렇다. 물론 root는 뭐든지 다 할 수 있다. 대표적인 것이 /tmp 디렉토리이다. sticky bit 설정은 chmod 1777과 같이 하면 된다. 즉 set UID나 SetGID를 이진수로 설정할 때와 같은 네번째 자리를 이용한다.

drwxrwxrwt. 16 root root 12288 Jan 20 11:53 tmp

맨 뒤의 't'가 sticky bit가 설정되었음을 의미한다. 원래 저기는 실행권한(x) 자리 아닌가? 그렇다. 실행권한이 있으면 t, 없으면 T로 표시한다.

미련한 질문: 파일에도 sticky bit를 설정할 수 있는가? 위키피디아의 설명에 의하면, sticky라는 이름이 생겨났던 과거에는 파일에도 관련된 속성이었지만(메모리에 끈끈하게 들러붙는.. 뭔 말인지 잘 모르겠음) 지금은 일부 디렉토리의 특수한 성격을 표시하는 기능으로만 국한되어 쓰이고 있다고 한다. 

Comments