Jak wykonywać polecenia jako root w git po otrzymaniu haka

12

Niedawno skonfigurowałem zdalne repozytorium git na serwerze dla aplikacji internetowej działającej jako usługa Upstart. Chciałbym użyć haczyka po otrzymaniu do uruchomienia działań wymaganych do zaktualizowania kodu aplikacji i zatrzymania, a następnie ponownego uruchomienia usługi aktualizacji. To jest mój plik repo.git / hooks / post-receive:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
echo "Checking out new files and restarting app"
echo $USER
git checkout -f
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

Na podstawie informacji, które tutaj czytam: askUbuntu.com , sposobem na uruchomienie poleceń upstart jako root jest edycja mojego pliku visudo. Oto odpowiedni fragment:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service /sbin/stop myapp-service

Ale kiedy pcham push do pilota, otrzymuję dane wyjściowe takie jak:

$ git commit -am "test" && git push prod master
[master 59ffccd] test
 1 file changed, 1 insertion(+), 1 deletion(-)
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 544 bytes, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Checking out new files on production and restarting app
remote: admin
remote: 
remote: sudo: no tty present and no askpass program specified
remote: Sorry, try again.

Sprawdziłem, czy właściwy użytkownik wykonuje skrypt po odbiorze (admin, jak powtórzono powyżej).

Czy ktoś może mi pomóc zatrzymać, a następnie rozpocząć zadanie Upstart w skrypcie przechwytującym git po otrzymaniu? Dopuszczalne byłyby również skrypty javascript w języku Python, PHP lub node.js, gdyby były w stanie wykonać polecenie upstart łatwiej niż bash (jestem nowicjuszem w bash)

Przejrzałem mój dziennik uwierzytelniania i oto, co mam:

Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo:    admin : 3 incorrect password attempts ; TTY=unknown ; PWD=/home/admin/myapp.git ; USER=root ; COMMAND=/s$
Apr 24 19:35:21 myhost01 sudo: unable to execute /usr/sbin/sendmail: No such file or directory
Apr 24 19:35:21  myhost01 sudo: pam_unix(sudo:auth): conversation failed
djheru
źródło
Okrężnica wygląda źle po NOPASSWD. Czy sprawdziłeś także dzienniki? „/var/log/auth.log”
Elliott Frisch

Odpowiedzi:

6

Musisz rozdzielić polecenia w pliku sudoers za pomocą przecinków. Teraz, jesteś upoważniające jednego polecenia: /sbin/start myapp-service /sbin/stop myapp-service.

Musisz pisać admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.

użytkownik2313067
źródło
Dzięki za wskazówkę. Spróbuję tego później dzisiaj. Jeśli to zadziała, zaakceptuję twoją odpowiedź, a nie moją powyżej.
djheru
Dzięki, że zadziałało. Myślę, że nadal będę korzystać z osobnej trasy skryptu zamiast autoryzować wiele poleceń.
djheru
5

Ok, rozgryzłem to. Musiałem stworzyć osobny skrypt zawierający tylko polecenia, które chciałem uruchomić jako root.

#!/bin/bash
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

Następnie w moim skrypcie po otrzymaniu wykonaj:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
set -x
echo "Checking out new files on production and restarting app"
echo $USER
git checkout -f
sudo /home/admin/restart-myapp

I wreszcie w moim visudo:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL) NOPASSWD: /home/admin/restart-myapp

Mam nadzieję, że to pomaga komuś innemu

djheru
źródło
Jestem pewien, że kiedyś
okażę się
1

Mam plik, /etc/sudoers.d/root_groupktóry ma po prostu linię %root ALL=(ALL) NOPASSWD: ALL, i dodaję konta do katalogu głównego grupy, aby umożliwić im korzystanie sudobez hasła.

Jestem pewien, że istnieją konsekwencje dla bezpieczeństwa plików, które nie uwzględniały kont użytkowników w grupie „root”, ale jeśli się martwisz, możesz użyć innej grupy. Wystarczy zmienić linię %my_new_group ALL=(ALL) NOPASSWD: ALLi dodać odpowiednie konta do mojej_nowej_grupy.

jbo5112
źródło
Dziękuję, ale próbuję to skonfigurować, aby jedynymi poleceniami, które można uruchomić bez hasła, są zatrzymanie w górę i uruchomienie wywołań w skrypcie.
djheru