나는 bash 스크립트를 작성 중입니다.
- 초기화 시 일부 sudoed 명령 실행
- 보안을 위해 루트 권한 해제(
sudo -K
) - 권한이 없는 프로그램 실행
- 단, 종료시 루트권한이 필요합니다.
나는 ~을 찾고 있다스크립트가 종료될 때 사용자에게 비밀번호를 다시 묻는 것을 방지하는 간단하고 안전한 방법.
sudo -K
나는 용어 신호를 잡기를 기다리기 전에 분기를 고려하고 있습니다. 이것이 가장 우아하고 안전한 솔루션인지는 모르겠습니다.
코드는 다음과 같습니다.
sudo unshare -m \
sudo -u "$USER" -g `id -g -n "$USER"` \
bash -c \
"sudo mount --bind \"$MOUNT_DIR\" \"$MOUNT_DIR\"; \
sudo mount --make-private \"$MOUNT_DIR\"; \
sudo -K; \
<unprivilegied program here>; \
sudo umount \"$MOUNT_DIR\""
참고: 참고로 이렇게 하면 프로그램만 액세스할 수 있는 네임스페이스에 비공개 마운트가 생성됩니다. unshare -r
프로그램을 실행하는 옵션이 아닙니다.
답변1
일반 사용자와 루트 사용자 간에 전환하는 것으로 나타났습니다.
- 루트로 전환하고 실행
unshare
- 실행하려면 일반 사용자로 다시 전환하세요
bash
(비록 bashism을 사용하지 않는 것처럼 보이므로sh
더 휴대성이 좋고 더 가벼울 수도 있습니다). bash
더 많은 권한이 있는 작업을 수행하려면 해당 셸 내에서 루트로 여러 번 다시 전환하세요.
이를 단순화하고 사용자 간에 전환하는 동시에 문제를 해결하는 데 필요한 횟수를 줄일 수 있다고 생각합니다.
sudo unshare -m sh -c '
mount --bind "$1" "$1";
mount --make-private "$1";
exec sudo -u "#$SUDO_UID" -g "#$SUDO_GID" sh -c "
sudo -K;
<unprivilegied program here>
"
' - "$MOUNT_DIR"
기술적으로 권한이 없는 부분을 실행하는 동안 지속적으로 실행되는 루트 셸이 있지만, 셸이 하는 일은 권한이 없는 부분이 완료될 때까지 기다리는 것뿐이며 다른 작업은 수행하지 않습니다. 그러나 실제로 권한을 조기에 포기 sudo
하고 사용자에게 권한을 다시 부여하도록 요청할 필요가 없다면 모든 대안에는 umount
어떻게든 명령을 실행하기 위한 신호를 기다리는 지연된 프로세스도 포함됩니다.
그런데, 명령이 독립적인 것은 괜찮습니다. 제 제안에도 그 정신을 유지했습니다. 하지만 솔직히 명령줄 옵션으로 제공되는 코드 덩어리는 쓰기 sh -c
, 읽기, 유지 관리가 어렵습니다. 참조가 복잡하므로 이를 자체 스크립트로 나누고 전체 프로세스를 다음과 같이 실행하는 것이 좋습니다.
sudo unshare -m /usr/local/bin/script-that-does-the-rest-of-the-work
또한 이렇게 하면 허용된 명령에 대한 sudo 규칙을 더 쉽게 작성할 수 있습니다. 이는 사용자가 명령을 실행하도록 허용하지 않는 한(전체 루트 액세스 권한을 부여하는 것과 동일) 제 제안으로는 작성하기 어려울 것입니다. 이 경우 명령을 허용해야 하는데, 이는 unshare -m sh -c <huge block> "$MOUNT_DIR"
작성하기 매우 어렵습니다.Cmnd_Alias