Dowiedz się, jak działa użytkownik Apache?

212

Chcę zabezpieczyć katalog przesyłania plików na moim serwerze, jak to pięknie tu opisano, ale mam jeden problem, zanim będę mógł wykonać te instrukcje. Nie wiem, jak działa użytkownik Apache.

Znalazłem sugestię, że możesz zajrzeć do httpd.conf i pojawi się wiersz „User”, ale w moim pliku httpd.conf nie ma takiego wiersza, więc myślę, że Apache działa jako domyślny użytkownik. Ale nie mogę się dowiedzieć, co to jest.

Moje pytanie brzmi (są):

  • jak mogę dowiedzieć się, jaki jest domyślny użytkownik
  • czy muszę zmienić domyślnego użytkownika?
  • jeśli odpowiedź brzmi „tak” i zmieniam domyślnego użytkownika, edytując httpd.conf, czy to może coś zepsuć?

Dzięki!

eikonomega
źródło
12
dlaczego to pytanie zostało odrzucone? Tak, został zaktualizowany, ponieważ udzielił odpowiedzi gdzie indziej, ale nie widzę potrzeby, aby głosować w dół? To idealnie dobre pytanie? Być może nasz głosujący nie chciałby dodać konstruktywnego komentarza na ten temat?
Bryan
2
Możesz opublikować tę aktualizację jako odpowiedź i zaakceptować ją, ponieważ obecnie znajdujesz się w kolejce bez odpowiedzi.
Fahad Sadah
7
+1 za to, że dostałeś komendę na StackOverflow; niektórzy użytkownicy wydają się
nalegać
Powiązane pytanie już nie istnieje
pal4life
Następne pytanie: co zrobić, ponieważ jest jednym z dwóch użytkowników, takich jak rooti www-data. W jaki sposób dajesz „właściwej” grupie Apache pozwolenie na dostęp do czegoś?

Odpowiedzi:

228

ps aux | egrep '(apache|httpd)' zwykle pokazuje, jak działa apache.

Zwykle nie trzeba zmieniać domyślnego użytkownika, „nikt” lub „apache” są zwykle świetnymi użytkownikami. O ile nie jest to „root”;)

edit: bardziej dokładne polecenie do przechwytywania plików binarnych apache

grufftech
źródło
42
Tak, albo będą to dane www na Ubuntu.
gravyface,
10
... i Debian. :)
cubuspl42
7
To polecenie pokazuje mi listę rzeczy, z których większość pochodzi od apache1 root.
Użytkownik
2
Mam 3 procesy ( /usr/sbin/apache2 -k start), jeden użytkownik jest, roota pozostałe dwa www-data. Czy powinienem się martwić?
zundi
3
@zundi, usługa zaczyna się jako root w celu powiązania z zarezerwowanymi portami (np. 80 i 443). Następnie uruchamia się niezależnie od skonfigurowanej liczby procesów, aby wykonać pracę serwera WWW i wszelkie inne zadania, jak zdefiniowani użytkownicy. W ten sposób żądania są obsługiwane przez procesy nieuprzywilejowane. Zauważysz, że identyfikator nadrzędny (PPID) jest taki sam dla wszystkich innych procesów. Ten pomysł powinien być PID dla tego jednego procesu działającego jako root.
Kevin
41

Możesz spróbować wykonać następujące polecenie:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'
nowthatsamatt
źródło
1
Uwielbiam tę odpowiedź, lepszą (bardziej ogólną) niż najbardziej pozytywną odpowiedź. Dzięki
pgr
14

Użyj apachectl -S, który pokaże coś użytkownika i grupę Apache, coś takiego:

User: name="_www" id=70
Group: name="_www" id=70
Kyaw
źródło
Dzięki, na moim Macu widzę, że apache działa jako „_www”.
Mercury,
To dobra odpowiedź, ponieważ jest to jedno polecenie, które mówi o wiele więcej na temat działającego serwera WWW i przedstawia je w sposób kompleksowy.
kontur
9

Według ubuntuforums.org , na Ubuntu domyślnym użytkownikiem dla apache2 jest www-data.

Uznane za prawdziwe w Ubuntu 13.10 Saucy.


Od Larsa Noodéna na powyższym forum.

Aby upewnić się, na co tak naprawdę ustawiony jest [użytkownik], sprawdź rzeczywiste pliki konfiguracyjne. Plik parasolowy apache2.confbędzie miał coś takiego, jak:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Jest to odniesienie do zmiennych środowiskowych ustawionych w /etc/apache2/envvars. mod_suexecumożliwia także uruchamianie skryptów jako inny użytkownik i grupa.

Aby znaleźć hosty wirtualne, które mogą korzystać z alternatywnych użytkowników, grup lub obu, sprawdź konfiguracje.

$ egrep "^User|^Group|^SuexecUserGroup" /etc/apache2/apache2.conf /etc/apache2/sites-available/*.conf

W przypadku dystrybucji opartych na systemie Red Hat byłoby to (zwykle jego użytkownik korzystający z httpd apache):

$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Kevin
źródło
8

Wiem, że jest to stary post, ale nadal jest wymieniony jako bez odpowiedzi, więc zasugeruję. Jeśli nie możesz znaleźć, który użytkownik lub grupa działa jako serwer Apache, być może spróbuj otworzyć plik httpd.conf. Powinien być tam wpis „Użytkownik” i „Grupa”. Nie tylko widzisz, który użytkownik Apache ma być uruchomiony, ale możesz go zmienić, jeśli czujesz taką potrzebę.

kainosnous
źródło
7

Możesz dołączyć wiersz kodu do skryptu PHP:

echo exec('whoami');
JG Estiot
źródło
8
Uważaj tutaj, pokazuje to użytkownika, pod którym działa PHP, a nie użytkownika Apache. Jeśli używasz mod_php, są one takie same, ale jeśli, jak to jest obecnie bardzo powszechne, używasz czegoś innego (np. Php_fpm), mogą łatwo być różne.
benz001
5

Ten kod będzie - mniej więcej - alfabetycznie wyświetlał listę wszystkich użytkowników innych niż root uruchamiających procesy zawierające apache(lub których nazwa zawiera apache)

ps aux | grep -v root | grep apache | cut -d\  -f1 | sort | uniq
użytkownik163193
źródło
Na liście prawdopodobnie znajdą się użytkownicy, którzy uruchamiają procesy takie jak „grep apache”, na przykład twoje dobre ja.
mwfearnley
4
  • Aby znaleźć użytkownika, możesz go po prostu użyć ps aux | grep apachepodczas jego działania.
  • Nie musisz, ale jeśli Apache działa jako root, występują problemy z bezpieczeństwem.
  • Po trzecie, zmiana użytkownika Apache zmieni jego prawa dostępu do niektórych katalogów. Musisz upewnić się, że / var / www (lub gdziekolwiek masz swoje witryny) jest dostępny dla nowego użytkownika i grupy.
  • W systemach, na które patrzyłem, apache był zawsze instalowany przy użyciu apache: apache (lub podobny) jako użytkownik i grupa, więc prawdopodobnie powinien już być tak ustawiony.

UWAGA: to ta sama odpowiedź, którą podałem w Stackoverflow .

Kjir
źródło
2

Lub możesz sprawdzić plik konfiguracyjny Apache i poszukać właściciela i grupy.

AliGibbs
źródło
2

Jak sugeruje Noyo tutaj :

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')

I wtedy:

echo $APACHE_USER
kenorb
źródło
1
Pobierz użytkownika (wiersz poleceń ubuntu): echo $ APACHE_USER
Jadeye
1

Alternatywnym podejściem, przynajmniej w przypadku dystrybucji opartych na Debianie / Ubuntu, jest użycie tej samej metody, którą robi Apache, aby ustawić swojego użytkownika i grupę: source/etc/apache2/envvars !

$ echo "$(source /etc/apache2/envvars && echo "$APACHE_RUN_GROUP")"
www-data

Jeśli chcesz się podobać, możesz ukryć błędy, jeśli plik nie zostanie znaleziony, i podaj wartość domyślną:

$ apacheuser = $ (
     source / fail / etc / apache2 / envvars 2> / dev / null &&
     echo „$ APACHE_RUN_GROUP” ||
     echo nikt  
)
$ echo „$ apacheuser”
nikt
MestreLion
źródło
1

Odkryłem, że większość oferowanych tutaj rozwiązań jest specyficzna dla systemu lub konfiguracji (w szczególności większość rozwiązań w ogóle nie działa w systemie MacOS), a niektóre polegają na tym, że użytkownik wie, gdzie są pliki konfiguracyjne Apache. .

Więc trochę oszukuję i pozwalam Apache'owi powiedzieć mi, co jest co.

Proste polecenie apachectl -Spowie ci, co musisz wiedzieć o działającej instancji Apache, a jej wyniki można dość łatwo przeanalizować. Oto moje rozwiązanie, którego używam na początku kilku bashskryptów, aby określić różne rzeczy, których mogę potrzebować w danym momencie ...

# Store the results so we don't have to keep calling apachetl...
astatus=`apachectl -S`

# Now grab whatever you want from the result... 
HTTPD_ROOT_DIR=$(expr "`echo "$astatus" | grep ServerRoot`" : ".*\"\(.*\)\".*")
HTTPD_DOC_DIR=$(expr "`echo "$astatus" | grep \"Main DocumentRoot\" `" : ".*\"\(.*\)\".*")
HTTPD_USER=$(expr "`echo "$astatus" | grep \"User:.*name=\" `" : ".*\"\(.*\)\".*")
HTTPD_GROUP=$(expr "`echo "$astatus" | grep \"Group:.*name=\" `" : ".*\"\(.*\)\".*")

Wartości tych można następnie użyć jako takich:

echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR  // /var/www
echo $HTTPD_USER     // www-data
echo $HTTPD_GROUP    // www-data
Mike Fahy
źródło
0

Znalazłem to polecenie w dokumentach CakePHP .

HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`

Teraz HTTPDUSERprzechowuje nazwę użytkownika, który obsługuje serwer, echo $HTTPDUSERw moim przypadku dane wyjściowe www-data- przy użyciu rlerdorf / php7dev .

Nabil Kadimi
źródło
0

Użyj lsof i przekaż, że apache portu nasłuchuje jako argument. Zobacz kolumnę USER dla appache użytkownika działa jako.

# lsof -i :80
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd     21058   root    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     21111 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     24915 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
David Okwii
źródło
Polecenie lsof może być powolne, gdy masz kilka 100 000 otwartych uchwytów plików i / lub dość zajęty serwer.
Dennis Nolte