chmod 2755 program # 파일에chmod g+s /project # 디렉터리에
SetGID는 파일에 걸 때와 디렉터리에 걸 때 하는 일이 다르다.
대상
효과
파일
실행하는 동안 파일의 소유 그룹 권한으로 동작
디렉터리
그 안에 만들어지는 파일이 디렉터리의 그룹을 물려받는다
-rwxr-sr-x 1 root tty ... /usr/bin/wall └ group 의 x 자리가 s = SetGID
디렉터리에 거는 쪽이 실무에서 훨씬 자주 쓰인다. 어제 남겨둔 협업 문제 — 각자 만든 파일의 그룹이 제각각인 문제 — 를 이것으로 해결한다.
sudo chgrp dev /projectsudo chmod 2770 /project # SetGID + rwxrwx---# 이제 누가 /project 안에 파일을 만들어도 그룹은 항상 dev
걸기 전과 건 뒤를 나란히 놓으면 차이가 분명하다.
$ ls -ld /projectdrwxrws---. 2 root dev 6 Sep 3 09:00 /project ← 그룹 자리가 s$ id -gnalice$ touch /project/plan.txt$ mkdir /project/docs$ ls -l /projectdrwxr-sr-x. 2 alice dev 6 Sep 3 09:06 docs-rw-r--r--. 1 alice dev 0 Sep 3 09:05 plan.txt
alice의 기본 그룹은 alice인데도 새 파일의 그룹이 dev 다. 어제는 여기가 alice였다.
소유자는 여전히 만든 사람(alice) 이다. SetGID가 물려주는 것은 그룹뿐이다.
안에 만든 하위 디렉터리 docs에도 SetGID가 함께 물려진다(drwxr-sr-x). 그래서 더 깊은 곳에서도 그룹이 유지된다.
걸기 전에 이미 있던 파일의 그룹은 바뀌지 않는다. 그것들은 chgrp -R dev /project로 따로 맞춘다.
그룹은 맞춰지지만 권한까지 열어 주지는 않는다. 위 plan.txt는 그룹에 w가 없다. 구성원이 서로 고치게 하려면 umask를 002로 하거나 chmod g+w를 더한다.
drwxrwxrwt 10 root root ... /tmp └ other 의 x 자리가 t = Sticky bit
디렉터리에 w 권한이 있으면 원래는 남의 파일도 지울 수 있다. 파일 자체의 권한과 무관하게, 디렉터리에 쓰기 권한이 있으면 그 안의 항목을 삭제할 수 있기 때문이다.
Sticky bit를 걸면 파일의 소유자와 root만 그 파일을 지울 수 있다.
대표 예시가 /tmp 다. 누구나 임시 파일을 만들 수 있어야 하지만 남의 임시 파일을 지우면 안 되므로 1777로 설정되어 있다.
$ ls -l /tmp/a.txt-rw-r--r--. 1 alice alice 6 Sep 3 09:00 /tmp/a.txt$ whoamibob$ cat /tmp/a.txt ← 파일의 other 칸에 r 이 있으니 읽기는 된다hello$ rm -f /tmp/a.txtrm: cannot remove '/tmp/a.txt': Operation not permitted$ mv /tmp/a.txt /tmp/b.txtmv: cannot move '/tmp/a.txt' to '/tmp/b.txt': Operation not permitted
Sticky bit가 막는 것은 삭제와 이름 변경이다. 파일 내용을 읽을 수 있는지는 여전히 파일 자신의 권한이 정한다. 위에서 bob은 읽기는 했지만 지우거나 이름을 바꾸지는 못했다.
지울 수 있는 사람은 그 파일의 소유자, 그 디렉터리의 소유자, 그리고 root 다.
Sticky bit는 디렉터리에 거는 권한이다. /tmp 외에 /var/tmp도 같은 1777이다.
-rwSr--r-- 는 SetUID는 걸렸는데 소유자에게 실행 권한이 없는 상태다. 대개 설정 실수다.
s·t는 x 자리를 빌려 쓰는 표시다. 한 칸에 두 정보(실행 권한 + 특수 권한)를 겹쳐 적어야 해서 대소문자로 구분한다.
그 자리의 글자
실행 권한
특수 권한
x
있음
없음
-
없음
없음
s / t
있음
있음
S / T
없음
있음
$ chmod 4644 a.sh ; ls -l a.sh-rwSr--r--. 1 user user 0 Sep 3 09:00 a.sh ← 644 에는 x 가 없어 대문자 S$ chmod u+x a.sh ; ls -l a.sh-rwsr--r--. 1 user user 0 Sep 3 09:00 a.sh ← x 가 생기자 소문자 s