A와 B는 모두 동일한 그룹의 루트가 아닌 사용자입니다. B가 회귀를 실행한 후 B가 소유한 일부 정크 파일이 디렉터리에 생성되지만(또한 B가 생성하고 소유함) B의 회귀가 종료되고 정리가 제대로 수행될 수 없는 경우 정리 작업을 수행하려면 A가 필요하다고 가정합니다.
내가 아는 가장 쉬운 방법은 회귀 전에 B를 umask 0002로 설정하는 것이지만 불행히도 회귀 도구는 어떻게든 이 설정을 무시하고 B만 쓸 수 있는 가비지 파일을 생성합니다.
그래서 이 문제를 해결하기 위해 suid 함수를 사용해 보았습니다.
데모 디렉토리는 다음과 같습니다
/proj/ttt> ll
total 0
-rw-r--r-- 1 B users 0 Mar 16 00:50 garbage.file
정크 파일을 정리하기 위해 B가 소유한 스크립트(정리)를 생성하려고 합니다.
#!/bin/bash
# cleanup
echo EUID=$EUID UID=$UID
rm -f garbage.file
그런 다음 "chmod ug+s cleanup"을 사용하여 스크립트에 suid를 추가했습니다. 디렉토리는 다음과 같습니다.
/proj/ttt> ll
total 0
-rwsr-sr-x 1 B users 57 Mar 16 00:50 cleanup
-rw-r--r-- 1 B users 0 Mar 16 00:50 garbage.file
또한 상위 디렉토리에 "s" 비트를 추가했습니다.
drwsr-sr-x 2 B users 4096 Mar 16 00:57 ttt
그런데 이 스크립트를 A로 실행하면 's' 비트가 작동하지 않아 A가 정크 파일을 삭제할 수 없는 것 같습니다.
/proj/ttt> ./cleanup # executed by A
EUID=25264 UID=25264 # user B's uid is 25220, user A's uid is 25264
rm: cannot remove `garbage.file': Permission denied
내 시도에 어떤 문제가 있는지, 아니면 이 접근 방식이 궁극적으로 효과가 있을지 확신할 수 없나요?
아니면 이 작업을 수행하는 다른 더 좋은 방법이 있습니까?
답변1
표준 접근 방식은 새 그룹을 만들고 해당 그룹의 A와 B 구성원을 모두 만든 다음 문제의 모든 파일(또는 삭제하려는 경우 최소한 디렉터리)이 해당 그룹에 속하고 있는지 확인하는 것입니다. 적절한 권한. 그룹 권한.
그룹을 권한 집합의 "규칙"으로 생각하십시오. 각 특수 규칙에는 일반적으로 그룹을 생성해야 합니다.
올바른 그룹 소유권을 적용하는 한 가지 방법은 해당 그룹에 속하는 적절한 디렉터리에 setgid(그룹) 비트를 설정하는 것입니다. 그러면 이 디렉터리에 생성된 모든 파일이 자동으로 해당 그룹에도 속하게 됩니다. 당신은 이렇게 하려고 노력하지만, 그것이 당신의 의도인지는 잘 모르겠습니다. 디렉토리에는 setuid(사용자) 비트를 설정할 수 없습니다.
절대적으로 필요한 경우가 아니면 setuid 실행 파일의 사용은 일반적으로 권장되지 않습니다. 이 경로로 가고 싶다면 일부 sudoer
항목이 더 나을 수도 있습니다.