फ़ाइलों को बनाने और पढ़ने के लिए स्वामी को अनुमति दें, लेकिन संशोधित या हटाएं नहीं


17

मैं एक विशेष निर्देशिका में फ़ाइलों को बनाने और पढ़ने के लिए एक उपयोगकर्ता अनुमति देना चाहूंगा, लेकिन फ़ाइलों को संशोधित या हटाने के लिए नहीं। यदि उपयोगकर्ता उन फ़ाइलों को संलग्न कर सकता है जो ठीक है, लेकिन मैं ऐसा नहीं करूंगा। यह उबंटू लिनक्स पर है।

मुझे लगता है कि यह मानक यूनिक्स फ़ाइल अनुमतियों के साथ असंभव है, लेकिन शायद एसीएल का उपयोग करना संभव है? उपयोगकर्ता हमेशा SFTP का उपयोग करके कनेक्ट हो रहा होगा, इसलिए यदि SFTP के भीतर इसे नियंत्रित करने का कोई तरीका था (जैसा कि OS अनुमतियों के विपरीत) ठीक होगा।

बिल्कुल स्पष्ट होने के लिए, मुझे निम्नलिखित चाहिए:

  • इको हैलो> परीक्षण # सफल होता है, क्योंकि परीक्षण मौजूद नहीं है, और निर्माण की अनुमति है
  • इको हेलो >> टेस्ट # सफल या विफल हो सकता है, इस पर निर्भर करता है कि एपडिंग की अनुमति है या नहीं
  • इको हेल्लो 2> परीक्षण # विफल रहता है, क्योंकि परीक्षण पहले से मौजूद है, और संशोधन की अनुमति नहीं है
  • कैट टेस्ट # सफल होता है, क्योंकि रीड की अनुमति है
  • rm test # विफल रहता है, क्योंकि हटाने की अनुमति नहीं है

यदि आप सोच रहे हैं कि मैं ऐसा क्यों करना चाहता हूं, तो यह रैंसमवेयर के लिए एक डुप्लिकेटी बैकअप सिस्टम को प्रतिरोधी बनाने के लिए है।


1
फाइलें हमेशा खाली बनाई जाती हैं। जब आप करते हैं echo > test, तो शेल एक open("test", O_WRONLY|O_CREAT|O_TRUNC)फाइल बनाता है और फिर echoउस सामग्री को लिखने वाले को इनवॉइस करता है इसलिए इसे संशोधित करता है। अब आप केवल पहले खुले (WR) को सफल होने की अनुमति दे सकते हैं।
स्टीफन चेज़लस

जवाबों:


16

आप इस bindfsतरह का उपयोग कर सकते हैं:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

उस निर्देशिका का स्वामित्व स्टीफन के पास है, जिसमें समूह स्टीफन (स्टीफन इसका एकमात्र सदस्य है)। यह भी ध्यान दें tकि उपयोगकर्ताओं को उन प्रविष्टियों का नाम बदलने या हटाने से रोकता है जो उनके पास नहीं हैं।

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

हम bindfs dirफ़ाइलों और निर्देशिकाओं के लिए निश्चित स्वामित्व और अनुमतियों से अधिक हैं। सभी फाइलें स्वामित्व में दिखाई देती हैं root(हालांकि वास्तविक निर्देशिका में वे अभी भी स्टीफन के स्वामित्व में हैं)।

निर्देशिकाओं को drwxrwxr-x root stephaneअनुमति मिलती है जबकि अन्य प्रकार की फाइलें मिलती -rw-r--r-- root stephaneहैं।

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

अब एक फ़ाइल काम कर रही है क्योंकि निर्देशिका लेखन योग्य है:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

हालाँकि उस फ़ाइल पर दूसरा लिखना संभव नहीं है open()क्योंकि हमारे पास इसकी अनुमति नहीं है:

$ echo test > dir/file
zsh: permission denied: dir/file

(ध्यान दें कि वहां अपील करने की अनुमति नहीं है (जैसा कि आपकी प्रारंभिक आवश्यकताओं का हिस्सा नहीं है))।

एक सीमा: जब आप बिट के dirकारण प्रविष्टियों को हटा या नाम बदल नहीं सकते हैं , तो आपके द्वारा tवहां बनाई गई नई निर्देशिकाओं में वह tबिट नहीं होगा , इसलिए आप वहां प्रविष्टियों का नाम बदलने या हटाने में सक्षम होंगे।


ये जबरदस्त है! इस तरह के एक सुरुचिपूर्ण समाधान के लिए समय निकालने के लिए धन्यवाद। मैंने पहले bindfs के बारे में सुना था, लेकिन यह पहली बार है जब मैंने वास्तव में इसका उपयोग किया है।
पेज 28

4

chattr +aविकल्प केवल जोड़कर अनुमति देगा। फ़ाइलों को उस तरह से बदल दिया जा सकता है, लेकिन केवल उन्हें जोड़कर (यानी जोड़कर)। आप मौजूदा फ़ाइलों को हटा नहीं सकते, लेकिन नए बना सकते हैं। यह आपकी आवश्यकताओं के अनुरूप हो सकता है:

sudo chattr -R +a /dir/to/apply/to

से man chattr

`ए 'विशेषता सेट के साथ एक फ़ाइल केवल लिखने के लिए एपेंड मोड में खुली हो सकती है। केवल कैप्युसर या CAP_LINUX_IMMUTUT की क्षमता वाली एक प्रक्रिया इस विशेषता को निर्धारित या साफ़ कर सकती है।

(ध्यान दें कि यह निर्देशिकाओं पर भी लागू होता है)

तो आपकी सूची इस तरह दिखाई देगी:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed

ठीक है, यह आशाजनक लगता है। यह सही ढंग से हटाने से रोकता है, और यदि किसी फ़ाइल में विशेषता है, तो यह ओवरराइट को रोकता है। हालाँकि, जब नई फ़ाइलें बनाई जाती हैं, तो वे स्वचालित रूप से विशेषता प्राप्त नहीं करती हैं। क्या ऐसा होने का कोई तरीका है?
पज28

यदि निर्देशिका में विशेषता है, तो फ़ाइलें स्पष्ट रूप से सेट नहीं होने के बावजूद तदनुसार व्यवहार करेंगी। समस्या नए उपखंडों में फाइल है। उदाहरण dir1 है chattr +aतो मैं एक फाइल बना सकता हूं, इसे हटाने की अनुमति नहीं है, संलग्न कर सकता हूं। अगर मैं
dir1

1
दुर्भाग्य से नहीं: dpaste.com/042XQ7X
paj28

आह, क्षमा करें - मैंने पहले एक गलत परीक्षण किया था
फिक्समैन

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