उपयोगकर्ताओं को लिनक्स पर अन्य उपयोगकर्ताओं के लिए फ़ाइलों को स्थानांतरित करने की अनुमति कैसे दें


10

हमारे पास कुछ हज़ार उपयोगकर्ताओं का एक वातावरण है, जो लगभग 40 समूहों पर चल रहे हैं, जिनका आकार 20 गणना नोड्स से लेकर 98,000 कंप्यूट नोड्स तक है। इन प्रणालियों पर उपयोगकर्ता पारंपरिक यूनिक्स अनुमतियों द्वारा नियंत्रित बड़े पैमाने पर फाइलें (कभी-कभी 1PB) उत्पन्न करते हैं (ACL आमतौर पर फाइल सिस्टम की विशेष प्रकृति के कारण उपलब्ध या व्यावहारिक नहीं होते हैं)।

वर्तमान में हमारे पास "दे" नामक एक कार्यक्रम है, जो एक suid-root प्रोग्राम है जो एक उपयोगकर्ता को किसी अन्य उपयोगकर्ता को एक फ़ाइल "देने" की अनुमति देता है जब समूह अनुमतियाँ अपर्याप्त होती हैं। इसलिए, एक उपयोगकर्ता किसी अन्य उपयोगकर्ता को एक फ़ाइल देने के लिए निम्नलिखित जैसा कुछ लिखेगा:

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

फिर प्राप्त उपयोगकर्ता फ़ाइल प्राप्त करने के लिए "टेक" (दिए गए प्रोग्राम का हिस्सा) नामक एक कमांड का उपयोग कर सकता है:

> take filename-to-receive

फ़ाइल की अनुमति तब प्रभावी रूप से प्राप्त उपयोगकर्ता को हस्तांतरित की जाती है।

यह कार्यक्रम वर्षों से है और हम सुरक्षा और कार्यात्मक दृष्टिकोण से चीजों को फिर से देखना चाहते हैं।

हमारी वर्तमान कार्ययोजना "दे" के हमारे वर्तमान कार्यान्वयन में थोड़ी सड़ांध को दूर करने और इसे उत्पादन में बदलने से पहले इसे एक ओपन सोर्स ऐप के रूप में पैकेज करना है।

क्या किसी के पास एक और तरीका है जो वे उपयोगकर्ताओं के बीच अत्यंत बड़ी फ़ाइलों को स्थानांतरित करने के लिए उपयोग करते हैं जब केवल पारंपरिक यूनिक्स अनुमतियाँ उपलब्ध होती हैं?


1
क्या कोई कारण है कि आप केवल एक साझा निर्देशिका नहीं बना सकते हैं जहाँ सभी उपयोगकर्ताओं की पहुँच हो?
ज़ॉडेचे

1
यदि साझा पहुंच वाली कोई निर्देशिका है, तो अनुमति के बिना उपयोगकर्ताओं के पास फ़ाइलों तक पहुंच होगी, क्योंकि वे साझा किए जा रहे हैं। इस वातावरण में, कभी-कभी फ़ाइल-नाम संवेदनशील भी होते हैं। इसलिए, दुर्भाग्य से, एक साझा निर्देशिका एक विकल्प नहीं है। एक साझा निर्देशिका के साथ, फ़ाइल के साथ तीसरे उपयोगकर्ता द्वारा छेड़छाड़ की भी संभावना है।
जॉन बर्डहर्स्ट

पर्याप्त नहीं होगा एक क्रॉन नौकरी फ़ाइलों की नकल करेगी? उदाहरण: उपयोगकर्ता फू उपयोगकर्ता पिल्ला को फ़ाइल बार देना चाहता है। इसलिए वह विशेष निर्देशिका बनाता है जो उपयोगकर्ता नाम प्राप्त करने वाली 'नियंत्रण' फ़ाइल के साथ क्रोन जॉब द्वारा स्कैन की जाती है। क्रोन जॉब्स इस 'कंट्रोल' फ़ाइल को पढ़ेंगे, यदि उपयोगकर्ता ठीक है, तो गंतव्य निर्देशिका में स्थान ठीक है, प्रतिलिपि है। आप अभी भी ऐतिहासिक अनुकूलता के लिए 'नियंत्रण' फ़ाइल बनाने के लिए 'दे' के लिए एक आवरण बना सकते हैं। Suid-root की कोई आवश्यकता नहीं है, आप उस फ़ाइल को गैर-रूट उपयोक्ता के तहत कॉपी कर सकते हैं और फिर स्वामित्व बदलने के लिए sudo कर सकते हैं।
जिरिब

यदि आप केवल अनुमतियाँ बदलना चाहते हैं, chownतो इसे करना चाहिए .. ऐसा लगता है कि आप भी फ़ाइल की प्रतिलिपि बनाना चाहते हैं, एक बार दोनों पक्षों ने सहमति व्यक्त की है।
zebediah49

@JiriXichtkniha मैं एक नियंत्रण फ़ाइल और क्रॉन जॉब के विचार को पसंद करता हूं। हालाँकि, फ़ाइलों की प्रतिलिपि बनाने के लिए बहुत बड़ी हैं।
जॉन बर्डहर्स्ट

जवाबों:


1

यदि एमिटर वास्तव में फ़ाइल को दूर देने के लिए तैयार है, तो आप एक एसयूआईडी बाइनरी का उपयोग कर सकते हैं जो फ़ाइल को एक निर्देशिका में ले जाता है जो सभी द्वारा लिखी जाती है और /tmpउसमें चिपचिपा सा (जैसे ) होता है, फिर स्वामित्व को नए मालिक में बदल देता है। chown(3)पहले से ही आप के लिए बिट्स set-user-IDऔर set-group-IDबिट्स को हटाने का ख्याल रखता है । इस तरह से नया मालिक वह कर सकता है जो वह फ़ाइल के साथ चाहता है, जिसमें उसे स्थानांतरित करना शामिल है।

सभी के द्वारा लिखी जाने वाली यह निर्देशिका उपयोगकर्ता के होम डायरेक्टरी से संबंधित हो सकती है, यदि आप होम डाइरेक्टरी के लिए कई फाइल सिस्टम का उपयोग करना चाहते हैं और यह सुनिश्चित करना चाहते हैं कि आप फाइल सिस्टम की सीमाओं को पार न करें क्योंकि प्रदर्शन तुरंत भयानक होगा। इस मामले में आप शायद यह सुनिश्चित करना चाहेंगे कि प्राप्तकर्ता को पता चल जाए कि कोई नई फ़ाइल कब पेश की गई है।

ई-मेल की चाल चलेगा। एक और अधिक Unixy समाधान होगा /etc/profileजो आपकी नई वितरित फ़ाइलों को सूचीबद्ध करता है। बोनस जोड़ा गया है, तो आप के साथ यह सुविधा प्रदान pam_echo( जैसे के साथ file=/tmp/deliveries/%u, देखें pam_echo(8))। PAM से संबंधित किसी भी चीज़ के साथ, आप यह जांचना चाहेंगे कि आपके सभी कार्यान्वयन पहले इस तरह का एक मॉड्यूल प्रदान करते हैं।


0

आप एक साझा निर्देशिका के साथ एक प्रणाली का उपयोग कर सकते हैं, (संभवतः निष्पादित किए बिना परमिट।), जहां किसी दिए गए उपयोगकर्ता के लिए चीजें एक विशिष्ट फ़ाइल नाम संरचना ( to-$username_from-$username.tarउदाहरण के लिए) के साथ संग्रहीत की जाती हैं । दे फ़ाइल बनाता है और chownsयह लक्ष्य उपयोगकर्ता के लिए; फ़ाइल निकालता है और इसे निकालता है।

यदि आप इसे वास्तव में स्थानांतरित करना चाहते हैं (IE, फ़ाइल स्थान और अनुमतियाँ बदलें; विशाल फ़ाइल आकार के कारण कोई प्रतिलिपि नहीं), तो आप -x परमिट के साथ साझा निर्देशिका में जाने में सक्षम हो सकते हैं (इसलिए कोई भी नहीं कर सकता है) सूची फ़ाइलें वहाँ), और एक ही 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

दे कमांड बन जाता है

#!/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

टेक कमांड कुछ इस तरह दिखती है:

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

0

मैं एप्लिकेशन को वास्तव में एक "दे" और "टेक" की नकल करने के लिए फिर से लिखने का सुझाव दूंगा, लेकिन एक संरक्षित निर्देशिका से इसे "पुश" और "खींच" करूंगा। आपकी निर्देशिका केवल पुश / पुल ऐप के लिए सुलभ हो सकती है - जो फ़ाइल चाल को संभालती है। वैकल्पिक रूप से, आपका ऐप / स्क्रिप्ट एक यादृच्छिक, अस्थायी निर्देशिका बना सकता है जिसमें केवल प्रेषक और रिसीवर के लिए अनुमतियाँ निर्धारित की जा सकती हैं।

अधिक सुरक्षा चाहते हैं? आप फ़ाइल को पीजीपी एन्क्रिप्ट / हस्ताक्षर कर सकते हैं (रिसीवर की सार्वजनिक कुंजी का उपयोग करके)।

"सुरक्षा और कार्यात्मक दृष्टिकोण" से इसे फिर से तैयार करने के संदर्भ में, मैं दृढ़ता से सुझाव दूंगा कि SUID प्रोग्राम बनाएं। यदि आप विशेषाधिकार को उचित तरीके से नहीं छोड़ते हैं, तो आप सिस्टम पर किसी भी फाइल को एक्सेस कर सकते हैं। यदि आपका कार्यक्रम छोटी गाड़ी है (बफर अतिप्रवाह, आदि ...) - तो यह आपके सिस्टम पर रूट एक्सेस हासिल करने के लिए शोषण कर सकता है।


0

यह शायद आपके लिए कोई उपयोग नहीं है, लेकिन संदर्भ के लिए cp --reflink स्रोत लक्ष्य कॉपी-ऑन-राइट का उपयोग करके फ़ाइलों की पतली प्रतियां करता है।

इसका मतलब है कि आप फ़ाइल को एकमुश्त कॉपी कर सकते हैं और केवल बदले हुए ब्लॉक वास्तव में कॉपी किए जाएंगे। एक कड़ी के विपरीत नई फ़ाइल का अपना इनकोड और मेटाडेटा है, जिसका अर्थ है कि आप मानक उपयोगकर्ता के सामान का उपयोग करके नए उपयोगकर्ता को फ़ाइल की प्रतिलिपि प्रदान कर सकते हैं।

जहाँ तक मुझे पता है यह एक ऐसी सुविधा है जो केवल OCFS2 और btrfs पर उपलब्ध है। मुझे लगता है कि यह आपकी समस्या को हल करता है लेकिन इसकी उपलब्धता को देखते हुए यह व्यापक नहीं है कि यह उपयोगी नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.