ให้สิทธิ์การอ่าน / เขียนแก่ผู้ใช้ในไดเรกทอรีเดียวเท่านั้น


18

ฉันใช้เซิร์ฟเวอร์และฉันต้องให้สิทธิ์การอ่าน / เขียนในไดเรกทอรีหนึ่งแก่ผู้ใช้รายเดียว ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

ข้างต้นดูเหมือนว่าจะใช้งานได้ แต่ช่วยให้ผู้ใช้สามารถเข้าถึงส่วนที่เหลือของเซิร์ฟเวอร์แบบอ่านอย่างเดียว

ฉันจะตั้งค่าการอนุญาตเพื่อให้ผู้ใช้สามารถอ่านและเขียนไปยังโฟลเดอร์เฉพาะได้อย่างไร mysqlผู้ใช้ยังจะสามารถที่จะเรียกใช้โปรแกรมเช่น


2
คำตอบสั้น ๆ : ใช้ chroot
Chris Down

@Chris Care ที่จะอธิบายรายละเอียดในคำตอบ? มานิชและฉันดิ้นรนกับสิ่งนี้และดูเหมือนจะไม่สามารถใช้งานได้
เลิกทำ

ไหนจะmysqlโปรแกรมจะอยู่? ผู้ใช้จะต้องสามารถอ่านและไลบรารีและไฟล์ข้อมูลทั้งหมดที่ต้องการ
Gilles 'หยุดความชั่วร้าย'

@Gilles อืม มันเป็นการติดตั้ง mysql มาตรฐานจาก apt-get เท่าที่ฉันสามารถบอกได้ (ไม่ใช่ระบบของฉันมันคือเลิกทำ)
Manishearth

คำตอบ:


18

ACL เชิงลบ

คุณสามารถป้องกันผู้ใช้จากการเข้าถึงบางส่วนของระบบแฟ้มโดยการตั้งค่ารายการควบคุมการเข้าถึง ตัวอย่างเช่นเพื่อให้แน่ใจว่าผู้ใช้abcdไม่สามารถเข้าถึงไฟล์ใด ๆ ภายใต้/home:

setfacl -m user:abcd:0 /home

วิธีการนี้ง่าย แต่คุณต้องอย่าลืมปิดกั้นการเข้าถึงทุกสิ่งที่คุณไม่ต้องการabcdเข้าถึง

chroot

หากต้องการควบคุมสิ่งที่abcdมองเห็นได้ในเชิงบวกให้ตั้งค่าchrootเช่น จำกัด ผู้ใช้ในระบบย่อยของระบบไฟล์

คุณต้องสร้างไฟล์ทั้งหมดที่ผู้ใช้ต้องการ (เช่นmysqlและการอ้างอิงทั้งหมดหากคุณต้องการให้ผู้ใช้สามารถรันได้mysql) ภายใต้ chroot พูดเส้นทางไป chroot คือ/home/restricted/abcd; โปรแกรมจะต้องอยู่ภายใต้mysql /home/restricted/abcdลิงก์สัญลักษณ์ที่ชี้ด้านนอก chroot นั้นไม่ดีเพราะการค้นหาลิงก์สัญลักษณ์ได้รับผลกระทบจากคุก chroot ภายใต้ Linux คุณสามารถใช้ประโยชน์จากการผูกติด:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

นอกจากนี้คุณยังสามารถคัดลอกไฟล์ (แต่คุณจะต้องดูแลให้ทันสมัย)

เพื่อ จำกัด การให้ผู้ใช้ chroot ให้เพิ่มคำสั่งไปยังChrootDirectory/etc/sshd_config

Match User abcd
    ChrootDirectory /home/restricted/abcd

คุณสามารถทดสอบด้วย: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

กรอบความปลอดภัย

คุณยังสามารถใช้เฟรมเวิร์กความปลอดภัยเช่น SELinux หรือ AppArmor ในทั้งสองกรณีคุณต้องเขียนการกำหนดค่าที่ละเอียดอ่อนพอสมควรเพื่อให้แน่ใจว่าคุณไม่ได้ออกจากหลุมใด ๆ


วิธีที่ง่ายกว่ามากในการให้สิทธิ์การอ่านและเขียนไปยังไดเรกทอรีหนึ่ง ๆ คือการสร้างกลุ่มใช่ไหม ตัวอย่างเช่นเขาสามารถสร้างกลุ่มใหม่และใช้ chown เพื่อให้เจ้าของกลุ่มไดเรกทอรีเป็นกลุ่มที่สร้างขึ้นและเพิ่มผู้ใช้ในกลุ่ม สุดท้ายให้สิทธิ์การอ่านและเขียนไดเรกทอรีแก่กลุ่ม
Qasim

@Qasim ต้องมีไฟล์ทั้งหมดที่มีสิทธิ์และความเป็นเจ้าของของพวกเขาตั้งค่าตามที่ต้องการ มีหลายสิ่งที่อาจผิดพลาดได้ (ไฟล์ที่คัดลอกมาจากที่อื่นหรือแยกออกจากไฟล์เก็บถาวรที่มีการสงวนสิทธิ์ไฟล์ที่ต้องอยู่ในกลุ่มอื่นไฟล์ที่ไม่ควรอ่านเป็นกลุ่มผู้ใช้ที่ทำผิดพลาดหรือสามารถ ' ไม่ต้องกังวลเพื่อให้แน่ใจว่าการเข้าถึงกลุ่มยังคงอยู่ตามที่ต้องการ…) ว่ากลุ่มไม่สามารถแก้ปัญหานี้ได้
Gilles 'หยุดความชั่วร้าย' ใน

ฉันหมายถึงฉันไม่เห็นว่าไฟล์จะต้องมีสิทธิ์ของตัวเองหรือไม่ถ้าสิทธิ์กลุ่มในไดเรกทอรีถูกตั้งค่าในลักษณะที่ไม่มีผู้ใช้สามารถ "cd" ในไดเรกทอรีหรือ "ls" ไดเรกทอรี
Qasim

ไฟล์ @Qasim ทุกคนภายใต้/var/www/allowfolderและไดเรกทอรีย่อยจะต้องมีการเข้าถึงได้ไม่เพียง แต่/var/www/allowfolderตัวเอง และไฟล์อื่น ๆ ในทางกลับกันจะต้องไม่สามารถเข้าถึงได้ ในความเป็นจริงการแก้ปัญหาเพียงลำพังบนพื้นฐานสิทธิ์ของแฟ้มและ ACL ไม่สามารถตอบสนองความต้องการได้อย่างสมบูรณ์: มันอย่างน้อยจะช่วยให้ผู้ใช้ในการทดสอบไม่ว่าจะเป็นชื่อที่มีอยู่ภายใต้/var/wwwเนื่องจากพวกเขาจำเป็นต้องมี x สิทธิ์ในการเข้าถึง/var/www /var/www/allowfolder
Gilles 'หยุดความชั่วร้าย' ใน

โอ้ตกลงฉันเห็น แต่ถ้าเราแยกไดเรกทอรี / var ออกจากนี้และให้บอกว่าเรากำลังพูดถึงไดเรกทอรีปกติในไดเรกทอรี / home / user?
Qasim

5

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

สิ่งนี้ถูกเขียนขึ้นตรงจุด ตอนนี้ฉันไม่ได้อยู่หน้าเครื่อง UNIX ในตัวอย่างนี้มีไดเรกทอรีที่เรียกว่าdirสามไฟล์: a, b, และc lsสามไฟล์แรกเป็นไฟล์ปกติ lsเป็นฮาร์ดลิงก์ไปยังlsไบนารีจริงเพื่อให้เราสามารถแสดงรายการไฟล์ในขณะที่อยู่ใน chroot

ฉันจะลงไปchroot dir(โปรดทราบว่าฉันอาจลืมบางไดเรกทอรีในไดเรกทอรีราก)

นี่คือการตั้งค่าในรูปแบบเอาต์พุตเชลล์:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

ตอนนี้ผมจะเข้าไปchroot Chooses โต้แย้งสิ่งที่กระบวนการควรจะทำงานกับไดเรกทอรีรากใหม่ มันเริ่มต้นที่dir/bin/bash/bin/shมันเริ่มต้นที่

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

ตอนนี้เราออกจากchroot:

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

ฉันหวังว่าสิ่งนี้แสดงให้เห็นว่า chrootคำสั่งทำงานอย่างไร โดยทั่วไปสิ่งที่คุณต้องทำเพื่อแก้ไขปัญหาของคุณคือการเรียกใช้chrootคำสั่งในฐานะผู้ใช้ทุกครั้งที่เข้าสู่ระบบบางทีใส่ไว้ในสคริปต์เริ่มต้น?

ฮาร์ดลิงก์ไปยังไฟล์จะยังคงทำงานต่อไปภายในchrootแม้ว่าไฟล์นั้นจะไม่สามารถเข้าถึงได้ด้วยวิธีอื่น (วิธีนี้ใช้งานได้เพราะฮาร์ดลิงก์ชี้ไปที่ inodes ไม่ใช่พา ธ ) ดังนั้นเพื่อให้ผู้ใช้สามารถเข้าถึงได้เช่นmysqlคำสั่งคุณจะดำเนินการ:

ln /usr/bin/mysql /path/to/chroot/target

แต่สิ่งนี้จะไม่ต้องการให้ฉันตั้งค่าสภาพแวดล้อม chroot ทั้งหมดด้วย symlink ทั้งหมดหรือไม่ จะเป็นการง่ายกว่าไหมถ้าจะเรียกใช้คำสั่งเพื่อให้ผู้ใช้ใหม่ไม่สามารถเข้าถึงไดเรกทอรีอื่น ๆ ได้ แต่โปรแกรมเช่น apache จะไม่สูญเสียสิทธิ์ในการเข้าถึงมัน?
Manishearth

โดยทั่วไปมีวิธีใดบ้าง (ผ่าน chmod) ในการทำให้ผู้ใช้สูญเสียการเข้าถึงการอ่านไปยังส่วนที่เหลือของ fs โดยไม่ส่งผลกระทบต่อการเข้าถึงของผู้ใช้รายอื่น?
Manishearth

@Manishearth chmodไม่มีวิธีที่เรียบง่ายด้วย เมื่อคุณพูดว่า "มันจะไม่ง่ายต่อการเรียกใช้คำสั่ง ... ทำไม่สูญเสียการเข้าถึงให้กับพวกเขา" chrootคำสั่งที่ หากคุณอธิบายสิ่งที่คุณหมายถึงโดย "สภาพแวดล้อม chroot ทั้งหมด" หรือทำไมสิ่งนี้จะเป็นปัญหาบางทีฉันอาจจะเข้าใจดีกว่า (หมายเหตุที่คุณสามารถให้เข้าถึง executables ทั้งหมดกับ oneliner A: ln /bin/* /path/to/chroot/target)
strugee

@ หายไปถ้าตัวอย่างของฉันไม่สมเหตุสมผลฉันก็สนับสนุนให้คุณเล่นกับchrootตัวเองหรือบอกให้ฉันรู้ว่าอะไรไม่สมเหตุสมผล ดียิ่งกว่านั้นทำทั้งสองอย่าง (และอ่าน manpages.)
strugee

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