Sticky bit 란 무엇인가? (Unix 와 Linux 운영체제)

유닉스와 리눅스에서 파일 퍼미션에 대한 공부를 하다보면 나오는 특수한 파일 퍼미션이 두개가 있다. 하나는 앞의 find 명령어에 대한 고찰(http://blogger.pe.kr/338)에서 조금 살펴본 setuid/setgid 이고 다른 하나는 이번 포스트에서 설명할 sticky bit다.

sticky bit 란?

유닉스 운영체제는 기본적으로 파일의 소유자가 아니면 해당 디렉토리 내의 파일을 지우거나 수정하지 못하도록 기본적인 umask를 설정한다. 하지만 딱~두군데 모든 사용자 계정이 파일을 만들고 수정, 삭제할 수 있는 디렉토리가 있다. 바로 /tmp와 /var/tmp다. 이 두개의 디렉토리는 퍼미션이 기본적으로 777로 설정되어 있어 누구나 임의의 파일을 생성하고 수정하고 삭제할 수 있다. 말 그대로 모든 사용자 계정이 사용하는 공용 디렉토리다.

그러다 보니… 이 두개의 디렉토리에 퍼미션이 777 퍼미션을 갖는 파일들과 디렉토리들이 생겨나게 되는데…문제는 이 파일들이 꼭 필요한 파일인지 알 수 없고 현재 사용중인지 아닌지를 판단하기 어렵다 보니 파일 퍼미션이 777인 파일들을 아무나 다른 소유자의 파일들을 지워버리는 문제가 생겨난다. 하지만 그 파일들이 현재 사용중인 파일이라면 서비스에 장애가 발생하게 되는 것이다.

그래서 등장한 것이 sticky bit 다.

sticky bit가 설정된 디렉토리 내에서는

1. 퍼미션이 777인 파일에 대해서 파일의 소유자만이 삭제를 할 수 있다. (수정이나 실행, 읽기는 모두 허용된다.)

2. sticky bit가 설정된 디렉토리 자체도 소유자만이 삭제할 수 있다.

3. root는 다할 수 있다.

즉… 파일을 만든 계정과 root에서만 삭제할 수 있다는 뜻이다. 비록 파일의 퍼미션이 777이더라도 말이다.

sticky bit 실제 테스트

[taeho@ncsd /]$ ls -l
drwxrwxrwt   3 ncsd ncsd  4096 May  1 11:20 stickytest
[taeho@ncsd /]$
[taeho@ncsd /]$
[taeho@ncsd /]$ id
uid=500(taeho) gid=500(taeho) groups=500(taeho)
[taeho@ncsd /]$
[taeho@ncsd /]$ rm -f stickytest
rm: cannot remove `stickytest’: Permission denied        <— 퍼미션이 777이고 sticky bit가 설정된 디렉토리 삭제안됨.
[taeho@ncsd /]$
[taeho@ncsd /]$ cd stickytest         <— sticky bit가 설정된 디렉토리로 들어감.
[taeho@ncsd stickytest]$
[taeho@ncsd stickytest]$ ls -l
total 4-rwxrwxrwx 1 ncsd ncsd    0 May  1 11:20 1.txt
drwxrwxrwx 2 ncsd ncsd 4096 May  1 11:11 test
[taeho@ncsd stickytest]$
[taeho@ncsd stickytest]$ rm -rf 1.txt
rm: cannot remove `1.txt’: Operation not permitted       <— 퍼미션이 777인데 소유자가 다르기 때문에 삭제 안됨.
[taeho@ncsd stickytest]$
[taeho@ncsd stickytest]$ rm -rf test
rm: cannot remove directory `test’: Operation not permitted     <— 퍼미션이 777인 디렉터리가 소유자가 다르기 대문에 삭제 안됨.
[taeho@ncsd stickytest]$
[taeho@ncsd stickytest]$

sticky bit를 특정 디렉토리에 지정해주기 위해서는…

$
$ ls -l drwxr-xr-x   3 ncsd ncsd  4096 May  1 11:20 stickytest      <— 755 퍼미션의 테스트 디렉토리
$
$
$ chmod 1777 stickytest        <—- sticky bit 는 맨 앞의 1 임.
$
$ ls -l drwxrwxrwt   3 ncsd ncsd  4096 May  1 11:20 stickytest      <— sticky bit 설정된 화면
$
$

이쯤에서 chmod 1777 에서 1은 sticky bit 인것은 알겠는데 왜 나머지 퍼미션을 777로 주는가?? 에 대한 의문이 생긴다면… 맨 앞의 내용을 다시 잘 읽어보기 바란다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top