어떤 상황에서 SUID 비트를 설정하고 싶나요?

어떤 상황에서 SUID 비트를 설정하고 싶나요?

저는 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 명령이다. 이 명령을 사용하면 모든 사용자는 루트 권한 없이 자신의 비밀번호를 변경할 수 있습니다. 그러나 모든 비밀번호가 저장된 파일은 루트만 쓸 수 있습니다.

비밀번호와 섀도우

누구나 콘텐츠를 변경할 수 있도록 Shadow의 권한을 666으로 설정할 수 있지만 이는 끔찍한 보안 결함이 됩니다. 따라서 SUID가 필요합니다. 이렇게 하면 사용자는 passwd 스크립트를 통해서만 섀도우 파일을 변경할 수 있으므로 통제된 방식으로 모든 사용자에게 상승된 권한을 부여할 수 있습니다. 스크립트 자체는 사용자가 다른 사람의 비밀번호를 변경할 수 없도록 보장합니다.

물론 passwd는 쓰기 금지되어 있어야 합니다. 그렇지 않은 경우 사용자는 이 파일을 변경하고 이를 사용하여 루트 권한으로 스크립트를 실행할 수 있습니다.

관련 정보