วิธีการอนุญาตให้ผู้ใช้ถ่ายโอนไฟล์ไปยังผู้ใช้รายอื่นบน linux


10

เรามีสภาพแวดล้อมของผู้ใช้ไม่กี่พันคนที่ใช้งานแอพพลิเคชั่นบนเครือข่ายประมาณ 40 กลุ่มตั้งแต่ขนาด 20 โหนดไปจนถึง 98,000 โหนด ผู้ใช้ในระบบเหล่านี้สร้างไฟล์ขนาดใหญ่ (บางครั้ง> 1PB) ควบคุมโดยสิทธิ์ unix แบบดั้งเดิม (โดยทั่วไปจะไม่สามารถใช้งานหรือใช้งานได้จริงเนื่องจากลักษณะเฉพาะของระบบไฟล์)

ขณะนี้เรามีโปรแกรมที่เรียกว่า "ให้" ซึ่งเป็นโปรแกรม suid-root ที่อนุญาตให้ผู้ใช้ "มอบ" ไฟล์ให้กับผู้ใช้รายอื่นเมื่อสิทธิ์กลุ่มไม่เพียงพอ ดังนั้นผู้ใช้จะพิมพ์สิ่งต่อไปนี้เพื่อให้ไฟล์แก่ผู้ใช้รายอื่น:

> give username-to-give-to filename-to-give ...

ผู้ใช้ที่ได้รับจากนั้นสามารถใช้คำสั่งที่เรียกว่า "ใช้" (ส่วนหนึ่งของโปรแกรมให้) เพื่อรับไฟล์:

> take filename-to-receive

สิทธิ์ของไฟล์จะถูกถ่ายโอนไปยังผู้ใช้ที่ได้รับอย่างมีประสิทธิภาพ

โปรแกรมนี้มีมานานหลายปีและเราต้องการที่จะทบทวนสิ่งต่าง ๆ จากมุมมองด้านความปลอดภัยและการใช้งาน

แผนปฏิบัติการปัจจุบันของเราคือการลบบิตเน่าในการดำเนินการ "ให้" ปัจจุบันของเราและบรรจุมันเป็นแอพโอเพนซอร์ซก่อนที่เราจะนำมันไปใช้ในการผลิตอีกครั้ง

ใครบ้างมีวิธีอื่นที่พวกเขาใช้ในการถ่ายโอนไฟล์ที่มีขนาดใหญ่มากระหว่างผู้ใช้เมื่อมีสิทธิ์ unix แบบดั้งเดิมเท่านั้นที่สามารถใช้ได้?


1
มีเหตุผลบางอย่างที่ทำให้คุณไม่สามารถสร้างไดเรกทอรีที่ใช้ร่วมกันซึ่งผู้ใช้ทั้งหมดสามารถเข้าถึงได้หรือไม่?
Zoredache

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

จะไม่เพียงพองาน cron จะคัดลอกไฟล์ตัวเอง ตัวอย่าง: ผู้ใช้ foo ต้องการให้แถบไฟล์แก่ลูกสุนัขผู้ใช้ ดังนั้นเขาจึงสร้างไดเรกทอรีพิเศษซึ่งสแกนโดย cron job ด้วยไฟล์ 'control' ที่มีชื่อผู้ใช้ที่ได้รับ งาน cron จะอ่านไฟล์ 'control' นี้หากผู้ใช้ตกลงไดเรคทอรีปลายทางมีที่ว่างก็อปปี้ คุณยังสามารถสร้าง wrapper สำหรับ 'ให้' เพื่อสร้างไฟล์ 'control' เพื่อให้มีความเข้ากันได้ในอดีต ไม่จำเป็นต้องใช้ suid-root คุณสามารถคัดลอกไฟล์นั้นภายใต้ผู้ใช้ที่ไม่ใช่รูทแล้วเปลี่ยน sudo เพื่อเปลี่ยนความเป็นเจ้าของ
jirib

หากคุณต้องการเปลี่ยนการอนุญาตchownควรทำ .. ดูเหมือนคุณต้องการคัดลอกไฟล์เมื่อทั้งสองฝ่ายได้ตกลงกัน
zebediah49

@JiriXichtkniha ฉันชอบความคิดของไฟล์ควบคุมและงาน cron อย่างไรก็ตามไฟล์มีขนาดใหญ่เกินไปที่จะคัดลอก
Jon Bringhurst

คำตอบ:


1

หากตัวปล่อยมีความตั้งใจจริงที่จะให้ไฟล์ไปคุณสามารถใช้ SUID binary ที่ย้ายไฟล์ไปยังไดเรกทอรีที่ทุกคนเขียนได้และมีบิตเหนียว (เช่น/tmp) จากนั้นเปลี่ยนความเป็นเจ้าของเป็นเจ้าของคนใหม่ chown(3)ดูแลการลบset-user-IDและset-group-IDบิตสำหรับคุณแล้ว วิธีนี้เจ้าของใหม่สามารถทำสิ่งที่เขาต้องการกับไฟล์รวมถึงการย้ายมัน

ไดเรกทอรีนี้เขียนได้โดยทุกคนสามารถเป็นของโฮมไดเร็กตอรี่ของผู้ใช้, ในกรณีที่คุณต้องการใช้หลาย ๆ ระบบไฟล์สำหรับโฮมไดเร็กตอรี่และต้องการให้แน่ใจว่าคุณจะไม่ข้ามขอบเขตของระบบไฟล์ ในกรณีนี้คุณอาจต้องการให้แน่ใจว่าผู้รับรู้เมื่อมีไฟล์ใหม่ให้

อีเมลทำเคล็ดลับ โซลูชัน Unixy ที่มากขึ้นจะเป็น/etc/profileรายการไฟล์ที่ส่งใหม่ของคุณ เพิ่มโบนัสหากคุณเสนอคุณสมบัตินี้ด้วยpam_echo( เช่นด้วยfile=/tmp/deliveries/%u, ดูpam_echo(8)) เช่นเดียวกับสิ่งที่เกี่ยวข้องกับ PAM คุณต้องการตรวจสอบว่าการใช้งานทั้งหมดของคุณนำเสนอโมดูลดังกล่าวก่อน


0

คุณสามารถใช้ระบบที่มีไดเรกทอรีที่ใช้ร่วมกัน (อาจไม่มีการเรียกใช้ perms) ซึ่งสิ่งต่าง ๆ สำหรับผู้ใช้ที่กำหนดจะถูกเก็บถาวรด้วยโครงสร้างชื่อไฟล์ที่เฉพาะเจาะจง ( to-$username_from-$username.tarตัวอย่างเช่น) Give ทำให้ไฟล์และเป็นไฟล์chownsสำหรับผู้ใช้เป้าหมาย; แยกไฟล์และลบออก

ถ้าคุณต้องการที่จะทำมันเป็นการย้ายที่แท้จริง (IE, เปลี่ยนที่ตั้งของไฟล์และการอนุญาต, ไม่มีการคัดลอกเพราะขนาดของไฟล์ยักษ์), คุณอาจหนีจากการย้ายไปยังไดเรคทอรีที่แชร์ด้วย -x perms (ไม่มีใครสามารถทำได้ รายการไฟล์ที่นั่น) และchownวิธีการ เดียวกัน mv, chown/ mv.


0

xryl669 บอกว่าคุณสามารถใช้ไดเรกทอรีเพื่อแชร์ไฟล์ได้ ควรมีลักษณะเช่นนี้:

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

คำสั่ง give กลายเป็น

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

คำสั่ง take มีลักษณะดังนี้:

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~

0

ฉันขอแนะนำให้เขียนแอปใหม่เพื่อเลียนแบบ "ให้" และ "ใช้" แต่แทนที่จะ "ดัน" และ "ดึง" จากไดเรกทอรีที่ได้รับการป้องกัน ไดเรกทอรีของคุณสามารถเข้าถึงได้เฉพาะสำหรับแอพ push / pull ซึ่งจัดการการย้ายไฟล์ อีกทางหนึ่งแอป / สคริปต์ของคุณสามารถสร้างไดเรกทอรีชั่วคราวแบบสุ่มที่มีการตั้งค่าสิทธิ์สำหรับผู้ส่งและผู้รับเท่านั้น

ต้องการที่จะมีความปลอดภัยมากขึ้น? คุณสามารถ PGP เข้ารหัส / เซ็นชื่อไฟล์ (ใช้กุญแจสาธารณะของผู้รับ)

ในแง่ของการทำซ้ำจาก "ความปลอดภัยและมุมมองการทำงาน" ฉันขอแนะนำไม่ให้สร้างโปรแกรม SUID หากคุณไม่ทิ้งสิทธิ์ในวิธีที่เหมาะสมคุณสามารถเข้าถึงไฟล์ใด ๆ ในระบบได้ หากโปรแกรมของคุณเป็นบั๊กกี้ (บัฟเฟอร์มากเกินไป ฯลฯ ... ) คุณสามารถใช้ช่องโหว่นี้เพื่อเข้าถึงรูทบนระบบของคุณ


0

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

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

เท่าที่ฉันทราบนี่เป็นคุณลักษณะที่มีเฉพาะใน OCFS2 และ btrfs เท่านั้นในปัจจุบัน ฉันเดาว่าจะแก้ปัญหาของคุณ แต่การเห็นว่าความพร้อมใช้งานของมันไม่แพร่หลายมันอาจไม่เป็นประโยชน์

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