Tìm hiểu xem người dùng Apache đang chạy như thế nào?


212

Tôi muốn bảo mật một thư mục tải lên tệp trên máy chủ của mình như được mô tả đẹp ở đây, nhưng tôi có một vấn đề trước khi tôi có thể làm theo các hướng dẫn này. Tôi không biết người dùng Apache đang chạy như thế nào.

Tôi đã tìm thấy một đề xuất rằng bạn có thể xem trong httpd.conf và sẽ có một dòng "Người dùng", nhưng không có dòng nào như vậy trong tệp httpd.conf của tôi, vì vậy tôi đoán Apache đang chạy như người dùng mặc định. Tôi không thể tìm ra đó là gì, mặc dù.

Vì vậy, câu hỏi của tôi là (đang):

  • Làm cách nào để biết người dùng mặc định là gì
  • Tôi có cần thay đổi người dùng mặc định không?
  • nếu câu trả lời là có và tôi thay đổi người dùng mặc định bằng cách chỉnh sửa httpd.conf, liệu nó có khả năng làm hỏng mọi thứ không?

Cảm ơn!


12
Tại sao câu hỏi này đã bị hạ cấp? Vâng, nó đã được cập nhật vì nó đã được trả lời ở mọi nơi, nhưng tôi thấy không cần phải bỏ phiếu? Đó là một câu hỏi hoàn toàn tốt? Có lẽ cử tri xuống của chúng tôi sẽ quan tâm để thêm một nhận xét mang tính xây dựng liên quan đến điều này?
Bryan

2
Bạn có thể muốn đăng cập nhật đó dưới dạng câu trả lời và chấp nhận nó, vì bạn hiện đang ở trong hàng đợi chưa được trả lời.
Fahad Sadah

7
+1 khi được thông báo trên StackOverflow; một số người dùng dường như khăng khăng chạy khỏi người dùng mới
wruckie

Câu hỏi được liên kết không còn tồn tại nữa
pal4life

Câu hỏi tiếp theo: phải làm gì vì một trong hai người dùng của nó, thích rootwww-data. Làm thế nào để bạn cho phép nhóm "quyền" Apache truy cập vào một cái gì đó?

Câu trả lời:


228

ps aux | egrep '(apache|httpd)' thông thường sẽ hiển thị những gì apache đang chạy như.

Thông thường, bạn không cần thay đổi người dùng mặc định, "không ai" hoặc "apache" thường là người dùng tốt. Miễn là nó không "root";)

chỉnh sửa: lệnh chính xác hơn để bắt nhị phân apache quá


42
Yup, hoặc đó sẽ là dữ liệu www trên Ubuntu.
gravyface

10
... và Debian. :)
cubuspl42

7
Lệnh đó cho tôi thấy một danh sách các thứ, hầu hết từ apachenhưng 1 từ rootquá.
Người dùng

2
Tôi có 3 tiến trình ( /usr/sbin/apache2 -k start), một người dùng rootvà hai người kia www-data. Tôi có nên quan tâm không?
zundi

3
@zundi, dịch vụ bắt đầu bằng root để thực hiện những việc như liên kết với các cổng dành riêng (ví dụ 80 và 443). Sau đó, nó bắt đầu bất kể số lượng quy trình được cấu hình là gì, để làm cho máy chủ web hoạt động và bất kỳ tác vụ nào khác, như người dùng đã xác định. Bằng cách đó, các yêu cầu đang được xử lý bởi các quy trình không có đặc quyền. Bạn sẽ thấy ID cha (PPID) giống nhau cho tất cả các quy trình khác. Ý tưởng đó là PID cho một tiến trình đang chạy bằng root.
Kevin

41

Bạn có thể thử lệnh sau:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'

1
Tôi thích câu trả lời này, tốt hơn (chung chung hơn) câu trả lời được đánh giá cao nhất. Cảm ơn
pgr

14

Sử dụng apachectl -S, sẽ hiển thị một cái gì đó người dùng và nhóm Apache, đại loại như thế này:

User: name="_www" id=70
Group: name="_www" id=70

Cảm ơn, trên máy mac của tôi, tôi thấy rằng apache đang chạy dưới dạng '_www'.
Sao Thủy

Đây là một câu trả lời hay, bởi vì đây là một lệnh cho bạn biết nhiều hơn về máy chủ web đang chạy của bạn và trình bày nó một cách toàn diện.
kontur

9

Theo ubuntuforums.org , trên Ubuntu người dùng mặc định cho apache2 là www-data.

Được thấy là đúng trên Ubuntu 13.10 Saucy.


Từ Lars Noodén trên diễn đàn trên.

Để chắc chắn những gì [người dùng] thực sự được đặt thành, hãy kiểm tra các tệp cấu hình thực tế. Các tập tin ô, apache2.confsẽ có một cái gì đó như sau,

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Đó là một tham chiếu đến các biến môi trường được đặt trong /etc/apache2/envvars. mod_suexeccũng cho phép các tập lệnh được chạy như một người dùng và nhóm khác nhau.

Để tìm bất kỳ máy chủ ảo nào có thể sử dụng người dùng thay thế, nhóm hoặc cả hai, hãy kiểm tra cấu hình.

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

Đối với các bản phân phối dựa trên Red Hat, nó sẽ là (thường người dùng của nó đang chạy httpd là apache):

$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

8

Tôi biết rằng đây là một bài viết cũ, nhưng nó vẫn được liệt kê là chưa được trả lời, vì vậy tôi sẽ đưa ra một gợi ý. Nếu bạn không thể tìm thấy người dùng hoặc nhóm Apache nào đang chạy, có lẽ hãy thử mở tệp httpd.conf. Cần có một mục ở đó cho "Người dùng" và "Nhóm". Bạn không chỉ có thể xem người dùng nào được cho là đang chạy như Apache mà còn có thể thay đổi nếu bạn cảm thấy cần phải làm như vậy.


7

Bạn có thể bao gồm một dòng mã trong tập lệnh PHP của bạn:

echo exec('whoami');

8
Xem ra ở đây, điều này cho thấy người dùng mà PHP chạy theo, không phải người dùng Apache. Nếu sử dụng mod_php thì chúng giống nhau nhưng nếu hiện tại rất phổ biến, bạn đang sử dụng một thứ khác (như php_fpm) thì chúng có thể dễ dàng khác nhau.
benz001

5

Mã này sẽ - nhiều hơn hoặc ít hơn - liệt kê theo thứ tự bảng chữ cái tất cả người dùng không phải root đang chạy các quy trình có chứa apache(hoặc có tên chứa apache)

ps aux | grep -v root | grep apache | cut -d\  -f1 | sort | uniq

Danh sách này có thể sẽ bao gồm những người dùng đang chạy các quy trình như 'grep apache', chẳng hạn như bản thân tốt của bạn.
mwfearnley

4
  • Để tìm hiểu người dùng, bạn chỉ cần sử dụng ps aux | grep apachetrong khi nó đang chạy.
  • Bạn không cần, nhưng nếu Apache đang chạy bằng root thì có vấn đề bảo mật.
  • Thứ ba, thay đổi người dùng Apache sẽ thay đổi quyền truy cập vào một số thư mục. Bạn cần đảm bảo rằng / var / www (hoặc bất cứ nơi nào bạn có trang web của mình) có thể truy cập được đối với người dùng và nhóm mới.
  • Trên các hệ thống tôi đã xem xét, apache luôn được cài đặt bằng apache: apache (hoặc tương tự) là người dùng và nhóm, vì vậy có lẽ nó đã được đặt như thế.

LƯU Ý: Đây là câu trả lời tương tự tôi đã đưa ra trên Stackoverflow .


2

Hoặc bạn có thể kiểm tra tệp cấu hình apache và tìm chủ sở hữu & nhóm.


2

Theo đề xuất của Noyo tại đây :

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

Và sau đó:

echo $APACHE_USER

1
Nhận người dùng (dòng lệnh ubfox): echo $ APACHE_USER
Jadeye

1

Một cách tiếp cận khác, ít nhất là cho các bản phân phối dựa trên Debian / Ubuntu, là sử dụng cùng một phương thức mà Apache thực hiện để đặt người dùng và nhóm của nó: nguồn/etc/apache2/envvars !

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

Nếu bạn muốn nhận được ưa thích, bạn có thể loại bỏ lỗi nếu không tìm thấy tệp và cung cấp giá trị mặc định:

$ apacheuser = $ (
     nguồn / fail / etc / apache2 / envvars 2> / dev / null &&
     tiếng vang "$ APACHE_RUN_GROUP" ||
     tiếng vang không ai  
)
$ echo "$ apacheuser"
không ai

1

Tôi thấy hầu hết các giải pháp được cung cấp ở đây là dành riêng cho hệ thống hoặc cấu hình (cụ thể, hầu hết các giải pháp hoàn toàn không hoạt động trên MacOS) và một số ít dựa vào người dùng biết vị trí các tệp cấu hình của Apache ở đâu .. .

Vì vậy, tôi gian lận một chút và để chính Apache nói cho tôi biết những gì.

Lệnh đơn giản apachectl -Ssẽ cho bạn biết những gì bạn cần biết về một phiên bản đang chạy của Apache và kết quả của nó có thể được phân tích cú pháp khá dễ dàng. Đây là giải pháp của tôi, mà tôi sử dụng ở đầu một vài bashtập lệnh để xác định nhiều thứ tôi có thể cần bất cứ lúc nào ...

# 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=\" `" : ".*\"\(.*\)\".*")

Những giá trị này sau đó có thể được sử dụng như sau:

echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR  // /var/www
echo $HTTPD_USER     // www-data
echo $HTTPD_GROUP    // www-data

0

Tôi tìm thấy lệnh này trong tài liệu CakePHP .

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

Bây giờ HTTPDUSERgiữ tên người dùng của người dùng chạy máy chủ, echo $HTTPDUSERtrong trường hợp của tôi, kết quả đầu ra là www-datasử dụng rusdorf / php7dev .


0

Sử dụng lsof và vượt qua apache cổng là lắng nghe như một đối số. Xem cột USER cho appache người dùng đang chạy.

# 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)

lsof có thể bị chậm khi bạn có một vài tệp mở 100k và / hoặc một máy chủ khá bận rộn.
Dennis Nolte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.