본문 바로가기
Security

권한설정 chmod (change mode)

by Hide­ 2007. 3. 9.
반응형
chmod
파일 또는 디렉토리의 접근 권한을 변경하는 명령이다.

1 chmod의 기본적인 사용법
chmod [-옵션] [모드] [파일명]

[옵션]
chmod 명령에는 몇가지 옵션이 존재하지만 -R 옵션 외에는 사용할 일이 없기 때문에 -R 옵션만 설명을 하겠다.
-R : 퍼미션 변경 대상이 디렉토리일 경우 그 하위 경로에 있는 모든 파일과 디렉토리의 퍼미션을 변경한다.

[모드(심볼릭)]
심볼릭 모드와 8진수 모드를 사용할 수 있는데 대부분의 사용자들은 심볼릭 모드 보다 8진수 모드를 선호한다. 그럼 심볼릭
모드부터 공부해 보도록 하자.
심볼릭 모드에서 "u = 소유자, g = 소유 그룹, o = other, a = all, r = 읽기, w = 쓰기, x = 실행"을 의미한다.
심볼릭 모드에서는 권한 추가에 대해서 '+' 를 사용하고 권한 박탈에 대해서는 '-' 를 사용한다. '=' 를 사용하면 현재 설정
된 권한은 제거되고 오직 '='로 설정한 권한만 부여한다.

file1에 대해 소유 그룹에게 쓰기 권한을 추가할 때
[root@rootman root]# chmod g+w file1

소유자에게 file1에 대해 쓰기 권한을 주고 소유 그룹에게는 쓰기 권한을 박탈할 할 때
[root@rootman root]# chmod u+w,g-w file1
--> 위와 같이 동시에 여러 대상에 대해 설정할 때는 각 대상을 콤마(,)로 구분하면 된다. 절대 공백이 들어가서는 안된다.

[모드(8진수)]
8진수 모드에서 4 = 읽기, 2 = 쓰기, 1 = 실행을 의미한다. 8진수 모드는 소유자와 소유그룹, other에 대해서 8진수 3자리로
표현하는데 첫째 자리수가 소유자를 의미하고 둘째 자릿수가 소유 그룹, 셋째 자릿수가 other을 의미한다.
예를 들어 751 라는 퍼미션은 소유자에게 7, 소유 그룹에게 5, other에게 1 에 해당하는 퍼미션을 설정한 것이다.
퍼미션의 계산은 주어진 권한에 해당하는 8진수 값을 모두 더해서(+) 설정된다.

소유자에게 읽기, 쓰기, 실행 권한을 소유 그룹에게는 읽기, 실행 권한을 other에게는 실행 권한만을 설정한 8진수 모드
소유자 = 4(읽기) + 2(쓰기) + 1(실행) = 7
소유그룹 = 4(읽기) + 1(실행) = 5
other = 1(실행) = 1
--> 이걸 정리하면 751 이라는 8진수 모드로 표현할 수 있다. 물론 초보자를 위한 설명이니까 덧셈까지 하면서 설명을 했지만 몇번 사용하다 보면 금방 익힐 수 있을 것이다.

file1에 대해 소유자에게 읽기, 쓰기 권한을 소유 그룹과 other에게는 읽기 권한을 갖도록 설정할 때
[root@rootman root]# chmod 644 file1

2 특별한 퍼미션 setuid, setgid, sticky bit
setuid, setgid
실행 퍼미션에는 setuid와 setgid라는 특별한 퍼미션이 있다. setuid는 심볼릭 모드로 's'로 표현되고 8진수 모드로는 4000
으로 표현된다. setuid 퍼미션이 설정되어 있는 실행 파일은 실행되는 동안에는 그 파일의 소유자 권한을 가지게 된다.
이러한 이유때문에 root 소유의 setuid 퍼미션이 포함되어 있는 파일은 아주 신중히 관리를 해야 된다. 저는 사용 안하는
setuid 실행 파일은 setuid 퍼미션을 제거해서 따로 보관하고 있습니다. setgid 퍼미션이 포함되어 있는 실행 파일은 실행되는 동안은 그 파일의 소유 그룹의 권한을 가지는 것 빼고는 setuid와 같다. setgid의 8진수 모드는 2000 이다.
setuid 퍼미션을 포함하고 있는 실행 파일을 ls -al 명령으로 확인해 보면 다음과 같이 소유자 실행퍼미션에 's'라고 되어
있는 것을 확인할 수 있다.
[root@rootman root]# ls -al /bin/su
-rwsr-xr-x  1 root     root        14112  1월 16  2001 /bin/su

setgid가 포함되어 있는 실행 파일을 ls -al 명령으로 확인하면 소유 그룹의 실행 퍼미션에 's'가 설정되어 있는 것을 확인
할 수 있을 것이다.
[root@rootman root]# ls -al /usr/bin/man
-rwxr-sr-x    1 root     root        14112  2월 5  2001 /usr/bin/man

file1 이라는 실행 파일에 setuid 퍼미션을 설정할 때
[root@rootman root]# chmod 4755 file1

file1 이라는 실행 파일에 setgid 퍼미션을 설정할 때
[root@rootman root]# chmod 2755 file1

sticky bit
sticky bit도 특별한 퍼미션이다. other의 쓰기 권한에 대한 특별한 퍼미션인데 /tmp 디렉토리와 /var/tmp 디렉토리에의
퍼미션이 stickbit가 포함되어 있다. sticky bit는 8진수 모드로는 1000으로 설정되고 심볼릭 모드로는 't' 또는 'T'
로 설정된다. 이 sticky bit가 포함되어 있는 디렉토리에 other에 쓰기 권한이 있을 경우 other에 해당하는 사용자들은
디렉토리 안에 파일을 만들 수는 있어도 디렉토리 삭제는 할 수 없다.
sticky bit가 포함되어 있는 대포적인 디렉토리가 /tmp 디렉토리인데 분명히 /tmp 디렉토리의 퍼미에는 other에게 쓰기 권한이 주어져 있다. 그렇기 때문에 /tmp 디렉토리에는 누구나 디렉토리와 파일을 만들 수 있다. 하지만 other에 해당하는 사용자는 쓰기 권한이 있음에도 불고 하고 /tmp 디렉토리를 지울수 없는 것이다. 그 이유는 /tmp 디렉토리에는 sticky bit가 설정되어 있기 때문이다. 당연히 소유자는 sticky bit가 설정되어 있는 디렉토리를 삭제할 수 있다.
디렉토리가 아닌 파일에 sticky bit가 설정되어 있을 때는 other 에게 쓰기 퍼미션이 있어도 파일을 수정할 순 있지만 그 파일을 삭제할 수는 없다. sticky bit의 이런 특징을 이용하면 공개 서버에서는 여러모로 요기나게 사용할 수 있을 것이다.
sticky bit를 적용할려면 당연히 쓰기 권한도 주어야 되다.

sticky bit가 포함되어 있는 디렉토리의 ls -al 결과
[root@rootman root]# ls -ald /tmp
drwxrwxrwt   14 root     root         4096 Aug 30 02:05 /tmp

dir1 이라는 디렉토리에 sticky bit를 설정할 때
[root@rootman root]# chmod 1707 dir1    -->  또는 chmod 1777 dir1

sticky bit가 설정되어 있는 디렉토리를 other에 해당되는 사용자가 디렉토리 삭제 명령을 했을 때
[rootman@rootman /tmp]# rm -rf dir1
rm: cannot remove directory `dir1':
Operation not permitted  
[rootman@rootman /tmp]# ls -ald dir1

drwx---rwt 2 root     root         4096 Aug 30 18:42 dir1

'Security' 카테고리의 다른 글

리눅스 find 명령어  (0) 2007.03.09
일반적인 리눅스 명령어 모음  (0) 2007.03.09
퍼미션  (0) 2007.03.09
/etc/passwd 구조  (0) 2007.03.09
PHP Injection  (0) 2007.03.09