[Linux/리눅스] setuid, setgid


위에 있는 이미지를 보면 /etc/shadow 는 비밀번호가 저장되어 있는 파일입니다. 권한을 보면 일반 사용자는 아무런 권한이 없는 걸 확인할 수 있습니다. 그렇지만 passwd 명령어를 사용하면 비밀번호를 변경할 수가 있습니다. 비밀번호를 변경했다는 건 shadow 파일을 수정했다는 말인데, 권한도 없는데 어떻게 할 수 있었던 걸까요? 바로 그 이유는 setuid 덕분에 가능합니다.

1. setuid
setuid는 파일을 실행했을 때, 일시적으로 파일 소유자의 권한을 사용할 수 있는 것을 말합니다. 작업이 끝나면 권한은 원래대로 돌아옵니다.


위에 있는 이미지는 파일 소유자와 파일 소유 그룹을 root라고 가정하고, A라는 사용자가 파일을 실행했을 경우라고 생각해 보겠습니다. A라는 사용자는 Other에 해당하니까 other의 권한을 가지고 파일을 실행합니다. 그래서 Other 권한으로 작업을 수행하고 있다가 'setuid'를 만나면 User 권한으로 바뀌면서 User 권한으로 작업을 계속 수행합니다. 그러다가 작업을 다 마치면 원래대로 Other 권한으로 돌아오고 실행이 종료됩니다.


2. setgid
파일을 실행했을 때, 일시적으로 파일 소유 그룹의 권한을 사용할 수 있는 것을 말합니다. 작업이 끝나면 권한은 원래대로 돌아옵니다.


3. setuid, setgid 설정 방법

파일 허가권은 3자리를 사용합니다. 여기서 제일 앞에 setuid를 설정하고 싶으면 4를 넣고, setgid를 설정하고 싶으면 2를 넣고, 둘 다 설정하고 싶으면 6를 넣으면 됩니다.
실행 권한이 없으면 대문자 S, 실행 권한이 있으면 소문자 s로 표시됩니다.
  • 예) chmod 4000 ./aaa (aaa 파일에 setuid 설정, 권한은 아무것도 없음.)
  • 예) chmod 6444 ./bbb (bbb 파일에 setuid, setgid 설정, 권한은 모두 읽기.)
  • 예) chmod 2111 ./ccc (ccc 파일에 setgid 설정, 권한은 모두 실행.)


중간에 setuid를 넣어서 root 권한으로 바꾸고, setuid를 만나기 전후의 권한을 출력하는 코드를 가지고 실제로 파일을 실행했을 때 어떻게 되는지 확인해 보죠.


test라는 파일을 보면 소유자와 그룹이 root입니다. fedora라는 일반 사용자로 test 파일을 실행해 보았습니다. setuid를 만나기 전에는 uid와 gid가 모두 fedora인 걸 보니, 처음 실행했을 때는 사용자의 권한으로 실행한다는 사실을 알 수 있습니다. 그 다음에 setuid를 만나고 나서 id를 확인해 보니 uid는 root로 변경이 되었습니다. 마지막으로 test 파일이 종료된 후에 파일 권한을 확인해 보니 uid가 fedora로 돌아와 있습니다.

Comments