การตั้งค่าหลายกลุ่มเป็นเจ้าของไดเรกทอรี


31

/srv/svnบนเซิร์ฟเวอร์ของฉันฉันมีไดเรกทอรี

มันเป็นไปได้ที่จะตั้งไดเรกทอรีนี้จะมีกรรมสิทธิ์ในกลุ่มได้หลากหลายเช่นdevFirmA, devFirmBและdevFirmC?

ประเด็นก็คือฉันต้องการsubversionควบคุมเวอร์ชันจัดการผู้ใช้หลายคนในที่เก็บหลายแห่งและฉันไม่ทราบวิธีผสาน /srv/svnไดเรกทอรีรากของที่เก็บสิทธิ์ ผมมีตัวอย่างเช่นสาม บริษัทFirmA, และFirmB FirmCตอนนี้ภายใน/srv/svnฉันได้สร้างสามไดเรกทอรีFirmA, FirmB, FirmCและภายในพวกเขาฉันได้สร้างพื้นที่เก็บข้อมูลสำหรับแต่ละโครงการและตอนนี้ผมไม่ทราบวิธีการสร้างโครงการที่ได้รับอนุญาตตั้งแต่ elementes ทั้งหมดภายใน/srv/svnเป็นเจ้าของโดยroot:rootที่ไม่ได้ตกลงหรือฉัน ไม่ถูกต้อง?


1
กลุ่ม บริษัท เข้าถึงไฟล์กันได้หรือไม่? หรือแยกจากกันอย่างสิ้นเชิงนอกจากการแชร์ไดเรกทอรีหลัก
JM Becker

@TechZilla กลุ่ม บริษัท ต้องไม่สามารถเข้าถึงไฟล์อื่น ๆ ได้ต้องแยกจากกันเฉพาะฉันเท่านั้นที่ต้องมีสิทธิ์เข้าถึงไดเรกทอรีทั้งหมด
KernelPanic

ตกลงฉันโพสต์คำตอบที่ถูกต้องคุณไม่ควรใช้ ACL สำหรับสิ่งนี้ พวกเขาเป็นตัวเลือกสุดท้ายปัญหานี้ยังคงเป็นปัญหาที่พบบ่อยมาก
JM Becker

คำตอบ:


16

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

ก่อนอื่นคุณต้องตั้ง umask เป็น 002 นี่คือเพื่อให้กลุ่มสามารถแบ่งปันกับตัวเอง ฉันมักจะสร้างไฟล์เช่น/etc/profile.d/firm.shแล้วเพิ่มคำสั่งทดสอบด้วย umask

[ $UID -gt 10000 ] && umask 002

ถัดไปคุณต้องตั้งค่าไดเรกทอรีเป็นกลุ่มที่เกี่ยวข้อง

chgrp -R FirmA /srv/svn/FirmA 
chgrp -R FirmB /srv/svn/FirmB
chgrp -R FirmC /srv/svn/FirmC

ในที่สุดคุณจะต้องตั้งค่าบิต SGID อย่างถูกต้องดังนั้นกลุ่มจะอยู่ในตำแหน่งที่คุณตั้งไว้เสมอ สิ่งนี้จะป้องกันไฟล์ที่เขียนไม่ให้ถูกตั้งค่าเป็น GID ของนักเขียน

find /srv/svn/FirmA -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmB -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmC -type d -print0 | xargs -0 chmod 2775

find /srv/svn/FirmA -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmB -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmC -type f -print0 | xargs -0 chmod 664

ในที่สุดถ้าคุณต้องการป้องกันไม่ให้ไดเรกทอรีเข้าถึงโดยผู้ใช้รายอื่น

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC

2
คำเตือน: สิ่งนี้จะใช้งานได้ แต่จะลบบิตสิทธิ์การใช้งานไฟล์ทั้งหมด ไม่เป็นไรถ้าทรีไดเรกทอรีของคุณเก็บเอกสารไว้เท่านั้น หากมีไฟล์ที่ปฏิบัติการได้สิ่งนี้จะป้องกันการเรียกใช้งานซึ่งอาจทำลายการตั้งค่าของคุณ
Stéphane Gourichon

1
นี่อาจเป็นความคิดที่ดี แต่ไม่ตอบคำถามเลย
ceving

สิ่งนี้ตามที่อธิบายไว้เพียงแค่แบ่งพาร์ติชั่นทั้งสามโฟลเดอร์เพื่อให้สมาชิกของแต่ละ บริษัท เท่านั้นที่สามารถแก้ไขไฟล์ของตนได้ - มันไม่ให้สิทธิ์การเข้าถึง 'svn' ที่ต้องการ
คนรวย

นี่เป็นเรื่องที่ใกล้เคียงกันมาก สิ่งที่ขาดหายไปคือให้คุณเข้าถึงทุกกลุ่ม เพิ่มขั้นตอนนี้โดยสมมติว่าชื่อเข้าใช้ของคุณคือsvnadmin: sudo usermod -a -G FirmA,FirmB,FirmC svnadmin นี่จะเพิ่มsvnadminในกลุ่มเหล่านี้ทั้งหมด เนื่องจากไฟล์ในกลุ่มทั้งหมดเหล่านี้เปิดใช้งาน 'การเขียนเป็นกลุ่ม' ( chmod 664ทำเช่นนี้) คุณรวมถึง firmX จะเป็นผู้เขียนไฟล์ที่เป็นเจ้าของโดย firmX เท่านั้น
รวยหน้า

1
ดีกว่า - เปลี่ยนการอนุญาตเพื่อเพิ่ม / ลบสิ่งที่คุณต้องการเพิ่ม / ลบ - เช่นทำfind /srv/svn/FirmA -type f -print0 | xargs -0 chmod ug+rw,o+r,o-wx
rich p

25

คุณมีเจ้าของได้เพียงกลุ่มเดียวเท่านั้น

อย่างไรก็ตามการใช้รายการควบคุมการเข้าถึงคุณสามารถกำหนดสิทธิ์สำหรับกลุ่มอื่น ๆ

ตรวจสอบว่าคุณมีการติดตั้ง ACL getfaclการออกคำสั่ง หากระบบของคุณยังไม่ได้ติดตั้ง ACL ให้ติดตั้งเครื่องมือบรรทัดคำสั่งที่อยู่ในaclแพ็คเกจด้วย:sudo apt-get install acl

ด้วยgetfaclคุณสามารถอ่านข้อมูล ACL ของไดเรกทอรีหรือไฟล์อื่น ๆ และด้วยsetfaclคุณสามารถเพิ่มกลุ่มไปยังไฟล์

ตัวอย่างเช่น:

setfacl -m g:devFirmB:rwx /srv/svn/  

เพิ่มกลุ่มdevFirmBกับอาอี๊ด, Wพระราชพิธี, E x ecute /srv/svnสิทธิ์ในการไดเรกทอรี

หากคุณต้องการให้ไฟล์ที่สร้างขึ้นในไดเรกทอรีนั้นมีหลายกลุ่มให้ตั้งค่า ACL เป็น ACL เริ่มต้น รายการXในกลุ่มเริ่มต้นหมายถึง“ อนุญาตให้มีการดำเนินการหากสามารถเรียกใช้งานได้โดยเจ้าของ (หรือบุคคลอื่น)”

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  

6

เป็นไปไม่ได้ที่จะมีไฟล์เป็นของกลุ่ม Linux หลายกลุ่มที่มีสิทธิ์ Unix แบบดั้งเดิม (อย่างไรก็ตามอาจเป็นไปได้กับ ACL )

แต่คุณอาจจะใช้วิธีแก้ปัญหาต่อไปนี้และสร้างกลุ่มใหม่ (เช่นเรียกdevFirms) ซึ่งจะรวมถึงผู้ใช้ทุกคนของกลุ่มdevFirmA, และdevFirmB คุณสร้างกลุ่มผู้ใช้ใหม่ด้วย:devFirmC

sudo addgroup NEWGROUPNAME

ก่อนอื่นคุณอาจต้องติดตั้งid-utilsเพื่อรับlid- คำสั่ง:

sudo apt-get install id-utils

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

for u in $(lid -g -n SOURCEGROUP); do sudo usermod -a -G TARGETGROUP $u; done

ดังนั้นในกรณีของคุณคุณจะต้องเรียกใช้คำสั่ง (ทุกบรรทัดพร้อมกัน):

sudo addgroup devFirms &&
for u in $(lid -g -n devFirmA); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmB); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmC); do sudo usermod -a -G devFirms $u; done

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

sudo adduser NEWUSER TARGETGROUP

ขอบคุณJustin Ethierสำหรับคำตอบของเขาที่Unix & Linux.SE: เพิ่มผู้ใช้ทั้งหมดของกลุ่มหนึ่งในกลุ่มอื่นหรือไม่


@Gilles คุณทำแบบแผนของคุณในการทำงานกับ Subversion Server หลายแห่งพร้อมที่เก็บของผู้ใช้หลายคนหรือไม่
KernelPanic

2

ไม่เป็นไปไม่ได้

แต่ละไฟล์ (และเช่นเดียวกันกับไดเรกทอรี) สามารถมีผู้ใช้หนึ่งคนและกลุ่มเดียวเท่านั้น


6
ให้วิธีการทางเลือกเพื่อให้ได้ผลลัพธ์ที่เหมือนกันหรือคล้ายกันจะดี
ผู้บัญชาการ Byte

2

เพื่อให้สิทธิ์ที่แตกต่างกับหลายกลุ่มหรือผู้ใช้ใช้คำสั่งต่อไปนี้ (ทดสอบบน RHEL 6 & 7):

วิธีสร้างเจ้าของกลุ่มใหม่:

setfacl -m g:<group_name>:<rights you want to give eg.rwx> -R <directory_name>

วิธีตรวจสอบการตั้งค่า acl ปัจจุบัน:

getfacl <directory_name>

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