특수 권한 (SUID, SGID, Sticky Bit) 이해 및 적용
이 단계에서는 Linux 의 특수 권한인 SUID (Set User ID), SGID (Set Group ID), 그리고 Sticky Bit 에 대해 알아보겠습니다. 이러한 권한은 파일 실행 및 디렉토리 동작에 대한 향상된 제어를 제공합니다.
특수 권한은 옥탈 권한 모드에서 추가 숫자로 표현되며, 표준 세 자리 숫자 (소유자, 그룹, 기타) 앞에 위치합니다.
- SUID (Set User ID):
- 옥탈 값 (Octal value): 4
- 파일에 미치는 영향: SUID 가 설정된 실행 파일을 실행하면, 이를 실행한 사용자가 아닌 파일의 소유자 권한으로 실행됩니다. 이는
passwd 명령 (/etc/shadow 파일에 쓰기 권한이 필요한데, 이 파일은 root가 소유) 과 같이 특정 작업을 수행하기 위해 높은 권한이 필요한 프로그램에 일반적으로 사용됩니다.
ls -l 출력에서: 소유자의 x (실행) 권한 대신 s가 나타납니다. 소유자에게 실행 권한이 없는 경우 대문자 S가 나타납니다.
- SGID (Set Group ID):
- 옥탈 값 (Octal value): 2
- 파일에 미치는 영향: SUID 와 유사하지만, 실행 파일이 파일의 그룹 소유자 권한으로 실행됩니다.
- 디렉토리에 미치는 영향: SGID 가 활성화된 디렉토리 내에서 생성된 파일 및 하위 디렉토리는 해당 디렉토리의 그룹 소유권을 상속받으며, 이를 생성한 사용자의 기본 그룹이 아닌 해당 디렉토리의 그룹 소유권을 상속받습니다. 이는 모든 파일이 특정 그룹에 속해야 하는 공유 디렉토리에 매우 유용합니다.
ls -l 출력에서: 그룹의 x (실행) 권한 대신 s가 나타납니다. 그룹에 실행 권한이 없는 경우 대문자 S가 나타납니다.
- Sticky Bit:
- 옥탈 값 (Octal value): 1
- 파일에 미치는 영향: 영향 없음.
- 디렉토리에 미치는 영향: 사용자는 디렉토리에 파일을 생성할 수 있지만, 자신이 소유한 파일만 삭제하거나 이름을 변경할 수 있습니다. 이는 사용자가 공유 디렉토리 (예:
/tmp) 에서 다른 사용자의 파일을 삭제하거나 이동하는 것을 방지합니다.
ls -l 출력에서: 기타 사용자의 x (실행) 권한 대신 t가 나타납니다. 기타 사용자에게 실행 권한이 없는 경우 대문자 T가 나타납니다.
이러한 특수 권한을 시연해 보겠습니다.
SUID 예시
제한된 파일을 읽으려는 간단한 C 프로그램을 만들겠습니다.
먼저, root만 읽을 수 있는 파일을 생성합니다.
sudo touch ~/project/secret_data.txt
sudo chmod 600 ~/project/secret_data.txt
sudo chown root:root ~/project/secret_data.txt
권한을 확인합니다.
ls -l ~/project/secret_data.txt
출력:
-rw------- 1 root root 0 Jun 6 17:36 /home/labex/project/secret_data.txt
이제 이 파일을 읽으려고 시도하는 C 프로그램 read_secret.c를 만듭니다.
nano ~/project/read_secret.c
다음 코드를 read_secret.c에 붙여넣습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
FILE *fp;
char buffer[256];
printf("Attempting to read /home/labex/project/secret_data.txt...\n");
fp = fopen("/home/labex/project/secret_data.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
printf("Successfully read file.\n");
return 0;
}
저장하고 nano를 종료합니다 (Ctrl+S, Ctrl+X).
프로그램을 컴파일합니다.
gcc ~/project/read_secret.c -o ~/project/read_secret
이제 labex로 실행해 봅니다.
~/project/read_secret
"Error opening file: Permission denied" 메시지가 표시되어야 합니다. labex는 secret_data.txt에 대한 읽기 권한이 없기 때문입니다.
이제 read_secret의 소유자를 root로 설정하고 SUID 비트를 설정해 보겠습니다.
sudo chown root:root ~/project/read_secret
sudo chmod u+s ~/project/read_secret
권한을 확인합니다.
ls -l ~/project/read_secret
출력:
-rwsr-xr-x 1 root root 17704 Jun 6 01:02 /home/labex/project/read_secret
소유자 권한 집합에서 s를 확인합니다. 이제 labex로 프로그램을 다시 실행합니다.
~/project/read_secret
이번에는 파일을 성공적으로 읽어야 합니다 (비어 있으므로 내용이 출력되지 않지만 "Successfully read file." 메시지는 성공을 나타냅니다). SUID 비트가 프로그램을 root의 권한으로 실행했기 때문입니다.
SGID 예시 (디렉토리에서)
공유 디렉토리와 새 그룹을 만들어 보겠습니다.
sudo groupadd shared_group
sudo mkdir ~/project/shared_dir
sudo chown labex:shared_group ~/project/shared_dir
sudo chmod 770 ~/project/shared_dir
이제 shared_dir에 SGID 비트를 설정합니다.
sudo chmod g+s ~/project/shared_dir
권한을 확인합니다.
ls -ld ~/project/shared_dir
출력:
drwxrws--- 2 labex shared_group 6 Jun 6 01:02 /home/labex/project/shared_dir
그룹 권한 집합에서 s를 확인합니다.
이제 shared_dir 내에 파일을 생성합니다.
touch ~/project/shared_dir/new_file.txt
new_file.txt의 소유권을 확인합니다.
ls -l ~/project/shared_dir/new_file.txt
출력:
-rw-r--r-- 1 labex shared_group 0 Jun 6 01:02 /home/labex/project/shared_dir/new_file.txt
labex의 기본 그룹이 labex임에도 불구하고, new_file.txt는 SGID 비트로 인해 shared_dir에서 shared_group 그룹 소유권을 상속받았습니다.
Sticky Bit 예시
/tmp 디렉토리는 Sticky Bit 가 설정된 디렉토리의 전형적인 예입니다. 유사한 디렉토리를 만들어 보겠습니다.
sudo mkdir ~/project/public_upload
sudo chmod 1777 ~/project/public_upload
1777의 1은 Sticky Bit 의 옥탈 값입니다. 777은 소유자, 그룹 및 기타 사용자에게 전체 권한을 부여합니다.
권한을 확인합니다.
ls -ld ~/project/public_upload
출력:
drwxrwxrwt 2 root root 6 Jun 6 01:02 /home/labex/project/public_upload
기타 사용자의 권한 집합에서 t를 확인합니다.
이제 다른 사용자가 이 디렉토리에 파일을 생성하는 것을 시뮬레이션해 보겠습니다. labex 사용자만 있으므로, labex로 파일을 생성한 다음 소유권을 root로 변경한 후 삭제하려고 시도합니다 (다른 사용자를 시뮬레이션).
labex로 파일을 생성합니다.
touch ~/project/public_upload/labex_file.txt
소유권을 root로 변경합니다.
sudo chown root:root ~/project/public_upload/labex_file.txt
이제 labex로 labex_file.txt를 삭제하려고 시도합니다.
rm ~/project/public_upload/labex_file.txt
쓰기 보호된 파일을 제거할지 묻는 메시지가 표시되고, y로 확인하면 "Operation not permitted" 오류가 발생합니다. Sticky Bit 는 labex가 public_upload 디렉토리에 대한 쓰기 권한이 있더라도 사용자가 소유하지 않은 파일을 삭제하는 것을 방지하기 때문입니다. root 또는 labex_file.txt의 소유자 (이 경우 root) 만 삭제할 수 있습니다.
정리하려면 sudo를 사용하여 labex_file.txt를 제거해야 합니다.
sudo rm ~/project/public_upload/labex_file.txt
정리
생성된 파일과 디렉토리, 그리고 사용자/그룹을 제거합니다.
sudo rm -f ~/project/secret_data.txt ~/project/read_secret.c ~/project/read_secret
sudo rm -rf ~/project/shared_dir ~/project/public_upload
sudo groupdel shared_group