리눅스 권한에대한 기초적인 설명입니다
기사 원문으로 가시면 예제 코드와 자세한 설명을 볼 수 있습니다
디벨로퍼 웍스 http://www.ibm.com/developerworks/kr
아이베엠 디벨로퍼 트위터 보기 http://twitter.com/#search?q=ibmdw
Learn Linux, 101: 파일 권한 및 소유권 관리하기
파일에 올바른 보안 설정하기
요약: Linux® 파일 시스템에서 파일 소유권 및 권한을 관리하는 방법에 대해 설명합니다. suid, sgid 및 스티키 비트와 같은 액세스 모드에 대해 살펴보고 이러한 모드를 활용하여 보안 기능을 향상시키는 방법에 대해 설명합니다. 본 기사의 자료를 활용하여 Linux 시스템 관리자 인증을 위한 LPI 기초 과정 시험에 대비한 공부를 하거나, 단순히 파일 소유권, 권한 및 보안에 대해 배울 수도 있습니다.
원문 게재일: 2010 년 11 월 30 일
번역 게재일: 2011 년 4 월 05 일
난이도: 중급
원문: 보기
PDF: A4 and Letter (63KB | 16 pages)Get Adobe® Reader®
페이지뷰: 79 회
의견: 0 (의견 추가)
이 시리즈의 정보
본 기사 시리즈를 통해 Linux 시스템 관리 작업을 배울 수 있다. 기사의 자료를 이용해 LPIC-1(Linux Professional Institute Certification 레벨 1) 시험에 대비할 수도 있다.
본 시리즈의 각 기사에 대한 설명과 링크는developerWorks roadmap for LPIC-1을 참조한다. 이 로드맵은 현재 진행 중이며, 최근(2009년 4월)의 LPIC-1 시험 목적을 반영한다. 기사 작성을 완료하면 해당 기사를 로드맵에 추가한다. 그렇지만 LPI certification exam prep 튜토리얼에도 유사한 형태의 초기 자료가 있으며 이 자료는 2009년 이전의 LPIC-1 목표를 지원한다.
이 기사에서는 파일 및 디렉토리의 권한 및 소유권을 올바르게 사용하여 파일 액세스 권한을 제어하는 방법에 대해 설명한다. 그 내용은 다음과 같다.
- 일반 및 특수 파일과 디렉토리에 대한 액세스 권한 관리
- suid, sgid 및 스티키 비트와 같은 액세스 모드를 사용하여 보안 관리
- 파일 작성 마스크 변경
- 그룹 구성원에게 파일 액세스 권한 부여
별도로 언급하지 않는 한 이 기사의 예제에서는 2.6.34 커널의 Fedora 13을 사용한다. 다른 시스템에 대한 결과는 다를 수 있다.
본 기사는 Linux Professional Institute의 Junior Level Administration(LPIC-1) 시험 기초 과정에서 Topic 104의 Objective 104.5에 대비하는 데 도움이 된다. 이 목적의 가중치는 3이다.
이전 기사인 "Learn Linux 101: Manage disk quotas"에서 이 기사의 파일 및 그룹 소유권 개념에 대해 설명하고 있다. 이 기사는 그러한 개념을 좀 더 완벽하게 이해하는 데 도움이 될 것이다.
본 시리즈에 수록된 기사를 최대한 활용하려면 Linux에 대한 기본적인 지식과 이 기사에서 다루는 명령을 실습할 수 있는 Linux 시스템이 있어야 한다. 때때로 같은 프로그램이라도 버전이 다르면 출력 형식이 다르므로, 실습 결과가 이 기사에서 보여주는 목록 및 그림과 항상 정확히 같지는 않을 수도 있다.
Ian과 연락하기
지금까지 알고 있는 바를 살펴보면 Linux는 다중 사용자 시스템이고 각 사용자는 하나의 기본 그룹에 속해 있으며 추가 그룹에도 속해 있을 수 있다. 또한 한 사용자로 로그인한 후 su
또는 sudo -s
명령을 사용하여 다른 사용자가 될 수도 있다. Linux의 파일 소유권과 액세스 권한은 사용자 ID 및 그룹과 밀접하게 관련되어 있으므로 몇 가지 기본 사용자 및 그룹 정보를 살펴보자.
다른 사용자로 전환하지 않았다면 로그인할 때 사용한 ID가 현재 ID이다. 다른 사용자로 전환했다면 이 기사에 나오는 대부분의 예제와 같이 프롬프트에 사용자의 사용자 ID가 포함된다. 프롬프트에 사용자 ID가 포함되어 있지 않은 경우에는 whoami
명령을 사용하여 현재 유효 ID를 확인할 수 있다. 리스트 1에서는 이 기사의 다른 예제와 차이가 나는 프롬프트 문자열(PS1 환경 변수)을 보여 주는 몇 가지 예제를 보여 준다. 프롬프트 문자열에 사용자 ID가 있으면 여러 면에서 유용하다.
리스트 1. 목록 1. 유효 사용자 ID 확인하기
/home/ian$ whoami tom /home/ian$ exit exit $ whoami ian |
앞에서와 유사하게 groups
명령을 사용하여 현재 속해 있는 그룹을 확인할 수 있으며 id
명령을 사용하여 사용자 및 그룹 정보를 확인할 수 있다. 현재 사용자 ID가 아닌 해당 사용자 ID의 정보를 확인하려면 사용자 ID 매개변수를 groups
또는 id
에 추가한다. 리스트 2 에서 몇 가지 예제를 살펴보자. 사용자 ID 없이 id
명령을 실행하면 SELinux 컨텍스트와 기본 ID 정보가 표시된다.
리스트 2. 목록 2. 그룹 멤버십 확인하기
[ian@echidna ~]$ id uid=1000(ian) gid=1000(ian) groups=1000(ian),505(development),8093(editor) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [ian@echidna ~]$ id ian uid=1000(ian) gid=1000(ian) groups=1000(ian),8093(editor),505(development) [ian@echidna ~]$ groups ian development editor [ian@echidna ~]$ id tom uid=1012(tom) gid=1012(tom) groups=1012(tom),505(development) [ian@echidna ~]$ groups tom tom : tom development [ian@echidna ~]$ su tom Password: [tom@echidna ian]$ groups tom development [tom@echidna ian]$ groups ian ian : ian editor development |
각 사용자가 ID를 가지고 있고 하나의 기본 그룹에 속해 있는 것과 마찬가지로 Linux 시스템의 각 파일에도 하나의 소유자와 하나의 그룹이 연관되어 있다.
ls -l
명령을 사용하여 소유자와 그룹을 표시한다.
리스트 3. 목록 3. 파일 소유권 확인하기
[ian@echidna ~]$ ls -l /bin/bash .bashrc helloworld.C -rw-r--r--. 1 ian ian 124 Mar 31 2010 .bashrc -rwxr-xr-x. 1 root root 943360 May 21 2010 /bin/bash -rw-rw-r--. 1 ian development 116 Nov 30 10:21 helloworld.C |
이 특별한 예제에서는 사용자 ian의 .bashrc 파일이 ian의 소유이고 그의 기본 그룹인 ian 그룹에 속해 있다. 이와 유사하게 /bin/bash는 사용자 root의 소유이고 root 그룹에 속해 있다. 이와는 달리 helloworld.C는 사용자 ian의 소유이지만 development 그룹에 속해 있다. 사용자 이름과 그룹 이름은 네임스페이스가 서로 다르기 때문에 하나의 지정된 이름이 사용자 이름이면서 그룹 이름일 수도 있다. 실제로 많은 배포판에서는 기본적으로 새 사용자마다 일치하는 그룹을 작성한다.
Linux 권한 모델에는 파일 시스템 오브젝트마다 세 가지 유형의 권한 즉, 읽기(r), 쓰기(w) 및 실행(x) 권한이 있다. 쓰기 권한에는 오브젝트를 변경하거나 삭제하는 권한도 포함된다. 또한 이러한 권한은 파일 소유자, 파일의 그룹 구성원 및 모든 사용자에 대해 별도로 지정된다.
리스트 2 의 첫 번째 열을 다시 한번 보면 11개의 문자로 구성된 문자열이 포함되어 있다. 11번째 문자는 최근에 추가된 문자이며 잠시 후에 살펴볼 것이다. 첫 번째 문자는 오브젝트의 유형(이 예제의 경우, 일반 파일을 의미하는 -
)을 설명하며 나머지 9개의 문자는 3개의 문자로 구성된 3개의 그룹을 나타낸다. 첫 번째 그룹은 파일의 소유자에 대한 읽기, 쓰기 및 실행 권한을 나타낸다. -
는 해당 권한이 부여되지 않았음을 나타낸다. 따라서 사용자 ian은 .bashrc 파일을 읽고 쓸 수 있지만 실행하지는 못한다. 그에 반해 root는 /bin/bash 파일을 읽고 쓸 수 있을 뿐만 아니라 실행할 수도 있다. 두 번째 그룹은 파일의 그룹에 대한 읽기, 쓰기 및 실행 권한을 나타낸다. development 그룹의 구성원은 ian의 helloworld.C를 읽거나 쓸 수 있지만 다른 모든 사용자는 읽을 수만 있다. 이와 유사하게 root 그룹의 구성원과 다른 모든 사용자는 /bin/bash 파일을 읽거나 실행할 수 있다.
디렉토리도 일반 파일과 동일한 권한 플래그를 사용하지만 해석 방법이 다르다. 디렉토리의 경우 읽기 권한은 사용자에게 디렉토리의 내용을 나열할 수 있는 권한이 있음을 의미하고, 쓰기 권한은 사용자에게 디렉토리의 파일을 작성 또는 삭제할 수 있는 권한이 있음을 의미한다. 실행 권한은 사용자에게 해당 디렉토리에 들어와서 서브디렉토리에 액세스할 수 있는 권한이 있음을 의미한다. 실행 권한이 없으면 디렉토리 내의 파일 시스템 오브젝트에 액세스할 수 없다. 읽기 권한이 없는 경우에는 디렉토리 내의 파일 시스템 오브젝트가 디렉토리 목록에 표시되지 않는다. 하지만 디스크에 저장되어 있는 오브젝트의 전체 경로를 알고 있으면 이러한 오브젝트에 액세스할 수 있다.리스트 4 는 이러한 관점을 보여 주기 위한 매우 인위적인 예제이다.
리스트 4. 목록 4. 권한과 디렉토리
[ian@echidna ~]$ ls -l /home total 32 drwxr-x---. 38 editor editor 12288 Nov 30 10:49 editor drwxr-x---. 4 greg development 4096 Nov 30 12:44 greg drwx------. 21 gretchen gretchen 4096 Nov 30 11:26 gretchen drwxr-xr-x. 41 ian ian 4096 Nov 30 10:51 ian drwx------. 21 ianadmin ianadmin 4096 May 28 2010 ianadmin d-wx--x--x. 21 tom tom 4096 Nov 30 11:30 tom [ian@echidna ~]$ ls -a ~greg/.ba* /home/greg/.bash_history /home/greg/.bash_profile /home/greg/.bash_logout /home/greg/.bashrc [ian@echidna ~]$ ls -a ~gretchen ls: cannot open directory /home/gretchen: Permission denied [ian@echidna ~]$ ls -a ~tom ls: cannot open directory /home/tom: Permission denied [ian@echidna ~]$ head -n 3 ~tom/.bashrc # .bashrc # Source global definitions |
긴 목록의 첫 번째 문자는 오브젝트의 유형(디렉토리를 의미하는 d
)을 설명한다. 사용자 greg의 home 디렉토리에는 development 그룹의 구성원에 대한 읽기 및 실행 권한이 있으므로 사용자 tom과 ian은 이 디렉토리를 나열할 수 있다. 사용자 gretchen의 home 디렉토리에는 gretchen 그룹이나 다른 사용자에 대한 읽기 및 실행 권한이 전혀 없으므로 사용자 ian은 이 디렉토리에 액세스할 수 없다. 사용자 tom의 home 디렉토리에는 실행 권한만 있고 읽기 권한이 없으므로 사용자 ian은 내용을 나열할 수 없다. 하지만 오브젝트가 있다는 것을 알고 있다면 디렉토리 내의 오브젝트에 액세스할 수 있다.
ls -l
의 출력에 목록의 첫 번째 문자에 따라 표시된 파일과 디렉토리 이외의 파일 시스템 오브젝트가 포함될 수 있다. 나중에 자세히 살펴보겠지만 여기에서는 가능한 오브젝트 유형에 대해 알아보자.
표 1. 표 1. 파일 시스템 오브젝트 유형
코드 | 오브젝트 유형 |
---|---|
- | 일반 파일 |
d | 디렉토리 |
l | 기호 링크 |
c | 문자 특수 디바이스 |
b | 블록 특수 디바이스 |
p | FIFO |
s | 소켓 |
ls
명령의 긴 목록에 있는 11번째 문자는 최근에 개선된 기능이므로 일부 배포판에서는 여전히 처음 10개의 문자만 표시될 수도 있다. 11번째 문자가 공백으로 표시되는 경우에는 모르고 지나칠 수도 있다. 이 문자는 대체 액세스 방법이 파일에 적용되는지 여부를 지정한다. 파일 모드 비트 이후의 문자가 공백인 경우에는 대체 액세스 방법이 없는 것이며, 문자가 표시되는 경우에는 방법이 있는 것이다. 예를 들어, 액세스 제어 목록이 대체 방법이 될 수 있다. GNU ls
는 '.'(마침표) 문자를 사용하여 SELinux 보안 컨텍스트만을 사용하는 파일을 나타낸다. 다른 조합의 대체 액세스 방법이 있는 파일에는 '+'(더하기 기호) 문자가 표시된다.
"Hello world" 쉘 스크립트를 작성한다고 가정해 보자. 처음으로 작성한 스크립트는 일반적으로 실행할 수 없다. chmod
명령을 +x
옵션과 함께 사용하여 실행 권한을 추가한다리스트 5.
리스트 5. 목록 5. 실행 가능 쉘 스크립트 작성하기
[ian@echidna ~]$ echo 'echo "Hello world!"'>hello.sh [ian@echidna ~]$ ls -l hello.sh -rw-rw-r--. 1 ian ian 20 Nov 30 13:05 hello.sh [ian@echidna ~]$ ./hello.sh bash: ./hello.sh: Permission denied [ian@echidna ~]$ chmod +x hello.sh [ian@echidna ~]$ ./hello.sh Hello world! [ian@echidna ~]$ ls -l hello.sh -rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh |
+r
을 사용하여 읽기 권한을 설정할 수 있으며, 이와 마찬가지로 +w
를 사용하여 쓰기 권한을 설정할 수 있다. 실제로 r
, w
및 x
를 원하는 대로 조합하여 사용할 수 있다. 예를 들어, chmod +rwx
를 사용하면 파일에 대한 읽기, 쓰기 및 실행 권한을 모두 설정할 수 있다. 이 형태의 chmod
는 아직 설정되지 않은 권한을 추가한다.
위 예제에서는 실행 권한이 소유자, 그룹 및 기타 사용자에 대해 설정된다. 권한을 선택적으로 설정하기 위해 모드 표현식의 접두부에u
를 지정하여 사용자에 대한 권한을 설정하고, g
를 지정하여 그룹에 대한 권한을 설정하고, o
를 지정하여 기타 사용자에 대한 권한을 설정할 수 있다. a
를 지정하면 모든 사용자에 대한 권한이 설정되며 이는 접두부를 생략하는 것과 같다. 리스트 6에서는 쉘 스크립트의 또 다른 사본에 사용자 및 그룹의 쓰기 및 실행 권한을 추가하는 방법을 보여 준다.
리스트 6. 목록 6. 선택적으로 권한 추가하기
[ian@echidna ~]$ echo 'echo "Hello world!"'>hello2.sh [ian@echidna ~]$ chmod ug+xw hello2.sh [ian@echidna ~]$ ls -l hello2.sh -rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh |
권한을 추가하는 것이 아니라 제거해야 하는 경우도 발생할 수 있다. 간단히 +
를 -
로 변경하여 설정되어 있는 지정된 권한을 제거할 수 있다. 리스트 7에서는 두 개의 쉘 스크립트에 대한 다른 사용자의 모든 권한을 제거하는 방법을 보여 준다.
리스트 7. 목록 7. 권한 제거하기
[ian@echidna ~]$ ls -l hello*.sh -rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh -rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh [ian@echidna ~]$ chmod o-xrw hello*.sh [ian@echidna ~]$ ls -l hello*.sh -rwxrwx---. 1 ian ian 20 Nov 30 13:08 hello2.sh -rwxrwx---. 1 ian ian 20 Nov 30 13:05 hello.sh |
두 개 이상의 파일에 대한 권한을 동시에 변경할 수도 있다. Topic 103에 대한 기사에서 보았던 다른 명령과 마찬가지로 디렉토리 및 파일에 대해 재귀적으로 작동하는 -R
(또는 --recursive
) 옵션을 사용할 수 있다.
이제 권한을 추가하거나 제거할 수 있으므로 특정 권한 세트를 설정하는 방법이 궁금할 것이다. 이 작업에서는 +
또는 -
대신 =
를 사용한다. 위 스크립트에 대해 다른 사용자에게 액세스 권한이 없도록 권한을 설정하려면 권한을 제거할 때 사용했던 명령 대신 chmod o= hello*
를 사용한다.
사용자, 그룹 또는 기타 사용자에 대해 다른 권한을 설정하려는 경우 쉼표를 사용하여 각 표현식을 구분하거나(예: ug=rwx,o=rx
) 다음 섹션에서 설명하는 숫자 권한을 사용할 수 있다.
지금까지는 기호(ugoa 및 rxw)를 사용하여 권한을 지정했다. 각 그룹에는 세 가지 가능한 권한이 있다. 따라서 기호 대신 8진수를 사용하여 권한을 설정할 수도 있다. 이 방법으로 설정한 권한은 최대 4자리의 8진수를 사용한다. 첫 번째 숫자는 속성에 대해 설명할 때 살펴볼 것이며 두 번째 숫자는 사용자 권한, 세 번째 숫자는 그룹 권한, 네 번째 숫자는 기타 사용자 권한을 정의한다. 이러한 세 개의 숫자는 각각 원하는 권한 설정 즉, 읽기(4), 쓰기(2) 및 실행(1)을 추가하여 생성된다. 리스트 5의 hello.sh 예제에서는 스크립트가 -rw-r--r-- 권한으로 작성되었으며, 이는 8진수로 644에 해당한다. 모든 사용자에 대해 실행 권한을 설정하면 모드가 755로 변경된다.
숫자 권한은 각각의 그룹에 동일한 권한을 지정할 필요 없이 동시에 모든 권한을 설정하려는 경우에 매우 편리하다. 표 2에서 8진수 권한을 쉽게 찾아볼 수 있다.
표 2. 표 2. 숫자 권한
기호 | 8진수 |
---|---|
rwx |
7 |
rw- |
6 |
r-x |
5 |
r-- |
4 |
-wx |
3 |
-w- |
2 |
--x |
1 |
--- |
0 |
로그인하면 새로운 쉘 프로세스가 사용자의 사용자 및 그룹 ID로 실행된다. 이러한 ID는 시스템의 파일에 대한 사용자의 액세스를 제어하는 권한이다. 이는 일반적으로 다른 사용자에게 속한 파일에 액세스할 수 없고 시스템 파일에도 액세스할 수 없음을 의미한다. 실제로 사용자는 자기 대신 조작을 수행해 주는 다른 프로그램에 전적으로 의존한다. 사용자가 시작한 프로그램은 사용자의 사용자 ID를 상속하므로 사용자에게 액세스 권한이 없는 파일 시스템 오브젝트에 액세스할 수 없다.
중요한 예로 /etc/passwd 파일이 있다. 이 파일은 루트에 대해서만 쓰기 권한이 허용되기 때문에 일반 사용자가 직접 변경할 수 없다. 하지만 일반 사용자도 자신의 비밀번호를 변경할 필요가 있을 때 /etc/passwd를 수정할 수 있어야 한다. 따라서 사용자가 이 파일을 수정할 수 없을 경우 수정할 수 있게 하려면 어떻게 해야 할까?
Linux 권한 모델에는 suid(사용자 ID 설정)와 sgid(그룹 ID 설정)라는 두 가지 특수 액세스 모드가 있다. 실행 프로그램에 suid 액세스 모드가 설정되어 있는 경우 이 프로그램은 실제로 시작한 사용자가 아닌 파일의 소유자에 의해 시작된 것처럼 실행된다. 마찬가지로 sgid 액세스 모드가 설정되어 있는 경우에는 시작한 사용자가 사용자 자신의 그룹이 아닌 파일의 그룹에 속해 있는 것처럼 프로그램이 실행된다. 두 가지 액세스 모드 중 하나 또는 둘 다를 설정할 수 있다.
에서는 passwd
실행 파일이 루트의 소유임을 보여 준다.
리스트 8. 목록 8. /usr/bin/passwd의 suid 액세스 모드
[ian@echidna ~]$ ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 34368 Apr 6 2010 /usr/bin/passwd |
사용자의 권한 세트에서 x
대신 s
가 있다. 이는 이 특정 프로그램에 대해 suid 및 실행 가능 비트가 설정되어 있음을 나타낸다. 따라서passwd
를 실행하면 프로그램을 실행한 사용자의 권한으로 실행되는 것이 아니라 루트 사용자가 전체 수퍼유저 액세스 권한을 가지고 실행하는 것처럼 프로그램이 실행된다. passwd
가 root
액세스 권한으로 실행되는 것이므로 /etc/passwd를 수정할 수 있다.
suid 및 sgid 비트는 긴 디렉토리 목록에서 사용자 및 그룹의 x
비트와 같은 위치에 사용된다. 파일이 실행 파일일 경우 suid 또는 sgid 비트(설정된 경우)는 소문자 s
로 표시되며, 그렇지 않은 경우에는 대문자 S
로 표시된다.
suid와 sgid가 편리하고 많은 상황에서 필요하기도 하지만 이러한 액세스 모드를 잘못 사용하면 시스템 보안에 영향을 미칠 수 있다. suid 프로그램은 가능한 적게 사용해야 한다. passwd
명령은 suid를 반드시 사용해야 하는 소수의 프로그램 중 하나이다.
suid 및 sgid 비트는 문자 s
를 사용하여 기호로 설정 및 재설정된다. 예를 들어, u+s
는 suid 액세스 모드를 설정하고 g-s
는 sgid 모드를 제거한다. 첫 번째 자리를 차지하는 suid 및 sgid의 값은 8진수 형식으로 각각 4와 2이다.
sgid 모드가 설정된 디렉토리에 있는 모든 파일 또는 디렉토리는 해당 디렉토리의 그룹 ID를 상속한다. 이는 같은 프로젝트에서 작업하고 있는 사용자 그룹에 사용되는 디렉토리에 특히 유용하다. 에서는 사용자 greg가 development 그룹의 모든 사용자가 사용할 수 있는 디렉토리를 설정하는 방법과 사용자 gretchen이 이 디렉토리에서 파일을 작성하는 예제를 보여 준다. gretchen.txt 파일이 작성되면 그룹 구성원이 이 파일에 쓸 수 있으므로 gretchen은 chmod g-w
를 사용하여 그룹 쓰기 기능을 해제한다.
리스트 9. 목록 9. sgid 액세스 모드와 디렉토리
[greg@echidna ~]$ mkdir lpi101 [greg@echidna ~]$ chmod g+ws lpi101 [greg@echidna ~]$ ls -ld lpi101 drwxrwsr-x. 2 greg development 4096 Nov 30 13:30 lpi101/ [greg@echidna ~]$ su - gretchen Password: [gretchen@echidna ~]$ touch ~greg/lpi101/gretchen.txt [gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt -rw-rw-r--. 1 gretchen development 0 Nov 30 14:12 /home/greg/lpi101/gretchen.txt [gretchen@echidna ~]$ chmod g-w ~greg/lpi101/gretchen.txt [gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt -rw-r--r--. 1 gretchen development 0 Nov 30 14:12 /home/greg/lpi101/gretchen.txt |
이제 development 그룹의 모든 구성원이 사용자 greg의 lpi101 디렉토리에 파일을 작성할 수 있다. 에서 보듯이 그룹의 다른 구성원은 gretchen.txt 파일을 업데이트할 수 없다. 하지만 디렉토리에 대한 쓰기 권한이 있으므로 이 파일을 삭제할 수 있다.
리스트 10. 목록 10. sgid 액세스 모드와 파일 소유권
[gretchen@echidna ~]$ su - tom Password: [tom@echidna ~]$ echo "something" >> ~greg/lpi101/gretchen.txt -bash: /home/greg/lpi101/gretchen.txt: Permission denied [tom@echidna ~]$ rm ~greg/lpi101/gretchen.txt rm: remove write-protected regular empty file `/home/greg/lpi101/gretchen.txt'? y [tom@echidna ~]$ ls -l ~greg/lpi101/ total 0 |
조금 전 디렉토리에 대한 쓰기 권한이 있는 사용자가 디렉토리에 있는 파일을 삭제할 수 있다는 것을 살펴보았다. 이는 작업 그룹 프로젝트에서 사용할 수 있는 설정이지만 /tmp 디렉토리와 같은 글로벌 공유 파일 공간에는 적합하지 않은 설정이다. 다행히도 해결 방법이 있다.
나머지 액세스 모드 비트를 스티키 비트라고 한다. 이 비트는 기호로는 t
로 표시되며 8진수로는 1로 표시된다. 이 비트는 긴 디렉토리 목록에서 기타 사용자에 대한 실행 플래그의 자리(마지막 문자)에 표시되며 suid 및 sgid에 적용되는 것과 같은 대소문자 의미가 적용된다. 디렉토리에 이 비트가 설정된 경우에는 소유 사용자 또는 수퍼유저(루트) 사용자만 파일을 삭제하거나 파일의 링크를 해제할 수 있다. 에서는 사용자 greg가 lpi101 디렉토리에 스티키 비트를 설정하는 방법을 보여 주며 이 비트가 /tmp에도 설정되어 있음을 보여 준다.
리스트 11. 목록 11. 스티키 디렉토리
[greg@echidna ~]$ chmod +t lpi101 [greg@echidna ~]$ ls -ld lpi101 /tmp drwxrwsr-t. 2 greg development 4096 Nov 30 14:16 lpi101 drwxrwxrwt. 24 root root 12288 Nov 30 14:22 /tmp |
과거에는 UNIX® 시스템에서 실행 파일을 재로드하지 않기 위해 파일에 대한 스티키 비트를 사용하여 실행 파일을 스왑 공간에 저장했다. 최신 Linux 커널에서는 파일에 대해 설정된 스티키 비트를 무시한다.
표 3에서는 지금까지 살펴본 세 가지 액세스 모드에 대한 기호 및 8진수 표현을 요약해서 보여 준다.
표 3. 표 3. 액세스 모드
액세스 모드 | 기호 | 8진수 |
---|---|---|
suid | s + u |
4000 |
sgid | s + g |
2000 |
스티키 | t |
1000 |
이 정보를 이전 권한 정보와 결합하면 greg의 lpi101 권한 및 액세스 모드 drwxrwsr-t에 해당하는 전체 8진수 표현이 3775라는 것을 알 수 있다. ls
명령으로는 8진수 권한이 표시되지 않지만 find
명령을 사용하여 8진수 권한을 표시할 수 있다.
리스트 12. 목록 12. 기호 및 8진수 권한 인쇄하기
[greg@echidna ~]$ find . -name lpi101 -printf "%M %m %f\n" drwxrwsr-t 3775 lpi101 |
액세스 모드와 권한은 누가 파일과 디렉토리를 사용하여 어떤 작업을 수행할 수 있는지를 강력하게 제어할 수 있는 수단을 제공하지만 루트 사용자에 의한 부주의한 파일 삭제와 같은 경우를 막지는 못한다. LPI Topic 104.5의 범위에 포함되지는 않지만 다양한 파일 시스템에서 사용할 수 있는 추가 기능을 제공하는 몇 가지 추가 속성이 있다. 이 중 하나가 불변 속성이다. 이 속성을 설정하면 루트일지라도 속성이 해제될 때까지 파일을 삭제할 수 없다.
lsattr
명령을 사용하여 파일이나 디렉토리에 대해 불변 플래그(또는 기타 속성)가 설정되었는지 여부를 확인한다. 불변 파일로 설정하려면 chattr
명령을 -i
플래그와 함께 사용한다.
에서는 루트 사용자가 불변 파일을 작성할 수 있지만 불변 플래그가 제거될 때까지 해당 파일을 삭제할 수 없다는 것을 보여 준다.
리스트 13. 목록 13. 불변 파일
[root@echidna ~]# touch keep.me [root@echidna ~]# chattr +i keep.me [root@echidna ~]# lsattr keep.me ----i--------e- keep.me [root@echidna ~]# rm -f keep.me rm: cannot remove `keep.me': Operation not permitted [root@echidna ~]# chattr -i keep.me [root@echidna ~]# rm -f keep.me |
불변 플래그를 변경하려면 루트 권한 또는 적어도 CAP_LINUX_IMMUTABLE 기능이 필요하다. 파일을 불변 파일로 설정하는 작업은 보안 또는 침입 탐지 작업 중에 종종 수행된다. capabilities man 페이지(man capabilities
)에서 자세한 정보를 볼 수 있다.
새 파일이 작성될 때 작성 프로세스에 의해 새 파일이 가지고 있어야 하는 권한이 지정된다. 0666 모드가 자주 요청되는데 이 모드는 파일에 대한 읽기 및 쓰기를 모든 사용자에게 허용한다. 일반적으로 디렉토리는 기본 모드인 0777로 설정된다. 하지만 이 허용적 작성은 umask 값의 영향을 받으며, 이 값은 사용자가 새로 작성된 파일이나 디렉토리에 자동으로 부여하는 것을 원하지 않는 권한을 지정한다. 시스템에서는 umask 값을 사용하여 원래 요청된 권한을 축소한다. umask
명령을 사용하여 umask 설정을 볼 수 있다.
리스트 14. 목록 14. 8진수 umask 표시하기
[ian@echidna ~]$ umask 0002 |
다시 한번 말하지만 umask는 부여되지 않아야 하는 권한을 지정한다. Linux 시스템에서는 사용자에게 개인용 그룹이 없을 경우 일반적으로 새 파일에서 그룹 및 기타 사용자의 쓰기 권한을 제거하는 0022로 umask가 설정된다. 사용자에게 개인용 그룹이 있을 경우에는(이러한 예제에 사용되는 Fedora 시스템에서와 같이) 일반적으로 기타 사용자의 쓰기 권한을 제거하는 0002로 umask가 설정된다.-S
옵션을 사용하여 umask를 기호로 표시할 수 있으며, 이 경우에는 허용되는 권한을 보여 주는 형태로 표시된다.
umask
명령을 사용하여 umask를 설정하고 표시할 수 있다. 따라서 파일을 개인용 파일로 유지하면서 새로 작성된 파일에 대한 모든 그룹 또는 기타 사용자의 액세스를 허용하지 않으려는 경우 umask 값 0077을 사용한다. 또는 umask u=rwx,g=,o=
를 사용하여 기호식으로 설정한다.
리스트 15. 목록 15. umask 설정하기
[ian@echidna ~]$ umask -S u=rwx,g=rwx,o=rx [ian@echidna ~]$ umask u=rwx,g=,o= [ian@echidna ~]$ umask 0077 [ian@echidna ~]$ touch newfile [ian@echidna ~]$ ls -l newfile -rw-------. 1 ian ian 0 Nov 30 15:40 newfile |
파일의 그룹을 변경하려면 chgrp
명령을 그룹 및 하나 이상의 파일 이름과 함께 사용한다. 원하는 경우 그룹 번호를 사용할 수도 있다. 일반 사용자는 해당 파일을 소유해야 하고 변경 중인 대상 그룹의 구성원이어야 한다. 루트 사용자는 파일의 그룹을 변경할 수 있다. 의 예제를 살펴보자.
리스트 16. 목록 16. 그룹 소유권 변경하기
[ian@echidna ~]$ touch file{1,2} [ian@echidna ~]$ ls -l file* -rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file1 -rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file2 [ian@echidna ~]$ chgrp development file1 [ian@echidna ~]$ chgrp 505 file2 [ian@echidna ~]$ ls -l file* -rw-rw-r--. 1 ian development 0 Nov 30 15:54 file1 -rw-rw-r--. 1 ian development 0 Nov 30 15:54 file2 |
이 튜토리얼에서 다룬 많은 명령과 마찬가지로 chgrp
에도 변경사항을 선택한 모든 파일 및 서브디렉토리에 재귀적으로 적용하는 -R
옵션이 있다.
앞에서 액세스 모드를 설명할 때 디렉토리에 sgid 모드를 설정하면 해당 디렉토리에 작성된 새 파일이 파일을 작성한 사용자의 그룹이 아닌 해당 디렉토리의 그룹에 속하게 된다는 것을 살펴보았다.
또한 newgrp
명령을 사용하여 사용자의 기본 그룹을 사용자가 속해 있는 다른 그룹으로 임시로 변경할 수 있다. 새 쉘이 작성되며, 사용자가 쉘을 종료하면 이전 그룹이 다시 시작된다.
리스트 17. 목록 17. newgrp를 사용하여 임시로 기본 그룹 변경하기
[ian@echidna ~]$ groups ian development editor [ian@echidna ~]$ newgrp development [ian@echidna ~]$ groups development ian editor [ian@echidna ~]$ touch file3 [ian@echidna ~]$ ls -l file3 -rw-r--r--. 1 ian development 0 Nov 30 16:00 file3 [ian@echidna ~]$ exit [ian@echidna ~]$ groups ian development editor |
루트 사용자는 chown
명령을 사용하여 파일의 소유권을 변경할 수 있다. 이 명령의 가장 단순한 형태의 구문은 그룹 이름 또는 ID 대신 사용자 이름이나 숫자 ID가 사용된다는 점을 제외하면 chgrp
명령과 유사하다. 사용자 이름 또는 ID 바로 뒤에 콜론과 그룹 이름 또는 ID를 추가하여 파일의 그룹을 동시에 변경할 수 있다. 콜론만 지정한 경우에는 사용자의 기본 그룹이 사용된다. 기본적으로 -R
옵션은 변경사항을 반복적으로 적용한다. 의 예제를 살펴보자.
리스트 18. 목록 18. chown을 사용하여 파일 소유권 변경하기
[ian@echidna ~]$ touch file4 [ian@echidna ~]$ su - Password: [root@echidna ~]# ls -l ~ian/file4 -rw-rw-r--. 1 ian ian 0 Nov 30 16:04 /home/ian/file4 [root@echidna ~]# chown greg ~ian/file4 [root@echidna ~]# ls -l ~ian/file4 -rw-rw-r--. 1 greg ian 0 Nov 30 16:04 /home/ian/file4 [root@echidna ~]# chown tom:gretchen ~ian/file4 [root@echidna ~]# ls -l ~ian/file4 -rw-rw-r--. 1 tom gretchen 0 Nov 30 16:04 /home/ian/file4 [root@echidna ~]# chown :tom ~ian/file4 [root@echidna ~]# ls -l ~ian/file4 -rw-rw-r--. 1 tom tom 0 Nov 30 16:04 /home/ian/file4 |
이전에는 사용자와 그룹을 동시에 지정할 때 콜론 대신 마침표를 사용했다. 이 방법은 이름에 마침표가 포함된 경우 혼동이 발생할 수 있기 때문에 더 이상 권장되지 않는다.
이제 Linux의 파일 및 디렉토리 권한에 대한 소개를 마친다.
교육
- developerWorks의 LPIC-1 로드맵을 사용하여 2009년 4월 목표를 기반으로 하는 LPIC-1 인증을 준비하는 데 도움을 줄 수 있는 developerWorks 기사를 찾을 수 있다.
- LPIC Program 사이트에서 Linux Professional Institute의 Linux 시스템 관리 인증의 세 가지 레벨에 대한 자세한 목표, 작업 목록 및 샘플 질문을 찾을 수 있다. 특히, LPI exam 101과 LPI exam 102의 2009년 4월 목표를 확인하자. 항상 LPIC Program 사이트를 참조하여 최신 목적을 확인한다.
- Linux 기초를 학습하고 2009년 4월 이전의 LPI 시험 목적을 바탕으로 한 시스템 관리자 인증 시험을 준비하려면 developerWorks에서 전체 LPI exam prep series를 검토한다.
- GNU Coreutils 매뉴얼의 Directory listing 장에서 디렉토리 목록에 대한 설명을 볼 수 있다.
- Linux Documentation Project에는 유용한 문서, 특히 다양한 HOWTO가 많이 있다.
- Linux에서는 수백 개의 기술자료 목록과 함께, Linux 개발자와 관리자를 위한 다양한 다운로드, 토론 포럼 및 다른 참고자료를 찾을 수 있다.
- developerWorks 기술 행사 및 웹 캐스트를 통해 다양한 IBM 제품 및 IT 산업 주제에 대한 최신 정보를 얻을 수 있다.
- 무료 developerWorks Live! briefing을 통해 최신 IBM 제품 및 도구에 대한 정보뿐만 아니라 IT 업계의 최신 경향까지도 빠르게 확인할 수 있다.
- developerWorks on-demand demos에서는 입문자를 위한 제품 설치 및 설정부터 숙련된 개발자를 위한 고급 기능까지 망라된 다양한 데모를 제공한다.
- Twitter의 developerWorks를 팔로우(follow)하거나 developerWorks에 대한 Linux 트윗(tweet)의 피드를 구독하자.
제품 및 기술 얻기
- 자신에게 가장한 적합한 방법으로 IBM 제품을 평가해 보자. 시험판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나, SOA Sandbox에서 SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.
토론
- 포럼에 참여하기.
- developerWorks community에 참여한다. 개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.
Ian Shields는 developerWorks 리눅스 영역을 위한 리눅스 프로젝트 다수를 수행하고 있다. Shields는 노스 캐롤라이나 주 소재 IBM 리서치 트라이앵글 파크에서 선임 프로그래머로 일한다. Shields는 1973년 시스템 엔지니어로 오스트레일리아, 캔베라에 있는 IBM 사무실에 들어갔으며 캐나다 몬트리얼과 노스 캐롤라이나 주 RTP에서 통신 시스템과 배포 컴퓨팅 부문에서 일해왔다. Shields는 특허 여러 건을 획득했으며, 논문 여러 건을 발표했다. Shields는 순수 수학과 철학 학사 학위를 오스트레일리안 국립 대학에서 받았다. 노스 캐롤라이나 주립 대학에서 컴퓨터 과학 분야를 대상으로 석사와 박사 학위를 받았다. 전자편지 주소는 ishields@us.ibm.com이다.
'보물창고 > IT 정보' 카테고리의 다른 글
Google Spreadsheets 데이터와 PHP의 통합, Part 2 (구글, 문서도구, doc, 스프레드시트, data) (0) | 2011.04.15 |
---|---|
베레미즈와 wxGlade 사용 제한 (beremiz) (0) | 2011.04.13 |
Android 애플리케이션을 위한 java 기술 (0) | 2011.04.13 |
아이폰 고도원의 아침 편지 어플 (짧은 글귀, 마음의 비타민, 행복 바이러스, 좋은 말 한마디, iPhone) (0) | 2011.04.07 |
Linux의 가상 네트워크 (0) | 2011.04.04 |
Android에서의 보안 이해하기 (0) | 2011.04.04 |
베레미즈 빌드된 소스 분석 (tcp_ip 테스트 예제 마스터 프로젝트) (0) | 2011.04.02 |
아이비엠 디벨로퍼웍스 라이브러리 주소 (리눅스, 오픈소스, 웹개발, 자바, SOA와 웹서비스, XML) (0) | 2011.03.29 |