
나는 SUID 비트의 개념과 그것이 유용한 이유를 이해하려고 애쓰고 있습니다.
예를 들어 다음과 같은 프로그램이 있다고 가정해 보겠습니다.
-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo
내가 이해한 바에 따르면 s
사용자 소유자의 실행 비트는 본질적으로 파일 소유자의 권한을 가진 다른 사용자가 파일을 실행할 수 있다는 것을 의미합니다.
내가 왜 이런 걸 원하겠어요? 모든 사용자가 속한 그룹에서 작동하도록 파일의 그룹을 변경하면 어떨까요?
답변1
Setuid 및 setgid(및 존재하는 경우 setcap)는 권한을 높이는 유일한 방법입니다. 이 메커니즘을 통하지 않고 프로세스는 권한을 포기할 수 있지만 결코 얻을 수는 없습니다. 따라서 추가 권한이 필요한 작업은 수행할 수 없습니다.
예를 들어, 프로그램은 su
모든 sudo
사용자로서 명령을 실행할 수 있어야 합니다. 따라서 어떤 사용자가 호출했는지에 관계없이 루트로 실행해야 합니다.
또 다른 예는 입니다 ping
. TCP 및 UDP 소켓은 모든 사용자가 액세스할 수 있습니다. 이러한 프로토콜에는 포트 개념이 있고 프로세스가 포트를 제어할 수 있으므로(바인딩이라고 함) 커널이 패킷을 보낼 위치를 알 수 있기 때문입니다. ICMP에는 그러한 개념이 없으므로 루트로 실행되는 프로그램(또는 적절한 기능을 갖춘 프로그램)만 ICMP 패킷이 전달되도록 요청할 수 있습니다. 모든 사용자가 를 실행할 수 있으려면 ping
프로그램 ping
에 추가 권한이 있어야 하므로 setuid 루트(또는 setcap)입니다.
그룹 권한의 예로 로컬 최고 점수를 파일에 저장하는 게임을 생각해 보세요. 스코어 파일에는 사용자가 실제로 달성한 최고 점수만 저장되어야 하므로, 플레이어가 스코어 파일을 쓸 수 없어야 합니다. 게임 프로그램에서만 점수 파일에 쓸 수 있도록 허용해야 합니다. 그래서 게임 프로그램은 setgid로 만들어지고 games
점수 파일은 그룹이 쓸 수 있지만 games
플레이어는 쓸 수 없습니다.
권한을 높이는 다른 방법은 권한이 있는 실행 프로그램에서 추가 권한이 필요한 프로그램을 시작하는 것입니다. 사용자가 추가 권한이 필요한 작업을 수행하려는 경우 특정 형태의 프로세스 간 통신을 사용하여 권한 있는 작업을 수행하는 프런트엔드 프로그램을 실행합니다. 이는 옵션을 구문 분석하고 진행 상황을 보고하는 ping
하나의 프로그램과 패킷을 보내고 받는 서비스와 같은 일부 사용 사례에서는 잘 작동 하지만 게임 최고 점수 파일과 같은 다른 사용 사례에서는 그렇지 않습니다.ping
ping-backend
답변2
가장 일반적인 이유는 실행 파일을 루트로 실행할 수 있기 때문입니다. 예를 들어:
find /bin/ -type f \( -perm -4000 -o -perm -2000 \) -ls | awk '{print $3,$NF}'
-rwsr-xr-x /bin/su
-rwsr-xr-x /bin/mount
-rwsr-xr-- /bin/fusermount
-rwsr-xr-x /bin/ping6
-rwsr-xr-x /bin/ping
-rwsr-xr-x /bin/umount
이는 모두 일반 사용자가 실행할 수 있지만 높은 권한이 필요한 명령입니다. mount
완벽한 예입니다. user
또는 이와 유사한 옵션이 설정된 디스크를 마운트할 수 있지만 /etc/fstab
마운트하려면 root
SUID 비트가 설정되도록 권한이 필요합니다.
답변3
suid(또는 sgid) 비트는 실행 파일을 호출하는 사용자와 다른 사용자/그룹으로 실행되도록 합니다.
그렇게 하는 유일한 이유가 특정 파일에 액세스하는 것이라면, 다른 메커니즘을 사용하여 해당 파일을 쓰기 가능하게 만들 수 있습니다. 그러나 사용자는 다음을 수행할 수 있습니다.아무것프로그램에서 허용하는 것만이 아니라 파일에 추가합니다.
예를 들어, 프로그램에서 특정 형식으로만 파일에 줄을 추가하도록 허용할 수 있습니다. 그러나 방금 파일 시스템 권한을 사용한 경우 사용자는 파일에서 줄을 삭제할 수도 있습니다. 또는 형식이 잘못된 줄을 입력하세요.
기본적으로 suid 프로그램은 임의의 정책을 시행할 수 있습니다. 파일 시스템 권한은 불가능합니다. 예를 들어, 시스템에 suid 프로그램이 있습니다 /bin/su
. 예를 들어 루트 셸을 제공하지만 정책을 먼저 충족하는 경우에만 일반적으로 루트 비밀번호를 입력합니다. 권한만으로는 그렇게 할 수 없습니다.
답변4
나에게 있어 가장 간단한 예는 passwd-명령이다. 이 명령을 사용하면 모든 사용자는 루트 권한 없이도 자신의 비밀번호를 변경할 수 있습니다. 그러나 모든 비밀번호가 저장된 파일은 루트만 쓸 수 있습니다.
누구든지 콘텐츠를 변경할 수 있도록 섀도우에 대한 권한을 666으로 설정할 수 있지만 이는 끔찍한 보안 결함이 됩니다. 따라서 SUID가 필요합니다. 이렇게 하면 사용자는 passwd-스크립트를 통해서만 Shadow 파일을 변경할 수 있으므로 통제된 방식으로 모든 사용자에게 높은 권한을 부여할 수 있습니다. 스크립트 자체는 사용자가 다른 사람의 비밀번호를 변경할 수 없도록 합니다.
물론 passwd는 쓰기 금지되어 있어야 합니다. 그렇지 않은 경우 사용자는 이 파일을 변경하고 이를 사용하여 루트 권한으로 스크립트를 실행할 수 있습니다.