내 문제에 대한 간략한 소개: 이 명령은 ps
시스템 프로세스에 대한 정보를 인쇄합니다.
그런데 로그인을 해보니뿌리x
그리고 권한 변경ps
chmod -x /bin/ps
chmod u+x /bin/ps
ls -l /bin/ps
-rwxr--r-- 1 root root ...... ps
그런 다음 새 쉘 스크립트 파일을 만듭니다.call_ps_via_root.sh
#!/bin/bash
ps
그리고 x
권한 설정
chmod +x /bin/call_ps_via_root.sh
ls -l /bin/call_ps_via_root.sh
-rwxr-xr-x 1 root root ...... call_ps_via_root.sh
그 후 일반 사용자로 로그인했습니다.남자 이름, 그런 다음 입력 ps
하면 인쇄됩니다.
Permission denied
나는 들어간다/bin/call_ps_via_root.sh
여전히 거부되었습니다. 어떻게 작동하게 할 수 있나요 call_ps_via_root.sh
?
답변1
당신은 할 수 없습니다: /bin/ps
루트로만 실행 가능하게 만들면 루트에서만 실행할 수 있습니다. 권한 확인을 우회하기 위해 스크립트를 래핑할 수는 없습니다.
사용자 ID 설정
일반 사용자가 루트로 호출하도록 하려면 ps
set-uid 권한을 확인해야 합니다. ~에서setuid 기사위키피디아에서:
setuid 및 setgid(각각 "실행 시 사용자 ID 설정" 및 "실행 시 그룹 ID 설정"의 약어)1사용자가 실행 파일 소유자 또는 그룹의 권한으로 실행 파일을 실행할 수 있도록 허용하는 Unix 액세스 권한 플래그입니다. 이는 컴퓨터 시스템의 사용자가 일시적으로 상승된 권한으로 프로그램을 실행하여 특정 작업을 수행할 수 있도록 하는 데 종종 사용됩니다. 제공된 가정된 사용자 ID 또는 그룹 ID 권한이 항상 승격되는 것은 아니지만 최소한 구체적입니다.
chmod에 대한 매뉴얼 페이지도 참조하십시오.
스도
일반 사용자가 루트를 통해서만 실행 파일을 실행하도록 하려면sudo
. 이를 통해 어떤 사용자가 어떤 작업을 수행할 수 있는지 구성할 수 있습니다.
답변2
-rwxr--r-- 1 root root ...... ps
이는 이를 소유한 사용자에게 읽기, 쓰기 및 실행 권한이 있는 반면 다른 모든 사용자에게는 읽기 권한만 있음을 의미합니다. 그래서 루트 외에는 누구도 그것을 실행할 수 없습니다 ps
.
귀하가 작성한 스크립트는 모든 사람이 실행할 수 있지만 이를 호출하는 사람의 권한을 상속하므로 해당 스크립트를 실행하려고 하면 ps
여전히 일반 사용자이기 때문에 "권한 거부" 메시지가 표시됩니다.
내 생각엔 일반 사용자가 특정 옵션을 사용하여 실행하는 것을 방지하고 싶지만 ps
(나에게는 이해가 되지 않음) 스크립트에 약간 또는 그 이상을 추가해야 할 것입니다 setuid
(자세한 내용은 매뉴얼 페이지 참조). 이렇게 하면 스크립트 호출자로부터 권한을 가져오는 것이 아니라 스크립트를 소유한 사람으로부터 권한을 가져옵니다.setgid
chmod
하지만 조심해: suid
스크립트에 비트를 설정하는 것은 본질적으로 안전하지 않습니다. 쉘에 명령을 실행하도록 지시하는 등 환경 변수를 사용하여 많은 작업을 수행할 수 있으며 그런 다음 루트로 실행됩니다(여기서는 고정 비트가 있는 사용자 정의 C 프로그램이 더 나은 솔루션입니다).
편집하다: 또 다른 해결책은 sudo
ed 프로그램이 허용하는 매개변수를 여기에서 구성하는 것입니다 sudo
.
편집 2:사용자를 비활성화하는 것이 왜 좋지 않다고 생각합니까 ps
? 내가 아는 한, 모든 정보 ps
출력은 시스템을 통해서도 가능합니다 /proc
. 따라서 다른 조치를 취하지 않으면 난독화를 통해 보안(또는 달성하려는 모든 것)을 달성하기만 하면 됩니다.
답변3
일반적으로 말하면 "sudo"를 사용하는 것이 좋습니다. sudo가 설치 및 구성되어 있지 않은 경우
su - someuser -c "/yourscript.sh"
답변4
의 전체 기능에 대한 액세스를 sudo
제공 하지 않고 루트 도구를 통해서만 사용할 수 있는 정보에 대한 액세스 권한을 사용자에게 부여하려는 경우가 있습니다 .smartctl -A
smartctl
프로그램을 예로 들어보겠습니다 hddtemp
. 드라이브의 SMART 데이터에서 특정 하드 드라이브의 온도를 읽고 이를 표준 출력으로 인쇄합니다. 이 작업을 수행하려면 일반적으로 루트 권한이 필요하지만 프로그램이 루트로 실행되어 루트가 아닌 클라이언트 요청을 백그라운드에서 기다리고 소켓에 연결할 때 출력을 전달하는 데몬 모드도 제공합니다. 이 방법으로 ps
클라이언트가 필요할 때 실행되고 출력을 리디렉션하는 데몬(루트로 시작)을 구현할 수 있습니다 .
다음 Python 예제를 고려하십시오(루트로 실행해야 할 수도 있음).
import socket, subprocess
HOST = '127.0.0.1'
PORT = 50006
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)
while True:
conn,addr = s.accept()
pipe = subprocess.Popen(["/bin/ps"],stdout=subprocess.PIPE).stdout
for line in pipe:
conn.send(line)
conn.close()
netcat localhost 50006
그런 다음 하나를 입력 하면 call_ps_via_root.sh
완료됩니다.