Linux drwxr-xr-x என்றால் என்ன? கோப்பு அனுமதிகள் விளக்கம்
Linux கோப்பு முறையில் drwxr-xr-x என்பதன் அர்த்தத்தை விரிவாகக் காண்போம். 755 permission குறியீடு, directory traversal மற்றும் chmod 777 ஏன் பாதுகாப்பானது அல்ல என்பதை அறியுங்கள்.
drwxr-xr-x என்பதன் பொருள்
drwxr-xr-x என்பது, அதன் உரிமையாளர் மாற்றங்களைச் செய்யக்கூடிய, அதேசமயம் மற்ற பயனர்கள் அனைவரும் படிக்கவும் உள்ளே நுழையவும் மட்டுமே கூடிய (மாற்றங்களைச் செய்ய முடியாத) ஒரு கோப்பகத்தைக் (directory) குறிக்கிறது. ஆக்டல் (octal) முறையில் இந்த mode 755 ஆகும். ls -l வெளியீட்டின் ஒவ்வொரு வரியின் தொடக்கத்திலும் Linux இந்த பத்து எழுத்துக்களைக் காட்டுகிறது. இவை எப்போதும் ஒரே வரிசையில் ஒரே பொருளைக் கொண்டிருப்பதால், ஒரு சரத்தைப் புரிந்துகொண்டாலே அனைத்தையும் கற்றுக்கொள்ளலாம்.
மற்ற அனைத்து விதிகளுக்கும் மேலாக ஒரு விதி உள்ளது, ஏனெனில் உங்கள் சொந்த சோதனைகள் சரியான முடிவைத் தருகிறதா என்பதை இதுவே தீர்மானிக்கிறது. root பயனர் permission bits-களைப் பொருட்படுத்துவதில்லை. Kernel, root பயனருக்கு CAP_DAC_OVERRIDE திறனை (discretionary access control override) வழங்குகிறது. எனவே, mode அனுமதி மறுத்தாலும் root பயனரால் கோப்புகளைத் திறக்க முடியும். இந்தப் பக்கத்தில் உள்ள ஒவ்வொரு உதாரணமும், bits என்னவாக இருந்தாலும், root பயனருக்குச் சரியாகச் செயல்படும். விதிகள் எவ்வாறு செயல்படுகின்றன என்பதைக் கவனிக்க விரும்பினால், ஒரு சாதாரண பயனராக (normal user) உள்நுழையவும்.
பத்து எழுத்துகள், ஒவ்வொன்றாக
ஒரு directory மற்றும் ஒரு file-ஐ உருவாக்கி அவற்றை ஆராயுங்கள். புதிய directory-க்கு வெளியே எந்த மாற்றமும் செய்யப்படாது.
mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txtபொதுவான default umask 022 ஆக இருக்கும்போது, directory-க்கான இரண்டு வரிகள் drwxr-xr-x என்றும், file-க்கான வரி -rw-r--r-- என்றும் தொடங்கும்.
முதல் எழுத்து file-ன் வகை, அது permission அல்ல. d என்பது directory. - என்பது சாதாரண file. l என்பது symbolic link. c மற்றும் b என்பவை character மற்றும் block device nodes. s என்பது socket, p என்பது named pipe. இது octal மதிப்பிற்கு வெளியே இருப்பதால், drwxr-xr-x என்பது d என்று தொடங்குவதற்குப் பதிலாக 755 என்று அமைகிறது.
அதற்குப் பின் வரும் ஒன்பது எழுத்துகள் மூன்று குழுக்களாகப் பிரிக்கப்பட்டுள்ளன, அவற்றின் வரிசை எப்போதும் மாறாது.
- 2 முதல் 4 வரையிலான எழுத்துகள் owner triad, இவை file-ஐ வைத்திருக்கும் பயனருக்குப் பொருந்தும் bits.
- 5 முதல் 7 வரையிலான எழுத்துகள் group triad, இவை file-ன் group-க்கு பொருந்தும் bits.
- 8 முதல் 10 வரையிலான எழுத்துகள் other triad, இவை மற்ற அனைவருக்கும் பொருந்தும் bits.
ஒரு triad-க்குள் இடங்கள் எப்போதும் r, பிறகு w, பிறகு x என்ற வரிசையில் இருக்கும், ஒரு dash (-) அந்த bit முடக்கப்பட்டுள்ளது என்பதைக் குறிக்கும். எழுத்துகளின் இடம் மாறாது. r-x என்பது write இல்லாமல் read செய்வதைக் குறிக்கும். -w- என்பது read இல்லாமல் write செய்வதைக் குறிக்கும், இது சட்டப்பூர்வமானது ஆனால் அரிதானது.
எனவே drwxr-xr-x என்பது இவ்வாறு பிரிக்கப்படுகிறது: directory-க்கு d, owner-க்கு rwx, group-க்கு r-x, மற்றவர்களுக்கு r-x.
சில system-கள் பதினோராவது எழுத்தை அச்சிடும். இறுதியில் உள்ள புள்ளி, drwxr-xr-x., அந்த file ஒரு SELinux (security enhanced Linux) context-ஐக் கொண்டுள்ளது என்பதைக் குறிக்கிறது; Fedora மற்றும் Rocky போன்ற SELinux விநியோகங்கள் இதை default-ஆக அச்சிடுகின்றன. இறுதியில் உள்ள பிளஸ் குறி, drwxr-xr-x+, அந்த file ஒரு POSIX ACL (access control list)-ஐக் கொண்டுள்ளது என்பதைக் குறிக்கிறது, இது இந்த ஒன்பது bits-க்கு அப்பாற்பட்ட கூடுதல் விதிகளின் தொகுப்பாகும். அந்த கூடுதல் விதிகளைப் பார்க்க getfacl <path> கட்டளையைப் பயன்படுத்தவும்.
directory-ல் r, w மற்றும் x ஆகியவற்றுக்கு வெவ்வேறு பணிகள் உள்ளன
தொடக்க நிலையில் உள்ளவர்கள் செய்யும் முதல் தவறு இதுதான். கோப்பு (file) மற்றும் கோப்பகம் (directory) இரண்டிற்கும் இந்த எழுத்துக்கள் ஒரே மாதிரியாக இருந்தாலும், அவை வழங்கும் அதிகாரங்கள் வெவ்வேறானவை.
- கோப்பில்
rஎன்பது அதன் உள்ளடக்கத்தைப் படிக்க உதவும். கோப்பகத்தில்rஎன்பது அதற்குள் உள்ள கோப்புகளின் பெயர்களைப் பட்டியலிட உதவும்; இதுவே சாதாரணlsகட்டளைக்குத் தேவைப்படுகிறது. - கோப்பில்
wஎன்பது அதன் உள்ளடக்கத்தை மாற்ற உதவும். கோப்பகத்தில்wஎன்பது அதற்குள் புதிய கோப்புகளைச் சேர்க்கவும், நீக்கவும் உதவும். ஒரு கோப்பை நீக்குவது என்பது அந்த கோப்பகத்தில் செய்யப்படும் மாற்றமாகும்; எனவே, கோப்பகத்தின் எழுதும் உரிமை (write permission) மட்டுமே இதைத் தீர்மானிக்கிறது, கோப்பின் சொந்த அனுமதி (mode) இதில் எந்தப் பங்கையும் வகிப்பதில்லை. - கோப்பில்
xஎன்பது அதை ஒரு நிரலாக (program) இயக்க உதவும். கோப்பகத்தில்xஎன்பது அதன் வழியாகச் செல்ல (traverse) உதவும்; அதாவது, ஒரு கோப்பின் பாதையைத் தேடும்போது (path lookup), அதற்குள் உள்ள ஒரு பெயரை kernel கண்டறிய இது தேவைப்படுகிறது.
'Traverse' என்பதுதான் பலரை வியக்க வைக்கும் பகுதி. கோப்பகத்தில் x என்பது எதையும் இயக்குவதில்லை. /srv/site/index.html-ஐத் திறக்க, /-ல் x-ம், பிறகு /srv-ல் x-ம், பிறகு /srv/site-ல் x-ம், இறுதியாகக் கோப்பில் r-ம் தேவைப்படுகிறது. இந்தச் சங்கிலியில் ஏதேனும் ஒரு கோப்பகத்தில் உங்களுக்கு x இல்லையென்றால், தேடல் அங்கேயே நின்றுவிடும். இறுதியில் உள்ள கோப்பு அனைவருக்கும் படிக்கக்கூடியதாக இருந்தாலும், அந்தப் பாதை முழுமைக்கும் Permission denied என்று அழைப்பவருக்குத் தெரிவிக்கப்படும். namei -l /srv/site/index.html கட்டளை, பாதையின் ஒவ்வொரு நிலையையும் அதன் mode மற்றும் உரிமையாளருடன் அச்சிடும்; இதன் மூலம் எந்த இடத்தில் தடை ஏற்படுகிறது என்பதைக் கண்டறியலாம்.
r அனுமதி இருந்து, x அனுமதி இல்லாத கோப்பகம் ஒரு விசித்திரமான நிலையாகும். ஒரு சாதாரண பயனர் கோப்புகளின் பெயர்களைப் பட்டியலிட முடியும், ஏனெனில் பட்டியலிடுவதற்கு r போதுமானது. ஆனால், எந்தவொரு கோப்பின் விவரங்களையும் (stat) அறிய முடியாது; எனவே ls -l கட்டளை அளவு மற்றும் mode நெடுவரிசைகளில் கேள்விக்குறிகளை இட்டு, ஒவ்வொன்றிற்கும் ls: cannot access ...: Permission denied என்று அச்சிடும்.
எழுத்துக்களை 755 ஆக மாற்றுதல்
ஒவ்வொரு தொகுப்பும் மூன்று பிட்கள் கொண்ட எண் ஆகும். r என்பது 4, w என்பது 2, x என்பது 1. செயல்பாட்டில் உள்ள பிட்களைக் கூட்டவும்.
rwxஎன்பது 4 + 2 + 1 = 7rw-என்பது 4 + 2 = 6r-xஎன்பது 4 + 1 = 5r--என்பது 4---என்பது 0
எனவே, drwxr-xr-x என்பது உரிமையாளருக்கு 7, குழுவிற்கு 5 மற்றும் பிறருக்கு 5 என அமையும்: 755. -rw-r--r-- என்பது 6, 4, 4: 644. drwxrwxr-x என்பது 7, 7, 5: 775, இது 755 உடன் குழுவிற்கு எழுதும் அனுமதியை (write) சேர்த்ததாகும். நீங்கள் ஒருபோதும் எழுத்துக்களைக் கையால் எண்ண வேண்டியதில்லை, ஏனெனில் stat இரண்டு வடிவங்களையும் ஒரே நேரத்தில் அச்சிடும்.
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt%A என்பது எழுத்து வடிவம், %a என்பது ஆக்டல் (octal) வடிவம், மேலும் %U மற்றும் %G ஆகியவை உரிமையாளர் பயனர் மற்றும் உரிமையாளர் குழுவின் பெயர்களைக் குறிக்கின்றன.
மக்கள் தேடும் permission strings
நிஜமான server-ல் நீங்கள் சந்திக்கும் modes, அவற்றின் octal மதிப்புகள் மற்றும் அவை எங்கு பயன்படுத்தப்படுகின்றன என்பது கீழே கொடுக்கப்பட்டுள்ளது.
-rw-r--r--என்பது 644. ஒரு service வாசிப்பதற்கு மட்டுமே பயன்படும் சாதாரண கோப்புகள், உதாரணமாக config file அல்லது HTML பக்கம்.-rw-------என்பது 600. ரகசியங்கள்: SSH private key, அல்லது ஒரு application-ன்.envகோப்பு.-rw-rw-r--என்பது 664. ஒரு குழுவால் பகிரப்படும் directory-ல் உள்ள கோப்பு; இதில் குழு உறுப்பினர்களுக்கு எழுதும் அனுமதி தேவைப்படும்.-rwxr-xr-xஎன்பது 755. Scripts மற்றும் binaries, உதாரணமாக/usr/local/bin/backup.shமற்றும்/usr/bin-ன் பெரும்பகுதி.-rwx------என்பது 700. உரிமையாளர் மட்டுமே இயக்கக்கூடிய ஒரு private script.drwxr-xr-xஎன்பது 755. பெரும்பாலான system directories மற்றும் ஒரு website-ன் document root.drwx------என்பது 700.~/.ssh, மற்றும் பாதுகாக்கப்பட்ட server-ல் உள்ள home directories.drwxrwxr-xஎன்பது 775. உரிமையாளரின் குழு எழுதக்கூடிய ஒரு directory.drwxrwsr-xஎன்பது 2775. இதுவும் அதேதான், கூடுதலாக setgid bit உள்ளது. இதனால் உள்ளே உருவாக்கப்படும் புதிய கோப்புகள் அந்த directory-ன் குழுவையே கொண்டிருக்கும்.drwxrwxrwtஎன்பது 1777./tmp. இறுதியில் உள்ளtஎன்பது sticky bit ஆகும். இதனால் ஒரு பயனர் தனது சொந்த கோப்புகளை மட்டுமே நீக்க முடியும்.-rwsr-xr-xஎன்பது 4755. இது ஒரு setuid binary; இது அதன் உரிமையாளரின் அனுமதியுடன் இயங்கும், உதாரணமாக/usr/bin/passwdமற்றும்/usr/bin/sudo.-rw-rw-rw-என்பது 666, மற்றும்drwxrwxrwxஎன்பது 777. இவை எவரும் எழுதக்கூடியவை (world writable). server-ல் இது பெரும்பாலும் தவறுதலான அமைப்பாகும்.lrwxrwxrwxஎன்பது அனைத்து symbolic link-களிலும் காட்டப்படும் மதிப்பு. Linux ஒரு link-ல் உள்ள mode bits-ஐக் கவனிக்காது, அதற்குப் பதிலாக இலக்கு கோப்பையே (target) சரிபார்க்கும். எனவே, இந்த string-க்கு எந்த அர்த்தமும் இல்லை.
உங்களுக்கு எந்த triad பொருந்தும்
தொடக்க நிலையில் உள்ளவர்கள் தவறு செய்யும் இரண்டாவது விதி இது. kernel சரியாக ஒரு triad-ஐ மட்டும் தேர்ந்தெடுத்து அங்கேயே நிறுத்திவிடும்.
உங்கள் user ID கோப்பின் உரிமையாளருடன் (owner) பொருந்தினால், உங்களுக்கு owner triad கிடைக்கும்; group மற்றும் other பிட்கள் கவனிக்கப்படாது. இல்லையெனில், கோப்பின் group உங்கள் குழுக்களில் ஒன்றாக இருந்தால், உங்களுக்கு group triad கிடைக்கும். இல்லையெனில், உங்களுக்கு other triad கிடைக்கும்.
இதிலிருந்து இரண்டு விஷயங்கள் தெளிவாகின்றன. owner triad மிகவும் கட்டுப்படுத்தப்பட்டதாக இருந்தாலும் அதுவே பொருந்தும். 0466 mode கொண்ட ஒரு கோப்பு, -r--rw-rw- என அச்சிடப்படும்போது, அதன் உரிமையாளருக்கு வாசிக்கும் உரிமை (read) மட்டுமே கிடைக்கும், ஆனால் மற்ற அனைவருக்கும் எழுதும் உரிமை (write) கிடைக்கும். ஏனெனில், உரிமையாளர் சரிபார்ப்பு முதலில் முடிந்துவிடுகிறது, அதற்குப் பிறகு எதுவும் வாசிக்கப்படுவதில்லை. இது சட்டப்பூர்வமானது, ஆனால் இதைப் பார்க்கும் எவருக்கும் முதலில் குழப்பத்தை ஏற்படுத்தும்.
group triad என்பது நீங்கள் சேர்ந்திருக்கும் குழுக்களின் பட்டியலால் அல்ல, அந்த கோப்பின் group-ஆல் தீர்மானிக்கப்படுகிறது. ls -l ஒவ்வொரு வரியிலும் இரண்டு பெயர்களை அச்சிடும்: உரிமையாளர், பிறகு group. அந்த இரண்டாவது group-க்கு மட்டுமே அந்த கோப்பின் மீது அதிகாரம் உண்டு. நீங்கள் இருபது குழுக்களில் உறுப்பினராக இருந்தாலும், அந்த கோப்பு அவற்றில் ஒன்றைக் கொண்டிருந்தால் மட்டுமே அது உதவும்.
id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txtid உங்கள் user மற்றும் நீங்கள் சேர்ந்திருக்கும் அனைத்து குழுக்களையும் அச்சிடும். stat கோப்பின் உரிமையாளர் மற்றும் group-ஐ அச்சிடும். இரண்டையும் ஒப்பிட்டுப் பார்த்தால், kernel உங்களுக்கு எந்த triad-ஐப் பயன்படுத்தும் என்பதை நீங்கள் தெரிந்துகொள்ளலாம்.
இதனால்தான் பகிரப்பட்ட directory-க்கு வழக்கமாக ஒரு group மற்றும் setgid பிட் வழங்கப்படுகிறது. sudo chmod 2775 /srv/shared என்பது drwxrwsr-x என அச்சிடப்படும். அப்போது உள்ளே உருவாக்கப்படும் கோப்புகள், உருவாக்கியவரின் தனிப்பட்ட group-க்கு பதிலாக அந்த directory-ன் group-ஐப் பெற்றுக்கொள்ளும். இதனால் அடுத்த நபரால் அந்த கோப்புகளைத் தொடர்ந்து எழுத முடியும். ஒவ்வொரு service-க்கும் தனித்தனி account வழங்குவது இந்த நடைமுறையின் மற்றொரு பகுதி, இது ஒரு VPS-ல் ஒவ்வொரு service-க்கும் ஒரு Linux user என்பதில் விளக்கப்பட்டுள்ளது.
umask ஒவ்வொரு புதிய கோப்பின் mode-ஐயும் தீர்மானிக்கிறது
ஒரு புதிய கோப்பு அதன் mode-ஐ உங்களிடமிருந்து பெறுவதில்லை. அதை உருவாக்கிய நிரலிடமிருந்து (program) அது பெறுகிறது, அதிலிருந்து உங்கள் umask நீக்கும் பிட்கள் கழிக்கப்படுகின்றன. umask என்பது நீக்கப்பட வேண்டிய பிட்களின் தொகுப்பாகும், எனவே பெரிய umask மதிப்பு அதிகத் தனித்தன்மை கொண்ட கோப்புகளை உருவாக்குகிறது.
பெரும்பாலான விநியோகங்கள் (distributions) 022-ஐ வழங்குகின்றன. ஒரு சாதாரண கோப்பை உருவாக்கும் நிரல் 0666-ஐக் கேட்கிறது. ஒரு கோப்பகத்தை (directory) உருவாக்கும் நிரல் 0777-ஐக் கேட்கிறது. umask இந்த இரண்டு கோரிக்கைகளிலிருந்தும் 022-ஐ நீக்குகிறது, எனவே உங்களுக்குக் கோப்புகளில் 644-ம், கோப்பகங்களில் 755-ம் கிடைக்கின்றன. புதிய VPS-ல் நீங்கள் காணும் அதே ஜோடி இதுதான்.
umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdirumask -S, 0022-ஐ விட எளிதாகப் படிக்கக்கூடிய வகையில் அதே மதிப்பை எழுத்துக்களாக அச்சிடுகிறது. மிகவும் கடுமையான இயல்புநிலைக்காக (stricter default) ~/.profile-ல் umask 027-ஐ அமைக்கவும்: கோப்புகளில் 640 மற்றும் கோப்பகங்களில் 750, இதன் மூலம் உங்கள் குழுவினர் உங்கள் வேலையைப் படிக்க முடியும், மற்றவர்கள் யாரும் பார்க்க முடியாது.
இரண்டு வரம்புகள் முக்கியமானவை. umask பிட்களை மட்டுமே நீக்க முடியும், அவற்றை ஒருபோதும் சேர்க்க முடியாது, இதனால்தான் நீங்கள் எதை அமைத்தாலும் புதிதாக உருவாக்கப்பட்ட கோப்பு ஒருபோதும் executable ஆக இருப்பதில்லை. மேலும், ஒரு systemd service உங்கள் shell profile-ஐ ஒருபோதும் வாசிப்பதில்லை, எனவே அந்த மதிப்பை unit file-லேயே அமைக்கவும்.
[Service]
UMask=0027இணைய கோப்புகள் 644 மற்றும் இணைய கோப்பகங்கள் 755 ஆக இருப்பதற்கான காரணம்
ஒரு இணைய சேவையகம் (web server) அதன் சொந்த கணக்கின் கீழ் இயங்குகிறது; Debian மற்றும் Ubuntu-வில் www-data, Rocky மற்றும் Alma-வில் nginx. அந்த செயல்முறை (process) தான் வழங்கும் கோப்புகளைப் படிக்கவும், அதற்கு மேலுள்ள கோப்பகங்களை (directories) கடந்து செல்லவும் (traverse) வேண்டும். கோப்புகளை எழுத அதற்கு எந்த காரணமும் இல்லை, ஒரு நிலையான (static) தளத்தில் அதை ஒருபோதும் அனுமதிக்கக்கூடாது.
கோப்பில் உள்ள 644, உரிமையாளருக்கு எழுதும் உரிமையையும் அனைவருக்கும் படிக்கும் உரிமையையும் வழங்குகிறது. எனவே, deploy பயனர் கோப்புகளை வெளியிட முடியும், இணைய பயனர் அவற்றை வழங்க முடியும். கோப்பகத்தில் உள்ள 755, உரிமையாளருக்கு எழுதும் உரிமையையும் அனைவருக்கும் கடந்து செல்லும் உரிமையையும் வழங்குகிறது. இதனால், இணைய பயனரால் எதையும் சேர்க்கவோ அல்லது நீக்கவோ முடியாமல், பாதையில் செல்ல மட்டும் முடியும். பயன்பாட்டில் (application) ஏதேனும் பிழை இருந்தாலும், அது தான் வழங்கும் பக்கங்களை மாற்றியமைக்க முடியாது.
இங்கேதான் கடந்து செல்லும் விதி (traverse rule) முக்கியமானது. தளம் /home/deploy/site-ல் இருந்து, /home/deploy என்பது 750 ஆக இருந்தால், இணைய பயனரால் home கோப்பகத்திற்குள் நுழைய முடியாது. கோரிக்கை HTTP 403 என முடிவடையும் மற்றும் /var/log/nginx/error.log-ல் இது போன்ற ஒரு வரி தோன்றும்:
open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5அந்த 13 என்பது EACCES, இது கர்னலின் அனுமதி மறுப்பு ஆகும். நெட்வொர்க்கில் எந்தப் பிரச்சினையும் இல்லை: போர்ட் (port) கேட்டுக்கொண்டிருக்கிறது (listening) மற்றும் கோரிக்கை வந்துவிட்டது. இதனால்தான் Linux-ல் listening ports எவ்வாறு செயல்படுகின்றன என்பதைப் பழகும்போது இது குழப்பத்தை ஏற்படுத்துகிறது. namei -l /home/deploy/site/index.html கட்டளையை இயக்கி, மற்றவர்களுக்கான x அனுமதி இல்லாத முதல் கோப்பகத்தைக் கண்டறிய வரிசையைப் பார்க்கவும்.
பயன்பாடு எழுதும் கோப்பகம், உதாரணமாக upload பாதை, இதற்கு விதிவிலக்காகும். அதற்கு அகலமான mode-ஐக் கொடுப்பதற்குப் பதிலாக உரிமையின் (ownership) மூலம் அனுமதி வழங்கவும்: sudo chown -R www-data:www-data /srv/site/uploads மற்றும் mode-ஐ 755-லேயே வைத்திருக்கவும். எழுதும் அனுமதி தேவைப்படும் அந்த ஒரு கோப்பகத்திற்கு மட்டும் அதை வழங்கவும்.
chmod, முழு கோப்பு முறைமையையும் (tree) பாதிக்காமல் பயன்படுத்துதல்
chmod இரண்டு வடிவங்களிலும் செயல்படும். Octal முறை அனைத்து ஒன்பது பிட்களையும் ஒரே நேரத்தில் அமைக்கும்: chmod 644 notes.txt. Symbolic முறை நீங்கள் குறிப்பிடும் மாற்றங்களை மட்டும் செய்யும், மற்றவற்றை மாற்றாது: chmod u+x deploy.sh உரிமையாளருக்கு execute அனுமதியைச் சேர்க்கும், chmod go-w notes.txt குழு மற்றும் பிற பயனர்களிடமிருந்து write அனுமதியை நீக்கும்.
Recursion பயன்படுத்தும்போது கோப்பு முறைமைகள் பாதிக்கப்பட வாய்ப்புள்ளது. chmod -R 755 . அனைத்து படங்கள் மற்றும் config கோப்புகளையும் executable ஆக மாற்றிவிடும், ஏனெனில் chmod ஒரு script-க்கும் JPEG கோப்பிற்கும் உள்ள வித்தியாசத்தை அறியாது. அதற்குப் பதிலாக பெரிய எழுத்து X-ஐப் பயன்படுத்தவும்.
chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txtபெரிய எழுத்து X, directories-க்கும் ஏற்கனவே execute பிட் கொண்ட கோப்புகளுக்கும் மட்டும் execute அனுமதியை வழங்கும். Directories 755 அனுமதியையும், சாதாரண கோப்புகள் 644 அனுமதியையும் பெறும்; ஏற்கனவே executable ஆக இருந்த scripts அப்படியே இருக்கும். ஒரு கோப்பின் அனுமதி உங்களுக்குத் தெரிந்தால், chmod --reference=good.sh other.sh மூலம் அதை மற்ற கோப்புகளுக்கு நகலெடுக்கலாம்.
பிட் தவறாக இருக்கும்போது நீங்கள் காணும் செய்திகள்
bash: ./deploy.sh: Permission denied என்பது, உங்களுக்குப் பொருந்தும் triad-ல் ஸ்கிரிப்ட்டிற்கு x பிட் இல்லை அல்லது அதன் பாதையில் உள்ள ஒரு கோப்பகத்திற்கு x இல்லை என்று பொருள். chmod u+x deploy.sh முதல் சிக்கலைச் சரிசெய்யும்.
bash: ./deploy.sh: cannot execute: required file not found என்பது குழப்பமான பெயரைக் கொண்ட ஒரு மாறுபட்ட பிழையாகும். x பிட் சரியாக உள்ளது, ஆனால் முதல் வரியில் குறிப்பிடப்பட்டுள்ள interpreter விடுபட்டுள்ளது. இதற்கு வழக்கமான காரணம் Windows line endings ஆகும்; எனவே kernel /bin/bash\r என்ற interpreter-ஐத் தேடுகிறது. இதை sed -i 's/\r$//' deploy.sh மூலம் சரிசெய்யவும்.
Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. என்பது SSH client-லிருந்து வருகிறது. பிற கணக்குகள் படிக்கக்கூடிய private key-ஐப் பயன்படுத்த அது மறுக்கிறது. Key-க்கு 600 மற்றும் ~/.ssh-க்கு 700 அனுமதி தேவை. Key கையாளுதல் குறித்த முழுமையான விவரங்கள் SSH keys மற்றும் அவற்றின் கோப்பு அனுமதிகளை நிர்வகித்தல் பகுதியில் உள்ளன.
Authentication refused: bad ownership or modes for directory /home/deploy/.ssh என்பது, ஒரு home directory அல்லது அதன் .ssh group writable-ஆக இருக்கும்போது server-ன் journal-ல் தோன்றும். sshd StrictModes அமைப்பு அந்த key-ஐ நிராகரிக்கிறது. client பக்கத்திலிருந்து பார்க்கும்போது, இது எந்த விளக்கமும் இன்றி எதிர்பாராத password prompt-ஆகத் தோன்றும்.
sudo: /etc/sudoers is world writable, அதைத் தொடர்ந்து sudo: no valid sudoers sources found, quitting வருவது, sudo தனது சொந்த config-ன் mode-ஐச் சரிபார்த்து இயங்க மறுத்துவிட்டது என்று பொருள். அந்தக் கோப்பு 0440 ஆக இருக்க வேண்டும். இது ஒரு பரந்த recursive chmod-ன் விளைவாக ஏற்படும் பொதுவான சிக்கலாகும். இது மேலே குறிப்பிட்ட sshd செய்தியுடன் சேர்ந்து வரலாம்; அவ்வாறு நிகழ்ந்தால், provider-ன் console மட்டுமே மீண்டும் உள்ளே நுழைய ஒரே வழியாகும்.
777 ஏன் ஒரு தீர்வு அல்ல
777 என்பது கணினியில் உள்ள அனைத்து கணக்குகளுக்கும், அந்த கணக்குகளின் கீழ் இயங்கும் அனைத்து செயல்முறைகளுக்கும் (processes) எழுதும் உரிமையை (write access) வழங்குகிறது. ஒரு சர்வரில் சேவைகள் (services) அந்தந்த பயனர்களின் கீழ் இயங்குவதால், ஒரு லேப்டாப்பை விட VPS-ல் "அனைவருக்கும்" (everyone) என்ற சொல் மிக விரிவான பாதிப்பை ஏற்படுத்துகிறது. சமரசம் செய்யப்பட்ட (compromised) ஒரு சேவை, 777 அனுமதி உள்ள எந்த இடத்திலும் கோப்புகளை எழுத முடியும்.
ஒரு web root-க்குள் இதன் பாதிப்பு நேரடியாக இருக்கும். சர்வர் வழங்கும் ஒரு கோப்பகம் (directory) அனைவருக்கும் எழுதும் உரிமை பெற்றிருந்தால், கோப்பு பதிவேற்றத்தில் (file upload) உள்ள குறைபாடு, ஒரு ஸ்கிரிப்டை அங்கு பதிவேற்றி அதை மீண்டும் இயக்குவதற்கு வழிவகுக்கும்.
உரிமையாளர் தொடர்பான சிக்கல்களுக்கு 777 என்பது பெரும்பாலும் தவறான தீர்வாகும். "இந்த கோப்பகத்தில் app-ஆல் எழுத முடியவில்லை" என்பதுதான் இதன் அறிகுறி. கோப்பகம் தவறான பயனருக்குச் சொந்தமாக இருப்பதே இதற்கான காரணம். sudo chown -R appuser:appuser /srv/app/storage மற்றும் 755 பயன்முறை (mode) இந்த சிக்கலைத் தீர்ப்பதோடு, மற்ற கணக்குகளின் அணுகலையும் தடுக்கிறது. எதையும் நிறுவும் முன்பே அந்த கணக்குகளை உருவாக்குவது புதிய VPS-ல் முதல் பத்து நிமிடங்கள் என்ற பகுதியில் அடங்கும்.
உலகளாவிய எழுதும் உரிமை (world write) ஒரு பொதுவான இடத்தில் மட்டுமே நியாயமானது, அது /tmp ஆகும், இது drwxrwxrwt என்று குறிப்பிடப்படுகிறது. இறுதியில் உள்ள t என்பது sticky bit ஆகும்: இந்த கோப்பகத்தில் அனைவரும் எழுத முடியும், ஆனால் ஒரு பயனர் தான் உருவாக்கிய கோப்புகளை மட்டுமே நீக்க முடியும். இந்த பிட் இல்லையென்றால், எந்தவொரு கணக்கும் மற்றொரு கணக்கின் தற்காலிக கோப்புகளை நீக்க முடியும்.
மாற்றங்களைச் செய்வதற்கு முன் ஒரு mode-ஐ வாசிக்கவும்
இந்தக் கட்டளைகள் நிலையை மட்டுமே வாசிப்பதால், இவற்றை எங்கு வேண்டுமானாலும் பாதுகாப்பாக இயக்கலாம்.
id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002find <path> -perm -0002 என்பது ஒரு path-ன் கீழ் உள்ள, world write bit அமைக்கப்பட்ட அனைத்து கோப்புகளையும் பட்டியலிடுகிறது. யாராவது chmod 777 மூலம் பழுதுபார்க்கும் பணிகளைச் செய்த பிறகு, ஒரு server-ஐ தணிக்கை செய்ய இதுவே மிக வேகமான வழியாகும்.
ஒரு குறிப்பிட்ட service account ஒரு directory-க்குள் நுழைய முடியுமா என்று சோதிக்க, அந்த account-ஆகவே கட்டளையை இயக்கவும். அந்த user-க்கு directory-க்குள் நுழையும் அனுமதி (traverse) இருந்தால் sudo -u www-data test -x /srv/site && echo yes || echo no கட்டளையானது yes என்று அச்சிடும், அனுமதி இல்லையெனில் no என்று அச்சிடும். root பயனர் மூலம் இதைச் சோதிப்பதில் அர்த்தமில்லை, ஏனெனில் root பயனர் இந்தச் சோதனைகளைத் தவிர்த்துவிடும், எனவே பதில் எப்போதும் yes என்றே இருக்கும்.
FAQ
Linux-ல் drwxr-xr-x என்பதன் பொருள் என்ன?
இது ஒரு directory ஆகும், இதை அதன் தொடக்கத்தில் உள்ள d குறிக்கிறது, மேலும் இதன் mode 755 ஆகும். உரிமையாளருக்கான பகுதி rwx, எனவே உரிமையாளருக்கு அதில் அனைத்து அனுமதிகளும் உண்டு. group பகுதி r-x மற்றும் பிற பயனர்களுக்கான பகுதி r-x ஆகும், எனவே மற்ற அனைவரும் உள்ளே உள்ள கோப்புகளைப் பட்டியலிடவும், directory-க்குள் நுழையவும் முடியும், ஆனால் உரிமையாளரைத் தவிர வேறு யாரும் எதையும் சேர்க்கவோ அல்லது நீக்கவோ முடியாது. எந்தவொரு path-ன் அனுமதியையும் stat -c '%A %a %U %G %n' <path> மூலம் உறுதிப்படுத்தலாம், இது அதன் எழுத்து வடிவம் மற்றும் octal வடிவத்தை அருகருகே காட்டும்.
இணையக் கோப்புகள் ஏன் 644 மற்றும் இணைய directory-கள் ஏன் 755 அனுமதியைக் கொண்டுள்ளன?
இணைய server, Ubuntu-வில் www-data என்ற கணக்கின் கீழ் இயங்குகிறது. அது வழங்கும் கோப்புகளைப் படிக்கவும், அதற்கு மேலுள்ள ஒவ்வொரு directory-க்குள்ளும் நுழையவும் அதற்கு அனுமதி தேவை, ஆனால் எதையும் எழுத வேண்டிய அவசியம் அதற்கு இல்லை. 644 என்பது உரிமையாளருக்கு எழுதும் உரிமையையும், மற்றவர்களுக்குப் படிக்கும் உரிமையையும் வழங்குகிறது. 755 என்பது உரிமையாளருக்கு எழுதும் உரிமையையும், மற்றவர்களுக்கு உள்ளே நுழையும் உரிமையையும் வழங்குகிறது. ஒரு application கண்டிப்பாக எழுத வேண்டிய directory-யை, அனைவருக்கும் அனுமதியை விரிவுபடுத்துவதற்குப் பதிலாக, chown மூலம் அந்த application-ன் பயனருக்கு வழங்க வேண்டும்.
x bit என்பது ஒரு directory-யை execute செய்ய முடியும் என்று அர்த்தமா?
இல்லை. ஒரு directory-க்கு x என்பது உள்ளே நுழைவதைக் குறிக்கிறது, அதாவது kernel ஒரு path-ஐத் தேடும்போது, அதற்குள் உள்ள ஒரு பெயரைத் தீர்மானிக்கும் உரிமை இது. cd-க்கு இது தேவை, மேலும் அதற்கு அடியில் உள்ள ஒரு கோப்பைத் திறப்பதற்கும் இது தேவை. அந்தப் பாதையில் உள்ள ஒவ்வொரு directory-க்கும் x தேவை, எனவே ஒரு கோப்பு 644 mode-ல் இருந்தாலும், அதற்கு மேலுள்ள directory-யில் உங்களுக்கு x இல்லையென்றால், அந்தக் கோப்பை அணுக முடியாது. namei -l /path/to/file அந்தப் பாதையில் உள்ள ஒவ்வொரு directory-ன் mode-ஐயும் காட்டும், இது தேடல் எங்கே நிற்கிறது என்பதைத் தெரிவிக்கும்.
chmod 777 என்பது எப்போதாவது சரியான தீர்வாகுமா?
server-ல் இது கிட்டத்தட்ட ஒருபோதும் சரியான தீர்வாகாது. இது கணினியில் உள்ள அனைத்து கணக்குகளுக்கும் எழுதும் உரிமையை வழங்குகிறது, இதில் services இயங்கும் கணக்குகளும் அடங்கும், எனவே ஒரு compromised service அந்தக் கோப்பை மாற்றியமைக்க முடியும். ஒரு application-ஆல் ஒரு directory-யில் எழுத முடியவில்லை என்றால், உண்மையான சிக்கல் பெரும்பாலும் ownership-ல் தான் இருக்கும்: sudo chown -R appuser:appuser /srv/app/storage மற்றும் 755 mode, application-க்குத் தேவையானதை வழங்கி மற்றவர்களைத் தவிர்க்கும். இதற்கு விதிவிலக்காக /tmp 1777 mode-ல் பயன்படுத்தப்படுகிறது, இது sticky bit காரணமாக பயனர்கள் ஒருவருக்கொருவர் கோப்புகளை நீக்குவதைத் தடுப்பதால் மட்டுமே செயல்படுகிறது.
ls கட்டளை அனுமதிகளுக்குப் பிறகு ஏன் ஒரு புள்ளி அல்லது கூட்டல் குறியீட்டைக் காட்டுகிறது?
அந்த பதினோராவது எழுத்து ஒன்பது அனுமதி பிட்களுக்கு அப்பாற்பட்ட விதிகளை விவரிக்கிறது. drwxr-xr-x.-ல் உள்ளது போல ஒரு புள்ளி இருந்தால், அது SELinux security context இணைக்கப்பட்டுள்ளதைக் குறிக்கிறது, இது Fedora மற்றும் Rocky-ல் இயல்பானது. drwxr-xr-x+-ல் உள்ளது போல ஒரு கூட்டல் குறியீடு இருந்தால், அது POSIX ACL (access control list) அமைக்கப்பட்டுள்ளதைக் குறிக்கிறது, எனவே சில பயனர்கள் அல்லது group-களுக்கு அந்த மூன்று triads-ல் காட்டப்படாத கூடுதல் உரிமைகள் உள்ளன என்று அர்த்தம். அந்த கூடுதல் உள்ளீடுகளைப் பட்டியலிட getfacl <path> கட்டளையை இயக்கவும்.