리눅스에서 실행 파일을 실행하면 일반적으로 현재 사용자의 사용자 ID와 그룹 ID로 프로세스가 실행됩니다. 하지만 때로는 해당 파일을 다른 사용자(예: root) 권한으로 실행해야 할 필요가 있습니다. 사용자 계정을 전환하지 않고도 setuid를 활용하면, 현재 사용자가 아닌 파일 소유자의 권한으로 실행 파일을 구동할 수 있습니다. 이번 글에서는 setuid가 어떻게 동작하는지, 그리고 사용자가 어떻게 상승된 권한으로 실행 파일(바이너리)을 실행할 수 있게 되는지 자세히 알아보겠습니다.
Setuid의 동작 원리
Setuid는 SET User ID on execution(실행 시 사용자 ID 설정)의 약자입니다. 예를 들어, root 사용자가 만든 "identity"라는 실행 파일이 있다고 가정해 봅시다. 이 파일을 실행하면 파일은 실행한 사용자의 사용자 ID, 그룹 ID 및 권한으로 동작합니다. 그러나 "identity" 파일에 setuid 비트가 설정되어 있다면, 파일을 실행할 때 현재 사용자가 아닌 root 사용자와 그 권한으로 프로세스가 실행됩니다.
실제로 확인해 보겠습니다. 먼저 "identity" 파일의 소유권을 확인하여 root 사용자가 소유하고 있는지 살펴봅니다. 권한 문자열에는 사용자, 그룹, 기타 사용자에 대해 실행(x) 비트가 설정되어 있는 것도 볼 수 있습니다.
사용자 "john1"이 "identity" 파일을 실행하면, 이 파일은 실행 시점에 하나의 프로세스가 됩니다. 프로세스 목록을 보면, 해당 프로세스가 "john1"이라는 사용자 이름과 사용자 ID로 생성되고 실행된 것을 확인할 수 있습니다.
이제 root 사용자로 "identity" 파일에 setuid 비트를 설정해 보겠습니다:
chmod u+s /usr/bin/identity
여기서 "u"는 setuid 비트(+s)를 오직 파일 소유자(user)에게만 설정한다는 의미입니다.
설정 후 권한 문자열의 소유자 실행 부분을 보면 "x"가 "s"로 바뀐 것을 확인할 수 있습니다. 실행 파일에서 "s"를 발견하면 그 파일에 setuid 비트가 설정되어 있다는 뜻입니다.
아래와 같이 chmod 명령어의 숫자 표기 방식을 사용할 수도 있습니다.
chmod 4755 /usr/bin/identity
숫자 권한 문자열 앞에 붙는 4는 setuid 비트가 포함되었음을 나타냅니다.
이제 "john1"이 다시 "identity" 파일을 실행하면 어떻게 되는지 살펴보겠습니다. 실행 중인 프로세스 목록을 확인해 보면, 이번에는 "john1"이 아닌 "root" 사용자로 프로세스가 생성되고 실행되는 것을 볼 수 있습니다.
Setuid 비트의 중요한 활용 사례
전문가들은 대부분 "애플리케이션을 root 사용자로 실행해서는 안 된다"고 조언합니다. 하지만 특정 파일이 root 권한으로 반드시 실행되어야 하는 경우도 존재합니다. 대표적인 예가 리눅스 시스템에 기본적으로 설치되어 있으며 setuid 비트가 설정된 passwd 유틸리티입니다.
그 이유는 간단합니다. 사용자의 비밀번호 정보는 "/etc/passwd"와 "/etc/shadow" 파일에 저장되는데, 이 두 파일은 오직 "root"만 수정할 수 있습니다. 사용자 "john1"이 자신의 비밀번호를 변경하려면 앞서 언급한 두 파일의 정보를 수정할 권한이 필요합니다. passwd에 setuid 비트가 설정되어 있기 때문에 "john1"은 일시적으로 root 권한을 얻어 자신의 비밀번호를 변경하고, 두 파일의 정보를 갱신할 수 있게 됩니다.
Setuid의 보안 위험성
주의하지 않으면 공격자가 setuid 바이너리를 악용해 시스템을 장악할 수 있습니다. 일반 사용자는 setuid 프로그램, 특히 자기 자신이 아닌 다른 사용자로 setuid가 설정된 프로그램을 설치해서는 안 됩니다. 무엇보다 홈 디렉터리에 root 사용자용 setuid가 활성화된 바이너리가 있다면 그것은 거의 확실히 트로이 목마나 악성코드일 가능성이 높으므로 즉시 제거하는 것이 좋습니다.
마치며
Setuid는 실행 가능한 파일에만 설정할 수 있습니다. 마찬가지로 setgid 비트도 설정할 수 있으며, 이를 통해 그룹의 모든 멤버가 소유자 권한으로 실행 파일을 구동할 수 있게 됩니다.
setuid와 setgid 비트는 보안에 민감한 기능이므로, 숙련된 시스템 관리자만 신중하게 사용해야 한다는 점을 유의하시기 바랍니다.
함께 읽으면 좋은 글
- 리눅스 공유 디렉터리에서 Sticky Bit로 파일 관리하는 방법
- 리눅스 터미널에서 맞춤법 검사하는 방법
- find, locate, which, whereis 명령어로 리눅스에서 파일 검색하기