2009-09-30 26 views
9

W systemie Linux chcę uruchomić skrypt w języku Python jako inny użytkownik.Uruchamianie skryptu Pythona jako innego użytkownika

Zrobiłem już program otoki w C++, który wywołuje skrypt, ponieważ zdałem sobie sprawę, że własność uruchamiania skryptu zależy od własności interpretera python. Potem zmieniam program C++ na innego użytkownika i uruchamiam program C++.

Ta konfiguracja prawdopodobnie nie działa. Jakieś pomysły?

+0

Czy Twoi inni użytkownicy nie mają uprawnień do uruchomienia 'python'? – Arkady

+2

To nie jest kwestia uruchomienia Pythona. Skrypt musi robić rzeczy, które wymagają pewnych uprawnień. Nie chcę przyznawać wszystkim użytkownikom tych uprawnień. Skrypt działa jak coś w rodzaju kontrolowanego dawcy uprawnień, ale najpierw skrypt potrzebuje uprawnień ... – johannix

+0

@johannix Natknąłem się również na dokładny problem. Czy znalazłeś jakieś obejście? – Anubis

Odpowiedz

4

Brzmi jak chcesz używać setuid trochę

+0

Należy pamiętać, że to nie zmieni wszystkich zmiennych środowiskowych. tzn. '~ /' nadal będzie się rozszerzać do '/ home/old_user /', co może spowodować pewne problemy w dalszej części drogi. –

0

Użyj polecenia sudo.

Aby uruchomić program jako użytkownik, system musi "uwierzytelnić" tego użytkownika.

Oczywiście, root może uruchomić dowolny program jako dowolny użytkownik, a każdy użytkownik może su do innego użytkownika z hasłem.

Program sudo można skonfigurować tak, aby zezwolić grupie użytkowników na sudo konkretne polecenie jako określonego użytkownika. Na przykład można utworzyć grupę scriptUsers i użytkownika scriptRun. Następnie skonfiguruj sudo, aby każdy użytkownik w scriptUsers stał się TYLKO scriptRun, aby uruchomić skrypt.

+0

Nie można używać sudo, ponieważ skrypt musi być używany przez inne osoby. – johannix

1

Daj tym użytkownikom możliwość sudo su $dedicated_username i dostosuj uprawnienia w systemie, aby $dedicated_user miał wystarczający, ale nie przesadny dostęp.

11

Można ustawić użytkownikowi os.setuid(), i można dostać uid z pwd. tak:

>>> import pwd, os 
>>> uid = pwd.getpwnam('root')[2] 
>>> os.setuid(uid) 

Oczywiście działa to tylko wtedy, gdy użytkownik lub plik wykonywalny ma na to zgody. Dokładnie, jak to ustawić, nie wiem. Oczywiście działa, jeśli jesteś rootem. Myślę, że możesz potrzebować flagi setuid na pliku wykonywalnym Pythona, a to zostawiłoby lukę bezpieczeństwa. możliwe, że jest permittable, jeśli użytkownik, którego ustawiłeś, jest dedykowanym użytkownikiem z ograniczonym dostępem, który nie może nic zrobić, z wyjątkiem tego, co musisz zrobić.

Zabezpieczenia Unix, oparte na użytkownikach i ustawieniach i innych rzeczach, nie są zbyt dobre ani praktyczne i łatwo można zostawić duże luki w zabezpieczeniach. Bardziej bezpieczną opcją jest wykonanie typowego serwera-klienta, więc masz demona, który robi wszystko, a klient z nim rozmawia. Demon może wtedy działać z wyższymi poziomami bezpieczeństwa niż użytkownicy, ale użytkownicy będą musieli podać nazwę i hasło podczas uruchamiania skryptu lub identyfikować się z kluczem publicznym lub prywatnym lub salsuchami.

+0

Użyłem tego kodu w skrypcie uruchamianym ze skryptu startowego Ubuntu, który NIE wymagał bitu setuid w pliku wykonywalnym Pythona. – EarlCrapstone

+0

Działa bez bitu setuid, jeśli jesteś rootem lub sudo skryptu. –

Powiązane problemy