리눅스에서 setuid가 왜 존재하고, 실제로 어떤 동작을 하며, 언제 의미가 있는지

setuid는 ‘누가 실행했느냐’가 아니라 ‘누가 소유한 파일이냐’의 권한으로 실행하게 만드는 장치다.

일반적으로 리눅스에서 어떤 프로그램을 실행하면, 그 프로그램은 실행한 사용자 권한으로 동작한다. 그런데 setuid가 설정된 실행 파일은 예외다. 이 파일을 누가 실행하든지 간에, 파일의 소유자 권한으로 실행된다. 대표적인 예가 /usr/bin/passwd다. 이 파일의 소유자는 root이고, 일반 사용자가 실행해도 실행 중에는 root 권한을 가진다. 그래서 일반 사용자가 자신의 비밀번호를 변경할 수 있는 것이다.

이것이 권한 문자열에서 -rwsr-xr-x처럼 보이는 이유다. 원래 실행 권한 자리에는 x가 있어야 하는데, 그 자리에 소문자 s가 있으면 “실행 권한 + setuid가 함께 설정되어 있다”는 뜻이다. 즉, 실행은 가능하고, 실행 시에는 소유자 권한을 사용한다는 의미다.

setuid는 두 가지 방식으로 설정할 수 있다. 하나는 숫자 방식이고, 다른 하나는 기호 방식이다. 숫자 방식에서는 4000을 사용한다. 예를 들어 chmod 4744 파일명이라고 하면, 기존 권한(744)에 setuid(4000)를 추가하는 것이다. 기호 방식으로는 chmod u+s 파일명처럼 설정할 수 있다. 반대로 setuid가 설정된 파일을 찾고 싶다면, find 명령으로 4000 권한이 붙은 파일을 검색하면 된다.

여기서 중요한 동작 원리를 하나 짚어야 한다. setuid는 실행 파일에만 의미가 있다. 실행될 수 없는 파일에 setuid를 붙여도 아무 효과가 없다.

또 하나 중요한 포인트가 있다. chmod 4000 파일명처럼 4000만 단독으로 주면 기존 권한이 사라진다. 그래서 실제로는 거의 사용하지 않는다. 보통은 기존 권한을 유지한 채 chmod 4755처럼 함께 설정한다. 이 경우 소유자는 읽기·쓰기·실행이 가능하고, 실행 시에는 setuid가 적용된다.

정리하면 이렇다. setuid는 “이 프로그램은 실행하는 사람의 권한이 아니라, 파일 소유자의 권한으로 실행되어야 한다”라는 의도를 가진 특수 권한이다. 그래서 시스템 핵심 프로그램에서만 제한적으로 사용된다. 잘못 사용하면 일반 사용자가 root 권한으로 무엇이든 할 수 있게 되기 때문에, 보안 측면에서는 항상 주의 깊게 관리해야 하는 위험한 권한이기도 하다.