launch ipython mas não como root

1

ipython é lançado como root (UID); ok, mas preciso disso depois que o ipython não puder rodar e não permitir, script / código que possa ganhar privilégios de root. eg

Eu inicio o ipython, ok o UID é root. E no meu arquivo visudo eu mudo:

root ALL=NOEXEC:/usr/bin/sudo
user ALL=NOEXEC:/usr/bin/sudo

E tire os usuários de sudoers.

Então ... eu corro o próximo código:

import subprocess
from subprocess import Popen, PIPE
COMMAND = "sudo apt-get install g++ -y" #In this line, you put the code that you want to run
proccess = Popen(COMMAND, shell=True, executable="/bin/bash", stdout=PIPE, stderr=PIPE)
result = proccess.communicate()
o, e = result

print "*"*100
print "Output"
print "*"*100
for i in o.split("\n"):
    print i

print "*"*100
print "Errors"
print "*"*100
for i in e.split("\n"):
    print i

Eu preciso que o ipython não consiga fazer isso. Eu mais, se eu sair de sudo do comando; ipython me permite fazer isso !!!!

Por favor, ajude! Obrigado!

    
por Xpersona 18.06.2015 / 23:27

1 resposta

0

Depois de lançar um intérprete como root, ele inevitavelmente tem privilégios de root. Para eliminar privilégios, você pode escrever um wrapper de script de shell no qual você altera o usuário e o grupo do processo e inicia o interpretador sem privilégios.

Solução 1: wrapper de script de shell

  1. Você precisa de um usuário sem privilégios para o qual pode alternar (crie um com sudo adduser --system --no-create-home [username] , se necessário, mas sua conta de login deve ser boa)
  2. inicie python com sudo su -c ipython [username] e verifique se não é privilegiado com

    import os
    os.getuid() # should be [username]'s UID
    os.geteuid() # should be [username]'s UID
    import subprocess
    subprocess.check_call(["sudo", "-i"]) # should raise CalledProcessError
    

Esta solução fornece apenas flexibilidade suficiente para iniciar o intérprete. Se você quiser escrever código e lidar com partes privilegiadas e sem privilégios, considere a solução 2.

Solução 2: descartar privilégios em python

Caso você queira gerenciar privilégios no interpretador python :

A decisão de descartar privilégios em seu código não é trivial e precisa levar em consideração a troca entre conforto (você não quer digitar sua senha o tempo todo), segurança (o menor número de código possível deve ser executado com privilégios) e manutenibilidade (tanto código quanto possível não deve se preocupar com privilégios).

Abordagens:

  • sudo oferece uma maneira de adquirir privilégios para um comando em um intérprete não privilegiado, mas requer interação do usuário e dificulta a execução do código sem privilégios (porque você tem a instrução sudo em todos os seus comandos).
  • Se você iniciar o intérprete com privilégios, poderá descartar privilégios com os.set[/e/r/s]uid e os.set[/e/r/s]gid . A palestra da documentação do python é obrigatória neste caso.

Em geral, você deve escrever o máximo de código possível sem ter que lidar com privilégios e colocar esse código em uma função que exclua privilégios, ou seja, eu não recomendo a abordagem sudo , também porque isso torna o código dependente em sudo .

    
por Karl Richter 18.06.2015 / 23:48