Linux에서 명령이나 스크립트를 실행하기 위해 비밀번호를 설정하는 방법은 무엇입니까?
권한 없는 사용자가 스크립트(사용자 및 비밀번호 세부 정보가 포함되어 있음)를 사용/실행하는 것을 방지해야 합니다. 특정 스크립트를 실행하기 위해 비밀번호를 설정하는 방법이 있습니다.
답변1
스도어쩌면 그게 갈 길일 수도 있습니다.
특정 사용자가 스크립트를 소유자 및 실행 가능하게 만들고 다른 사용자가 액세스할 수 없도록 허용합니다(예: 700 권한).
둘째, sudoers를 사용하여 sudoers 파일을 편집 visudo
하고 다음과 같은 줄을 추가합니다.
%your_group ALL=path_to_script/script
스크립트를 실행할 수 있는 모든 사용자를 your_group에 추가해야 합니다.
따라서 your_group에 속하지 않은 사람들은 스크립트를 실행할 수 없습니다. 또 다른 방법은 사용자 이름을 지정하는 것입니다.
username ALL=path_to_script/script
답변2
비밀번호는 승인된 사용자만 읽을 수 있도록 해야 합니다. 비밀번호를 스크립트에 저장하지 말고 스크립트에서 읽는 별도의 파일에 저장하세요. 이런 방식으로 권한을 관리하는 것이 훨씬 쉽습니다. 자격 증명을 스크립트에 저장하면 최종 위치를 결정하기가 어렵습니다. 실수로 복사될 수 있고, 버전 제어에 입력해야 하는 위치 등이 있을 수 있습니다.
자격 증명을 스크립트에서 분리하면 두 번째로 더 중요한 이점이 있습니다. 이는 "스크립트 실행 권한"과 "리소스 액세스 권한"을 구분합니다. 이는 실제로 사람들이 스크립트를 실행하는 것을 방지하려는 것이 아니라 사람들이 리소스에 액세스하는 것을 방지하려고 하기 때문에 좋습니다. 따라서 비밀번호 파일에 대한 권한을 적절하게 설정하면 괜찮을 것입니다.
권한을 관리하는 쉬운 방법은 그룹을 만들고 리소스에 대한 액세스 권한이 있는 사용자를 해당 그룹에 배치하는 것입니다. 그룹을 그룹이라고 부르고 seniors
사용자 alice
와 bob
리소스에 대한 액세스를 허용합니다. seniors
(예:)이라는 그룹을 만들고 addgroup seniors
해당 그룹에 사용자를 추가합니다(예: adduser alice seniors; adduser bob seniors
). 이 그룹이 소유 seniors
하고 이 그룹만 읽을 수 있는 비밀번호 파일을 만듭니다 .
chgrp seniors password.txt
chmod u=rw,g=r,o= password.txt # or chmod 640 password.txt for short
특정 사용자가 스크립트를 실행할 수 있지만 리소스에 임의로 액세스할 수는 없도록 하고 싶을 수도 있습니다. 귀하의 질문에서는 이에 대해 언급하지 않았지만 만일을 대비하여 수행 방법을 설명하겠습니다.
사용자가 특정 스크립트를 실행할 수 charlie
있어야 dominique
하지만 리소스에 액세스할 수는 없다고 가정합니다. 라는 그룹을 만들고 juniors
이러한 사용자를 해당 그룹에 넣습니다. (실제로 그룹을 만들 필요는 없지만 관리가 더 쉬워집니다.)스도이 규칙을 사용하면 그룹 내의 사용자는 juniors
그룹의 권한을 얻을 수 있지만 seniors
특정 프로그램(비밀번호 파일을 읽는 스크립트)만 실행할 수 있습니다. 다음 줄을 파일 visudo
에 추가하려면 다음을 실행하세요 .sudoers
%juniors ALL = (:seniors) /path/to/script ""
하위 항목은 를 호출하여 스크립트를 실행할 수 있습니다 sudo -g seniors /path/to/script
. 그러면 이 그룹이 부여한 추가 권한으로 스크립트가 실행됩니다 seniors
. 그럼에도 불구하고, 호출하는 사용자는 sudo
비밀번호 파일에 접근할 수 없습니다(스크립트에 버그가 있거나 속아서 공개할 수 있는 경우는 제외).
sudo는 누군가가 비밀번호를 모르고 리소스에 액세스할 수 있어야 하는 경우에만 유용하다는 점을 다시 한 번 기억하세요. 특정 사용자에게 비밀번호에 대한 액세스를 제한하고 다른 사용자가 리소스에 액세스하는 것을 허용하지 않으려면 아무 것도 수행되지 않습니다.
답변3
답변해주신 분들께 감사드립니다. 내가 구현한 최종 대답은... 이 사이트의 다른 곳에서 비밀번호를 /etc/shadow와 비교하는 루틴을 찾았습니다.
저는 그래픽 인터페이스를 사용하고 있기 때문에 zenity를 사용하여 비밀번호를 묻는 메시지를 표시하고 있습니다. 자동 로그인으로 인해 RPi 사용자는 자신의 비밀번호를 알 수 없습니다. 비밀번호를 입력하면 사용자 계정의 솔트를 사용하여 해시로 변환되고 결과 해시가 원본 해시와 비교됩니다. 동일하다면 터미널 프로그램을 실행하세요.
zenity 취소 버튼을 누르거나 잘못된 비밀번호를 입력하면 아무 일도 일어나지 않습니다.
grep /etc/shadow 파일 권한이 필요한 스크립트를 실행하기 위해 /etc/sudoers.d/myfile = UserA ALL=(ALL) NOPASSWD: /opt/myFiles/startTerminal.sh에 항목이 있습니다.
스크립트는 다음과 같습니다
USERNAME=UserA
PASSWD=$(zenity --forms --title=" " \
--text="Enter Password" \
--add-password="" )
if [[ $? -eq 0 ]]; then
export PASSWD
ORIGPASS=`grep -w "$USERNAME" /etc/shadow | cut -d: -f2`
export ALGO=`echo $ORIGPASS | cut -d'$' -f2`
export SALT=`echo $ORIGPASS | cut -d'$' -f3`
GENPASS=$(perl -le 'print crypt("$ENV{PASSWD}","\$$ENV{ALGO}\$$ENV{SALT}\$")')
if [ "$GENPASS" == "$ORIGPASS" ]; then
/usr/bin/lxterminal &
exit 0
fi
fi