Linux에서 일반 사용자로 "ps"를 호출합니다.

Linux에서 일반 사용자로 "ps"를 호출합니다.

내 문제에 대한 간략한 소개: 이 명령은 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 설정

일반 사용자가 루트로 호출하도록 하려면 psset-uid 권한을 확인해야 합니다. ~에서setuid 기사위키피디아에서:

setuid 및 setgid(각각 "실행 시 사용자 ID 설정" 및 "실행 시 그룹 ID 설정"의 약어)1사용자가 실행 파일 소유자 또는 그룹의 권한으로 실행 파일을 실행할 수 있도록 허용하는 Unix 액세스 권한 플래그입니다. 이는 컴퓨터 시스템의 사용자가 일시적으로 상승된 권한으로 프로그램을 실행하여 특정 작업을 수행할 수 있도록 하는 데 종종 사용됩니다. 제공된 가정된 사용자 ID 또는 그룹 ID 권한이 항상 승격되는 것은 아니지만 최소한 구체적입니다.

chmod에 대한 매뉴얼 페이지도 참조하십시오.

스도

일반 사용자가 루트를 통해서만 실행 파일을 실행하도록 하려면sudo. 이를 통해 어떤 사용자가 어떤 작업을 수행할 수 있는지 구성할 수 있습니다.

답변2

-rwxr--r-- 1 root root ...... ps

이는 이를 소유한 사용자에게 읽기, 쓰기 및 실행 권한이 있는 반면 다른 모든 사용자에게는 읽기 권한만 있음을 의미합니다. 그래서 루트 외에는 누구도 그것을 실행할 수 없습니다 ps.

귀하가 작성한 스크립트는 모든 사람이 실행할 수 있지만 이를 호출하는 사람의 권한을 상속하므로 해당 스크립트를 실행하려고 하면 ps여전히 일반 사용자이기 때문에 "권한 거부" 메시지가 표시됩니다.

내 생각엔 일반 사용자가 특정 옵션을 사용하여 실행하는 것을 방지하고 싶지만 ps(나에게는 이해가 되지 않음) 스크립트에 약간 또는 그 이상을 추가해야 할 것입니다 setuid(자세한 내용은 매뉴얼 페이지 참조). 이렇게 하면 스크립트 호출자로부터 권한을 가져오는 것이 아니라 스크립트를 소유한 사람으로부터 권한을 가져옵니다.setgidchmod

하지만 조심해: suid스크립트에 비트를 설정하는 것은 본질적으로 안전하지 않습니다. 쉘에 명령을 실행하도록 지시하는 등 환경 변수를 사용하여 많은 작업을 수행할 수 있으며 그런 다음 루트로 실행됩니다(여기서는 고정 비트가 있는 사용자 정의 C 프로그램이 더 나은 솔루션입니다).

편집하다: 또 다른 해결책은 sudoed 프로그램이 허용하는 매개변수를 여기에서 구성하는 것입니다 sudo.

편집 2:사용자를 비활성화하는 것이 왜 좋지 않다고 생각합니까 ps? 내가 아는 한, 모든 정보 ps출력은 시스템을 통해서도 가능합니다 /proc. 따라서 다른 조치를 취하지 않으면 난독화를 통해 보안(또는 달성하려는 모든 것)을 달성하기만 하면 됩니다.

답변3

일반적으로 말하면 "sudo"를 사용하는 것이 좋습니다. sudo가 설치 및 구성되어 있지 않은 경우

su - someuser -c "/yourscript.sh"

답변4

의 전체 기능에 대한 액세스를 sudo제공 하지 않고 루트 도구를 통해서만 사용할 수 있는 정보에 대한 액세스 권한을 사용자에게 부여하려는 경우가 있습니다 .smartctl -Asmartctl

프로그램을 예로 들어보겠습니다 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완료됩니다.

관련 정보