ห้ามใช้ Nginx 403 สำหรับไฟล์ทั้งหมด


192

ฉันติดตั้ง nginx ด้วย PHP-FPM บนกล่อง CentOS 5 แต่ฉันพยายามที่จะให้บริการไฟล์ใด ๆ ของฉันไม่ว่าจะเป็น PHP หรือไม่

Nginx ทำงานเป็น www-data: www-data และไซต์ "ยินดีต้อนรับสู่ nginx บน EPEL" เริ่มต้น (เป็นเจ้าของโดย root: root พร้อมสิทธิ์ 644) โหลดได้ดี

ไฟล์การกำหนดค่า nginx มีคำสั่งincludeสำหรับ/etc/nginx/sites-enabled/*.confและฉันมีไฟล์การกำหนดค่าexample.com.confดังนั้น:

server {
 listen 80;

 Virtual Host Name
 server_name www.example.com example.com;


 location / {
   root /home/demo/sites/example.com/public_html;
   index index.php index.htm index.html;
 }

 location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  PATH_INFO $fastcgi_script_name;
  fastcgi_param  SCRIPT_FILENAME  /home/demo/sites/example.com/public_html$fastcgi_script_name;
  include        fastcgi_params;
 }
}

แม้ว่า public_html จะถูกครอบครองโดย www-data: www-data ที่มีสิทธิ์ใช้งานไฟล์ 2777 เว็บไซต์นี้ไม่สามารถแสดงเนื้อหาใด ๆ -

 [error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com"

ฉันพบโพสต์อื่น ๆ อีกมากมายที่ผู้ใช้ได้รับ 403s จาก nginx แต่ส่วนใหญ่ที่ฉันได้เห็นเกี่ยวข้องกับการตั้งค่าที่ซับซ้อนยิ่งขึ้นด้วย Ruby / Passenger (ซึ่งในอดีตที่ผ่านมาฉันประสบความสำเร็จจริง) หรือได้รับข้อผิดพลาดเมื่อ PHP อัปสตรีม -FPM มีส่วนเกี่ยวข้องดังนั้นพวกเขาจึงดูเหมือนว่าจะมีความช่วยเหลือเล็กน้อย

ฉันทำอะไรโง่ ๆ


ตรวจสอบคำตอบนี้stackoverflow.com/questions/16808813/…
sandes

คำตอบ:


334

ข้อกำหนดสิทธิการใช้งานหนึ่งที่มักถูกมองข้ามคือผู้ใช้ต้องการสิทธิ์ x ในทุกไดเรกทอรีหลักของไฟล์เพื่อเข้าถึงไฟล์นั้น ตรวจสอบการอนุญาตบน /, / home, / home / demo, เป็นต้นสำหรับการเข้าถึง www-data x ฉันเดาว่า / home น่าจะเป็น 770 และ www-data ไม่สามารถ chdir ผ่านมันเพื่อไปที่ subdir ใด ๆ ถ้าเป็นเช่นนั้นลอง chmod o + x / home (หรือสิ่งใดก็ตามที่ dir ปฏิเสธคำขอ)

แก้ไข: เพื่อแสดงสิทธิ์ทั้งหมดบนพา ธ คุณสามารถใช้ namei -om /path/to/check


6
กันที่นี่ ในการติดตั้ง CentOS 6 ของฉัน / บ้าน / ผู้ใช้ถูกตั้งค่าเป็น 700 โดยค่าเริ่มต้น
jjt

2
ผู้ชายคนนี้พูดถึงมันด้วย: ( chmod -4 +x /mypathทำงานให้ฉัน) nginxlibrary.com/403-forbidden-error
Peter Ehrlich

1
บางคนสามารถอธิบายได้ว่าทำไมพฤติกรรมนี้แตกต่างจาก apache ซึ่งไม่ต้องการไดเรกทอรีหลักทุกตัวที่มีสิทธิ์ "x" หรือไม่!
JoshuaDavid

3
มันไม่แตกต่างกัน เหตุผลเดียวที่อาปาเช่ไม่ต้องการสิทธิ์ x ในไดเรกทอรีหลักคือถ้ามันทำงานเหมือนรูท
kolbyjack

ฉันลงเอยด้วยการเพิ่มผู้ใช้ www-data ไปยังกลุ่มผู้ใช้ส่วนตัวของฉันและทำ chmod 710 ในโฟลเดอร์ผู้ใช้รูทของฉัน ทำงานเหมือนจับใจ (ในเขตการค้าแบบเดเบียน)
วันธรรมดา

299

หากคุณยังคงเห็นpermission deniedหลังจากตรวจสอบสิทธิ์ของโฟลเดอร์พาเรนต์มันอาจเป็นการจำกัด การเข้าถึงของSELinux

วิธีตรวจสอบว่า SELinux กำลังทำงานอยู่หรือไม่:

# getenforce

หากต้องการปิดใช้งาน SELinux จนกว่าจะรีบูตครั้งถัดไป:

# setenforce Permissive

รีสตาร์ท Nginx และดูว่ายังมีปัญหาอยู่หรือไม่ ในการอนุญาตให้ nginx ให้บริการไดเรกทอรี www ของคุณ (ตรวจสอบให้แน่ใจว่าคุณได้เปิด SELinux ก่อนที่จะทำการทดสอบเช่นsetenforce Enforcing)

# chcon -Rt httpd_sys_content_t /path/to/www

ดูคำตอบของฉันที่นี่สำหรับรายละเอียดเพิ่มเติม


1
ฉันไม่สามารถหาเหตุผลได้ว่าทำไมเมื่อใดก็ตามที่ฉันเริ่ม nginx มันพูดopen() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)หลังจากที่ฉันตรวจสอบการอนุญาตและทำให้แน่ใจว่ามันเริ่มต้นเป็นรูท ฉันเจอสิ่งนี้และพบว่า SELinux เปิดใช้งานอยู่ ฉันปิดการใช้งานและตอนนี้ก็ใช้งานได้ไม่มีปัญหา ขอบคุณ!
ub3rst4r

1
ขอบคุณ! ฉันยังคงมีปัญหาเกี่ยวกับการอนุญาตที่ถูกปฏิเสธสำหรับผู้ใช้ที่มีซ็อกเก็ต FPM ของตัวเองดังนั้นฉันสามารถแก้ไขได้โดยเปลี่ยนuserจากnginxเป็นrootใน/var/nginx/nginx.conf- บางทีอาจช่วยคนอื่นที่เจอปัญหานี้ S / O ไปยังDataPsycheสำหรับส่วนที่สอง
ฤดูหนาว

11
นี่เป็นพฤติกรรมเริ่มต้นใน CentOS 7 เช่นกัน
timss

4
ฉันกับคนอื่น ๆ ที่แสดงความคิดเห็น ฉันพร้อมที่จะโยนคอมพิวเตอร์ออกไปนอกหน้าต่าง Nginx ได้รับการกำหนดค่าอย่างถูกต้องการอนุญาตที่ถูกต้องฉันยังทำทุกอย่างที่ 777 และยังมีข้อผิดพลาดที่ถูกปฏิเสธสิทธิ์
DOFFicial

2
บน Centos 7 (เปิดใช้งาน SELinux) การแก้ไขที่ง่ายที่สุดสำหรับฉันคือ setsebool httpd_read_user_content on(สำหรับไฟล์แบบคงที่ที่โฮสต์จากโฮมไดเร็กตอรี่, chmod'ed เป็นแบบอ่านได้ทั่วโลก) - แม้ว่าฉันเดาว่า @ KapiteinWitbaard
TimStaley

63

ฉันแก้ไขปัญหานี้ด้วยการเพิ่มการตั้งค่าผู้ใช้

ใน nginx.conf

worker_processes 4;
user username;

เปลี่ยน 'ชื่อผู้ใช้' ด้วยชื่อผู้ใช้ลินุกซ์


4
ฉันเชื่อว่าคำตอบนี้ปลอดภัยกว่าฉลาดกว่าคำตอบที่ยอมรับ คุณไม่ต้องไปยุ่งกับการอนุญาตในโฟลเดอร์บ้านของคุณ (ซึ่งอาจมีข้อมูลที่ละเอียดอ่อน) และหากคุณกำลังพัฒนาด้วย nginx จะช่วยให้คุณไม่ต้องอัปโหลดการอนุญาตไฟล์แปลก ๆ ไปยัง SCM
CamelBlues

สิทธิ์ที่เพิ่มเข้ามาในโฮมไดเร็กตอรี่นั้นไม่ได้ถูกอ่าน, ดังนั้นจึงไม่มีข้อมูลที่ละเอียดอ่อน (ในทางทฤษฎี) เปิดเผย (ยกเว้นในกรณีนี้, อาจจะเป็นสคริปต์ PHP ที่เป็นอันตรายซึ่งซ้ำไปซ้ำมาและรู้ตำแหน่งของไฟล์สำคัญภายในไดเรกทอรีอื่น สามารถเข้าถึง www-data) คุณจะสังเกตเห็นว่าในคำถามเดิม nginx ของฉันทำงานเป็น "www-data" - ค่าการตั้งค่าที่นี่ถูกตั้งค่าตามที่ต้องการแล้ว
แองกัสไอร์แลนด์

2
ต้องเพิ่มกลุ่มผู้ใช้ด้วย: user usegroup
Gabriel A. Zorrilla

ทำงานให้ฉันเช่นกัน (เช่นเดียวกับ chmodding the dir ถึง nginx: nginx) ฉันชอบโซลูชันนี้มากกว่าดังนั้นฉันจึงสามารถมีรูทเอกสารของฉันเป็นของผู้ใช้รายอื่นได้มากกว่า nginx ขอบคุณแอนเดอร์สันที่ชี้เรื่องนี้ออกมา
kvdv

บันทึกวันของฉัน ถ้าเครื่องมีผู้ใช้หลายคนและผู้ใช้แต่ละคนมีเว็บไซต์ของตัวเองฉันจะจัดการกับมันได้อย่างไร
psychok7

38

ฉันพบข้อผิดพลาดนี้และในที่สุดก็แก้ไขได้ด้วยคำสั่งด้านล่าง

restorecon -r /var/www/html

ปัญหาเกิดขึ้นเมื่อคุณ mv บางสิ่งจากที่หนึ่งไปอีกที่หนึ่ง มันรักษาบริบท selinux ของต้นฉบับเมื่อคุณย้ายดังนั้นถ้าคุณ untar บางสิ่งใน / home หรือ / tmp มันจะได้รับบริบท selinux ที่ตรงกับที่ตั้งของมัน ตอนนี้คุณ mv นั้นไปที่ / var / www / html และใช้บริบทที่ระบุว่าเป็นของ / tmp หรือ / home ด้วยและ httpd ไม่ได้รับอนุญาตจากนโยบายในการเข้าถึงไฟล์เหล่านั้น

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


1
ขอบคุณ @jsina สิ่งนี้ช่วยฉันได้มาก
Pankaj Garg

1
ประณาม+1ฉันด้วย
jww

24

ฉันได้ลองใช้เคสหลายกรณีและเมื่อเจ้าของถูกตั้งค่าเป็น nginx ( chown -R nginx:nginx "/var/www/myfolder") - มันเริ่มทำงานได้อย่างที่คาดไว้


1
ทำงานให้ฉันเช่นกัน ฉันสงสัยว่าสิ่งนี้เกิดขึ้นเพราะถึงแม้ว่า nginx จะเริ่มต้นเป็น root แต่จะเกิดกระบวนการภายใต้ผู้ใช้ที่ระบุไว้ในไฟล์ nginx.conf ซึ่งเป็น "user nginx;" โดยค่าเริ่มต้น. การเปลี่ยนผู้ใช้เป็นผู้ใช้ที่เป็นเจ้าของรูทเอกสารของคุณควรทำงานตามคำแนะนำของ Anderson
kvdv

นายแอนเดอร์สัน? No! Andron;)
Andron

ขอโทษนาย Andron;) ฉันดูเหมือนจะไม่สามารถแก้ไขความคิดเห็นก่อนหน้านี้อีกต่อไปแม้ว่า ...
kvdv

แน่นอนว่าไม่ใช่ปัญหา ตอนนี้ฉันเป็น Anderson :) และต้องเขียนนิทาน ...
Andron

1
นี่ไม่ใช่ปัญหาด้านความปลอดภัยใช่ไหม
gontard


1

คำถามเก่า แต่ฉันมีปัญหาเดียวกัน ฉันลองทุกคำตอบข้างต้นไม่มีอะไรทำงาน สิ่งที่แก้ไขได้สำหรับฉันคือลบโดเมนและเพิ่มอีกครั้ง ฉันกำลังใช้ Plesk และฉันติดตั้ง Nginx หลังจากที่โดเมนมีอยู่แล้ว

ทำการสำรองข้อมูลในเครื่องไปยัง / var / www / backups ก่อน ดังนั้นฉันสามารถคัดลอกไฟล์กลับมาได้อย่างง่ายดาย

ปัญหาแปลก ๆ ....


1

เรามีปัญหาเดียวกันโดยใช้ Plesk Onyx 17 แทนที่จะทำเรื่องวุ่นวายกับสิทธิ์ ฯลฯ วิธีแก้ไขคือการเพิ่มผู้ใช้ nginx ในกลุ่ม psacln ซึ่งเจ้าของโดเมน (ผู้ใช้) คนอื่น ๆ ทั้งหมด:

usermod -aG psacln nginx

ตอนนี้ nginx มีสิทธิ์ในการเข้าถึง. htaccess หรือไฟล์อื่น ๆ ที่จำเป็นในการแสดงเนื้อหาอย่างถูกต้อง

ในทางกลับกันตรวจสอบให้แน่ใจว่า Apache อยู่ในกลุ่ม psaserv เพื่อให้บริการเนื้อหาแบบคงที่:

usermod -aG psaserv apache

และอย่าลืมรีสตาร์ททั้ง Apache และ Nginx ใน Plesk หลังจาก! (และโหลดหน้าใหม่ด้วย Ctrl-F5)


นี่คือคำตอบที่ถูกต้องและเป็นไปได้มากที่สุดusermod -aG username www-dataในการตั้งค่าส่วนใหญ่
Dario Zadro

0

ฉันขุดตัวเองเป็นตัวแปรเล็กน้อยในปัญหานี้โดยการเรียกใช้setfaclคำสั่งโดยไม่ตั้งใจ ฉันวิ่ง:

sudo setfacl -m user:nginx:r /home/foo/bar

ฉันละทิ้งเส้นทางนี้nginxเพื่อเพิ่มfooกลุ่ม แต่ ACL ที่กำหนดเองนั้นทำลายการพยายามเข้าถึงไฟล์ของ nginx ฉันล้างมันด้วยการวิ่ง:

sudo setfacl -b /home/foo/bar

จากนั้น nginx ก็สามารถเข้าถึงไฟล์ได้


0

หากคุณใช้ PHP ตรวจสอบให้แน่ใจว่าindexคำสั่ง NGINX ในบล็อกเซิร์ฟเวอร์มี index.php:

index index.php index.html;

สำหรับข้อมูลเพิ่มเติมชำระเงินคำสั่งดัชนีในเอกสารอย่างเป็นทางการ


0

ฉันกำลังเผชิญกับปัญหาเดียวกัน แต่การแก้ปัญหาข้างต้นไม่ได้ช่วย

ดังนั้นหลังจากการต่อสู้มากมายฉันพบว่าsestatusถูกตั้งค่าให้บังคับใช้ซึ่งบล็อกพอร์ตทั้งหมดและโดยการตั้งค่าให้อนุญาตปัญหาทั้งหมดได้รับการแก้ไข

sudo setenforce 0

หวังว่านี่จะช่วยให้คนอย่างฉัน


ในขณะที่อาจแก้ไขปัญหาของคุณ - ขอแสดงความยินดี! - มันค่อนข้างเศร้า :-( ดูstopdisablingselinux.com - คุณหาวิธีแก้ปัญหาอื่นได้ไหม?
Angus Ireland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.