리눅스는 동시에 멀티 유저 / 멀티 태스킹의 실행을 지원할 수 있는 것을 특징으로 하는 대화형 운영 체제라는 특징이 있다. 리눅스가 다중 사용자를 지원하는 운영체제라는 점을 주의 깊게 살펴야 하는데, 이런 리눅스의 특징 때문에 파일에 대한 권한 이라는 문제가 생기게 되었다.
사용자는 각자 자신의 계정(ID)과 암호를 가지고 로그인을 하여 리눅스환경에 접속하고, 다른 사용자가 자신의 삭제하거나 수정할 수 없도록 파일에 대한 권한을 설정 할 수 있다. (파일 권한은 다들 아시겠지만 잘 모르시는 분들을위해 더보기에 간략한 설명을 해보았다...)
아무튼간에 파일에 대한 권한이 없다면 다른 사용자는 내 파일에 접근할 수가 없게된다. 즉, 해당 디렉토리나 파일에 대한 읽기, 쓰기, 실행권한을 가지고 있어야 다른 사용자가 내 파일이나 디렉토리에 접근하여 파일을 생성하거나 읽을 수 있는 것이다.
rwx 외에도 권한에는 다음 세가지의 추가적인 속성이 있다.
- 04000 : set-user-id(set UID)
- 02000 : set-group-id(set GID)
- 01000 : save-text-image(sticky bit)
실행 파일에 setuid가 지정되어 있다면, 파일에 포함된 프로그램이 수행되기 시작할 때 UNIX는 생성되는 프로세스에게 파일 소유주의 UID를 effective uid로 부여한다. 다시 말하면, 프로세스는 프로세스를 생성시킨 사용자의 UID(real UID)를 가지는 것이 아니라 파일 소유주의 UID(effective UID)를 가지는 것이다.
어떤 파일의 소유자(A)가 그 파일에 set UID 비트를 설정해 놓았다면, 다른 사용자(B)가 그 파일을 실행 시켰을 때 그 프로세스의 Effective User ID는파일의 소유자의 UID(User ID)인 A가 된다. 마찬가지로 set GID 비트가 설정 되었다면 파일 실행시 해당 프로세스는 Group ID의 권한으로 실행되는 것이다.
* 참고
Effective User ID(euid) : 실행된 프로세스의 UID
Real User ID(uid) : 실제로 그 프로세스를 실행시키는 유저의 UID
이해를 위해서 한가지 예제를 준비했다.
- /bin/passwd 파일을 자신의 현재 디렉토리에 복사해 온다. => $ cp /bin/passwd
- 다음과 같이 자신의 현재 디렉토리에 있는 passwd 명령을 수행한다. => $ ./passwd
위의 명령어를 잘 수행했다면 여러분은 실패 메세지를 보게 되었을 것이다.
- $ passwd & 를 입력
- $ ./passwd & 를 입력
- $ ps -ef | grep passwd 를 입력
결과 화면을 보면, 가장 좌측에 나오는 것이 UID이다. passwd 와 ./passwd 의 UID가 다른것이 보일것이다. 이런 결과가 나오는 이유는 다음과 같다.
리눅스에 등록되어 있는 사용자의 계정 정보는 /etc/passwd 속에 정의되어 있다. 그 안에는 각 사용자계정의 암호가 특정한 형태로 저장되어 있으며, 사용자는 passwd명령어를 사용해서 자신의 암호를 바꾼다. 이 때 passwd파일에는 여러 사용자의 계정정보가 저장되어 있기 때문에 접근을 통제하지 않으면 보안상 문제가 될 수 있다. 그렇기 때문에 passwd파일은 root만이 접근 가능하도록 되어 있다. 여기서 root만이 접근 가능한 passwd를 일반 사용자가 접근하여 자신의 암호를 변경할 수 있는 이유는, 그 파일에 setuid가 지정 되어 있기 때문이다. setuid가 지정되어 있기 때문에 일반 사용자가 passwd를 실행하여 생성되는 프로세스의 Effective User ID는 파일 소유주인 root의 UID로 부여된다. 그래서 우리가 본래 root만이 접근할 수 있던 passwd에 접근하여 암호를 변경할 수 있던 것이다. 하지만 이 passwd파일을 복사하면 소유자가 자기 자신으로 설정되기 때문에 euid는 자신의 UID가 되고 권한이 없기 때문에 실행하여도 암호를 변경할 수 없게 되는 것이다.
'Linux/UNIX' 카테고리의 다른 글
리눅스/유닉스의 시스템 구조(커널과 쉘) (0) | 2012.12.16 |
---|---|
Command-Line Argument. agrv[argc] (0) | 2012.11.23 |
프로세스 종료 exit() _exit() atexit() (1) | 2012.11.21 |
signal() 함수 (0) | 2012.11.10 |
strtol() - 정수문자열을 진수를 선택하여 정수로 반환 (0) | 2012.11.07 |