우리 서버에서는 여러(현재 2명, 3~4명으로 예상됨) 사용자가 애플리케이션의 새 버전을 배포할 수 있도록 허용합니다. 이 프로세스에는 신뢰할 수 있는 소스 Git 저장소에서 일부 파일을 다운로드하고 애플리케이션을 시작하는 작업(권한 없는 프로세스)이 포함됩니다.
이 모든 작업은 단일 스크립트를 사용하여 수행할 수 있으며 단 몇 초 밖에 걸리지 않습니다. 다른 사용자가 잘못된 권한이나 그룹으로 파일이나 디렉터리를 떠나지 않는 한.
그런 다음 배포가 실패하고 실행됩니다.
sudo chgrp -R sudo /our/root/directory
sudo chmod -R g=u,o-rwx /our/root/directory &&
비밀번호를 입력하지 않고도 이 작업을 수행할 수 있기를 바랍니다.
나는 이것이 setuid
쉘 스크립트에서는 작동하지 않는다는 것을 알고 있습니다(합당한 이유가 있음). setuid perl 스크립트를 사용하려고 했는데 더 이상 지원되지 않습니다. C 래퍼와 스크립트를 작성할 수 있지만 파일이 두 개 있으면 편안하지도 안전하지도 않습니다. 시스템 호출을 사용하면 C로 모든 내용을 작성할 수 있지만 시간이 오래 걸립니다.
그래서 나는 이렇게 묻습니다.이를 달성하는 간단하고 안전한 방법이 있습니까?짧은 C 코드를 작성해 보세요.
중요한 경우 Ubuntu 16.04입니다.
sudo
(*) 그룹 및 권한 rwxrwx---
또는 rw-rw----
전체 트리를 사용하고 있습니다 .
답변1
쉘 스크립트를 작성하고 sudo를 사용하여 이를 호출할 수 있는 해당 사용자 권한을 부여하십시오. NOPASSWD
사용자가 비밀번호를 입력하지 못하도록 하려면 이 지시어를 사용하세요(순서가 중요합니다.비밀번호를 묻지 않고 루트로 특정 프로그램을 어떻게 실행할 수 있나요?).
sudo가 환경에서 일부 안전한 변수(예: LC_*
및 )를 LANG
제외한 모든 변수를 제거하도록 설정되어 있는지 확인하십시오. 이는 어쨌든 Ubuntu에서 기본적으로 적용되는 경우이므로 Ubuntu에서는 Defaults
설정을 변경하지 않는 한 이 줄이 필요하지 않습니다 env_reset
.
Defaults!/usr/local/bin/fix-our-permissions env_reset
%our-app-maintainers ALL = NOPASSWD: /usr/local/bin/fix-our-permissions
또는 고정된 소유권과 권한을 부여하는 파일 시스템을 통해 사람들이 배포 영역에 액세스할 수 있도록 합니다.파일 시스템 바인딩. 바라보다폴더에 쓸 때 파일 권한을 자동으로 변경합니다.그리고디렉터리에 생성된 모든 파일은 bob의 소유여야 합니다.
그러나 실제로는 누구도 수동으로 배포해서는 안 됩니다. 배포는 다음과 같아야 합니다.트리거됨수동으로 해야 하지만구현CI에서 버전을 가져와 다운로드한 후 시스템 사용자 계정에서 실행되는 자동화된 서비스를 통해 데몬을 다시 시작하세요.
답변2
폴더를 모니터링하는 프로그램을 만들고 문제가 발견되면 폴더나 콘텐츠의 권한을 변경하면 Crontab(루트)에서 이 작업을 수행하거나 서비스(루트) 실행으로 만들 수 있습니다. 이것은 대안입니다.
답변3
원하는 정확한 chmod를 사용하도록 이러한 사용자의 umask를 변경하여 시스템에 입력하는 모든 아카이브가 정의된 권한 세트로 시작되도록 할 수 있습니다.
링크를 남겨주세요여기
답변4
ACL( )을 사용하면 setfacl
문제를 예방할 수 있습니다.
또 다른 방법은 파일을 새로운 빈 폴더에 다운로드하고 이전 폴더를 바꾸는 것입니다. 이 폴더의 심볼릭 링크( )를 덮어쓰면 원자적으로 수행할 수 있습니다 ln -sf
.