스크립트에서 sudo를 사용해야 하나요, 아니면 전체 스크립트에 sudo를 사용해야 하나요?

스크립트에서 sudo를 사용해야 하나요, 아니면 전체 스크립트에 sudo를 사용해야 하나요?

저는 학생(예: 20명)을 위해 소규모 macOS 컴퓨터 그룹을 운영하고 있으며 모두 홈브류, 기타 패키지 및 애플리케이션과 같은 항목으로 설정해야 합니다. 각 컴퓨터에 필요한 모든 것을 자동으로 설치하는 bash 스크립트를 작성 중입니다. 내가 사용할 명령 중 일부는 루트로 실행해야 하지만 대부분은 그렇지 않습니다.

스크립트에서 이러한 각 명령을 개별적으로 sudo하는 것이 더 나은지, 아니면 스크립트에서 sudo를 제외하고 전체 스크립트를 sudo하는 것이 더 나은지 궁금합니다. 어느 것이 더 안전하고(보안 측면에서) 내 상황에 더 좋은지 알고 싶습니다. 스크립트 전체에서 비밀번호를 입력하라는 메시지를 표시하지 않는 것이 좋지만 안전하지 않기 때문에 스크립트의 모든 줄을 루트로 실행하고 싶지도 않습니다.

답변1

최소 권한의 원칙에 따라 루트로 가능한 한 적게 실행하십시오. 따라서 스크립트 내에서 sudo를 실행하세요.

sudo가 필요한 명령이 처음으로 나타나면 메시지가 나타날 수 있습니다. (많은 사람들이 안전하지 않기 때문에 기피하는 기술인 /etc/sudoers에서 NOPASSWD를 적용 가능하게 사용한다면 이는 사실이 아닙니다.) 그러나 sudo를 실행하고 비밀번호를 제공하면 sudo는 성공을 기억할 것입니다. 기간. 기본적으로 해당 기간은 5분입니다. 따라서 "sudo echo hi"를 실행하고 비밀번호를 입력한 후 곧 스크립트를 실행하면 스크립트를 실행할 때 비밀번호를 묻는 메시지가 표시될 필요가 없습니다. 보다 현실적으로, 스크립트를 실행하기만 하면 sudo를 한 번만 수행하라는 메시지가 표시될 것입니다. 스크립트가 나머지 작업을 완료하는 데 몇 분도 걸리지 않는다고 가정할 수 있습니다.

몇 가지 echo명령에 대해서는 걱정하지 않을 수도 있지만 추가 권한 없이 수행할 수 있는 중요한 콘텐츠가 있는 경우 보안을 위해 일반적으로 최소한의 권한 상승으로 수행되는 작업의 양을 최대화하는 것을 선호합니다.

권한을 최소화하는 예로 또 다른 샘플 시나리오를 보여드리겠습니다. 대신에:
sudo -c "sample-command >> /var/log/output.txt"

나는 다음을 사용하고 싶습니다 :
sample-command | sudo tee -a /var/log/output.txt >> /dev/null

이렇게 하면 전체 명령이 sudo 없이 실행되고, 강화된 권한을 갖게 되는 유일한 부분은 강화된 권한이 필요한 부분, 즉 파일에 쓰는 부분입니다.

분명히, 여기서 나의 목표는 얼마나 많은 일이 이루어졌는지 최소화하는 것입니다. 마찬가지로, 전체 스크립트에 권한 상승이 필요하지 않은 경우 보안 관점에서 선호되는 접근 방식은 권한 상승 작업의 양을 최소화하는 것입니다.

답변2

명령이 무엇인지에 따라 다릅니다. 인터넷에서 다운로드하는 명령의 경우 루트로 실행하지 않는 것이 좋습니다. 그러나 다른 명령은 루트로 실행해도 괜찮습니다. 내가 할 일은 명령을 두 개의 스크립트로 분리하는 것입니다. 하나는 루트가 아닌 명령용이고 다른 하나는 루트 명령용입니다.

명령 목록을 얻을 수 있다면 더 많은 도움을 줄 수 있을 것 같습니다.

답변3

일반적으로 스크립트가 다른 명령/응용 프로그램/유틸리티처럼 처리되기를 원할 것입니다. 이 경우 일반적으로 권한을 상승시키기 위해 비밀번호를 입력하라는 메시지가 표시되지 않습니다. 거부되고 오류가 발생합니다. 다음과 같은 것 :
Permission denied, 또는Operation not permitted.

하지만 구체적으로 다음과 같이 언급하셨습니다.
"..스크립트의 모든 줄을 루트로 실행하고 싶지 않습니다.."
sudo따라서 관련된 특정 코드 줄에서 /를 명시적으로 호출하고 독점적으로 호출하는 것에 대한 대안은 실제로 보이지 않습니다 .

또한 다음과 같이 하겠다고 언급하셨습니다.
"..스크립트 전체에서 비밀번호를 묻는 메시지가 표시되지 않습니다.."
그리고 당신은 그렇지 않을 가능성이 있습니다. 작업 사이에 상당한 시간이 경과하지 않는 한 sudo가 호출될 때마다 메시지가 표시되지 않습니다.

답변4

root한 가지 해결 방법은 다음과 같습니다. using 으로 스크립트를 실행하고 를 sudo사용하여 원래 사용자로 상승된 권한이 필요하지 않은 명령을 실행합니다 sudo -u $SUDO_USER <command>.

예제 스크립트는 다음과 같습니다 example.sh.

#!/bin/bash

if [ "$(whoami)" != "root" ] ; then
    echo "Run this script with sudo" >&2
    exit 1
fi

sudo -u "${SUDO_USER:-$USER}" this_command_run_as_user
this_command_run_as_root
this_command2_run_as_root

다음과 같이 실행합니다.

sudo ./example.sh

이 방법의 장점은 사용자의 비밀번호가 스크립트 시작 시 최대 한 번만 요청된다는 것입니다. 의 시간 초과에 대해 걱정할 필요가 없습니다 sudo.

관련 정보