Special Permission
리눅스 시스템에는 파일이나 프로그램에 추가로 적용할 수 있는 특수 권한(Special Permission)이 있다. 특수 권한에는 setuid
setgid
stickybit
가 있는데, 기본적으로 접근하는 사용자의 권한은 기본 퍼미션을 따르게 된다. 퍼미션(Permission)의 작동 원리는 다음 글을 참고하면 된다.
리눅스 시스템은 각 프로세스에 대해 다섯 가지 식별 번호를 할당한다.
- 프로세스 식별자(PID)
- 실제 사용자 ID(RUID)
- 유효 사용자 ID(EUID)
- 유효 사용자 그룹 ID(EGID)
- 실제 사용자 그룹(RGID)
실제 ID와 유효 ID
RUID
와RGID
는 프로세스를 실행한 사용자의 기본 권한을 나타내며, 일반적으로 계정 관리에 사용된다. 보통 이 값은 프로세스가 시작될 때 설정되고, 프로세스가 종료될 때까지 변경되지 않는다.EUID
와EGID
는 현재 프로세스가 어떤 권한으로 실행되고 있는 지를 나타내며, 접근 권한 설정에 사용된다. 특정 조건에서 변경될 수 있으며, 특수 권한이 설정된 프로그램을 실행하면 소유자의 ID로 변경된다.
특수 권한을 부여하면, 일반 사용자도 특정 프로그램을 실행할 때 일시적으로 더 높은 권한을 가질 수 있다. 예를 들어, setuid
가 설정된 파일을 실행하면, 해당 프로그램의 EUID
가 파일 소유자의 ID로 설정되어 그 사용자가 아니어도 프로그램을 실행할 수 있다. 이를 통해, ping
과 같은 명령어를 root 권한 없이도 실행할 수 있게 된다. 이러한 메커니즘 덕분에 일반 사용자도 제한된 작업을 일시적으로 수행할 수 있으며, 작업이 끝나면 다시 원래의 권한으로 돌아온다.
SetUID(4000)
Other User에 실행권이 있는 상태에서, SetUID를 선언하면 Other User 실행 시 상속받는 EUID가 파일의 소유자(User) 권한에 SET되어 실행된다. 쉽게 말하면, SetUID가 지정되어 있는 파일을 실행하면, 파일의 소유자(User)가 가진 권한을 임시로 부여받게 된다.
SetUID 예시
예시1 ) passwd
passwd
명령어는 사용자의 비밀번호를 변경하는 데 사용된다. 이 명령어는 일반 사용자가 자신의 비밀번호를 변경할 수 있도록 하지만, 시스템은 사용자 계정 정보를 수정해야 하기 때문에 루트 권한이 필요하다.passwd
파일의 소유자는 루트이며,setuid
비트가 설정되어 있다.
$ passwd
Changing password for nayoung.
Old Password:
-rwsr-xr-x. 1 root root 33600 4월 6 2020 /usr/bin/passwd
예시2) ping
ping
명령어는 ICMP 패킷을 보내기 위해 일반적으로 루트 권한이 필요하다. 그러나ping
명령어는setuid
가 설정되어 있어 일반 사용자도 사용할 수 있다.- 이 경우,
ping
명령어는 루트 권한으로 실행되므로 ICMP 패킷을 보낼 수 있다.
SetUID 설정 방법
setuid
비트를 설정하려면 chmod
명령어를 사용한다. 에를 들어 test
라는 파일에 setuid
를 설정하려면 다음과 같이 입력할 수 있다.
chmod u+s test
#넘버릭으로 설정하기
chmod 4755 test
이렇게 하면 파일의 소유자가 해당 프로그램을 실행할 때, 해당 프로그램은 소유자의 권한으로 실행된다. 단, setuid
는 보안상의 위험이 있을 수 있다. 잘못된 설정이나 취약점이 있는 프로그램은 악의적인 사용자에게 권한 상승을 허용할 수 있으므로, setuid
비트를 설정할 때는 신중하게 고려해야 한다.
SetGID(2000)
Other User에 실행권이 있는 상태에서 SetGID를 선언하면, Other User 실행 시 상속받는 EGID가 파일의 그룹 권한에 Set 되어 실행된다. 쉽게 말하면, SetGID가 지정되어 있는 파일을 실행하면 해당 파일에 지정되어 있는 그룹(Group)의 권한으로 실행된다.
SetGID 예시
예시 1) sg
sg
명령어는 사용자가 다른 그룹의 권한으로 명령어를 실행할 수 있도록 해준다. 이 명령어는setgid
비트가 설정되어 있을 경우, 해당 그룹의 권한으로 실행된다.sg
명령어를 사용하면 사용자는 다른 그룹의 사용자로 명령을 실행할 수 있다.
$ sg devgroup -c "whoami"
SetGID 설정 방법
setgid 비트를 설정하려면 chmod 명령어를 사용한다. 예를 들어, test라는 파일에 setgid를 설정하려면 다음과 같이 입력할 수 있다.
chmod g+s test
# 넘버릭으로 설정하기
chmod 2755 test
이렇게 하면 파일의 소유자가 해당 프로그램을 실행할 때, 해당 프로그램은 소유자의 그룹 권한으로 실행된다.
Sticky Bit(1000)
만약 일반사용자(Other)가 write
권한이 주어지면 어떤 문제가 생길까?
예를 들어, tmp
디렉터리의 경우 목적상 Other 영역에 write
권한을 가지고 있다. 문제는 Other 영역의 write 권한은 생성, 삭제, 복사, 이동에 영향을 준다는 것이다. 결국 tmp
디렉터리는 자신의 소유가 아닌 파일도 영향을 줄 수 있게 설정되어 있기 때문에 보호가 필요하다. 잘못 사용하는 경우, 프로그램의 무결성에 손상을 주고, 나아가 프로그램의 동작을 손상시킬 수 있다. 이러한 문제를 해결하기 위해 고안된 것이 바로 StickyBit이다.
StickyBit는, 설정된 디렉터리 내에서 파일을 삭제하거나 이름을 변경할 수 있는 권한을 제한하는 역할을 한다. 쉽게 말해, Sticky Bit가 설정된 디렉터리에서 사용자는 자신이 소유한 파일만 삭제하거나 변경할 수 있으며, 다른 사용자가 소유한 파일은 삭제할 수 없다.
Sticky Bit 예시
예시 1) /tmp
디렉터리
/tmp
디렉터리는 시스템에서 임시 파일을 저장하는 공간으로, 여러 사용자가 접근할 수 있는 공용 디렉터리이다.- 이 디렉터리에 Sticky Bit가 설정되어 있으면, 사용자는 자신의 파일만 삭제할 수 있고, 다른 사용자의 파일은 삭제할 수 없다.
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 10월 1 10:00 /tmp
Sticky Bit 설정 방법
Sticky Bit를 설정하려면 chmod
명령어를 사용한다. 예를 들어, testdir
라는 디렉터리에 Sticky Bit를 설정하려면 다음과 같이 입력할 수 있다.
chmod +t testdir
# 넘버릭으로 설정하기
chmod 1777 testdir
이렇게 하면 해당 디렉터리에 Sticky Bit가 설정되어, 사용자는 자신이 소유한 파일만 삭제하거나 변경할 수 있게 된다. Sticky Bit는 보안상의 이유로 공용 디렉터리에서 유용하게 사용되며, 여러 사용자가 파일을 공유하는 환경에서 파일의 무단 삭제를 방지하는 데 도움이 된다.