사용자 이름을 기록하지 않고 $USER 또는 $SUDO_USER에서 스크립트를 실행할 수 있습니까?

사용자 이름을 기록하지 않고 $USER 또는 $SUDO_USER에서 스크립트를 실행할 수 있습니까?

다른 사용자나 로그인한 사용자가 아닌 다른 사용자가 Bash 스크립트를 실행할 수 있는지 확인하려고 합니다 sudo -u otherusername.

다음 줄이 포함된 스크립트가 있습니다 echo $USER. echo $SUDO_USER그러면 항상 스크립트를 실행하는 사용자가 표시됩니다.

~에서이 Q&A특정 사용자가 를 사용할 수 있다는 것을 수집했습니다 sudo. 따라서 변수 SUDO_USER또는 ${SUDO_USER:-$USER}는 로그인한 사용자가 호출했는지 또는 를 사용하여 Bash 스크립트를 호출했는지 여부를 표시할 수 있습니다 sudo.

로그인한 사용자를 사용하거나 sudo. 명령이 "원래" 사용자 이름을 표시 echo $USER합니까 ?echo ${SUDO_USER:-$USER}

즉, 스크립트를 실행하는 동안 $USER사용자 이름을 숨길 수 있습니까?$SUDO_USER

인터넷에서 검색했지만 "bash call script obfuscating username"이라는 검색 키워드를 사용하여 답변을 찾지 못했습니다.

어쩌면 대답은 '아니요'일 수도 있지만 무엇이든 가능하기 때문에... 일종의 해킹이나 속임수가 가능할 수도 있습니다...

답변1

sudo액세스 권한 이 있는 한 모든 사용자로 명령을 실행할 수 있습니다 sudo.

$ cat ~/scripts/foo.sh
#!/bin/bash
echo $USER

$ ~/scripts/foo.sh
terdon

terdon@tpad ~ $ sudo -u bib ~/scripts/foo.sh
bib

따라서 대상 사용자의 사용자 이름으로 sudo -u USERNAME스크립트를 실행 하면 됩니다.USERNAME

변수 SUDO_USER에는 명령을 실행하는 사용자의 사용자 이름이 있지만 sudo변수 USER는 대상 사용자가 됩니다.

$ cat ~/scripts/foo.sh
#!/bin/bash
echo "sudo command was run by $SUDO_USER but I am actually $USER"


$ sudo -u bib ~/scripts/foo.sh
sudo command was run by terdon but I am actually bib

답변2

이 질문에 대해서는 질문대로 답변하겠습니다. 그러나 질문은 시스템 작동 방식을 이해하지 못한다고 생각하게 만드는 방식으로 작성되었으며 이 답변을 부주의하게 사용하면 시스템이 안전하지 않을 수 있습니다.

위 링크에서 일부 사용자는 SUDO를 사용할 수 있다는 것을 알고 있으므로 SUDO_USER 또는 ${SUDO_USER:-$USER} 변수는 로그인한 사용자 또는 SUDO를 사용하는 사용자에 의해 호출되었는지 여부에 관계없이 Bash 스크립트를 실행한 사용자를 표시할 수 있습니다. .

sudo에 관한 부분은 맞지만 sudo를 사용하지 않는다는 부분은 그렇지 않습니다. 다음과 같은 sudoers 규칙이 있는 경우

@staff ALL = (priya) /usr/local/bin/myprogram

그런 다음 런타임 시 이 sudo 규칙을 통해 프로그램이 호출되면 이 변수가 호출 사용자로 설정된다는 myprogram것을 확인할 수 있습니다 . 결과적으로 설정되지 않은 경우 실행자는 실제 사용자 계정에 액세스할 수 있는 다른 방법을 갖게 됩니다 .SUDO_USERsudo myprogramSUDO_USERmyprogrammyprogram

따라서 myprogram다른 사용자를 대신하여 작업을 수행해야 하고 priya관리자가 아닌 사람이 계정에 액세스할 수 있는 유일한 방법이 이 규칙을 통해서만 수행되는 경우 myprogram지정된 사용자를 대신하여 priya의 리소스에 안전하게 액세스할 수 있습니다 SUDO_USER.

상승된 권한 없이 실행하는 경우 myprogram이를 실행하는 사람은 누구나 실행 방법을 선택할 수 있습니다. 원하는 환경 변수를 설정할 수 있습니다. 이 USER변수는 관례이며 보안과 관련이 없습니다. 그러나 어쨌든 myprogram상승된 권한 없이 실행하면 신뢰할 수 있습니다( USER원하는 경우). 보안에는 높은 권한이 필요합니다. 실행 가능한 프로그램을 블랙박스로 보내고 특정 사용자만 실행할 수 있는지 확인하고 싶다면 잊어버리십시오. 그것은 불가능하며 그렇지 않다고 주장하는 사람은 뱀기름을 파는 것입니다.

즉, 스크립트를 실행할 때 $USER 또는 $SUDO_USER에서 사용자 이름을 숨길 수 있습니까?

이것은 같은 문제가 아닙니다! 위에서 설명했듯이 스크립트를 설정 USER하고 실행하는 것은 SUDO_USER매우 간단합니다 . 그렇지 않은 상황이 있는데, 바로 사용자가sudo를 실행하고 스크립트를 실행하라고 지시하세요.(스크립트를 직접 실행하는 대신) 이 경우에만 기본 sudo 구성을 가정하면 스크립트를 실행하는 사용자와 sudo를 호출하는 사용자가 USER보장됩니다 .SUDO_USER

sudo 규칙이 program1을 호출하고 program1이 program2를 호출하는 경우, program2는 이 변수를 변경하지 않도록 program1을 신뢰하는 경우에만 이러한 변수를 신뢰할 수 있습니다.

로그인한 사용자를 사용하거나 SUDO를 사용하는 것 외에 Bash 스크립트를 실행하는 다른 방법은 생각할 수 없습니다.

프로그램의 다른 서비스를 호출하십시오. 매우 일반적인 것은예약 된 일들. 일반적으로 사용자는 로그인하여 crontab을 편집하지만 그 후에는 사용자가 "로그인"(즉, 컴퓨터 앞에 있거나 자격 증명을 입력)할 필요 없이 cron 작업이 실행됩니다. cron은 로그인으로 간주되므로 사용자는 "로그인"됩니다(용어의 문제임).

다른 계정을 사용하여 프로그램을 호출하는 다른 방법이 있습니다.(대상 계정의 자격 증명이 필요함)프로그램 실행(일반적으로 대상 계정의 자격 증명이 필요하지만 더 복잡한 전략도 가능합니다.) 또는 프로그램이 일종의 네임스페이스나 컨테이너 내에서 실행될 수도 있습니다(여기에 나열하기에는 너무 많습니다).

Linux에는 또 다른 개념이 있습니다."로그인 ID". 이 값은 사용자가 로그인할 때 설정되어야 하며 사용자가 다른 계정으로 변경할 때 변경되지 않아야 합니다. 예를 들어, 사용자 로그인의 일반적인 흐름(제한 설정, 호출 등)을 따르지만 su -loginuid 는 변경하지 않습니다. 다음 명령을 사용하거나 다음 명령을 사용하여 loginuid를 검색 할 수 있습니다.sudo -i.profile/proc/self/loginuidlogname주문하다. 이는 주로 감사 목적으로 사용됩니다. 기본적으로 루트할 수 있는로그인 아이디를 변경하세요. 또한 loginuid는 프로세스별 개념이므로 로그인한 단일 사용자에 대한 전역 개념이 없습니다.

관련 정보