내 시스템에 sudo
로컬로 시간 제한이 구성되어 있어 sudo
일부 터미널에서 실행하여 한 번 인증하면 10분 동안 다시 인증할 필요가 없다고 가정해 보겠습니다.
이렇게 하면 프로세스가 프로세스의 하위로 실행되는 것이 효율적입니까?직접 sudo
사용하지 않고 호출됨sudo
(따라서아이가 아닌 형제자매실행 중인 프로세스의그리고 sudo
) 내 권한을 루트로 업그레이드할 수 있나요?
구체적인 예로 터미널에서 실행한다고 가정해 보겠습니다.
sudo echo "hi"
other_process
프로세스 가 을(를 ) echo
사용하여 실행 중이지만 그렇지 않습니다. 예를 들어 이전 호출과 관련된 10분 만료 sudo 티켓을 사용하여 ?를 통해 하위 프로세스 자체를 시작할 수 있습니다.sudo
other_process
other_process
sudo
sudo
대답이 '예'라면 이는 제한 시간 내에 실행되는 모든 프로세스에 대해 매우 주의해야 한다는 의미입니다 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.sh
에 sudotest.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
.
SHLVL
tty는 실행 전반에 걸쳐 일정하게 유지되며 스크립트에 의해 실행되는 각 셸 프로세스가 호출 셸보다 한 수준 더 깊어질 때 값이 증가하는 것을 볼 수 있습니다 . 내 대화형 쉘 SHLVL = 1
호출 test.sh
which gets SHLVL = 2
, which 호출 sudotest.sh
which gets SHLVL = 3
.
한 가지 주의할 점은 tty_tickets
이 옵션이 설정되지 않은 이전 버전의 sudo가 있는 경우 sudo 세션의 사용자 이름+tty 세분성이 제거되고 세분성이 사용자 이름 및 타임스탬프로만 제한된다는 것입니다.
와 같은 다른 sudoers
옵션도 영향을 미칠 수 있습니다 requiretty
.
sudo
원래 셸에서 호출된 스크립트에 대한 후속 호출이 sudo 자격 증명이 유지되는 시간 제한 내에 이루어지면 동일한 사용자로 승격될 수 있습니다 . 시간 제한이 끝나면 계속해서 권한을 승격할 수 있도록 하려면 비밀번호를 다시 입력할 수 있는 방법이 필요합니다. (또는 시간 제한을 변경하거나 사용자 또는 명령에 대한 비밀번호 요구 사항을 비활성화할 수 있지만 이는 이 답변의 범위를 벗어납니다.)
답변3
내 대답은 아니오 야. sudo id
나중에 id
확인해 보세요 .