지난 시간에는 파일의 읽기(Read), 쓰기(Write), 실행(Execute) 권한을 다루는 방법을 배웠습니다.
일반적인 환경에서는 이 세 가지 권한만으로도 접근 제어가 가능하지만, 시스템을 운영하다 보면 특수한 상황이 발생합니다.
가장 대표적인 예가
비밀번호 변경
입니다.
사용자의 계정 정보가 담긴
/etc/shadow 파일은 관리자(
root
)만이 수정할 수 있습니다.
그런데 일반 사용자가
passwd 명령어를 통해 자신의 비밀번호를 변경하면, 결과적으로 이 파일이 수정됩니다.
권한이 없는 일반 사용자가 어떻게 관리자 전용 파일을 수정할 수 있을까요?
이 모순을 해결하기 위해 리눅스에는
특수 권한
이라는 메커니즘이 존재합니다.
오늘은 이 특수 권한이 어떻게 동작하며, 왜 보안 관리자가 가장 주의 깊게 모니터링해야 하는지 알아보겠습니다.
특수 권한은 기존의 권한 비트 외에 추가적인 기능을 부여하며, 4자리 8진수 표기법 중 맨 앞자리를 사용합니다.
표기
소유자(User)의 실행 권한 자리에 s로 표시됩니다. (rwsr-xr-x)
동작 원리
이 권한이 설정된 실행 파일을 실행하면, 프로세스가 끝날 때까지 파일 소유자의 권한
(ID)을 빌려서 실행됩니다.
예시
/usr/bin/passwd 파일은 소유자가 root
이고 SetUID가 걸려 있습니다.
따라서 일반 사용자가 이를 실행하면 잠시 root
권한을 얻어 /etc/shadow를 수정할 수 있게 됩니다.
표기
그룹(Group)의 실행 권한 자리에 s로 표시됩니다. (rwxr-sr-x)
동작 원리
파일 실행 시 파일 소유 그룹의 권한
으로 실행됩니다.
활용
주로 디렉토리에 설정하여, 해당 디렉토리 내에 생성되는 파일들이 자동으로 부모 디렉토리의 그룹 소유권을 상속받게 할 때 사용합니다. (협업 디렉토리 구성 시 유용)
표기
기타(Other) 사용자의 실행 권한 자리에 t로 표시됩니다. (rwxrwxrwt)
동작 원리
디렉토리에 설정되며, 모든 사용자가 파일을 생성할 수 있지만 삭제는 파일의 소유자(와 root)만 가능
하도록 제한합니다.
활용
/tmp와 같이 누구나 접근 가능한 공용 디렉토리에서, 타인의 파일을 함부로 지우지 못하게 보호하는 역할을 합니다.
일반 실행(사용자 UID 유지) vs SetUID 실행(파일 소유자 UID로 일시적 변경)
특수 권한은
ls -l 명령어로 확인할 수 있으며,
chmod 명령어로 설정할 수 있습니다.
직접 파일을 만들고 권한을 변경해 보며 표기법을 익혀보겠습니다.
시스템에 존재하는 대표적인 SetUID 파일을 확인해 봅니다.
Terminal
출력 결과 -rwsr-xr-x 1 root root 68208 Feb 7 2024 /usr/bin/passwd
소유자 권한 부분의 세 번째 글자가 x가 아닌 s로 되어 있음을 확인할 수 있습니다.
테스트용 파일을 생성하고 특수 권한을 부여해 봅니다.
Terminal # 1. 테스트 파일 생성
touch setuid_test
touch sticky_dir
# 2. SetUID 설정 (4000번대)
# 숫자 모드: 4(SetUID) + 755
chmod 4755 setuid_test
# 심볼릭 모드: user에게 s 권한 추가
chmod u+s setuid_test
# 3. Sticky Bit 설정 (1000번대)
# 숫자 모드: 1(Sticky) + 777
chmod 1777 sticky_dir
# 심볼릭 모드: other에게 t 권한 추가
chmod o+t sticky_dir
숫자 모드로 SetUID, Sticky Bit 설정
만약 실행 권한(
x)이 없는 상태에서 특수 권한만 부여하면,
ls 결과에 대문자
S 또는
T가 나타납니다.
이는 실행 권한이 없어 특수 권한이 실제로 동작하지 않는다는 경고 표시입니다.
SetUID는 시스템 운영에 필수적이지만, 공격자에게는
권한 상승
(Privilege Escalation)을 위한 최고의 매개체가 됩니다.
만약
root
소유의 쉘(
/bin/bash) 파일에 SetUID가 설정된다면 시스템은 무방비 상태가 됩니다.
공격자가 시스템에 침투하여 일시적으로
root
권한을 얻었거나, 관리자가 실수로 권한을 잘못 설정했을 때 발생할 수 있는 상황입니다.
쉘 복사
공격자는 /bin/bash를 숨겨진 경로(/tmp/.hidden_shell)로 복사합니다.
SetUID 설정
복사한 파일에 SetUID 권한(4755)을 부여합니다.
이때 파일의 소유자는 root
여야 합니다.
권한 상승
공격자는 나중에 일반 계정으로 접속하여 /tmp/.hidden_shell을 실행합니다.
이 파일은 실행되는 순간 root
권한을 획득하므로, 공격자는 손쉽게 루트 쉘을 얻게 됩니다.
이러한 위험 때문에 보안 가이드라인에서는
SetUID가 설정된 파일의 목록을 주기적으로 관리
하도록 권고합니다.
시스템 관리자는 주기적으로 시스템 전체를 스캔하여, 의도하지 않은 SetUID/SetGID 파일을 찾아내야 합니다.
find 명령어를 활용하면 이를 효율적으로 수행할 수 있습니다.
Terminal # -perm 옵션: 권한 비트를 기준으로 검색
# -4000: SetUID가 설정된 파일 (최소 조건 포함)
# -type f: 디렉토리가 아닌 일반 파일만 검색
# 2>/dev/null: 'Permission denied' 에러 메시지는 출력하지 않음
find / -user root -perm -4000 -type f 2> /dev/null
위 명령어를 실행하면
/usr/bin/passwd,
/usr/bin/sudo 등 합법적인 파일들이 출력됩니다.
하지만 리스트에서
생소한 파일명
이나,
홈 디렉토리, 임시 디렉토리(/tmp, /var/tmp)
등에 위치한 파일이 발견된다면 즉시 침해 여부를 분석하고 권한을 제거해야 합니다.
Terminal # SetUID 권한 제거 (s -> x)
chmod u-s setuid_test
# 또는 절대 모드로 권한 재설정
chmod 0755 setuid_test
# Sticky Bit 권한 제거 (t -> x)
chmod o-t sticky_dir
# 또는 절대 모드로 권한 재설정
chmod 0777 sticky_dir
심볼릭 모드로 SetUID, Sticky Bit 설정 제거
/tmp 디렉토리는 시스템의 모든 사용자가 임시 파일을 생성하고 공유하는 공간입니다.
따라서 권한이
777(
rwxrwxrwx)로 설정되어 있어야겠죠.
하지만 이 설정에는 치명적인 약점이 있습니다.
"누구나 쓸 수 있다"는 것은 "누구나 지울 수 있다"는 뜻
이기도 하기 때문입니다.
이 문제를 해결하기 위해
/tmp에는 반드시
Sticky Bit
가 설정되어야 합니다.
Terminal # -d 옵션: 디렉토리 자체의 정보 확인
ls -ld /tmp
출력 결과 drwxrwxrwt 19 root root 4096 Jan 31 12:00 /tmp
마지막 권한이
t로 설정되어 있음을 확인할 수 있습니다.
이 설정 덕분에 A 사용자가 만든 파일은 오직
A 사용자
(소유자)와
관리자
(root)만이 삭제할 수 있게 되어, 데이터 무결성이 보장됩니다.
이번 시간에는 리눅스 권한 관리의 심화 내용인 특수 권한에 대해 알아보았습니다.
SetUID (4000)
파일 실행 시 소유자의 권한을 획득하는 강력한 기능입니다.
관리 편의성을 제공하지만, 잘못 관리될 경우 권한 상승 공격의 주요 타겟이 됩니다.
Sticky Bit (1000)
공용 디렉토리에서 타인의 파일을 삭제하지 못하도록 보호하여 협업 환경의 안전을 보장합니다.
보안 점검
find 명령어를 사용하여 주기적으로 시스템 내의 SetUID 파일을 전수 조사하고, 불필요하거나 의심스러운 파일의 특수 권한을 제거하는 습관이 필요합니다.
이로써 리눅스 파일 시스템과 권한에 대한 핵심적인 내용을 모두 다루었습니다.
다음 시간에는 시스템에서 실행 중인 프로그램, 즉
1.4 리눅스 프로세스 관리와 Cron 스케줄링
에 대해 알아보겠습니다.
프로세스의 상태를 모니터링하고, 주기적인 작업을 자동화하는 방법을 배워보겠습니다.