Apache จะไม่ติดตาม symlinks (403 Forbidden)


92

ฉันมีปัญหาในการตั้งค่า Apache บน Ubuntu ฉันทำตามคู่มือนี้แล้ว

# /usr/sbin/apache2 -v
Server version: Apache/2.2.17 (Ubuntu)
Server built:   Feb 22 2011 18:33:02

ไดเร็กทอรีสาธารณะของฉัน / var / www สามารถแสดงและเรียกใช้งานเพจ PHP ที่วางไว้ในนั้นได้สำเร็จ อย่างไรก็ตามฉันต้องการสร้าง symlink ใน / var / www ที่ชี้ไปยังไดเร็กทอรีในโฮมโฟลเดอร์ของฉันและแสดงเพจที่นั่น

[root /var/www]# ll
total 36
drwxr-xr-x  3 root root 4096 2011-09-11 14:22 .
drwxr-xr-x 14 root root 4096 2011-06-04 22:49 ..
lrwxrwxrwx  1 root root   16 2011-09-11 13:21 about -> /root/site/about

เมื่อฉันพยายามเข้าถึง / เกี่ยวกับเบราว์เซอร์ฉันได้รับ

Forbidden

You don't have permission to access /about on this server.

เท่าที่ฉันรู้ฉันให้สิทธิ์เพียงพอกับไฟล์ที่ฉันต้องการให้บริการ:

[root ~/site/about]# ll
total 24
drwxr-xr-x 5 root root 4096 2011-09-11 13:20 .
drwxr--r-- 3 root root 4096 2011-09-11 13:19 ..
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 contact
-rwxr-xr-x 1 root root 1090 2011-09-11 13:19 index.php
drwxr-xr-x 2 root root 4096 2011-09-11 13:20 me
drwxr-xr-x 2 root root 4096 2011-09-11 13:21 resume

ฉันทราบถึงตัวเลือก FollowSymLinks และฉันเชื่อว่ามีการตั้งค่าไว้ในไฟล์ / etc / apache2 / sites-enabled / 000-default ของฉัน:

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options FollowSymLinks Indexes MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

มีความคิดอะไรที่ฉันอาจขาดหายไป?

คำตอบ:


129

ตรวจสอบว่า Apache ได้ดำเนินการเพื่อสิทธิมนุษยชน/root, และ/root/site/root/site/about

วิ่ง:

chmod o+x /root /root/site /root/site/about

8
ขอบคุณมาก ... ฉันไม่ทราบว่าไดเร็กทอรีพาเรนต์ต้องใช้งานได้ด้วย
ทิม

39
ฉันไม่ได้บอกว่ามันจะไม่ได้ผล แต่โดยทั่วไปการให้ o + x บน / รูทไม่ใช่ความคิดที่ดี)
Michal Rzemieniecki

11
มิคาลพูดถูก ฉันพบว่าฉันสามารถใช้ ACL ได้ (อย่างน้อยใน Mac): chmod -R +a "_www allow list,search,readattr" /root /root/site /root/site/aboutซึ่งให้สิทธิ์เหล่านั้นเฉพาะแอป apache (_www) ซึ่งปลอดภัยกว่า "อื่น ๆ " เล็กน้อย
James S

1
ใน Mac OS (10.9.4) ~ / Documents ของฉันไม่มีสิทธิ์ในการดำเนินการและฉันมี git repo ซึ่งจะโฮสต์ไฟล์ไซต์ของฉัน ให้ chmod o + x บน ~ / Documents ได้เคล็ดลับ! ขอบคุณ!
Ernani Joppert

1
ในที่สุดก็ได้คำตอบ! ขอบคุณ.
whoan

23

ข้อผิดพลาดที่ 403 นอกจากนี้ยังอาจเกิดจากระบบไฟล์ที่เข้ารหัสเช่น symlink ไปยังโฟลเดอร์บ้านเข้ารหัส

หาก symlink ของคุณชี้ไปที่โฟลเดอร์ที่เข้ารหัสผู้ใช้ apache (เช่น www-data) จะไม่สามารถเข้าถึงเนื้อหาได้แม้ว่าจะตั้งค่าสิทธิ์ของ apache และไฟล์ / โฟลเดอร์อย่างถูกต้องก็ตาม การเข้าถึงของผู้ใช้www-dataสามารถทดสอบได้ด้วยการโทร:

sudo -u www-data ls -l /var/www/html/<your symlink>/

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

/ubuntu/633625/public-folder-in-an-encrypted-home-directory

เครื่องมือที่สะดวกสำหรับวัตถุประสงค์ของฉันคือlsyncd สิ่งนี้ช่วยให้ฉันทำงานได้โดยตรงในโฟลเดอร์บ้านที่เข้ารหัสของฉันและสามารถเห็นการเปลี่ยนแปลงได้เกือบจะในทันทีในหน้าเว็บ apache การซิงโครไนซ์ถูกทริกเกอร์โดยการเปลี่ยนแปลงในระบบไฟล์โดยเรียก rsync เนื่องจากฉันทำงานเฉพาะกับหน้าเว็บและสคริปต์ที่ค่อนข้างเล็กการซิงค์จึงรวดเร็วมาก ฉันตัดสินใจใช้การหน่วงเวลาสั้น ๆ 1 วินาทีก่อนที่ rsync จะเริ่มทำงานแม้ว่าจะสามารถตั้งค่าหน่วงเวลา0 วินาทีได้ก็ตาม

การติดตั้ง lsyncd (ใน Ubuntu):

sudo apt-get install lsyncd

การเริ่มบริการพื้นหลัง:

lsyncd -delay 1 -rsync /home/<me>/<work folder>/ /var/www/html/<web folder>/

3
วิธีsudo -u www-data ...นี้เป็นวิธีที่ดีในการตรวจสอบว่ามีปัญหาการอนุญาตหรือไม่! โปรดทราบว่าผู้ใช้อาจเป็น www-data, apache หรืออย่างอื่นขึ้นอยู่กับ distro ของคุณ
mkasberg

อ๊ะในที่สุด! ฉันสงสัยในความสามารถพื้นฐานที่สุดของฉันแล้ว!
kalabalik

เสียเวลาไปหลายชั่วโมงและมันก็ถูกเข้ารหัสในที่สุด!
myol

15

ฉันประสบปัญหาคล้ายกันซึ่งฉันไม่สามารถแก้ไขได้เป็นเวลานานบนเซิร์ฟเวอร์ใหม่ของฉัน นอกจากคำตอบของ Palacsint แล้วคำถามที่ควรถามคือ: คุณใช้ Apache 2.4 หรือไม่? ใน Apache 2.4 มีกลไกที่แตกต่างกันสำหรับการตั้งค่าการอนุญาตที่ไม่ทำงานเมื่อเสร็จสิ้นโดยใช้การกำหนดค่าข้างต้นดังนั้นฉันจึงใช้วิธีแก้ปัญหาที่อธิบายไว้ในบล็อกโพสต์นี้

โดยทั่วไปสิ่งที่ฉันต้องทำคือแปลงไฟล์กำหนดค่าจาก:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    allow from all

</Directory>

ถึง:

Alias /demo /usr/demo/html

<Directory "/usr/demo/html">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

สังเกตว่าบรรทัดคำสั่งและอนุญาตถูกแทนที่โดยกำหนดให้อนุญาตทั้งหมด


โปรดทราบว่าคำสั่ง Order / Allow / Deny ยังคงมีอยู่ในคอมพิวเตอร์ส่วนใหญ่ ในเวอร์ชันที่ใหม่กว่าจะใช้งานในaccess_compatโมดูล หากโมดูลนั้นเปิดใช้งานส่วนแรกจะไม่ทำงานตามที่คาดไว้ หากไม่มีอยู่การพยายามเริ่ม Apache2 ควรล้มเหลวโดยมีข้อผิดพลาด
Alexis Wilke

config ตัวไหน /etc/httpd/conf/httpd.confไม่ได้อยู่ในระบบของฉันและยังไดเรกทอรี/etc/httpd/ไม่มีอยู่
Aaron Franke

@AaronFranke คุณติดตั้ง apache แล้วหรือยัง? ได้ที่นี่: /etc/apache2/httpd.conf /etc/apache2/apache2.conf /etc/httpd/httpd.conf /etc/httpd/conf/httpd.conf
RightHandedMonkey

ใช่ฉันติดตั้ง Apache แล้วและฉันใช้ Ubuntu /etc/apache2/apache2.confมีอยู่สำหรับฉัน
Aaron Franke

7

เกี่ยวกับคำถามนี้ฉันเพิ่งรู้ว่าทำไม vhost ถึงให้ 403 แก่ฉัน

ฉันได้ทดสอบความเป็นไปได้ทั้งหมดสำหรับคำถามนี้และคำถามอื่น ๆ ที่ไม่มีโชค มันทำให้ฉันแทบคลั่ง

ฉันกำลังตั้งค่าเซิร์ฟเวอร์ที่มีการปรับใช้รุ่นคล้ายกับ Capistrano ผ่านทาง symlinks และเมื่อฉันพยายามเข้าถึงโฟลเดอร์ DocRoot (ซึ่งตอนนี้เป็น symlink ไปยังโฟลเดอร์รีลีสปัจจุบัน) มันให้ 403 แก่ฉัน

vhost ของฉันคือ:

DocumentRoot /var/www/site.com/html
<Directory /var/www/site.com/html>
        AllowOverride All
        Options +FollowSymLinks
        Require all granted
</Directory>

และไฟล์ httpd.conf หลักของฉันคือ (ติดตั้ง Apache 2.4 เริ่มต้น):

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes -FollowSymLinks -Includes
(...)

ปรากฎว่าคำจำกัดความของตัวเลือกหลักมีความสำคัญเหนือกว่า vhosts fiel ของฉัน (สำหรับฉันที่ตอบโต้ได้ง่าย) ฉันจึงเปลี่ยนเป็น:

DocumentRoot "/var/www"
<Directory "/var/www">
    Options -Indexes +FollowSymLinks -Includes
(...)

และยูเรก้า! (สังเกตเครื่องหมายบวกก่อน FollowSymLinks ในไฟล์ MAIN httpd.conf หวังว่านี่จะช่วยคนที่หลงทางได้บ้าง


ใน Apache 2.4 โซลูชันของคุณจะทำให้การกำหนดค่าเป็นโมฆะและ httpd จะไม่สามารถเริ่มทำงานได้เนื่องจากคุณไม่สามารถรวม '+' และ '-' ในบรรทัดตัวเลือกเดียวได้
deesto

ใช่แล้วแม้ว่าฉันจะประกาศ DocumentRoot "ก่อนหน้านี้" ในไฟล์ แต่มันกำลังทับส่วนไดเรกทอรีลูก (อะไรนะ?)
rogerdpack

2

มีอีกวิธีหนึ่งที่การเชื่อมโยงสัญลักษณ์อาจทำให้คุณล้มเหลวดังที่ฉันค้นพบในสถานการณ์ของฉัน หากคุณมีระบบ SELinux เป็นเซิร์ฟเวอร์และลิงก์สัญลักษณ์ชี้ไปยังโฟลเดอร์ที่ติดตั้ง NFS (ระบบไฟล์อื่นอาจให้อาการคล้ายกัน) httpdอาจเห็นบริบทที่ไม่ถูกต้องและปฏิเสธที่จะให้บริการเนื้อหาของโฟลเดอร์เป้าหมาย

ในกรณีของฉันบริบทของ SELinux /var/www/html(ซึ่งคุณสามารถขอรับด้วยls -Z) unconfined_u:object_r:httpd_sys_content_t:s0เป็น การเชื่อมโยงสัญลักษณ์/var/www/htmlจะมีบริบทเดียวกัน แต่บริบทเป้าหมายของพวกเขาเป็น NFS system_u:object_r:nfs_t:s0ติดตั้งโฟลเดอร์เป็น

การแก้ปัญหาคือการเพิ่มfscontext=unconfined_u:object_r:httpd_sys_content_t:s0ไปยังmountตัวเลือก (เช่น# mount -t nfs -o v3,fscontext=unconfined_u:object_r:httpd_sys_content_t:s0 <IP address>:/<server path> /<mount point>) rootcontextไม่เกี่ยวข้องและdefcontextถูกปฏิเสธโดย NFS ฉันไม่ได้ลองcontextด้วยตัวเอง


2

ก่อนอื่นให้ปิดการใช้งาน Selinux (vim / etc / selinux / config)

vim /etc/httpd/conf/httpd.conf แก้ไขบรรทัดต่อไปนี้สำหรับ symlink และการจัดทำดัชนีไดเรกทอรี:

documentroot /var/www/html
<directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride None
</directory>

ถ้าไฟล์. htaccess แล้ว AllowOverride all


จะเกิดอะไรขึ้นถ้าฉันไม่มี/etc/httpd/โฟลเดอร์ในระบบของฉัน?
Aaron Franke


1

นอกเหนือจากการเปลี่ยนสิทธิ์ตามที่คำตอบอื่น ๆ ระบุแล้วฉันต้องรีสตาร์ท apache เพื่อให้มีผล:

sudo service apache2 restart

0

อีกหนึ่งข้อผิดพลาดที่ลึกซึ้งในกรณีที่คุณต้องการAllowOverride All:

บางลึกในต้นไม้ FS ที่เก่า.htaccessมี

    Options Indexes

แทน

    Options +Indexes

เพียงแค่ปิดการใช้งานFollowSymLinksชุดในการกำหนดค่าเซิร์ฟเวอร์อย่างไม่ไยดีและทำให้เกิด 403 ลึกลับที่นี่


0

เมื่อเปิดใช้งานตัวเลือก FollowSymLinks:

$ rg "FollowSymLinks" /etc/httpd/
/etc/httpd/conf/httpd.conf
269:    Options Indexes FollowSymLinks

คุณต้องการไดเร็กทอรีทั้งหมดใน symlink เพื่อให้เรียกใช้งานได้โดยผู้ใช้ httpd กำลังใช้

ดังนั้นสำหรับกรณีการใช้งานทั่วไปนี้:

cd /path/to/your/web
sudo ln -s $PWD /srv/http/

คุณสามารถตรวจสอบสิทธิ์ของเจ้าของด้วยnamei :

$ namei -m /srv/http/web
f: /srv/http/web
 drwxr-xr-x /
 drwxr-xr-x srv
 drwxr-xr-x http
 lrwxrwxrwx web -> /path/to/your/web
   drwxr-xr-x /
   drwxr-xr-x path
   drwx------ to
   drwxr-xr-x your
   drwxr-xr-x web

ในtoไดเร็กทอรีเคสของฉันสามารถดำเนินการได้สำหรับผู้ใช้ของฉันเท่านั้น:

เปิดใช้งานการดำเนินการโดยผู้อื่นแก้ปัญหาได้:

chmod o+x /path/to

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.