storage / knowledge
디렉토리에서 rwx가 뜻하는 것과 setgid
파일의 rwx는 직관적인데 디렉토리의 rwx는 뜻이 다르다. 공유 폴더 권한을 잡다가 매번 헷갈려서 정리했다.
| 비트 | 디렉토리에서의 의미 |
|---|---|
| r | 목록을 볼 수 있다 (ls) |
| w | 안에 만들고 지우고 이름을 바꿀 수 있다 |
| x | 안으로 들어갈 수 있다 |
x가 없으면 안으로 못 들어간다. 경로 중간의 디렉토리에 x가 없으면 그 아래 파일에 아무리 권한이 있어도 접근이 막힌다. 권한을 다 줬는데 안 된다면 대개 상위 디렉토리의 x가 없다.
w가 파일이 아니라 디렉토리에 붙는다는 것도 중요하다. 파일을 지울 수 있는지는 그 파일의 권한이 아니라 파일이 들어 있는 디렉토리의 w가 정한다. 읽기 전용 파일도 디렉토리에 w가 있으면 지워진다.
setgid
새로 만드는 파일의 그룹은 보통 만든 사람의 기본 그룹이 된다. 여러 사람이 같이 쓰는 폴더에서는 이게 문제다. 각자 자기 그룹으로 파일을 만들어놓으면 서로 못 읽는다.
디렉토리에 setgid를 걸면 그 아래 새로 생기는 파일과 폴더의 그룹이 부모의 그룹으로 고정된다.
$ chmod 2770 <디렉토리>
앞의 2 가 setgid다. 공유 폴더에는 사실상 필수다.
sticky bit
모두가 쓸 수 있는 폴더에서는 남의 파일도 지울 수 있다. 위에서 본 것처럼 삭제 권한이 디렉토리에 달려 있기 때문이다.
sticky bit를 걸면 자기가 소유한 것만 지울 수 있다.
$ chmod 1777 <디렉토리>
/tmp 가 이 방식이다.
setuid
파일에 걸면 실행할 때 소유자의 권한으로 돈다. 디렉토리에서는 의미가 없다. 보안상 주의해서 써야 하는 비트라 필요하지 않으면 건드리지 않는다.
확인
$ id <사용자>
$ getent group <그룹>
$ namei -l <경로>
namei -l 이 특히 유용하다. 경로를 한 단계씩 따라가며 각 디렉토리의 권한과 소유를 보여주므로, 어느 단계에서 막혔는지 바로 보인다.