หนึ่งไฟล์ต้องการเป็นของผู้ใช้สองคน อย่างไร? การเชื่อมโยงฮาร์ดล้มเหลว


32

สอง setuid โปรแกรม/usr/bin/barและแบ่งปันไฟล์การกำหนดค่าเดียว/usr/bin/baz fooโหมดของไฟล์การกำหนดค่าคือ0640มันเก็บข้อมูลที่ละเอียดอ่อน โปรแกรมหนึ่งวิ่งbar:bar(นั่นคือเป็นผู้ใช้บาร์,กลุ่มบาร์ ); อื่น ๆ baz:bazที่เป็น ผู้ใช้ที่เปลี่ยนแปลงไม่ได้เป็นตัวเลือกและแม้แต่การเปลี่ยนกลุ่มจะไม่เป็นที่ต้องการ

ฉันต้องการที่จะเชื่อมโยงอย่างหนักแฟ้มการกำหนดค่าเดียวและ/etc/bar/foo /etc/baz/fooแต่นี้ล้มเหลวเนื่องจากต้องยื่นเท่าที่ผมรู้ว่าเป็นอย่างใดอย่างหนึ่งหรือroot:barroot:baz

วิธีการแก้ปัญหาที่อาจเกิดขึ้น: สร้างกลุ่มใหม่barbazที่มีสมาชิกเป็นและbar bazให้เป็นของfooroot:barbaz

นั่นดูเหมือนจะเป็นทางออกที่หนักหน่วงสำหรับฉัน ไม่มีผู้ชนะวิธีที่ง่ายกว่าในการแชร์ไฟล์การกำหนดค่าfooระหว่างสองโปรแกรมหรือไม่

สำหรับตอนนี้ฉันกำลังรักษาสำเนาของไฟล์ที่เหมือนกันสองชุด ใช้งานได้ แต่เห็นได้ชัดว่าผิด อะไรจะถูกต้อง?

สำหรับข้อมูล: ฉันมีประสบการณ์น้อยกับกลุ่ม Unix และไม่มีใครกับ setgid (2)


คำถามจะค่อย ๆ โดยทั่วไป ในกรณีเฉพาะของฉันทั้งสองโปรแกรมเกิดขึ้นเป็น Exim4 และ Dovecot โปรแกรมจัดการจดหมายที่สามารถแบ่งปันรหัสผ่านและใบรับรอง TLS
บาท

8
โซลูชัน Ubuntu (& ฉันคิดว่า Debian) สำหรับssl-certกลุ่มนี้ซึ่งเป็นbarbazกลุ่มของคุณค่อนข้างมาก มาตรฐานคือการตั้งค่าไพรเวตคีย์ทั้งหมดให้เป็นของssl-certกลุ่มและใส่ UID ที่เกี่ยวข้องกับโปรแกรมที่จำเป็นต้องเข้าถึงพวกมันในกลุ่มนั้น
abligh

1
@ ระดับสูง: น่าสนใจ ระบบของฉันคือ Debian 8 jessie เห็นได้ชัดว่ามีแพคเกจssl-certที่มีสคริปต์ postinst เมื่อติดตั้งจะสร้างกลุ่มที่คุณพูด ssl-certฉันได้รับไม่รู้ Apache2 (ติดตั้งบนโฮสต์ของฉัน) ขอแนะนำ ssl-certเอ็กซิมต่างๆและ Dovecot แพคเกจไม่ได้ แต่ Postfix (ไม่ได้ติดตั้งบนโฮสต์ของฉัน) ขึ้นssl-certบน เนื่องจาก Apache โฮสต์ของฉันมีกลุ่มใบรับรอง SSLแต่กลุ่มนี้ยังไม่มีสมาชิก ขอบคุณสำหรับคำแนะนำ.
บาท

5
ทำให้โปรแกรมเป็น setgid ไม่ใช่ setuid โปรแกรม Setuid เป็นความคิดที่ไม่ดีเพราะหากพวกมันถูกบุกรุกไบนารีก็สามารถถูกแทนที่สร้างม้าโทรจัน (ข้อยกเว้น: setuid root เนื่องจากคุณไม่มีทางเลือก)
Gilles 'ดังนั้นหยุดความชั่วร้าย'

1
ไม่wiki.dovecot.org/HowTo/EximAndDovecotSASLแก้สถานการณ์ที่เฉพาะเจาะจงของคุณหรือไม่
MvG

คำตอบ:


50

คุณสามารถใช้ ACL เพื่อให้คนในทั้งสองกลุ่มสามารถอ่านไฟล์ได้

chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file

ตอนนี้ทั้งสองbarและbazกลุ่มสามารถอ่านไฟล์

ตัวอย่างเช่นต่อไปนี้เป็นไฟล์ของ bin: bin พร้อมโหมด 640

$ ls -l foo
-rw-r-----+ 1 bin bin 5 Aug 17 12:19 foo

+หมายความว่ามีชุด ACL ดังนั้นลองมาดูที่มัน

$ getfacl foo
# file: foo
# owner: bin
# group: bin
user::rw-
group::r--
group:sweh:r--
mask::r--
other::---

เราสามารถเห็นบรรทัดgroup:sweh:r--: นั่นหมายความว่าคนในกลุ่มswehสามารถอ่านได้

เฮ้นั่นฉันเอง!

$ id
uid=500(sweh) gid=500(sweh) groups=500(sweh)

และใช่ฉันสามารถอ่านไฟล์ได้

$ cat foo
data

23

คุณอาจต้องการพิจารณาคำแถลงเหล่านี้อีกครั้ง:

วิธีการแก้ปัญหาที่อาจเกิดขึ้น: สร้าง barbaz กลุ่มใหม่ที่มีสมาชิกเป็นและbar bazให้เป็นของfooroot:barbaz

นั่นดูเหมือนจะเป็นทางออกที่หนักหน่วงสำหรับฉัน ไม่มีผู้ชนะวิธีที่ง่ายกว่าในการแชร์ไฟล์การกำหนดค่าfooระหว่างสองโปรแกรมหรือไม่

ทำไมการสร้างกลุ่มใหม่จึงเป็นเรื่องหนัก การทำเช่นนั้นมีข้อดีดังต่อไปนี้มากกว่า ACLs:

  • แม้ว่าคุณจะใช้ถ้อยคำนี้เป็นสมมุติฐานกับคำสั่ง/usr/bin/barและ/usr/bin/bazมันมีความเกี่ยวข้องที่ทั้งสองโปรแกรมสามารถแชร์ไฟล์การกำหนดค่า สิ่งนี้ชี้ให้เห็นว่าโปรแกรมนั้นมีความเกี่ยวข้องกันตามธรรมชาติ การสร้างกลุ่มใหม่สำหรับพวกเขาดูเหมือนจะอธิบายความสัมพันธ์ที่มีอยู่จริงและควรทริกเกอร์พฤติกรรม (เช่นการอนุญาตให้อ่านไฟล์การกำหนดค่าทั่วไป)
  • การแก้ปัญหานี้ผ่านกลุ่มนั้นสามารถพกพาไปได้ในทุกระบบของ Unix ซึ่งหมายความว่าคุณสามารถพึ่งพากลไกเดียวกันทำงานในลักษณะเดียวกันกับระบบ Unix หรือ Unix ACL นั้นซับซ้อนกว่ามากและการพกพาอาจเป็นปัญหาได้

โดยส่วนตัวแล้วฉันเห็นว่า ACL เป็นโซลูชันที่ใช้งานหนักและนี่เป็นกลุ่มที่ใช้วิธี Unix แบบดั้งเดิมที่เรียบง่ายกว่า


16

ฉันคิดว่านี่จะเป็นการใช้งานทั่วไปสำหรับ Access Control Lists (ACLs) เพิ่มผู้ใช้ (หรือกลุ่ม) ลงใน ACL ของ config-file:

/etc/foo  root:root rw-------  # Traditional Unix ownership and permission for foo
$ setfacl -m ผู้ใช้: แถบ: rw- / etc / foo # อนุญาตให้แถบผู้ใช้อ่านและเขียน foo
$ setfacl -m ผู้ใช้: baz: rw- / etc / foo # อนุญาตให้ผู้ใช้ baz อ่านและเขียน foo

คุณอาจต้องติดตั้งแพ็กเกจ acl ก่อน


3

ทำให้โหมดของไฟล์0660(หรือแม้กระทั่ง0440ถ้าเขียนไม่จำเป็นต้องใช้) bar:bazและความเป็นเจ้าของ จากนั้นหนึ่งกระบวนการสามารถเข้าถึงไฟล์ได้เนื่องจากสิทธิ์ของผู้ใช้และอีกกระบวนการหนึ่งต้องขอบคุณสิทธิ์ของกลุ่ม สิ่งนี้ใช้ได้แม้กับระบบไฟล์ที่ ACL ไม่ทำงาน


2

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

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

ข้อได้เปรียบหลักของการทำเช่นนี้คือการกำหนดค่าของคุณเป็นรุ่น (พร้อมกับส่วนที่เหลือทั้งหมดของการกำหนดค่าของคุณ) และการปรับใช้เซิร์ฟเวอร์ที่เหมือนกันหรือเกือบเหมือนกันใหม่กลายเป็นเรื่องง่ายที่ ot อัตโนมัติ

(สำหรับบันทึกเนื่องจากคุณไม่ได้ใช้การจัดการการกำหนดค่าฉันจะไปกับระบบกลุ่มตามคำตอบของ @ drg)

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