मुझे यह उदाहरण मिला, जिसका शीर्षक है: linux में ACL और MASK । इस लेख में निम्नलिखित उदाहरणों का प्रदर्शन किया गया है जो मुझे लगता है कि यह समझने में मदद करते हैं कि ACL कैसे और umask
एक दूसरे के साथ बातचीत करता है।
पृष्ठभूमि
जब लिनक्स सिस्टम पर एक फाइल बनाई जाती है तो डिफॉल्ट परमिशन 0666
लागू होती है जबकि डायरेक्टरी बनाते समय डिफॉल्ट परमिशन 0777
लागू होती है।
उदाहरण 1 - फ़ाइल
मान लीजिए कि हम अपने umask को 077 पर सेट करते हैं और एक फ़ाइल को स्पर्श करते हैं। हम यह strace
देखने के लिए उपयोग कर सकते हैं कि जब हम ऐसा करते हैं तो वास्तव में क्या हो रहा है:
$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile
इस उदाहरण में हम देख सकते हैं कि सिस्टम कॉल open()
परमिशन 0666 के साथ किया गया है, हालाँकि जब umask 077
कर्नेल द्वारा लागू किया जाता है तो निम्नलिखित अनुमतियाँ हटा दी जाती हैं ( ---rwxrwx
) और हम rw-------
उर्फ 0600 के साथ छोड़ देते हैं ।
उदाहरण - 2 निर्देशिका
एक ही अवधारणा को निर्देशिकाओं पर लागू किया जा सकता है, सिवाय इसके कि डिफ़ॉल्ट अनुमति 0666 के बजाय, वे 0777 हैं।
$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777) = 0
drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir
इस बार हम mkdir
कमांड का उपयोग कर रहे हैं । mkdir
आदेश तो सिस्टम कॉल बुलाया mkdir()
। उपरोक्त उदाहरण में हम देख सकते हैं कि mkdir
कमांड ने mkdir()
सिस्टम कॉल को डिफॉल परमिशन 0777
( rwxrwxrwx
) के साथ कॉल किया है । इस बार 022
निम्नलिखित अनुमतियों के एक umask के साथ हटा दिया जाता है ( ----w--w-
), इसलिए हम 0755 ( rwxr-xr-x
) के साथ छोड़ दिए जाते हैं जब निर्देशिकाएं बनाई जाती हैं।
उदाहरण 3 (डिफ़ॉल्ट ACL लागू करना)
अब एक डायरेक्टरी बनाते हैं और प्रदर्शित करते हैं कि जब डिफ़ॉल्ट ACL उसके साथ फाइल के साथ लागू होता है तो क्या होता है।
$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir
$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx #effective:rwx
group::r-x #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
अब फाइल बनाते हैं aclfile
:
$ strace -s 128 -fvTttto luvly touch acldir/aclfile
# view the results of this command in the log file "luvly"
$ less luvly
अब नई बनाई गई फ़ाइल की अनुमति प्राप्त करें:
$ getfacl --all-effective acldir/aclfile
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
सूचना, मुखौटा mask::rw-
। mask::rwx
जब निर्देशिका बनाई गई थी, तो ऐसा क्यों नहीं है ?
luvly
फ़ाइल के निर्माण के लिए डिफ़ॉल्ट अनुमतियों का उपयोग किया गया था, यह देखने के लिए लॉग फ़ाइल की जाँच करें :
$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>
यह वह जगह है जहाँ यह थोड़ा भ्रामक है। rwx
जब निर्देशिका बनाई गई थी तब मास्क सेट के साथ , आप फ़ाइल के निर्माण के लिए समान व्यवहार की उम्मीद करेंगे, लेकिन यह उस तरह से काम नहीं करता है। यह इसलिए है क्योंकि कर्नेल open()
डिफ़ॉल्ट अनुमतियों के साथ फ़ंक्शन को कॉल कर रहा है 0666
।
संक्षेप में
- फ़ाइलों को निष्पादन की अनुमति नहीं मिलेगी (मास्किंग या प्रभावी)। कोई फर्क नहीं पड़ता कि हम किस विधि का उपयोग करते हैं: एसीएल, उमस्क या मास्क और एसीएल।
- निर्देशिकाओं को निष्पादन की अनुमति मिल सकती है, लेकिन यह निर्भर करता है कि मास्किंग फ़ील्ड कैसे सेट किया गया है।
- किसी फ़ाइल के लिए अनुमतियाँ सेट करने का एकमात्र तरीका जो ACL अनुमतियों के अंतर्गत है, उन्हें मैन्युअल रूप से उपयोग करके सेट करना है
chmod
।
संदर्भ
mask::rw-
। लेकिन यह वास्तव में आपका सवाल नहीं है, सही है?