To pytanie dotyczy najlepszych praktyk. Uruchamiam skrypt wdrażania za pomocą Fabric. Mój użytkownik wdrożenia "wdrażanie" wymaga sudo, aby ponownie uruchomić usługi. Używam funkcji sudo z tkaniny do uruchamiania tych poleceń w moim skrypcie. Działa to dobrze, ale monituje o hasło podczas wykonywania skryptu. NIE chcę wpisywać hasła podczas wdrażania. Jaka jest najlepsza praktyka tutaj. Jedynym rozwiązaniem, jakie mogę wymyślić jest zmiana uprawnień sudo, aby nie wymagać hasła dla poleceń uruchamianych przez mojego użytkownika wdrożenia. Nie wydaje mi się to właściwe.Tkanina Sudo Brak rozwiązania hasła
Odpowiedz
Jak Bartek sugeruje również, umożliwić hasłem mniej sudo dla "użytkownika" wdrażania w pliku sudoers.
Coś jak:
run('echo "{0} ALL=(ALL) ALL" >> /etc/sudoers'.format(env.user))
To nie jest dobry sposób z kilku powodów. Po pierwsze, doda ten wiersz za każdym razem, gdy polecenie zostanie uruchomione. Po drugie, plik sudoers nie ma być modyfikowany w ten sposób. Jeśli wystąpi błąd w pliku sudoers, może nie być w stanie ponownie uruchomić polecenia sudo bez uzyskiwania dostępu do konta root ręcznie. –
Moja odpowiedź brzmi: umożliwić sudo bez haseł. W jaki sposób użytkownik robi to jest inne pytanie, właśnie zasugerowałem jedną metodę. I tak, użytkownik powinien zdawać sobie sprawę z pułapek, o których wspomniałeś. –
Wygląda na to, że sudo
może wcale nie być tak źle. Możesz określić, które polecenia użytkownik może uruchamiać i argumenty, które może wykonać polecenie (man sudoers
). Jeśli problem jest tylko konieczności wpisywania hasła, opcja wiązałaby się z wykorzystaniem modułu pexpect
aby zalogować się automatycznie, może z hasłem, które można przechowywać zaszyfrowanych:
import pexpect, sys
pwd = getEncryptedPassword()
cmd = "yourcommand"
sCmd = pexpect.spawn('sudo {0}'.format(cmd))
sCmd.logfile_read = sys.stdout
sCmd.expect('Password:')
sCmd.sendline(pwd)
sCmd.expect(pexpect.EOF)
Można użyć:
fabric.api import env
# [...]
env.password = 'yourpassword'
Te rzeczy idą do vcs ujawniając hasła nigdy nie są najlepszym pomysłem, szczególnie mówimy tu o haseł do serwera. –
Można również użyć haseł dla wielu maszynach:
from fabric import env
env.hosts = ['[email protected]:port1', '[email protected]']
env.passwords = {'[email protected]:port1': 'password1', '[email protected]': 'password2'}
Zobacz tę odpowiedź: https://stackoverflow.com/a/5568219/552671
Idealnym rozwiązaniem jest utworzenie użytkownika na serwerze, który jest używany tylko do wdrożenia (np. deploy
). Następnie ustaw env.user=deploy
w swoim pliku fabfile. Następnie na serwerach, można dać użytkownikowi niezbędną zgodę na zasadzie poleceń przez dowódcę w pliku sudoers:
WAŻNE: Zawsze używaj sudo visudo
zmodyfikować pliki sudoers
Cmnd_Alias RELOAD_SITE = /bin/bash -l -c supervisorctl*, /usr/bin/supervisorctl*
deploy ALL = NOPASSWD: RELOAD_SITE
Możesz dodać wiele dyrektyw Cmnd_Alias
, zgodnie z potrzebą użytkownika wdrażania, a następnie przyznać dostęp NOPASSWD
dla każdego z tych poleceń. Aby uzyskać więcej informacji, patrz man sudoers
.
Chciałbym zachować moją konfigurację sudoers specyficzną dla wdrożenia w /etc/sudoers.d/deploy
i dołączyć ten plik z /etc/sudoers
, dodając na koniec: includedir /etc/suoders.d
.
Najlepszym sposobem na to jest podzadanie. Możesz poprosić o hasło w pliku fabfile i nigdy nie ujawniać żadnych haseł ani nie wprowadzać lekkomyślnych zmian w konfiguracji sudo na zdalnym systemie (ach).
import getpass
from fabric.api import env, parallel, run, task
from fabric.decorators import roles
from fabric.tasks import execute
env.roledefs = {'my_role': ['host1', 'host2']}
@task
# @parallel -- uncomment if you need parallel execution, it'll work!
@roles('my_role')
def deploy(*args, **kwargs):
print 'deploy args:', args, kwargs
print 'password:', env.password
run('echo hello')
@task
def prompt(task_name, *args, **kwargs):
env.password = getpass.getpass('sudo password: ')
execute(task_name, *args, role='my_role', **kwargs)
pamiętać, że można nawet połączyć to z równoległego wykonywania i zadania prompt
nadal działa tylko raz, podczas gdy zadaniem deploy
biegnie dla każdego hosta w roli równolegle.
Wreszcie przykładem jak można ją wywołać:
$ fab prompt:deploy,some_arg,another_arg,key=value
- 1. Tkanina: Lokalne użycie polecenia
- 2. Brak hasła dla użytkownika "postgres" error
- 3. fe_sendauth: brak hasła dostarczane
- 4. Tkanina wciąż prosi o podanie hasła przy użyciu połączenia SSH
- 5. Przechowywanie hasła sudo jako zmiennej w skrypcie - czy jest bezpieczne?
- 6. Wykonywanie poleceń jako root bez hasła root lub sudo
- 7. Jak uruchomić dowolne polecenie sudo Fabric bez wpisywania hasła?
- 8. Net :: Polecenie SSH sudo zawiesza się po wprowadzeniu hasła
- 9. Funkcja zwraca "Brak rozwiązania" Zamiast "Nic"
- 10. pgAdmin daje mi błąd: brak hasła dostarczane
- 11. właściwy sposób sudo nad ssh
- 12. Ponownie uruchom nginx bez sudo?
- 13. Najlepsze praktyki, aby uniknąć błędu Jenkinsa: sudo: brak bieżącego tty i nie określono programu wywołującego pytania
- 14. Błąd: Nie można odnaleźć modułu „tkanina-client”
- 15. Tkanina Jak wyświetlić/wyeksportować szczegóły wydarzeń
- 16. Tkanina js ruchomy obraz z klawiaturą
- 17. Skrypt powłoki wywołuje sudo; w jaki sposób wyłączyć monit o podanie hasła?
- 18. Devise Niepotwierdzenie hasła/potwierdzenie hasła
- 19. Aktualizacja klejnotów Sudo - uruchomić?
- 20. Korzystanie sudo z pętli
- 21. Manifestacja marionetki - komendy "sudo"?
- 22. sudo: nieznany użytkownik: postgres
- 23. sudo pip install django
- 24. Błąd "sudo pod install"
- 25. Dlaczego rvm install 2.0.0 prosi o hasło do sudo?
- 26. Rozwiązania WiX?
- 27. Rozwiązania buforowania
- 28. Odpowiedz: utwórz użytkownika z uprawnieniami sudo
- 29. Pierwsze sudo, aby poprosić o hasło za pośrednictwem GUI
- 30. Hashowanie hasła
Można spojrzeć na dodanie nowego użytkownika, specjalnie dla wdraża, kto ma dostęp do poleceń potrzebnych do uruchomienia bez korzystania z sudo. – Bartek