Score:2

มีเหตุการณ์บางอย่างใน Ubuntu หรือไม่?

ธง in

ฉันต้องการทราบว่า Ubuntu มีกิจกรรมบางอย่างหรือไม่ ฉันต้องทำงานให้เจนกินส์ แต่เจนกินส์ไม่มีสิทธิ์ sudo และฉันไม่ต้องการมอบให้เขา แต่งานจำเป็นต้องดำเนินการบางอย่างซึ่งต้องใช้สิทธิ์ sudo วิธีแก้ไขคือทริกเกอร์เหตุการณ์ซึ่งจะรับฟังในฐานะผู้ใช้รูท และเหตุการณ์นี้จะเรียกใช้โค้ดด้วยสิทธิ์ sudo ฉันอาจจะยังสับสนกับสิทธิพิเศษ แต่ฉันคิดว่านี่อาจมีประโยชน์มาก หรือบางอย่างเช่นส่วนต่อประสานผู้ใช้รูทสาธารณะซึ่งจะพร้อมใช้งานสำหรับผู้ใช้รายอื่น แต่จะเรียกใช้ในฐานะผู้ใช้รูท เช่น

รูท -> doSomethingAsRoot ()

หวังว่าคุณจะเข้าใจสิ่งที่ฉันต้องการบรรลุ ขอบคุณที่ช่วยเหลือ.

ป.ล. คำถามนี้เกี่ยวข้องกับ ปัญหานี้

muru avatar
us flag
แน่นอนว่ามีหลายสิ่งหลายอย่างที่ใช้ D-Bus สำหรับสิ่งนี้ เช่น GUI ผู้จัดการเครือข่ายและเครื่องมือบรรทัดคำสั่งสื่อสารผ่าน D-Bus กับ daemon ผู้จัดการเครือข่ายซึ่งทำงานในฐานะรูท
in flag
ขอบคุณฉันจะดูมัน
in flag
อืม ฉันกำลังค้นหาข้อมูลเกี่ยวกับ D-bus แต่ฉันไม่แน่ใจว่าสามารถเรียกใช้สคริปต์ภายใต้ผู้ใช้รูทได้หรือไม่ ซึ่งจะถูกทริกเกอร์กับผู้ใช้รายอื่น
raj avatar
cn flag
raj
คุณให้สิทธิ์ sudo กับ Jenkins ** สำหรับสคริปต์เฉพาะที่คุณต้องการเรียกใช้ ** ไม่ได้หรือ Sudo ไม่ใช่วิธีแก้ปัญหา "ทั้งหมดหรือไม่มีเลย" - ตรงกันข้าม คุณสามารถระบุได้อย่างละเอียดว่าผู้ใช้รายใดสามารถเรียกใช้อะไรได้บ้าง
in flag
โฟลว์ดูเหมือนว่า Jenkins รัน git clone Git repo มีสคริปต์ทุบตีที่ Jenkins เรียกใช้ และสคริปต์รัน `rm -rf` ในตอนท้าย และนั่นคือปัญหาที่ทำให้ฉันต้องลบไฟล์ที่มีสิทธิ์ 644 ของผู้ใช้อื่น (www-data) วิธีแก้ไขคือถ้าฉันสามารถบังคับให้ www-data (Laravel) สร้างไฟล์ที่มีสิทธิ์ 664 ได้
in flag
ฉันจะเพิ่มสิทธิ์ sudo ให้กับสคริปต์สำหรับ Jenkins ได้อย่างไร เจนกินส์สามารถเขียนบทใหม่แล้วทำอะไรก็ได้ ฉันรู้ว่า sudo สามารถมอบหมายให้คำสั่งไม่ให้สคริปต์ แต่ในกรณีนี้คำสั่งคือ rm ซึ่งอันตรายเล็กน้อย
raj avatar
cn flag
raj
@Äamo คุณยังสามารถจำกัดสิทธิ์ sudo ให้กับคำสั่ง **ด้วยพารามิเตอร์เฉพาะ** ดังนั้น หากสคริปต์ควรเรียกใช้ `sudo rm -rf /some/path` เช่น คุณสามารถให้สิทธิ์ Jenkins ในการเรียกใช้ `rm -rf /some/path` เท่านั้น แน่นอนว่าสิ่งนี้ไม่ง่ายเลยที่จะพยายามแก้ไขและลบไดเร็กทอรีอื่นออก แต่ก็ไม่ตรงไปตรงมา อย่างไรก็ตาม ในกรณีนั้น ฉันคิดว่าวิธีที่ปลอดภัยที่สุดคือการรัน setuid binary ที่รันคำสั่งฮาร์ดโค้ด `rm -rf /some/path`
in flag
สคริปต์ python หรือ php สามารถใช้เป็น "setuid binary" ได้หรือไม่ (ไม่แน่นอน) มันทำให้ฉันบ้า ...
in flag
ฉันมีมัน ฉันสร้างสคริปต์ทุบตีไม่รู้จบที่ทำงานเป็นรูทบนพื้นหลังซึ่งจะลบไดเร็กทอรีทุกๆ 10 วินาที https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-permissions
raj avatar
cn flag
raj
คุณได้แก้ไขปัญหาของคุณด้วยวิธีอื่นแล้ว (และอาจเป็นวิธีที่ดีกว่าหากจำเป็นต้องเปลี่ยนการอนุญาตเท่านั้น) แต่ฉันยังไม่เข้าใจว่าปัญหาของคุณคืออะไรกับไบนารีแรปเปอร์รอบสคริปต์เพื่อเรียกใช้ในฐานะรูท คุณเพียงแค่เรียกใช้ wrapper แทนสคริปต์ คุณยังสามารถแก้ไขสคริปต์ได้ตามต้องการและทำทุกอย่างที่คุณต้องการ และถ้าคุณต้องการเรียกใช้เพียงคำสั่งเดียว (`rm`) ในฐานะรูท คุณต้องสร้างตัวตัดรอบคำสั่งนั้นเท่านั้น และเรียกใช้ตัวตัดนั้นแทน `rm` โดยตรง มันง่ายมาก คุณมีปัญหาอะไรกับมัน?
Score:1
ธง cn
raj

หากการดำเนินการที่ต้องเรียกใช้ในฐานะ root สามารถแยกออกเป็นกระบวนการ/สคริปต์แยกกันได้ คุณก็สามารถเรียกใช้กระบวนการเหล่านี้เป็น setuid root ได้ เป็นเครื่องมือที่มีประโยชน์มากซึ่งในความคิดของฉันมีการใช้งานน้อยมาก

กระบวนการ setuid คืออะไร? ดูตัวอย่างได้ที่ รหัสผ่าน สั่งการ. สามารถเรียกใช้โดยผู้ใช้คนใดก็ได้ แต่ต้องเรียกใช้ในฐานะรูท เนื่องจากจำเป็นต้องแก้ไขรหัสผ่านที่จัดเก็บไว้ในไฟล์ที่มีเพียงรูทเท่านั้นที่สามารถเข้าถึงได้ (/ etc / เงา).

มันทำได้อย่างไร? ดูที่สิทธิ์ของ /usr/bin/passwd ไบนารี่:

-rwsr-xr-x 1 รูท 68208 พฤษภาคม 28 2020 /usr/bin/passwd

"s" แทน "x" ในฟิลด์เจ้าของระบุว่าไบนารีนี้จะถูกรันด้วยสิทธิ์ของเจ้าของ - นั่นคือรูท

เป็นอย่างนี้ทุกที ไบนารี่ สามารถเรียกใช้ในฐานะรูท (หรือผู้ใช้รายอื่น) โดยไม่ขึ้นกับว่าใครเป็นผู้เรียกมัน

อย่างไรก็ตามเมื่อ สคริปต์ บิต setuid ถูกละเว้นด้วยเหตุผลด้านความปลอดภัย ดังนั้นเพื่อเรียกใช้ก สคริปต์ ในฐานะรูทคุณต้องใช้ไฟล์ กระดาษห่อไบนารี ที่จะเรียกสคริปต์จากภายใน คุณสามารถใช้โปรแกรม C อย่างง่ายต่อไปนี้เพื่อสร้าง wrapper ดังกล่าว:

#รวม <stdio.h>
#รวม <stdlib.h>
#รวม <sys/types.h>
#รวม <unistd.h>
#รวม <sys/wait.h>

int หลัก ()
{
   int rc;
   เซทูอิด( 0 );
   rc=WEXITSTATUS(ระบบ( "/เส้นทาง/ถึง/ของคุณ/สคริปต์" ));
   ทางออก (rc);
}

คอมไพล์โปรแกรมและสร้าง root setuid ที่สามารถเรียกใช้งานได้ (สมมติว่าเรียก executable กระดาษห่อ, ทำ sudo chown root: รูท wrapper ติดตามโดย sudo chmod o+s แรปเปอร์).

BTW. สคริปต์ที่เรียกใช้จากภายใน wrapper ไม่จำเป็นต้องตั้งค่า ต้องใช้กระดาษห่อหุ้มเท่านั้น

แก้ไข: จากคำอธิบายของคุณในความคิดเห็น ดูเหมือนว่าคุณต้องการเรียกใช้รายการใดรายการหนึ่ง rm -rf /some/เส้นทาง คำสั่งเป็นรูทและกังวลว่าจะไม่ลบสิ่งอื่นใดโดยไม่ได้ตั้งใจ ในกรณีนั้น ฉันขอแนะนำให้เปลี่ยน /path/to/your/script เป็นส่วนหนึ่งของโปรแกรม wrapper ด้านบนด้วยคำสั่งนี้ rm -rf /some/เส้นทางและเพียงแค่เรียกใช้ไฟล์ กระดาษห่อ ไบนารีจากสคริปต์ของคุณในตำแหน่งที่คุณจะเรียกใช้ rm -rf /some/เส้นทาง สั่งการ. นี่ดูเหมือนจะเป็นแนวทางที่ปลอดภัยที่สุด

in flag
อย่าเข้าใจมัน ควรมีบางสิ่งที่ซับซ้อนน้อยกว่า เหตุใดไฟล์ S จึงไม่สามารถเรียกใช้งานได้โดยตรง แต่มาจากตัวห่อหุ้ม มันไม่ได้ทำให้ความรู้สึก.
raj avatar
cn flag
raj
@Äamo เฉพาะใน **ไบนารี** บิต **s** มีผล สำหรับ **สคริปต์** จะไม่มีผล เนื่องจากมีความหมายด้านความปลอดภัยที่รุนแรงอยู่เบื้องหลัง ดังนั้นสคริปต์จำเป็นต้องเรียกใช้จากภายใน setuid **binary** ไบนารีมีสิทธิ์รูทอยู่แล้ว (เพราะมันเป็น setuid) ดังนั้นเมื่อรันสคริปต์ สคริปต์จะสืบทอดสิทธิ์เหล่านี้ BTW. สคริปต์ที่รันจาก wrapper ภายในไม่จำเป็นต้องมีการตั้งค่าบิต **s** ต้องใช้กระดาษห่อเท่านั้น
in flag
นั่นคือเหตุผลที่คนไม่ใช้มัน มีบางอย่างเช่นเหตุการณ์ใน Linux หรือไม่ สิ่งที่จะฟังเป็นรากและดำเนินการบางอย่างเป็นราก?
raj avatar
cn flag
raj
@Äamo โดยใช้ซ็อกเก็ต คุณสามารถเขียนแอปพลิเคชันไคลเอ็นต์เซิร์ฟเวอร์ที่จะรับฟังข้อมูลขาเข้าบนซ็อกเก็ตและดำเนินการใดๆ กับข้อมูลนั้น ทั้งสองด้านของซ็อกเก็ตสามารถทำงานภายใต้ผู้ใช้ที่แตกต่างกัน และนี่เป็นกลไกมาตรฐานที่แอพพลิเคชั่นจำนวนมากใช้ในการแยกสิทธิ์ หากคุณกำลังใช้ตัวอย่าง (ไม่มีสิทธิ์) ไคลเอนต์ MySQL เพื่อขอให้เซิร์ฟเวอร์ MySQL (มีสิทธิ์) เข้าถึงฐานข้อมูล คุณกำลังใช้สิ่งนี้อยู่ อย่างไรก็ตาม การเขียนโปรแกรม sockets นั้นยากกว่าการเรียก setuid binary อย่างแน่นอน :) คุณอาจจะใช้ไปป์ที่มีชื่อในลักษณะเดียวกันก็ได้
in flag
ท่อชื่ออะไร? ดูเหมือนว่าจะเป็นไปไม่ได้สำหรับฉัน
raj avatar
cn flag
raj
@Äamo หากคุณเรียกใช้คำสั่งเช่น `mknod /tmp/mypipe p` และให้สิทธิ์ที่เหมาะสมแก่ผู้ใช้ทั้งสองสำหรับ `/tmp/mypipe` กระบวนการที่ทำงานบนผู้ใช้ที่แตกต่างกันสามารถสื่อสารได้โดยเช่น ตัวหนึ่งเขียนถึง `/tmp/mypipe` และอีกตัวอ่านจาก `/tmp/mypipe` มันเหมือนกับไพพ์ทั่วไป `|` แต่อนุญาตให้ทั้งสองกระบวนการทำงานแยกกัน แต่ฉันไม่คิดว่าสิ่งนี้จะเป็นประโยชน์อย่างยิ่งในกรณีของคุณ
marko avatar
tw flag
หากคุณอยู่ในสภาพแวดล้อมแบบกราฟิกเช่น X11 คุณสามารถเรียกใช้ `pkexec` จากภายในสคริปต์โดยให้สิ่งต่อไปนี้เป็นบรรทัดแรกในสคริปต์: `#!/usr/bin/pkexec /bin/bash` จากนั้นส่วนที่เหลือ ของมันทำงานเป็นรูท / ผู้ดูแลระบบผู้ใช้จะได้รับแจ้งให้ป้อนรหัสผ่านรูทเมื่อสคริปต์ทำงาน
in flag
ฉันมีมัน ฉันสร้างสคริปต์ที่ไม่มีที่สิ้นสุดซึ่งทำงานเป็นรูทบนพื้นหลังและจะลบไดเร็กทอรีทุกๆ 10 วินาที อาจไม่เท่ห์นัก แต่ใช้งานได้อย่างมีเสน่ห์ https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-permissions
in flag
วิธีสุดท้ายคือใช้ setfacl สำหรับไดเร็กทอรีหลัก
Score:0
ธง in

วิธีสุดท้ายสำหรับปัญหานี้เมื่อ Laravel สร้างไฟล์ด้วย chmod 644 คือการตั้งค่าสิทธิ์ ACL สำหรับไดเร็กทอรีหลักผ่าน setfacl

setfacl -R -dm "g:www-data:rw" $www_new_app_dir/storage 

โดยที่ไฟล์ที่สร้างขึ้นทั้งหมดจะสืบทอดการตั้งค่า acl จากไดเร็กทอรีหลัก ในกรณีนี้ rw สำหรับ www-data group

Score:0
ธง in

วิธีแก้ปัญหาตรงไปตรงมาของฉันคือการเรียกใช้สคริปต์พื้นหลังที่ไม่มีที่สิ้นสุดในฐานะรูทซึ่งจะค้นหาและลบไดเร็กทอรีที่จำเป็นทุกๆ 10 วินาที มันทำงานเป็น nohup ดังนั้นมันจึงยังคงทำงานแม้ว่าฉันจะปิดเทอร์มินัล

ในขณะที่จริง
ทำ
  ค้นหา /var/www -maxความลึก 1 -type d -name 'deploy-old-*' -exec rm -rf {} \;
  นอน10
เสร็จแล้ว

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา