"모던리눅스 교과서" 책을 읽던 중 RUID, EUID, SUID 에 대해 읽게 되었는데 이해를 위해 좀 더 찾아보고 정리하는 글입니다.
- RUID (Real User ID)
RUID는 프로세스를 실행시킨 실제 사용자의 ID입니다. 이는 사용자가 시스템에 로그인할 때 할당되고, 대부분의 경우에 변경되지 않습니다. - EUID (Effective User ID)
프로세스가 시스템 리소스에 접근할 때 사용하는 ID입니다. EUID는 특히 파일이나 다른 시스템 리소스에 접근 권한을 체크할 때 중요하게 사용됩니다. 만약 어떤 프로그램이 SUID 비트가 설정된 상태로 실행된다면, 그 프로그램의 EUID는 프로그램의 소유자 ID로 설정됩니다. - SUID (Set-user-ID)
특수한 접근 권한으로, 파일을 실행할 때 실행 파일의 소유자 권한으로 실행되게 합니다. 예를 들어, root 권한으로 설정된 실행 파일을 일반 사용자가 실행하면 이 프로세스는 root의 EUID로 실행됩니다. 이를 통해 프로그램은 필요 시 높은 권한을 가지고 작업을 수행할 수 있습니다.
위와 같이 설명되지만 역시 예제 없이는 잘 이해가 안됩니다. 아래의 예제를 통해 이해해보도록 하겠습니다.
EXAMPLE
1. suid_example.c 라는 이름의 간단한 코드를 작성합니다.
## 모든 예시는 일반 사용자 계정으로 수행하였습니다.
$ vi suid_example.c
// 하단의 코드를 작성하고 저장합니다.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> int main() {
printf("현재 사용자 UID는 %d입니다.\n", geteuid());
// 일반적으로 민감한 작업 추가 여기에
return 0;
}
2. 작성된 코드를 컴파일 합니다.
$ gcc suid_example.c -o suid_example
3. 파일 소유자와 그룹 권한을 root로 설정하고 SUID 비트를 설정합니다.
$ sudo chown root:root suid_example
$ sudo chmod u+s suid_example
$ ls -al suid_example
-rwsr-xr-x 1 root root 16016 May 2 13:12 suid_example
여기서 SUID 비트를 설정하는데 자세한 설명은 아래와 같습니다.
- SUID(Set User ID) 설정 (chmod 4xxx)
파일의 SUID 비트가 설정되어 있다면, 해당 파일(주로 실행 파일)을 실행할 때 실행 파일의 소유자 권한으로 실행됩니다. 위 예시와 같, root 권한으로 소유된 파일에 SUID 비트가 설정되어 있으면, 일반 사용자가 해당 파일을 실행하더라도 프로그램은 root 권한으로 실행됩니다. 파일 권한에서 's' 혹은 'S'로 표시되는데, 실행 권한(x)이 있는 상태에서 설정되면 's', 없는 상태면 'S'로 표시됩니다.
- SGID(Set Group ID) 설정 (chmod 2xxx)
SGID는 파일의 경우 실행 시 해당 파일의 그룹 권한으로 실행되도록 하고, 디렉터리의 경우 해당 디렉터리 내에서 생성되는 파일이나 디렉터리가 부모 디렉터리의 그룹 소유권을 상속받게 합니다. 이는 공동 작업 환경에서 유용하게 사용됩니다. 파일 권한에서 's' 혹은 'S'로 표시되며, 그룹 실행 권한(g) 위치에 위치합니다.
- Sticky bit (chmod 1xxx)
해당 파일의 소유자에게만 쓰기 권한을 제공하는 설정으로 해당 파일, 디렉토리가 모든 사용자에게 쓰기가 되어있다고 하더라도 해당 파일의 소유자가 아니면 쓰기에 관련된 작업을 할 수 없습니다. 설정되면 public 의 실행(x) 부분이 “t”, “T” 로 나타난다.대표적으로 tmp 폴더가 이 목적으로 주로 사용되어, 다른 유저가 다른 유저의 tmp 정보를 읽기는 가능하지만, 쓰거나 지울 수는 없습니다.
$ ls -adl /tmp
drwxrwxrwt 10 root root 20480 May 2 13:42 /tmp
4. 컴파일 된 파일을 실행한다.
$ ./suid_example
현재 사용자 UID는 0입니다.
실행 결과, 프로그램이 root 권한(EUID)으로 실행되어 '현재 사용자 UID는 0입니다.'라고 출력합니다.
이 프로세스는 실제 사용자(RUID)로부터 시작되었으나, SUID 설정으로 인해 실행 파일의 소유자(root) 권한으로 작업을 수행합니다. 이를 통해 특정 명령이나 작업에 대한 권한 제한 없이 더 높은 권한으로 실행되어야 할 필요가 있을 때 유용하게 사용될 수 있습니다.
추가적으로 처음에 자식 프로세스가 fork(2)를 통해 생성되면 이는 부모의 UID 복사본을 상속합니다. 또한 excute(2) 시스템 콜 중에는 프로세스의 RUID는 보존되지만 EUID와 저장된 SUID는 변경될 수 있습니다. 예를 들어 사용자가 passwd 명령을 실행할 때 사용자의 EUID는 사용자의 UID입니다. 이 UID를 1000이라고 가정하면 만약 passwd에서 suid 설정이 활성화되었다면 이를 실행할 때 사용자의 EUID는 0(root) 가 됩니다. 이 외에도 chroot를 비롯하여 여러 샌드박스 기술 등 EUID에 옇양을 미치는 경우는 다양합니다.
passwd 명령어가 대표적인 실제 사용 사례입니다.
$ ls -al /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Feb 6 21:54 /usr/bin/passwd
비밀번호를 설정하는 /usr/bin/passwd 는 사실 root 만 가능하기에 root 의 권한을 잠시 빌려 일반사용자가 계정의 패스워드를 설정 가능하게 됩니다.
'Linux' 카테고리의 다른 글
Linux systemd 완전 정복하기 (1) | 2024.05.07 |
---|---|
Linux 부팅 프로세스 (0) | 2024.05.07 |
Linux 접근 제어 목록(ACL) 이란? (0) | 2024.05.03 |
Linux seccomp 프로필과 접근제어목록(ACL)이란? (0) | 2024.05.03 |
Linux Capability 란? (1) | 2024.05.02 |