ค้นหาว่าผู้ใช้ Apache กำลังทำงานอะไร


212

ฉันต้องการรักษาความปลอดภัยไดเรกทอรีอัปโหลดไฟล์บนเซิร์ฟเวอร์ของฉันตามที่อธิบายไว้อย่างสวยงามที่นี่ แต่ฉันมีปัญหาหนึ่งก่อนที่ฉันจะสามารถทำตามคำแนะนำเหล่านี้ได้ ฉันไม่ทราบว่าผู้ใช้ Apache กำลังทำงานอะไร

ฉันพบข้อเสนอแนะที่คุณสามารถดูได้ใน httpd.conf และจะมีบรรทัด "ผู้ใช้" แต่ไม่มีบรรทัดดังกล่าวในไฟล์ httpd.conf ของฉันดังนั้นฉันเดาว่า Apache กำลังทำงานเป็นผู้ใช้เริ่มต้น ฉันไม่สามารถรู้ได้ว่ามันคืออะไร

ดังนั้นคำถามของฉันคือ:

  • ฉันจะทราบได้อย่างไรว่าผู้ใช้เริ่มต้นคืออะไร
  • ฉันจะต้องเปลี่ยนผู้ใช้เริ่มต้น
  • หากคำตอบคือใช่และฉันเปลี่ยนผู้ใช้เริ่มต้นด้วยการแก้ไข httpd.conf มีแนวโน้มที่จะทำให้เกิดข้อผิดพลาดหรือไม่

ขอบคุณ!


12
ทำไมคำถามนี้จึงถูกลดระดับลง ใช่มันได้รับการอัปเดตตามที่ได้รับคำตอบจากทุกที่ แต่ฉันไม่ต้องการลงคะแนนเลยเหรอ? มันเป็นคำถามที่ดีอย่างสมบูรณ์? บางทีผู้ลงคะแนนเสียงของเราอาจสนใจเพิ่มความคิดเห็นที่สร้างสรรค์เกี่ยวกับเรื่องนี้?
ไบรอัน

2
คุณอาจต้องการโพสต์การอัปเดตนั้นเป็นคำตอบและยอมรับเนื่องจากคุณอยู่ในคิวที่ยังไม่ได้ตอบ
Fahad Sadah

7
+1 สำหรับการถูกบอกเลิกใน StackOverflow ผู้ใช้บางรายดูเหมือนยืนกรานว่าจะไม่พบผู้ใช้รายใหม่
wruckie

คำถามที่เชื่อมโยงไม่มีอยู่อีกต่อไป
pal4life

คำถามต่อไป: สิ่งที่ต้องทำเพราะมันเป็นหนึ่งในสองผู้ใช้เช่นและroot www-dataคุณให้สิทธิ์ Apache กับกลุ่มในการเข้าถึงบางอย่างได้อย่างไร

คำตอบ:


228

ps aux | egrep '(apache|httpd)' โดยทั่วไปแล้วจะแสดงว่า Apache ทำงานอะไร

โดยปกติแล้วคุณไม่จำเป็นต้องเปลี่ยนผู้ใช้เริ่มต้น "ไม่มีใคร" หรือ "apache" มักจะเป็นผู้ใช้ที่ดี ตราบใดที่ไม่ใช่ "รูท";)

แก้ไข: คำสั่งที่แม่นยำยิ่งขึ้นสำหรับการจับไบนารีไบนารีด้วย


42
ใช่หรือจะเป็น www-data บน Ubuntu
gravyface

10
... และ Debian :)
cubuspl42

7
คำสั่งนั้นแสดงรายชื่อของสิ่งต่าง ๆ ส่วนใหญ่มาจากapache1 แต่จากrootมากเกินไป
ผู้ใช้

2
ฉันมี 3 กระบวนการ ( /usr/sbin/apache2 -k start) ผู้ใช้หนึ่งคนrootและอีกสองwww-dataกระบวนการ ฉันควรจะกังวลหรือไม่
zundi

3
@zundi บริการเริ่มต้นเป็นรูทเพื่อทำสิ่งต่างๆเช่นผูกเข้ากับพอร์ตที่สงวนไว้ (เช่น 80 และ 443) จากนั้นจะเริ่มทำงานตามจำนวนกระบวนการที่กำหนดค่าไว้เพื่อทำงานบนเว็บเซิร์ฟเวอร์และงานอื่น ๆ ตามที่ผู้ใช้กำหนด คำร้องขอนั้นถูกจัดการโดยกระบวนการที่ไม่มีสิทธิพิเศษ คุณจะสังเกตเห็นว่า ID ผู้ปกครอง (PPID) เหมือนกันสำหรับกระบวนการอื่นทั้งหมด แนวคิดนั้นเป็น PID สำหรับกระบวนการหนึ่งที่ทำงานในฐานะรูท
เควิน

41

คุณสามารถลองคำสั่งต่อไปนี้:

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

1
ฉันรักคำตอบนี้ดีกว่า (ทั่วไปมากกว่า) มากกว่าคำตอบที่ upvoted ที่สุด ขอบคุณ
pgr

14

ใช้apachectl -Sซึ่งจะแสดงสิ่งที่ผู้ใช้และกลุ่ม Apache บางอย่างเช่นนี้:

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

ขอบคุณบน mac ของฉันฉันเห็นว่า apache ทำงานเป็น '_www'
พุธที่

นี่เป็นคำตอบที่ดีเพราะเป็นคำสั่งเดียวที่จะบอกคุณเกี่ยวกับเว็บเซิร์ฟเวอร์ที่ใช้งานอยู่และนำเสนออย่างครอบคลุม
ข้อเขียน

9

ตามที่ubuntuforums.orgบนอูบุนตูผู้ใช้เริ่มต้นสำหรับ apache2 www-dataคือ

ถูกมองว่าเป็นจริงใน Ubuntu 13.10 Saucy


จากLars Noodénบนฟอรัมด้านบน

เพื่อให้แน่ใจว่าสิ่งที่ [ผู้ใช้] ตั้งค่าจริงๆให้ตรวจสอบไฟล์การกำหนดค่าจริง ไฟล์ร่มapache2.confจะมีสิ่งต่าง ๆ ดังต่อไปนี้

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

/etc/apache2/envvarsนั่นคือการอ้างอิงถึงตัวแปรสภาพแวดล้อมที่ตั้งอยู่ใน mod_suexecยังอนุญาตให้เรียกใช้สคริปต์ในฐานะผู้ใช้และกลุ่มอื่น

ในการค้นหาโฮสต์เสมือนใด ๆ ที่อาจใช้ผู้ใช้สำรองกลุ่มหรือทั้งสองอย่างให้ตรวจสอบการกำหนดค่า

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

สำหรับ Red Hat based distributions มันจะเป็น (โดยปกติแล้วผู้ใช้ที่ใช้ httpd คือapache):

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

8

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ก็ยังคงอยู่ในรายการเป็นยังไม่ได้ตอบดังนั้นฉันจะให้คำแนะนำ หากคุณไม่พบ Apache ผู้ใช้หรือกลุ่มใดที่กำลังทำงานอยู่อาจลองเปิดไฟล์ httpd.conf ควรมีรายการสำหรับ "ผู้ใช้" และ "กลุ่ม" ไม่เพียง แต่คุณจะเห็นว่าผู้ใช้ Apache คนใดที่ควรจะใช้งานเหมือนกัน แต่คุณสามารถเปลี่ยนแปลงได้หากคุณรู้สึกว่าจำเป็นต้องทำเช่นนั้น


7

คุณสามารถใส่รหัสในสคริปต์ PHP ของคุณ:

echo exec('whoami');

8
ระวังนี่แสดงให้เห็นว่าผู้ใช้ที่ PHP ทำงานภายใต้ไม่ใช่ผู้ใช้ Apache หากใช้ mod_php สิ่งเหล่านี้จะเหมือนกัน แต่ถ้าตามปกติแล้วคุณกำลังใช้อย่างอื่น (เช่น php_fpm) พวกเขาสามารถแตกต่างกันได้อย่างง่ายดาย
benz001

5

รหัสนี้จะ - มากหรือน้อย - แสดงรายการตามตัวอักษรทั้งหมดที่ไม่ใช่ผู้ใช้รูทที่กำลังทำงานกระบวนการที่มีapache(หรือชื่อที่มีapache)

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

รายการอาจรวมถึงผู้ใช้ที่กำลังใช้งานกระบวนการเช่น 'grep apache' เช่นตัวตนที่ดีของคุณ
mwfearnley

4
  • เพื่อค้นหาผู้ใช้คุณสามารถใช้ps aux | grep apacheในขณะที่กำลังทำงานอยู่
  • คุณไม่จำเป็นต้องใช้ แต่ถ้า Apache ทำงานในฐานะรูทมีปัญหาด้านความปลอดภัย
  • ประการที่สามการเปลี่ยนผู้ใช้ Apache จะเปลี่ยนสิทธิ์ในการเข้าถึงบางไดเรกทอรี คุณต้องแน่ใจว่า / var / www (หรือที่ใดก็ตามที่คุณมีเว็บไซต์ของคุณ) สามารถเข้าถึงได้โดยผู้ใช้และกลุ่มใหม่
  • ในระบบที่ฉันได้ดู apache ได้รับการติดตั้งโดยใช้ apache: apache (หรือคล้ายกัน) ในฐานะผู้ใช้และกลุ่มดังนั้นจึงควรตั้งค่าเช่นนั้น

หมายเหตุ: นี่เป็นคำตอบเดียวที่ฉันให้ในStackoverflow


2

หรือคุณสามารถตรวจสอบไฟล์การตั้งค่า apache และค้นหาเจ้าของและกลุ่ม


2

ตามที่แนะนำโดย Noyo ที่นี่ :

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

แล้ว:

echo $APACHE_USER

1
รับผู้ใช้ (ubuntu command-line): echo $ APACHE_USER
Jadeye

1

แนวทางอื่นอย่างน้อยสำหรับ Distros ที่ใช้ Debian / Ubuntu คือใช้วิธีเดียวกันกับที่ Apache ทำเพื่อตั้งค่าผู้ใช้และกลุ่ม: source/etc/apache2/envvars !

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

หากคุณต้องการได้รับแฟนซีคุณสามารถระงับข้อผิดพลาดหากไม่พบไฟล์และให้ค่าเริ่มต้น:

$ apacheuser = $ (
     แหล่งที่มา / ล้มเหลว / etc / apache2 / envvars 2> / dev / null &&
     echo "$ APACHE_RUN_GROUP" ||
     ไม่มีใครสะท้อน  
)
$ echo "$ apacheuser"
ไม่มีใคร

1

ฉันพบว่าโซลูชันส่วนใหญ่ที่นำเสนอในที่นี้เป็นระบบหรือเฉพาะการกำหนดค่า (โดยเฉพาะโซลูชันส่วนใหญ่ไม่ทำงานเลยบน MacOS) และผู้ใช้บางรายพึ่งพาผู้ใช้ที่รู้ว่าไฟล์กำหนดค่าของ Apache อยู่ที่ใด .

ดังนั้นฉันจึงโกงนิดหน่อยและให้ Apache บอกฉันเองว่ามีอะไรเกิดขึ้น

คำสั่งง่าย ๆapachectl -Sจะบอกคุณว่าคุณต้องรู้อะไรเกี่ยวกับอินสแตนซ์ที่ทำงานอยู่ของ Apache และสามารถแยกวิเคราะห์ผลลัพธ์ได้อย่างง่ายดาย นี่คือทางออกของฉันซึ่งฉันใช้ที่ด้านบนของbashสคริปต์สองสามอย่างเพื่อกำหนดสิ่งต่าง ๆ ที่ฉันอาจต้องการในเวลาที่กำหนด ...

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

ค่าเหล่านี้สามารถนำมาใช้เช่น:

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

0

ผมพบว่าคำสั่งนี้ในเอกสาร CakePHP

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

ตอนนี้HTTPDUSERถือชื่อผู้ใช้ของผู้ใช้ที่รันเซิร์ฟเวอร์echo $HTTPDUSERในกรณีของฉันเอาท์พุทwww-dataขนานแท้ใช้rlerdorf / php7dev


0

ใช้ lsof และส่งผ่านพอร์ต apache เพื่อรับฟังเป็นอาร์กิวเมนต์ ดูคอลัมน์ USER สำหรับ appache ผู้ใช้ที่เรียกใช้

# 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 อาจช้าเมื่อคุณมี filehandles เปิดไม่กี่ตัวและ / หรือเซิร์ฟเวอร์ค่อนข้างยุ่ง
Dennis Nolte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.