สคริปต์ PHP ไม่สามารถรันสคริปต์ทุบตีได้ sh: ปฏิเสธการอนุญาต


14

ฉันพยายามเรียกใช้สคริปต์. sh จาก PHP แต่ไม่ได้ดำเนินการ

ฉันตรวจสอบบันทึกข้อผิดพลาดและฉันได้รับข้อผิดพลาด 'sh: การอนุญาตที่ถูกปฏิเสธ' ฉันตรวจสอบภายใต้ php ผู้ใช้ที่กำลังทำงานและจะทำภายใต้ผู้ใช้ apache

ฉันพยายามเปลี่ยนความเป็นเจ้าของ. sh เป็นผู้ใช้ apache แต่ไม่มีผลลัพธ์

ฉันคิดว่าตอนแรกเป็นเพราะสคริปต์อยู่นอก www / dir อย่างไรก็ตามแม้ว่าฉันจะวางสคริปต์ในไดเรกทอรีเดียวกันข้อผิดพลาดก็ยังคงได้รับ

มีวิธีแก้ไขปัญหาอื่นนอกเหนือจากการเพิ่มผู้ใช้ apache ในรายการ SUDOers หรือไม่?

สคริปต์ sh ทำงานได้ดีถ้าฉันเรียกใช้จาก putty โดยใช้คำสั่ง 'php filename.php'


3
มันเป็นเชลล์สคริปต์หรือไฟล์ PHP หรือไม่? ย่อหน้าสุดท้ายของคุณไม่ชัดเจนเกี่ยวกับเรื่องนั้น นอกจากนี้คุณได้ตั้งค่าดำเนินการอนุญาต ( x) ในไฟล์หรือไม่ คุณระบุล่ามสคริปต์ในบรรทัด Shebang หรือไม่?
Daniel Beck

มันเป็นสคริปต์ทุบตีที่จะเรียกใช้จาก PHP ใช่ฉันทำให้มันเป็นปฏิบัติการและฉันได้ระบุล่ามสคริปต์ มันทำงานอย่างถูกต้องเมื่อฉันรันสคริปต์ PHP จากผงสำหรับอุดรูและสคริปต์ bash จะถูกเรียกใช้และทำงานอย่างถูกต้อง แต่ถ้าฉันรันสคริปต์ php จากเว็บเบราเซอร์แทนมันจะไม่สามารถรันสคริปต์ bash และมันจะทำข้อผิดพลาดนี้เนื่องจากมันทำงานในฐานะผู้ใช้ apache และไม่ใช่ผู้ใช้ที่ฉันใช้ในสีโป๊ว
Robin Presto

1
ลองchmod 775 yourscript.shดู ที่จะให้สิทธิ์r-x(อ่านและดำเนินการ) แก่ผู้ใช้ "อื่น ๆ " ในไฟล์นั้น
Rhyuk

ฉันลองแล้ว ไม่มีโชค .. ฉันไม่รู้เหตุผลที่แน่นอนจนกระทั่งพรุ่งนี้ ฉันไม่สามารถเข้าถึงบันทึกจากตำแหน่งของฉัน ฉันจะกลับไปหาพวกคุณ ขอขอบคุณสำหรับความช่วยเหลือของคุณ. :)
Robin Presto

คำตอบ:


10

ลองคำแนะนำต่อไปนี้:

  • ลองเรียกใช้คำสั่งทดสอบด้านล่างและตรวจสอบว่าทำงานได้หรือไม่:
    • php -r "echo exec('whoami');"
  • ตรวจสอบให้แน่ใจว่าไดเรกทอรีหลักและไฟล์ทั้งหมดมีr-xสิทธิ์ในการตั้งค่าสถานะอย่างน้อย:
    • chmod 755 dir; chmod 755 file
  • ตรวจสอบให้แน่ใจว่าเจ้าของของไฟล์ที่เป็นของคุณผู้ใช้อาปาเช่
    • ลองเพิ่ม+sแฟล็ก (sudo) ไปยังไฟล์ (ไม่แนะนำ):
      • chmod u+s file,
  • ตรวจสอบให้แน่ใจว่า PHP safe_modeของคุณไม่ได้ทำงานใน
  • ตรวจสอบให้แน่ใจว่าสคริปต์อยู่ในราก Apache ของคุณ:
    • มิฉะนั้นย้ายสคริปต์ภายใน
    • หรือเพิ่มไดเรกทอรีนั้นลงในการกำหนดค่า Apache ของคุณ
    • หรือเพิ่มไดเรกทอรีนี้ในของคุณinclude_pathเช่น:
      • php.ini ไฟล์: include_path ".:/usr/local/lib/php:/your/dir"
      • หรือ.htaccessไฟล์:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • ตรวจสอบว่าเชลล์ของคุณถูกตั้งค่าให้ถูกต้อง (เช่น/bin/sh) กับผู้ใช้ Apache ของคุณ (เช่นตรวจสอบด้วยfinger:)
  • ตรวจสอบให้แน่ใจว่าคุณphp.iniไม่ได้ใช้: disable_functionsสำหรับexecฟังก์ชั่น
  • หากใช้ SELinux หรือselinux-utilsติดตั้ง (ระบบรักษาความปลอดภัย Linux) ให้ตรวจสอบgetenforce/ setenforceกำหนดค่าตามที่อธิบายไว้ในคำตอบ@Tonin

การแก้ไขปัญหา:

  • หากคุณเปลี่ยนไฟล์php.iniหรือhttpd.confไฟล์อย่าลืมรีสตาร์ทเว็บเซิร์ฟเวอร์
  • ตรวจสอบบันทึกข้อผิดพลาด Apache ของคุณสำหรับรายละเอียดเพิ่มเติม
  • เปิดการใช้งานของคุณในphp.iniทุกชนิดของข้อผิดพลาด ( display_error, error_reportingฯลฯ )

1
นั่นเป็นปัญหาของฉัน .. ไดเรกทอรีแม่ไม่มีสิทธิ์ดำเนินการ ... มันใช้ได้เลย! ขอขอบคุณ! :)
Robin Presto

ยังไม่มีโชคสำหรับฉัน :( ข้อเสนอแนะใด ๆ `` `[root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x 27 root root 4096 Sep 3 12:31 / drwxrwxrwt. 4 root root 4096 Sep 3 15:45 / tmp -rwxr-xr-x. 1 root root 24 Sep 3 15:39 / tmp / sleep safe_mode = Off include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy

1
Argh, setenforce แก้ไขมัน OMG
pihentagy

13

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

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

คุณสามารถมีมุมมองที่สมบูรณ์ยิ่งขึ้นในการกำหนดค่าปัจจุบันด้วย:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

การเปลี่ยนแปลงนี้สามารถทำได้อย่างถาวรโดยแก้ไข/etc/selinux/configไฟล์และตั้งค่าSELINUXตัวแปรเป็นpermissivedisabledหรือ

แต่วิธีที่ถูกต้องในการแก้ไขปัญหานี้หากคุณอยู่ในสถานการณ์เช่นนี้ก็คือการตรวจสอบ/var/log/audit/audit.logไฟล์บันทึก มันจะมีเหตุการณ์ทั้งหมดที่เกี่ยวข้องกับกฎ SELinux จากนั้นคุณควรให้บริบทที่ถูกต้องแก่สคริปต์ของคุณเช่นได้รับอนุญาตให้ทำงานโดยผู้ใช้ apache / php การตรวจสอบบริบทความปลอดภัยของ SELinux นั้นทำได้ด้วยls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

รายการนี้ผู้ใช้บทบาทและประเภทของแต่ละไฟล์ / ไดเรกทอรี ที่นี่httpd_sys_script_exec_tประเภทให้ไฟล์ในไดเรกทอรี cgi สิทธิ์ที่จะดำเนินการโดย httpd เชลล์สคริปต์ของคุณอาจมีประเภทเดียวกัน

คุณยังสามารถป้อน audit.logบรรทัดไปยังaudit2allowคำสั่ง มันจะส่งผลให้คุณมีการเปลี่ยนแปลงที่จำเป็นเพื่อให้ SELinux มีความสุข แต่โดยปกติแล้วการเปลี่ยนแปลงที่แนะนำจะต้องทำในนโยบายของ SELinux ซึ่งไม่ใช่สิ่งที่คุณควรทำในกรณีของคุณ (ยังคงเอาท์พุทนี้สามารถให้เบาะแสบางอย่างที่เกิดขึ้น)

หน้าต่อไปนี้อธิบายปัญหาที่คล้ายกันและวิธีต่างๆในการแก้ไข: http://sheltren.com/stop-disabling-selinux


ขอบคุณสำหรับคำตอบอย่างละเอียด! อนิจจาอย่างที่ฉันบอกไปฉันไม่สามารถเข้าใช้รูทได้จนกระทั่งพรุ่งนี้ ดังนั้นฉันจะกลับไปหาคุณด้วย! :) และใช่ฉันใช้ CentOS
Robin Presto

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

ไม่ต้องกังวลดีใจที่รู้ว่าคุณได้เรียนรู้จากโพสต์ของฉัน!
Tonin

หากการเสริมกำลังเป็นปัญหาก็ไม่เป็นที่แน่ชัดว่าเกิดอะไรขึ้น มันช่วยชีวิตฉันไว้!
pihentagy

1

ดังนั้นฉันมาที่นี่หลังจากค้นหาปัญหาที่คล้ายกันใน Google ฉันคิดว่าจะทิ้งความคิดเห็นเกี่ยวกับ SELinux ชี้ให้ฉันไปในทิศทางที่ถูกต้อง

ในกรณีของฉันเองฉันใช้สคริปต์ปรับใช้ Git ที่กำหนดเองซึ่งใช้คำสั่งเชลล์ คำสั่งทำงานได้ดีบน BASH แต่มี "ปฏิเสธสิทธิ์" และ "ไม่ใช่ที่เก็บ" ใน Git นี่เป็นเรื่องแปลกจริง ๆ และฉันได้ทำการแก้ไขหลายครั้งจนกว่าฉันจะพบคำตอบนี้

root@ls:~# /usr/sbin/setenforce Permissive แก้ไขปัญหาให้ฉัน


0

สถานการณ์ของฉันแตกต่างกันเล็กน้อย แต่ Google พาฉันมาที่นี่ดังนั้นฉันคิดว่าฉันจะแบ่งปัน ...

เซิร์ฟเวอร์ของฉันทำงานที่มั่นคงเดเบียนและพยายามที่จะรันสคริปต์เปลือกทำงานครั้งเดียวแล้วสิทธิ์การเปลี่ยนแปลงโดยอัตโนมัติ 644 และพยายามต่อไปในการทำงาน Permission deniedGot มันกลายเป็นปัญหาของเซิร์ฟเวอร์แซมบ้าสำหรับฉันและฉันไม่ได้สังเกตเห็นรูปแบบจนกระทั่งบัดนี้

การเปลี่ยนแปลงสิทธิ์ของ QA Strange เมื่อบันทึกไฟล์บนพาร์ติชัน Samba จากตัวแก้ไข Windowsคือการแก้ไข ฉันไม่รู้เกี่ยวกับmap archive = noตัวเลือกนี้แม้หลังจากใช้งานแซมบ้าร่วมกันมาสิบปี

บางอย่างเกี่ยวกับการใช้ Notepad ++ บนเดสก์ท็อป Windows จะเปลี่ยนการอนุญาตของไฟล์เป้าหมายเป็น 675 แทนที่จะเป็น 775 เนื่องจาก umask ถูกตั้งค่าไว้


-7

การรันคำสั่งรูทใน PHP ผ่าน Apache

ฉันมีเว็บแอปพลิเคชันที่จำเป็นต้องใช้คำสั่งเชลล์ในฐานะรูทภายในฟังก์ชั่น PHP และคุณคิดว่ามันจะตรงไปตรงมา… แต่มันต้องใช้ googles สองสามตัวของฉันเพื่อรับรายละเอียดทั้งหมดดังนั้นนี่คือบันทึกย่อของฉัน มัน. นี่เป็นระบบ Linux ที่ใช้ Apache และเราจะใช้“ sudo” ใน“ shell_exec” เพื่อเรียกใช้คำสั่ง

สิ่งสำคัญคือการแก้ไขไฟล์ / etc / sudoers และโดยทั่วไปคุณสามารถ (เป็น root) ใช้คำสั่ง” visudo” เพื่อทำเช่นนั้น

ตรวจสอบให้แน่ใจว่า apache สามารถเรียกใช้คำสั่งและไม่จำเป็นต้องใช้รหัสผ่าน:

apache  ALL=(ALL)       NOPASSWD: ALL

จากนั้นคุณต้องแสดงความคิดเห็นออกบรรทัดนี้:

#Defaults    requiretty

หากคุณไม่ทำเช่นนั้นคุณจะเห็นข้อผิดพลาดเหล่านี้ใน / var / log / secure:“ ขออภัยคุณต้องมี tty เพื่อเรียกใช้ sudo” ตอนนี้คุณพร้อมที่จะไปและรหัส PHP นั้นง่าย:

$ results = shell_exec ('sudo date');


5
นี่เป็นความคิดที่แย่มาก หากการติดตั้ง apache ของคุณถูกบุกรุกหรือแอปพลิเคชันที่คุณใช้งานอยู่ ... แฮกเกอร์ของคุณสามารถเข้าถึงระบบได้อย่างง่ายดายมากเกินไป สิ่งที่ถูกต้องคือการเปลี่ยนการอนุญาตให้ใช้สคริปต์อย่าปล่อยให้สิ่งต่าง ๆ เปิดกว้าง
Journeyman Geek

2
ฉันรู้สึกผูกพันที่จะออก downvote ในคำตอบนี้เนื่องจากความกังวลด้านความปลอดภัยที่ชัดเจนกับการให้สิทธิ์ผู้ใช้ apache / บทบาททั้งหมด
Ramhound

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