** 이글루스에 있던 글을 가져왔고, 살짝 손을 봤다.
우분투를 업무에 적용하여 여럿이 공동으로 사용하는 경우라면 모를까, 이 글에서 설명할 기능이 모든 사람은 물론이거니와 나한테도 그렇게 유용하다는 생각은 들지 않는다.
그러나, 사실은 굉장히 중요한 기능이고, 개념이다. 우분투(리눅스)가 그만큼 쓰이고 있지 않아서 사람들이 별 관심이 없을 뿐.
또 한가지. 여기에서 말하는 ‘공유’는 네트웍을 통한 공유가 아니고, 디렉토리 공유다. NFS 는 네트웍을 통한 것이긴 하지만, 결국 파일 시스템에 마운트를 하게 되는 것이므로 여기에 해당하겠지만, Samba 는 그렇지 않다.
—
한 PC 를 2명이 사용한다고 가정한다. 한명은 bill 이고, 다른 한명은 karen 이다. id 가 다르므로, 당연히 uid 도 다르다. bill 이 1000, karen 이 1001 이라고 대충 생각하면 되겠다. 이 사용자들이 한 디렉토리에 파일을 읽고, 쓰고, 지우기를 해야 한다고 가정해본다.
리눅스 파일시스템엔 ‘권한(Permission)’이 있기 때문에 이런 것이 좀 어렵다. 물론, 가장 쉽게 하기 위해선 Others 권한을 최고(rwx, 즉 7; 또는 rw, 6)로 주면 된다. 더 이상 생각하고 자시고 할 것도 없다. 하지만 이렇게 되면 그냥 권한이 없는 파일시스템을 사용하는 것과 차이가 없다. (Fat32 라든가 exFat 이라든가..)
위 상황을 좀 더 구체화 하면 이렇다.
/opt/share 디렉토리 쓰기 권한을 bill 위주로 UID:GID, 1000:1000 으로 설정하면 UID:GID 1001:1001 인 karen 은 그 디렉토리에 파일을 쓸 수가 없다. 즉, bill 이 만든 파일을 수정할 수가 없다. 그 반대도 마찬가지. karen 위주로 설정하면 bill 은 속수무책 상태가 된다.
보안을 놓지 않고, 위 문제를 풀어보자면? 아래와 같은 지식이 필요하다. (그리고 살짝 복잡하다..)
다음 내용은 The Linux Command Line(1st Ed.)에서 가져왔다. 이 책, 정말 필요한 내용만 담고 있다. (심지어 무료다.) 그동안 이해되지 않았던 많은 것들을 이 책을 통해 이해할 수 있었는데…
다만, 한가지. 내가 이 책을, 리눅스를 처음 접하던 때에 봤어도 과연 ‘좋다’, ‘간결하다’, ‘쉽다’라고 생각할 수 있었을까. 아마도 그동안 이래 저래 쌓인 ‘사파(邪派)?? ^^’ 내공이 이 책을 이해하는데 도움을 준 것 같다. 아무튼, 리눅스에 대한 지식을 정리할 필요가 있었는데, 이 책으로 그것이 가능할 것 같다.
책에 있는 내용(p103~106)을 참고로 간단하게 정리해본다.
- 사용자 bill 과 karen 은 /usr/local/share/music-library 디렉토리에 음악 파일을 저장하려 한다.
- 이 디렉토리에 bill 과 karen 은 읽기/쓰기 권한이 있어야 한다. (따라서 파일/디렉토리를 생성할 수 있다.)
- bill 이 만든 것을 karen 이 지울 수도, 그 반대도 가능해야 한다.
- 물론, 이 디렉토리는 Others 권한이 7 이 아니어야 한다.
준비 완료.
bill 에겐 sudo 가 가능하다는 전제로 진행한다.
본격적인 작업 이전에, bill 과 karen 이 속할 새로운 그룹, music
을 만든다. 책에선 GUI 도구를 이용했지만, 그냥 CLI 로 진행한다.
group 을 만들 때 중요한 점은 GID 이다. 2001 등, 앞으로 사용할 시스템(다른 리눅스 기계나 mac 등)에서 충돌하지 않는, 고유한 숫자를 고른다.
$ sudo groupadd -g 2001 music $ sudo usermod -a -G music bill $ sudo usermod -a -G music karen
또는, 일단 그룹을 만든 후, /etc/group 을 편집해도 된다.
위 작업이 끝나면, /usr/local/share/music-library
를 만들고, 이 디렉토리 그룹 소유권을 music 으로 바꾼다.
$ sudo chown :music /usr/local/share/music-library $ sudo chmod 775 /usr/local/share/music-library
만들어진 디렉토리를 확인해보면 다음과 같다.
$ ls -ld /usr/local/share/music-library drwxrwxr-x 2 root music 4096 2008-03-24 20:03 /usr/local/share/music-library
사용자 소유권은 root 에게 있고, 그룹 소유권은 music 에 있으며, root 와 music 모두 rwx 권한을 갖고 있다.
따라서 music 그룹에 속해있는 bill 과 karen 은 당연히 이 디렉토리에 파일/디렉토리를 쓰고 지우고, 편집할 수 있다.
이제 bill 이 여기에 파일을 하나 만들었다고 치고, 그 파일을 확인해보면..
$ ls -l /usr/local/share/music-library -rw-r--r-- 1 bill bill 0 2008-03-24 20:03 test_file
잘 만들어지긴 했는데, 한가지 문제가 있다. test_file 그룹 소유권이 ‘music’ 이 아니고 bill 이다. 이렇게 되면 karen 은 이 파일을 볼 수만 있지, 그 외 작업은 전혀 할 수가 없게 된다. (karen 이 파일을 열어볼 수 있는 것은 Others 권한에 ‘r’ 이 있기 때문이다.)
여기까지가 내가 알고 있던 지식이다.
자.. 어떻게 해야 bill 이 생성한 파일/디렉토리가 bill:music 이 될 수 있을까.
이걸 가능하게 하려면, 예전부터 잘 이해가 되지 않아 그냥 넘기고 넘겼던 setgid bit 을 사용해야 한다. 이런 특수 권한에는 setuid, setgid, sticky bit 이렇게 세가지가 있는데, 그 중에 setgid 가 이 상황에서 필요하다.
이 세가지를 간단하게 정리해봤다.
- setuid 는 root 권한을 일반 사용자가 쓸 수 있도록 해준다.
- setgid 는, 디렉토리에 설정되었을 경우, 그 디렉토리 내에 사용자가 파일/디렉토리를 생성했을 때, 그 소유권을 사용자 자신이 가진 사용자:사용자그룹에 할당하는 것이 아니라, 사용자:디렉토리 소유그룹에 할당하게 된다. (뭔 소리냐~ ㅎㅎ)
- sticky bit 은, 리눅스에선 파일에 설정되는 것은 무시하고, 디렉토리에 설정되었을 경우는 해당 디렉토리에 있는 파일/디렉토리는 사용자 자신과 root 만 지울 수 있게끔 만든다. (원래 그런 거 아냐? ^^)
자.. 포석은 여기까지.
$ sudo chmod g+s /usr/local/share/music-library
g+s 대신 2775 를 줘도 된다.
그룹 권한에 s 를 추가했다. 결과는 다음과 같다.
$ ls -ld /usr/local/share/Music drwxrwsr-x 2 root music 4096 2008-03-24 20:03 /usr/local/share/music-library
그룹 권한이 rws 로 바뀐 것을 확인할 수 있다.
이제 이 디렉토리에 파일/디렉토리를 만들어 봤다고 치면~
$ ls -l /usr/local/share/music-library drwxrwsr-x 2 bill music 4096 2008-03-24 20:24 test_dir -rw-rw-r-- 1 bill music 0 2008-03-24 20:22 test_file
이렇게 bill:music 쌍이 제대로 설정되었음을 볼 수 있다. 이것은 karen 도 이 파일을 읽고, 쓰고, 지우고, 지지고, 볶고 다 할 수 있다는 뜻이 된다. 왜냐하면, karen 도 music 그룹 일원이기 때문이다.
아아아아!
이렇게 해야 하는 것이었군… 하고 보니 어려울 건 없는데.. 그동안 내가 접했던 문서들에선 너무 무게를 잡으며 설명을 했었던 것 같다.
예를 이런 식으로 들어놓으면 쉬운 건데.. 그래서 이 책이 괜찮다는 거다.
** 본문엔 umask 에 관한 내용도 있는데..?
예로 든 시스템에선 umask 가 0022 로 되어 있기 때문에, umask 를 0002 로 먼저 할당하고 작업을 진행하는 내용이 나온다.
umask 가 0022 로 지정되어 있으면, 새로 생성되는 파일은 644 가 되어 그룹은 읽기만 가능하므로, 위에서 한 작업들이 의미가 없게 된다. 따라서 0002 로 바꿔줄 필요가 있다.
그러나 우분투에선 기본 umask 가 0002 로 설정되어 있으므로, 이 글에선 umask 부분은 넘겼다.
umask 값은 아무 인수 없이 umask 라고만 터미널에서 입력하면 확인할 수 있다.
오랜만에 보람된 글이었어~