Napisałem skrypt CGI w Pythonie, który wywołuje bash
polecenia i musi przetestować udane logowanie do hosta.
Jak napisać na to test?
Na przykład, czy mogę utworzyć bash
skrypt, który przetestuje daną kombinację nazwy użytkownika i hasła względem zarejestrowanego użytkownika na hoście?
login
programu.Odpowiedzi:
Korzystanie z PAM jest najlepszym rozwiązaniem. Możesz napisać mały kod C lub zainstalować pakiet python-pam i użyć skryptu python, który jest dołączony do pakietu python-pam. Widzieć
/usr/share/doc/python-pam/examples/pamtest.py
źródło
/usr/share/doc/packages/python-pam/examples/pamtest.py
Skrypt pamtest.py może być używany do testowania poświadczeń w systemach korzystających z PAM do uwierzytelnienia jest zawarty w pakiecie python-pam (który wymaga Pythona), aw niektórych dystrybucjach pełna ścieżka jest/usr/share/doc/python-pam/examples/pamtest.py
.Właściwym podejściem do testowania, czy użytkownik może się zalogować, jest zalogowanie się jako ten użytkownik.
Dlatego zalecam użycie skryptu CGI
expect
do uruchomieniasu
, podania hasła i uruchomienia polecenia, które należy wykonać. Oto szkic skryptu expect, który właśnie to robi (ostrzeżenie: absolutnie niesprawdzony i nie jestem biegły w oczekiwaniu). Zastąp w nazwie użytkownika, haśle i poleceniu (gdzie napisałembob
,swordfish
isomecommand
); pamiętaj, aby podać poprawnie.Jeśli naprawdę nie chcesz wykonywać polecenia przez warstwę
su
(na przykład dlatego, że to, co robisz, musi być wykonane przez sam proces CGI), użyj funkcji expect i uruchom polecenietrue
i sprawdź, czy zwracany jest status 0.Innym podejściem byłoby użycie PAM bezpośrednio w aplikacji, poprzez powiązanie PAM Pythona .
źródło
su -c true bob && echo success
To wstyd, że su nie akceptują hasło jako argumentusu
ze skryptu CGI i do jego działania potrzebny jest terminal./bin/true
wystarczyłoby.Aby dokładniej odpowiedzieć: „Czy można utworzyć skrypt bash, który przetestuje daną kombinację nazwy użytkownika i hasła względem zarejestrowanego użytkownika na hoście?”
Tak.
źródło
shadow
grupa, co jest bardzo niezalecane dla CGI: potrzebna byłaby kolejna warstwa eskalacji uprawnień. I zakładasz, że określony algorytm mieszania hasła (obsługiwany przez openssl) i miejsce przechowywania haseł (/etc/shadow
w przeciwieństwie do np. NIS lub LDAP), który może, ale nie musi być tym, który jest faktycznie używany dla tego konkretnego użytkownika.Cytowane jest tutaj rozwiązanie PAM „C”, „Python”, pozwólcie, że dodam też perla :-)
Źródło: http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactactive ?
źródło
Jeśli masz dostęp do konta root i korzystasz z haseł md5, a po prostu musisz porównać hasła, możesz użyć modułu Perl Crypt :: PasswdMD5 . Weź skrót MD5 z / etc / shadow, usuń 1 $ $, a następnie podziel na pozostałe $. Pole 1 = Sól, Pole 2 = zaszyfrowany tekst. Następnie zaszyfruj tekst wprowadzony do twojego CGI, porównaj go z zaszyfrowanym tekstem, a Bob jest twoim wujem.
źródło
shadow
grupa, co jest bardzo niezalecane dla CGI: potrzebna byłaby kolejna warstwa eskalacji uprawnień. I zakładasz, że masz określony algorytm mieszania hasła (MD5, a nie bcrypt lub inny zalecany algorytm) i lokalizację przechowywania hasła (/etc/shadow
w przeciwieństwie np. Do NIS lub LDAP), który może, ale nie musi być tym, który jest faktycznie używany dla tego konkretnego użytkownika.Po kilku poszukiwaniach napisałem ten program C, którego można używać ze skryptu
Kompilujesz to z:
Możesz użyć go jako
źródło
shadow
grupa, co jest bardzo niezalecane dla CGI: potrzebna byłaby kolejna warstwa eskalacji uprawnień. I zakładasz, że określony algorytm mieszania hasła (obsługiwany przez openssl) i miejsce przechowywania haseł (/etc/shadow
w przeciwieństwie do np. NIS lub LDAP), który może, ale nie musi być tym, który jest faktycznie używany dla tego konkretnego użytkownika. Użyj PAM, zna swoją pracę.Ponieważ wspomniałeś, że używasz CGI w pythonie, prawdopodobnie należy założyć, że używasz Apache jako serwera httpd. Jeśli tak, pozostaw proces uwierzytelniania swojego programu Apache i pozwól uwierzytelnionym osobom wykonywać skrypty / programy cgi.
Istnieje wiele modułów, które mogą przeprowadzać dla Ciebie uwierzytelnianie na Apache, tak naprawdę zależy to od tego, jakiego rodzaju mechanizmu uwierzytelniania szukasz. Sposób, w jaki zacytowałeś pytanie, wydaje się być związany z uwierzytelnianiem lokalnego konta hosta na podstawie plików / etc / passwd, shadow. Moduł, który przychodzi do mojego szybkiego wyszukiwania w tym zakresie, jest
mod_auth_shadow
. Zaletą jest to, że pozwalasz komuś autorytatywnemu (działającemu na porcie uprawnień 80) uwierzytelnić użytkownika / hasło i możesz polegać na uwierzytelnionych informacjach użytkownika w celu uruchomienia poleceń w imieniu użytkownika, jeśli to konieczne.Dobre linki na początek:
http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2
http://mod-auth-shadow.sourceforge.net/
http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu
Innym podejściem jest użycie modułu SuEXEc Apache, który wykonuje procesy (programy cgi) w imieniu uwierzytelnionego użytkownika.
źródło
Ten kod używający PAM działał dla mnie:
źródło
Najlepszą rzeczą, jaką możesz zrobić, jeśli potrzebujesz skryptu do zalogowania się na hoście, jest skonfigurowanie klucza ssh między hostami.
Link: http://pkeck.myweb.uga.edu/ssh/
Prawie podniosłem to ze strony
Najpierw zainstaluj OpenSSH na dwóch komputerach z systemem UNIX, szybko i wydajnie. To działa najlepiej przy użyciu kluczy DSA i SSH2 domyślnie, o ile wiem. Wszystkie pozostałe HOWTO, które widziałem, wydają się mieć do czynienia z kluczami RSA i SSH1, a instrukcje nie zaskakująco nie działają z SSH2. Na każdym komputerze wpisz ssh somemachine.example.com i nawiąż połączenie za pomocą zwykłego hasła. Spowoduje to utworzenie katalogu .ssh w twoim katalogu domowym z odpowiednimi perms. Na podstawowym komputerze, na którym chcesz mieszkać tajne klucze (powiedzmy szybko), wpisz
Spowoduje to monit o tajne hasło. Jeśli jest to twój główny klucz tożsamości, upewnij się, że używasz dobrego hasła. Jeśli to zadziała, otrzymasz dwa pliki o nazwach id_dsa i id_dsa.pub w katalogu .ssh. Uwaga: możliwe jest naciśnięcie klawisza Enter, gdy pojawi się monit o podanie hasła, co spowoduje utworzenie klucza bez hasła. To jest zły pomysł ™ na klucz tożsamości, więc nie rób tego! Poniżej przedstawiono zastosowania kluczy bez haseł.
Skopiuj plik id_dsa.pub do katalogu .ssh drugiego hosta o nazwie klucze_autoryzowane2. Teraz krzepki jest gotowy na przyjęcie twojego klucza ssh. Jak powiedzieć, jakich kluczy użyć? Zrobi to polecenie ssh-add. Aby przeprowadzić test, wpisz
Spowoduje to uruchomienie ssh-agent, dodanie domyślnej tożsamości (monitowanie o podanie hasła) i odrodzenie powłoki bash. Z tej nowej powłoki powinieneś być w stanie:
Powinieneś być w stanie się zalogować
źródło