소유권과 허가권
리눅스 시스템은 앞에서도 말했지만 다중 사용자 시스템이다.
즉 혼자만이 아닌 여러사람이 동시에 같이 사용이 가능한 시스템이라는 이야기다.
따라서 지금 배울 허가권은 유닉스 계열의 시스템에서는 아주 중요한 개념이다.
잘못된 허가권은 시스템에 큰 보안홀을 만들 수 있으므로 잘 사용해야 한다.
허가권(퍼미션) 이해하기
앞에서 배운 ls 명령을 이용해서 파일 하나를 살펴보도록 하자.
linuxstudy ~ # ls -al /etc/inittab
-rw-r--r-- 1 root root 1645 Oct 28 13:13 /etc/inittab
linuxstudy ~ #
리눅스의 모든 파일과 디렉토리는 위와 같이 되어 있다.
위의 파일을 풀어서 설명하자면 이렇다.
/etc/inittab 파일은 root사용자와 root그룹의 것이며 root사용자는 읽고 쓸수 있으며
root그룹은 읽기만 되고 root사용자와 root그룹을 제외한 나머지 사용자는 읽기만 되며
파일의 그기는 1645byte 이며 최종적으로 10월28일 13시13분에 수정이 되었다.
뭔가 복잡하게 들릴지 모르겠지만 하나씩 한번 살펴보도록 하자.
리눅스의 기본적인 권한은 세가지로 나눠져 있다.읽기권한(read),쓰기권한(write),실행권한(excute)
- | r w x | r w x | r w x |
파일타입 | 소유자 | 소유그룹 | others |
| u | g | o
|
맨 처음 나오는 - 은 파일타입에 대한 것이다.
참고. 파일 타입
- | 일반 파일 |
b | 블럭형 장치파일(보통 하드 디스크등등) |
c | character device(보통 장치 파일들,마우스나,콘솔등등) |
d | 디렉토리 |
p | 파이프 파일 |
s | 소켓파일 |
컴퓨터는 단순한 기계다.0과1만 이해하는..^^;
이제 rwx 가 숫자로 변경되는 과정을 이해해 보도록 하자. 허가권이 있다면 1 없다면 0이다.
표기 | r | - | - |
비트(2진수) | 1 | 0 | 0 |
8진수 | 2의2승 | 2의1승 | 2의0승 |
10진수 | 4 | 0 | 0
|
읽기 권한만 준다면 숫자는 4로 나온다.
표기 | r | w | - |
비트(2진수) | 1 | 1 | 0 |
8진수 | 2의2승 | 2의1승 | 2의0승 |
10진수 | 4 | 2 | 0
|
읽고 쓰는 경우에는 4+2가 되서 6
표기 | r | w | x |
비트(2진수) | 1 | 1 | 1 |
8진수 | 2의2승 | 2의1승 | 2의0승 |
10진수 | 4 | 2 | 1
|
읽고 쓰고 실행하는 권한을 부여하면 4+2+1 해서 7 이 된다.
대충 이해가 되는가? 즉 모든 권한을 다 부여하면 7 이라는 숫자로 되는것이다.
편하게 이해하려면 다음을 보도록 하자.
무조건 4,2,1 이렇게 이해하자.
이제 앞으로 가서 우리가 봤던 /etc/inittab 파일의 퍼미션을 다시 한번 보도록 하자.
r w -(6), r - -(4),r - -(4)
즉 /etc/inittab 파일의 허가권은 644라고 하면 되는것이다.
rwxr-xr-x 는?
r(4),w(2),x(1)/r(4),w(0),x(1)/r(4),w(0),x(1)=7,5,5
자꾸 머리속으로 계산하는 습관을 들이도록 하자..^^;
chmod
이제 위에서 배운 허가권을 변경하는 방법에 대해서 알아보도록 하자.
chmod 명령은 허가권을 변경해 주는 명령으로 시스템 관리자가 되면 아주 많이 사용하게 될 명령어다.
허가권을 변경하는 방법은 두가지의 표현법이 있다.
위에서 배운 숫자로 변경하는 방법과 문자로 부여하는 방법이 있다.
하위 디렉토리까지 같이 변경하기 위해서는 -R 옵션을 사용하면 된다.
chmod 755 /etc/inittab(root에게 읽고 쓰고 실행,root그룹에게 읽고 실행,others에게 읽고 실행)
chmod u+rws,g+rx,o+rx /etc/inittab
위의 두가지는 표현만 다르지 똑같은 결과를 가져온다.
문자로 부여하는 방법은 u(소유자),g(소유그룹),o(others),a(all)과 +,-,= 을 조합해서 허가권을 부여할 수 있다.
특수 퍼미션
이제 설명할것은 기본적인 rwx 권한 이외의 특수한 목적으로 만들어진 퍼미션이다.
SetUID:파일을 실행하는 동안에는 소유자의 권한을 획득하는 허가권.
SetGID:파일을 실행하는 동안에는 소유그룹의 권한을 획득하는 허가권.
Stick Bit:아무나 읽고 쓰기가 가능하지만 생성한 소유자만이 파일을 지울 수 있는 허가권.
SetUID(4),SetGID(2),sticky bit(1) 를 부여하기 위해서는 기본 퍼미션 755 등등의 앞에 붙여주면 된다.
chmod 4755 실행파일(SetUID부여)
chmod 2755 실행파일(SetGID부여)
chmod 1777 디렉토리(Sticky bit부어)
문자 형태로 주고자 한다면 아래와 같다.
chmod u+s 파일
chmod g+s 파일
chod +t 디렉토리
SetUID,SetGID
단순한 설명으로는 이해가 어려울 수 있으니 예를 들어서 설명해 보겠다.
A라는 계정 사용자가 리눅스의 passwd 명령으로 패스워드를 변경한다고 생각해 보자.
당연히 변경된 패스워드는 저장이 될 것이다. 리눅스의 패스워드 파일은 /etc/shadow 라는 파일에 저장이 된다. 그렇지만 /etc/shadow 파일의 퍼미션은 다음과 같이 되어있다.
-rw------- 1 root root 24736 Oct 23 17:54 /etc/shadow
허가권을 알게 되었으니 충분히 이해하겠지만 /etc/shadow 파일은 root는 읽고쓰기,root그룹과others 는 아무 권한이 없는 상태이다.
그런데 어떻게 A라는 계정 사용자가 명령을 내려서 /etc/shadow 파일이 갱신이 될 수 있을까?
바로 여기에 SetUID의 비밀이 숨어있다.
ls -al /bin/passwd 명령을 내려보도록 하자.
-rws--x--x 1 root root 32888 Mar 11 2009 /bin/passwd
실행 권한(x)이 있어야 될 자리에 s 가 보일 것이다.
바로 이게 SetUID 다. 쉽게 설명하자면 시스템의 어떠한 계정이라도 /bin/passwd 파일을 실행하는 동안에는 소유주 즉 root의 권한을 갖는다는 것이다.
물론 실행이 종료되면 다시 A라는 계정의 권한으로 돌아온다..^^;
SetGID 권한은 위와는 동일하지만 소유그룹의 권한을 갖는다는 차이만 있다.
SetUID,SetGID권한은 이렇듯 일반 사용자가 특정사용자나 그룹의 권한을 갖을 수 있으므로
잘못 설정할 경우에는 아주 위험한 경우들이 생겨나므로 조심해야 된다.
나중에 보안 부분을 다루면서 예제를 보여주겠지만 보통 해킹당한 시스템에서 root권한으로 실행되는 백도어등을 많이 심어두고 언제라도 그 파일을 실행해서 root권한을 획득하는 경우가 많다.
그래서 root 비번을 변경하더라도 계속 크래킹이 이뤄지는 것이다.
sticky bit
sticky bit 란 위에서 설명했지만 누구나 읽고 쓸수있는 디렉토리지만 삭제는 생성한 유저만 가능하게 해주는 허가권이다.
보통 sticky bit가 설정되어 있는 대표적이 디렉토리가 있는데 바로 /tmp 디렉토리다.
예를 들어보겠다.리눅스 시스템을 이용해서 여러명의 개발자가 특정 디렉토리에서 프로그램을 개발한다고 가정해 보자.
같은 디렉토리를 공유하기 위해서 디렉토리의 퍼미션을 아래와 같이 설정했다.
chmod 777 /workspace
즉 모든 사용자가 읽고 쓸수가 있을 것이다.그런데 문제가 생겼다.
A라는 사용자가 같이 작업하는 B의 파일도 역시 읽고 쓸수 있기 때문에 실수로 B사용자의 파일을 지워버렸다. 이런 경우가 발생하지 않기 위해서 sticky bit 를 설정해 주는 것이다.
소유권 이해하기
허가권과 더불어 리눅스 시스템에서 가장 중요한 소유권을 알아보도록 하자.
유닉스 계열의 시스템들은 정확하게 내가 사용할수있는 파일과 사용할 수 없는 파일들이 정확하게 나눠진다.
chown
파일의 소유자와 소유그룹을 변경하는 명령으로
chown 소유자.소유그룹 파일 및 디렉토리 형태로 실행하면 된다.
하위 디렉토리까지 소유자와 소유그룹을 변경하려면 -R 옵션을 주면 된다.
chgrp
chgrp는 소유그룹만 변경하고자 할 경우에 사용한다.
chgrp 그룹명 파일 및 디렉토리
앞에서도 설명했지만 시스템 관리자는 많은 사용자의 권한을 적절하게 잘 조정해줘야 한다.
잘못된 권한 설정은 원치않는 결과를 가져올 수 있으므로 주의해서 사용하기 바란다.
특히나 접근이 안된다고 무조건 777로 주는 실수는 범하지 않도록 하기 바란다.