Sudo 티켓 및 후속 비 Sudo 피어 프로세스

Sudo 티켓 및 후속 비 Sudo 피어 프로세스

내 시스템에 sudo로컬로 시간 제한이 구성되어 있어 sudo일부 터미널에서 실행하여 한 번 인증하면 10분 동안 다시 인증할 필요가 없다고 가정해 보겠습니다.

이렇게 하면 프로세스가 프로세스의 하위로 실행되는 것이 효율적입니까?직접 sudo사용하지 않고 호출됨sudo(따라서아이가 아닌 형제자매실행 중인 프로세스의그리고 sudo) 내 권한을 루트로 업그레이드할 수 있나요?

구체적인 예로 터미널에서 실행한다고 가정해 보겠습니다.

sudo echo "hi"
other_process

프로세스 가 을(를 ) echo사용하여 실행 중이지만 그렇지 않습니다. 예를 들어 이전 호출과 관련된 10분 만료 sudo 티켓을 사용하여 ?를 통해 하위 프로세스 자체를 시작할 수 있습니다.sudoother_processother_processsudosudo

대답이 '예'라면 이는 제한 시간 내에 실행되는 모든 프로세스에 대해 매우 주의해야 한다는 의미입니다 sudo. 신뢰할 수 없는 프로세스를 실행하는 것은 현재 사용자의 샌드박스에 유지하는 것과 같지만 other_process기존 티켓을 사용할 수 있다면 sudo루트로 승격될 수 있다고 생각할 수도 있습니다.

sudo터미널에서 직접 호출하는 것이 아니라 터미널에서 실행되는 스크립트에서 호출하면 대답이 바뀌나요?

예를 들어 다음을 실행합니다.

script.sh
other_process2

script.sh거기에 이와 같은 줄이 있다면 이후 sudo echo "inside script"에 스크립트에 의해 시작된 다른 프로세스가 sudo 티켓을 사용하여 권한을 루트로 높일 수 있습니까? 스크립트가 완료된 후에는 어떻게 되나요? 티켓 1은 실행 중인 터미널의 다른 프로세스 script.sh에서 계속 사용할 수 있나요 ?sudo


1 이들은 더 이상 형제 프로세스와 같지 않지만 "이모" 또는 "삼촌" 프로세스(부모 프로세스의 형제)입니다.

답변1

예, sudo 티켓은 해당 터미널에서 실행 중인 모든 프로세스에 대해 작동합니다(적어도 사용자로서). 이것은 테스트하기 쉽습니다. 하나만 만드세요 test.sh:

#!/bin/sh

sudo apt-get check

그 다음에:

$ sudo apt-get check
[sudo] password for anthony: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done

$ ./test.sh 
Reading package lists... Done
Building dependency tree       
Reading state information... Done

일반적으로 특히 자신의 사용자로서 신뢰할 수 없는 프로그램을 실행하는 것은 권장되지 않습니다. 그리고 sudo 티켓이 있는 터미널에서는 이 작업을 수행해서는 안 됩니다. 신뢰할 수 없는 프로그램을 실행해야 하는 경우 보안 장벽을 설정해야 합니다(적어도 다른 사용자, 더 나은 가상 머신 또는 최소한 컨테이너 - 신뢰할 수 없는 프로그램을 실행하기 위한 보안 샌드박스를 설정하는 것은 쉽지 않습니다).

답변2

예. sudo인증은 사용자 이름, tty 및 타임스탬프의 조합에 연결되어 있으므로 이 셸에서 실행되는 모든 명령은 비밀번호를 입력하지 않고도 sudo를 통해 권한을 상승시키는 기능을 자체적으로 전달할 수 있습니다( 파일 timestamp_timeout=0에 비밀번호가 없다고 가정 /etc/sudoers).

이러한 스크립트는 설정한 제한 시간(기본값 = 15분) 내에 실행됩니다.

파일 test.sh:

#!/bin/bash

echo "test: \$SHLVL is: $SHLVL"
echo "test: I am $(id) on $(tty)"
echo "test: with sudo I am $(sudo id) on $(tty)"
/bin/bash -l ./sudotest.sh

파일 sudotest.sh:

#!/bin/bash

echo "sudotest: \$SHLVL is: $SHLVL"
echo "sudotest: I am $(id) on $(tty)"
echo "sudotest: with sudo I am $(sudo id) on $(tty)"

결과 :

test: $SHLVL is: 2
test: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
[sudo] password for tim:
test: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7
sudotest: $SHLVL is: 3
sudotest: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
sudotest: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7

이 경우 sudo에 대한 첫 번째 호출은 test.shsudotest.sh있지만아니요sudo 자체를 사용하여 호출했지만 내 사용자 이름과 tty가 여전히 동일하기 때문에 sudo는 프로세스가 높은 권한을 받을 수 있다고 생각하고 sudotest.sh.

몇 분 후, 시간이 초과되기 전에 다시 실행하면 다음과 같습니다.

test: $SHLVL is: 2
test: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
test: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7
sudotest: $SHLVL is: 3
sudotest: I am uid=1000(tim) gid=1000(tim) groups=1000(tim) on /dev/pts/7
sudotest: with sudo I am uid=0(root) gid=0(root) groups=0(root) on /dev/pts/7

힌트를 전혀 못 얻었어요. 제한시간이 지나기 전까지는 안 할 거예요 timestamp_timeout.

SHLVLtty는 실행 전반에 걸쳐 일정하게 유지되며 스크립트에 의해 실행되는 각 셸 프로세스가 호출 셸보다 한 수준 더 깊어질 때 값이 증가하는 것을 볼 수 있습니다 . 내 대화형 쉘 SHLVL = 1호출 test.shwhich gets SHLVL = 2, which 호출 sudotest.shwhich gets SHLVL = 3.

한 가지 주의할 점은 tty_tickets이 옵션이 설정되지 않은 이전 버전의 sudo가 있는 경우 sudo 세션의 사용자 이름+tty 세분성이 제거되고 세분성이 사용자 이름 및 타임스탬프로만 제한된다는 것입니다.

와 같은 다른 sudoers옵션도 영향을 미칠 수 있습니다 requiretty.

sudo원래 셸에서 호출된 스크립트에 대한 후속 호출이 sudo 자격 증명이 유지되는 시간 제한 내에 이루어지면 동일한 사용자로 승격될 수 있습니다 . 시간 제한이 끝나면 계속해서 권한을 승격할 수 있도록 하려면 비밀번호를 다시 입력할 수 있는 방법이 필요합니다. (또는 시간 제한을 변경하거나 사용자 또는 명령에 대한 비밀번호 요구 사항을 비활성화할 수 있지만 이는 이 답변의 범위를 벗어납니다.)

답변3

내 대답은 아니오 야. sudo id나중에 id확인해 보세요 .

관련 정보