“ ไม่อนุญาตให้ใช้ลิงก์สัญลักษณ์หรือลิงก์เป้าหมายไม่สามารถเข้าถึงได้” / Apache บน CentOS 6


30

ฉันมีการติดตั้ง CentOS 6 ใหม่เอี่ยมซึ่งมี symlink ในรูทเอกสารไปยังไฟล์การพัฒนาของฉัน:

[root@localhost html]# ls -l
total 4
-rwxrwxrwx. 1 root root  0 Sep 18 20:16 index.html
-rwxrwxrwx. 1 root root 17 Sep 18 20:16 index.php
lrwxrwxrwx. 1 root root 24 Sep 18 20:19 refresh-app -> /home/billy/refresh-app/

httpd.conf ของฉันมีสิ่งนี้:

<Directory "/">
    Options All
    AllowOverride None
    Order allow,deny
    Allow from all
</directory>

เป้าหมายของลิงก์สัญลักษณ์มีสิทธิ์ที่ควรอนุญาตให้ Apache อ่านสิ่งที่ต้องการ:

 [root@localhost billy]# ls -l
total 40 (Some entries were omitted because the list was too long
drwxr-xr-x. 7 billy billy 4096 Sep 18 20:03 refresh-app

ฉันได้ลองปิดการใช้งาน SELinux ด้วยการเปลี่ยน/etc/selinux/conf:

SELINUX=disabled

แต่ไม่ว่าฉันจะทำอะไรเมื่อมีคนพยายามไปที่ลิงค์http://localhost/refresh-app/นั้นฉันก็จะได้รับหน้าข้อผิดพลาด 403 แบบที่ต้องห้ามและสิ่งนี้เขียนไว้ใน/var/log/httpd/error_log:

Symbolic link not allowed or link target not accessible

ทำไม Apache ไม่สามารถเข้าถึงเป้าหมายของ symlink ได้?


ผู้ใช้คนใดที่ Apache ใช้งานอยู่ คุณสามารถอ่านทรัพยากรในฐานะผู้ใช้นั้นได้จริงหรือไม่?
draeath

นอกจากนี้คุณยังดีกว่าเรียกใช้ selinux ในโหมดอนุญาตแล้วใช้ sealert เพื่อแยกวิเคราะห์บันทึกการตรวจสอบ - ซึ่งจะช่วยให้คุณเห็นสาเหตุ / วิธีที่ SELinux ปฏิเสธและมักจะให้ความละเอียดกับคุณ
draeath

@raeath: ฉันไม่รู้ว่าจะตรวจสอบอย่างไร
Billy ONeal

@draeath: 1. นี่ไม่ใช่กล่องผลิต ฉันไม่สนใจว่า SELinux ปิดอยู่หรือไม่ 2. ไม่ว่าในกรณีใดฉันเพิ่งแก้ไขปัญหา ณ จุดนี้ - ฉันอาจจะกู้คืนได้เมื่อฉันทราบสาเหตุของปัญหา
Billy ONeal

ไม่ต้องกังวลว่านี่เป็นการกำกับดูแลทั่วไปครั้งแรกที่ฉันทำมันฉันติดอยู่หลายวันserverfault.com/questions/313485/… :: ข้อผิดพลาดหนึ่งในนั้น : D
whoami

คำตอบ:


44

พบปัญหา เปิดออก Apache ต้องการจะใช้ไม่ได้เป็นเพียงไดเรกทอรีฉันให้บริการ/home/billy/refresh-app/แต่ยังทุกไดเรกทอรีดังกล่าวข้างต้นนั้นคือ/home/billy/, และ/home /(ฉันไม่รู้ว่าทำไม ... ให้คนเข้าถึงไดเรกทอรีย่อยไม่จำเป็นต้องให้สิทธิ์กับทุกสิ่งที่อยู่เหนือไดเรกทอรีย่อยนั้น .... )

ฉันเดาว่ามันกำลังมองหา.htaccessหรืออะไรซักอย่างหรือบางทีอาจจะเป็นเรื่องที่แปลกประหลาดเกี่ยวกับวิธีการใช้งานการอนุญาตให้ทำไดเรกทอรี


15
มันไม่แปลก มันเป็นวิธีการทำงาน คุณต้องมี + x สำหรับเส้นทางทั้งหมดที่คุณพยายามเข้าถึง
bahamat

4
@bahamat: นั่นไม่สมเหตุสมผลเลย ทำไมทุกคนต้องมีสิทธิ์ดำเนินการสำหรับไฟล์ที่ไม่ได้ดำเนินการ (นี่เป็นการลดราคาให้อย่างสมบูรณ์แบบที่ไม่ควรให้สิทธิ์แก่/... มากทีเดียว) ระบบที่มี ACL มักจะมีตัวเลือกการแยกไดเรกทอรีแบบแยกต่างหาก คุณคิดว่าหลังจาก 30 ปีที่ผ่านมาตั้งแต่ Unix ได้รับการออกแบบและความพร้อมใช้งานที่กว้างขวางของระบบ ACL นั่นคือ ACL จะเป็นมาตรฐาน : ถอนหายใจ:
Billy ONeal

11
ฉันเชื่อว่าเขาหมายถึง + x ในไดเรกทอรี ลองเปลี่ยนเป็นผู้ใช้และ cd-ing ไปยังไดเรกทอรีที่มี / x จากหน่วยความจำ + x ช่วยให้คุณสามารถเข้าถึง แต่ไม่เห็นไดเรกทอรีในขณะที่ + r ช่วยให้คุณสามารถแสดงรายการไฟล์และ + w ช่วยให้คุณสามารถเปลี่ยนไฟล์ในไดเรกทอรีดังกล่าวได้

1
@BillyONeal: วลี "ทั้งเส้นทาง" แสดงถึงไดเรกทอรี
บาฮามาต

5
นี่คือพฤติกรรมที่ถูกต้องในยูนิกซ์ คุณต้องมีสิทธิ์ดำเนินการ (+ x สำหรับ g หรือ o) ในไดเรกทอรีหลักที่คุณพยายามเปลี่ยนเป็นไดเรกทอรีย่อยที่อยู่ด้านล่าง
slm

11

ฉันมีปัญหาที่คล้ายกันซึ่งฉันมีการกำหนดค่าต่อไปนี้ซึ่งเคยทำงานกับ Ubuntu 10 แต่หยุดทำงานกับ Ubuntu 14 (Apache 2.4):

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +FollowSymLinks
</Directory>

การสลับไปยังการเรียงลำดับปัญหา (แม้ว่าผู้ใช้เว็บเซิร์ฟเวอร์ไม่สามารถเข้าถึง symlink ได้โดยตรง)

<Directory /var/www/vhosts/example.com/httpdocs>
    Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
</Directory>

จากสิ่งที่ฉันสามารถบอกได้เพียงการ-SymLinksIfOwnerMatchตั้งค่าและมีส่วนเกี่ยวข้องกับการเปลี่ยนแปลงใน Apache 2.4 แต่ฉันไม่ได้พยายามค้นหาสาเหตุที่แน่นอน

ฉันก็คิดว่ามันอาจจะเป็นopenbase_dirข้อ จำกัด ใน PHP แต่ก็ไม่เป็นเช่นนั้น


6

ข้อผิดพลาดนี้อาจเกิดขึ้นหากคุณเชื่อมโยงไปยังโฟลเดอร์ที่เข้ารหัส


4

ปรากฏว่า "FollowSymLinks" เป็นตัวเลือกที่คุณต้องการใน httpd.conf มันมีรายละเอียดที่นี่ ดูเหมือนว่าคุณอาจต้องการกฎใน htdocs ด้วย ... แต่เป็นตัวเลือกที่คุณต้องการ


3
ดูOptions All- FollowSymLinksได้ระบุไว้แล้ว
Billy ONeal

2

คุณอาจต้องการตรวจสอบว่ามีการบังคับใช้ selinux หรือไม่ บน RedHat / Fedora ให้ทำสิ่งนี้:

getenforce

หากการตอบสนองคือ 'การบังคับใช้' คุณอาจต้องการดำเนินการ

setenforce 0

และลอง URL ใหม่อีกครั้งในเบราว์เซอร์ของคุณ

โปรดทราบว่าฉันไม่ได้บอกว่าการปิดใช้งาน selinux เป็นวิธีที่ดีที่สุดในการแก้ปัญหานี้ แต่อาจช่วยระบุสาเหตุได้


วิธีนี้แก้ไขปัญหาลิงก์ sym แต่มีผลกระทบเชิงลบหรือไม่
digz6666

2
Options +FollowSymLinks

สร้างไฟล์. htaccess โดยใช้กลอุบายสำหรับฉัน (วางไว้ใน dir ก่อน symlink)


ในกรณีของฉันฉันกำลังสร้าง/var/wwwลิงก์สัญลักษณ์ไปยังลิงก์สัญลักษณ์กลางอื่น หากคุณต้องใช้ลิงก์สัญลักษณ์ให้เป็นลิงก์สัญลักษณ์โดยตรงไปยังปลายทางของคุณ
Sridhar Sarnobat

0

สิ่งที่แก้ปัญหาของฉันหลังจากที่อนุญาตให้ใช้สิทธิ์ทั้งหมดและอนุญาตให้ followymlink "ในกรณีของ FollowSymLinks โดยเฉพาะต้องอยู่ในโครงสร้าง Directory เมื่ออยู่ในไฟล์. config จากคู่มือปัจจุบันของ Apache

ตัวเลือก FollowSymLinks และ SymLinksIfOwnerMatch ทำงานได้เฉพาะในส่วนหรือไฟล์. htaccess

ตอบจากที่นี่


0

/home/repoวิธีการแก้ปัญหาของฉันคือการสร้างโฟลเดอร์ที่ใช้ร่วมกันสำหรับการเก็บชื่อทั้งหมด

จากนั้นเชื่อมโยงจากบ้านของฉันเองเช่น: ln -s /home/repo ~/Code ดังนั้น~/Code/www.xxxx.com/public ชี้ไปที่ /home/repo/www.xxxx.com/public

และลิงก์ไปยัง apache web root /var/www/html ชี้ไปที่ /home/repo/www.xxxx.com/public

พบได้ที่นี่: https://github.com/alghanmi/ubuntu-desktop_setup/wiki/Git-Local-Repository-Setup-Guide

ด้วยการแสดงกายกรรม symlink + กลุ่มผู้ใช้คุณสามารถมีผู้ใช้หลายคน / รุ่นที่ปรับใช้


0

@Billey ONeil @Flion ฉันไม่สามารถตอบในบรรทัด (นับตัวแทนต่ำ) ที่
นี่ฉันต้องทำ:
( หมายเหตุ:นามแฝง ll = 'ls $ LS_OPTIONS -lh')

root@Bellach:/var/www/html# ll lego
lrwxrwxrwx 1 root root 43 Sep 10 21:21 lego -> /home/DATA/Documents/Chris/Synced/web/lego/

ตอนนี้ดูทุกไดเรกทอรีในลิงค์แหล่งที่มา

root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/web/
drwxr-xr-x 9 chris chris 4.0K Sep 12  2017 /home/DATA/Documents/Chris/Synced/web/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/Synced/
drwxr-xr-x 20 chris chris 4.0K Mar 27 18:52 /home/DATA/Documents/Chris/Synced/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/Chris/
drwxr-xr-x 36 chris chris 4.0K Jun 17 23:31 /home/DATA/Documents/Chris/
root@Bellach:/var/www/html# ll -d /home/DATA/Documents/
drwxr-xr-x 21 chris chris 4.0K Aug  7 18:22 /home/DATA/Documents/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-- 10 root users 4.0K Sep 10 11:17 /home/DATA/
root@Bellach:/var/www/html# ll -d /home/
drwxr-xr-x 5 root root 4.0K Sep 10 10:37 /home/

/ home / DATA directory เป็นผู้ร้าย
แก้ไขด้วยสิ่งนี้:

root@Bellach:/var/www/html# chmod +x /home/DATA/
root@Bellach:/var/www/html# ll -d /home/DATA/
drwxrwxr-x 10 root users 4.0K Sep 10 11:17 /home/DATA/

การแก้ไขทันที - ไม่ต้องรีสตาร์ท apache


-1

คุณอาจปรับการตั้งค่า SELinux ของคุณและ setenforce อาจไม่ได้อยู่ในเส้นทางของคุณ ลองทำสิ่งนี้:

sudo /usr/sbin/setenforce 0

และเพื่อทำให้สิ่งนี้คงอยู่ระหว่างการรีบูต

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