실행 가능 비트 없이 setuid를 활성화하는 목적은 무엇입니까?

실행 가능 비트 없이 setuid를 활성화하는 목적은 무엇입니까?

권한에 대해 자세히 알아보려고 합니다. 내가 읽고 있는 내용은사용자 ID 설정그리고 그 용도. 그러나 이 특별한 경우는 나를 혼란스럽게 한다.

작은 스크립트를 만들었고 이제 설정이 완료되었습니다.수에이드스크립트 비트는 다음과 같습니다.

chmod u+s ramesh

권한이 다음과 같이 설정되어 있는 것을 확인했습니다.

-rwsrw-r--  1 ramesh ramesh   29 Sep 30 10:09 ramesh

이제 setuid를 사용하는 모든 사용자가 스크립트를 실행할 수 있다고 생각합니다. 이제 명령을 실행했습니다.

chmod u-x ramesh

허락해줬는데,

-rwSrw-r--  1 ramesh ramesh   29 Sep 30 10:09 ramesh

지금은 이해에스실행 가능 비트가 없는 setuid를 나타냅니다. 즉, 누구도 이 파일을 실행할 수 없습니다.

그래서 내 질문은 설정의 실제 목적이 무엇입니까?에스조금 있나요? 나는 예제 관점에서 이것을 설정하는 것을 이해하려고 노력하고 있습니다.

답변1

이제 setuid를 사용하는 모든 사용자가 스크립트를 실행할 수 있다고 생각합니다.

완전한 것은 아니고. 모든 사용자가 스크립트를 실행할 수 있도록 하려면 a+rx권한을 설정하기만 하면 됩니다.

chmod a+rx script

setuid는 스크립트가 항상 다음으로 시작함을 의미합니다.소유자의 권한즉, 다음 바이너리가 있는 경우:

martin@dogmeat ~ % touch dangerous
martin@dogmeat ~ % sudo chown root:root dangerous 
martin@dogmeat ~ % sudo chmod a+rx,u+s dangerous 
martin@dogmeat ~ % ll dangerous 
-rwsrwxr-x 1 root root 0 Sep 30 17:23 dangerous*

이 바이너리는 실행하는 사용자에 관계없이 항상 루트로 실행됩니다. 분명히 이것은 위험하므로 특히 setuid 응용 프로그램을 작성할 때 setuid에 매우 주의해야 합니다.또한 Linux에서는 본질적으로 안전하지 않으므로 스크립트에서 setuid를 전혀 사용해서는 안 됩니다.

이제 S는 setuid에 실행 가능한 비트가 없다는 것을 의미한다는 것을 이해합니다. 즉, 누구도 이 파일을 실행할 수 없습니다.

그래서 내 질문은 S 비트 설정의 실제 용도는 무엇입니까? 나는 예제 관점에서 이것을 설정하는 것을 이해하려고 노력하고 있습니다.

실제 목적은 없습니다. IMO는 단지 권한 비트의 가능한 조합일 뿐입니다.

답변2

파일을 실행할 수 없지만 setuid 및/또는 setgid로 만드는 목적 중 하나는 액세스 제어 목록(ACL)을 사용하여 특정 사용자만 파일을 실행할 수 있도록 허용하는 것입니다. 예를 들어, setuid 루트로 명령을 실행하고 싶지만 모든 사람이 명령을 실행할 수 없도록 하고 싶은 경우가 있습니다. 특정 사용자 또는 특정 그룹만 실행할 수 있도록 하려면 일반적으로 실행을 비활성화한 다음 ACL을 사용하여 제한된 실행을 허용할 수 있습니다.

다음 예에서는 가상의 명령을 가져와 일반적으로 실행할 수 없게 만들고 setuid를 설정한 다음 ACL을 사용하여 adm 그룹의 구성원이 명령을 실행할 수 있도록 허용합니다.

$ chown root.root privileged_command
$ chmod 4000 privileged_command
$ ls -l privileged_command
---S------ 1 root root 152104 Nov 17 21:15 privileged_command
$ setfacl -m g:adm:rx privileged_command

따라서 파일 권한에 따라 파일은 setuid이지만 실행 가능하지 않습니다(또는 읽을 수도 없음). 그러나 액세스 제어 목록은 adm 그룹의 모든 구성원에게 읽기 및 실행 권한을 부여합니다.

adm 그룹의 구성원이 파일을 실행하는 경우 파일에 있는 setuid 권한을 사용하여 ACL에서 부여한 실행 권한에 따라 실행됩니다. 다른 사람이 이를 실행하려고 하면 권한 거부 오류가 발생합니다.

위의 setfacl 명령 이후에 실행된 파일의 디렉터리 목록은 다음과 같습니다.

$ ls -l privileged_command
---Sr-x---+ 1 root     root     152104 Nov 17 21:15 privileged_command

이는 루트 그룹에 파일에 대한 읽기/실행 권한이 있음을 나타내는 것처럼 보이지만 실제로는 읽기/실행 권한을 제공하는 ACL이 있음을 나타냅니다.

이는 프로그램이 setuid가 되기를 원하지만 (보통) 실행이 불가능한 상황의 예입니다.

답변3

모든 권한 비트는 독립적으로 설정하거나 지울 수 있습니다. 일부 조합은 일반적이고 다른 조합은 실용적이지 않습니다. " None "에 ls대문자를 사용하여 이것이 이상하고 잘못된 설정일 수 있음을 강조합니다.Ssx

파일을 누구도 실행할 수 없는 경우 해당 파일의 setuid 및 setgid 비트는 관련이 없습니다. 파일의 기존 Unix 권한 비트가 x설정되지 않은 경우에도 특정 사용자 또는 그룹이 파일을 실행하도록 허용하는 ACL이 있을 수 있다는 점을 명심하십시오 .

많은 Unix 변형(Linux 및 Solaris 포함)에서 디렉토리의 setgid 비트는 해당 디렉토리에 생성된 파일이 디렉토리의 그룹 ID(setgid 비트가 설정될 때 사용되는 BSD 의미 체계) 또는 프로세스의 유효 그룹 ID(System V)를 상속하는지 여부를 제어합니다. 의미), setgid 비트가 지워질 때 사용됨).

Solaris에서는 실행할 수 없는 일반 파일의 setgid 비트가 강제 잠금을 활성화합니다. 강제 잠금은 다음에 의해 허용됩니다.fcntl잠금 메커니즘은 필수입니다. 즉, 한 프로세스가 잠금을 보유하고 다른 프로세스가 잠금을 사용하지 않으면 두 번째 프로세스는 파일에 액세스할 수 없습니다.

관련 정보