Chame 'ps' como um usuário normal no Linux

1

Uma breve introdução à minha pergunta: o comando ps imprimirá as informações dos processos do sistema.

Mas quando eu fizer login como root e alterar a permissão x de ps

chmod -x /bin/ps
chmod u+x /bin/ps
ls -l /bin/ps 
-rwxr--r-- 1 root root ...... ps

Em seguida, criei um novo arquivo de script de shell call_ps_via_root.sh

#!/bin/bash
ps

e defina a x permission

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

Depois disso, faço login com um usuário normal sammy e digito ps , ele será impresso

Permission denied

e eu digito /bin/call_ps_via_root.sh

Ainda é negado. Como posso fazer isso funcionar por call_ps_via_root.sh ?

    
por sammy 03.11.2011 / 10:02

4 respostas

7

Você não pode: se você tornar o /bin/ps apenas executável pelo root, ele será apenas executável pelo root. Você não pode simplesmente envolver um script em torno dele para ignorar a verificação de permissão.

set-user-id

Se você quiser que um usuário normal chame ps como root, consulte a permissão set-uid. Do artigo setuid na Wikipedia:

setuid and setgid (short for "set user ID upon execution" and "set group ID upon execution", respectively)1 are Unix access rights flags that allow users to run an executable with the permissions of the executable's owner or group. They are often used to allow users on a computer system to run programs with temporarily elevated privileges in order to perform a specific task. While the assumed user id or group id privileges provided are not always elevated, at a minimum they are specific.

Veja também a página man do chmod

sudo

Se você quiser que um usuário normal execute algo executável pelo root, use apenas sudo . Ele permitirá que você configure qual usuário poderá executar o que.

    
por 03.11.2011 / 10:11
3
-rwxr--r-- 1 root root ...... ps

Isso diz que o usuário proprietário possui permissão de leitura, gravação e execução, e todos os outros apenas leem. Portanto, ninguém além do root pode executar ps .

O script que você escreveu é executável por todos, mas herda as permissões de quem invoca, então ele também recebe a "permissão negada" ao tentar executar o ps , já que ele ainda é um usuário normal.

Meu palpite é que você deseja impedir que usuários comuns executem ps com determinadas opções (não que isso faça sentido para mim), mas você precisa adicionar o setuid bit ou setgid bit ao seu script (veja man page de chmod ). Quando você faz isso, obtém as permissões não do invocador do script, mas daquele que possui o script.

MAS CUIDADO : Definir o suid bit em scripts é inerentemente inseguro. Você pode fazer muito com variáveis de ambiente, por exemplo diga ao shell para executar comandos - e então eles são executados como root (aqui um programa c customizado com o bit pegajoso é a melhor solução).

EDIT : outra solução seria usar sudo . Aqui você também pode configurar quais parâmetros são permitidos para um programa sudo ed.

EDIT2: Por que eu acho que não é uma boa idéia proibir que o usuário apenas execute ps ? Até onde eu sei, todas as informações ps outputs também podem ser adquiridas através do sistema /proc - então, se você não fizer nada, é apenas segurança (ou o que você quer alcançar) por ofuscação.

    
por 03.11.2011 / 10:11
2

Geralmente, é melhor usar o 'sudo'. Se você não tem o sudo instalado e configurado

su - someuser -c "/yourscript.sh"
    
por 03.11.2011 / 10:15
0

Às vezes, você deseja conceder aos usuários acesso a informações disponíveis apenas com o uso de ferramentas raiz, sem conceder privilégios de usuário root por sudo . Por exemplo, para fornecer as informações de um smartctl -A sem fornecer acesso à funcionalidade completa de smartctl .

Considere, por exemplo, o programa hddtemp . Ele lê a temperatura de um determinado disco rígido do S.M.A.R.T. dados da unidade e imprime para stdout. Enquanto você normalmente precisa de privilégios de root para fazer isso, ele também fornece um modo daemon, s.t. o programa seria executado como raiz, aguardaria em segundo plano solicitações de cliente não raiz e encaminharia a saída para elas sempre que conectassem o soquete. Dessa forma, você poderia implementar um daemon (iniciado como root) que executa ps e redireciona sua saída sempre que o cliente desejar.

Considere este exemplo do Python (talvez precise ser executado como root):

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()

você pode colocar um netcat localhost 50006 no seu call_ps_via_root.sh e está pronto.

    
por 03.11.2011 / 10:41