Робота з розмежуванням прав доступу до файлів у GNU/Linux.

Clement Lefebvre, April 5, 2006

Original text http://www.linuxforums.org/security/file_permissions.html

Вступ

У GNU/Linux доступ до файлів обмежений. Користувачу необов'язково мати однакові права на редагування, виконання і читання. Фактично кожен файл має інформацію про те хто є його власником, його дозволи (або права, від англійської permisions) та іншу інформацію, що визначає кому і що саме можна робити з файлом.

Зауваження: у GNU/Linux звернення до будь якого об'єкту відбувається як до файлу. Як наслідок, директорії мають точнісінько такий самий набір властивостей та дозволів як і звичайний файл.

Розуміння прав доступу до файлів.

У GNU/Linux кожен користувач має свій власний обліковий запис і є членом однієї чи декількох груп. Одночасно з цим кожен файл у системі належить якомусь користувачу а також користувацькій групі. За для розмежування доступу GNU/Linux (та й будь який Unix взагалі) визначає три типи прав:

  • На читання (позначається символом "r" Read), що означає що файл може бути прочитаний;
  • На запис (позначається символом "w" Write), що означає що файл може бути змінено;
  • На виконання (позначається символом "x" eXecute), що означає що файл може бути виконано, або якщо це директорія, що у ній виконувати пошук.

Зауваження: у Unix системах виконання файлу визначається не розширенням, як у системах DOS/Windows, а спеціальним атрибутом.

Для кожного файлу усі три права (читання, запису та виконання) надаються для трьох типів користувачів:

  • Користувач або Власник - позначається символом "u" (User), той хто володіє файлом;
  • Група — позначається символом "g" (Group), і уособлює всіх користувачів що належать до групи до якої належить файл (адже файл належить як і групі і користувачеві одночасно).
  • Інші — позначається символом "o" (Others), і уособлює всіх користувачів, що не є ні членами вказаної групи, ні власниками файлу.

Наприклад, якщо файл належить користувачу Джордж (власнику) та групі administrators (групі), то можна визначити різні права на читання, зміну та виконання для Джорджа, користувачів групи "administrators" та усіх інших користувачів.

Перегляд прав доступу: ls -l

Уся інформація, що відноситься до прав доступу файлу зберігається як атрибути файла, тобто становить з ним одне ціле, і може бути переглянута за допомогою команди "ls -l":

ls -l myfile
-rwxr-x---  1 george administrators 10 2006-03-09 21:31 myfile

Як ви бачите з цього прикладу, команда "ls -l" дає досить багато інформації про "myfile":

  • його ім'я, "myfile";
  • його дозволи, "-rwxr-x---";
  • його власника, "george";
  • його групу "administrators";
  • та іншу інформацію, що наразі не відноситься до цієї статті.

Те яким чином показані дозволи може дещо заплутати, якщо ви початківець у GNU/Linux або Unix. Але не засмучуйтесь, це дуже просто. Перший символ просто показує якого типу файл. Типи, які позначаються цим символом зазначені нище:

Символ Опис
"-" звичайний файл
"d" директорія
"l" символьне посилання
"s" сокет
"p" іменований потік (named pipe)
"c" символьний пристрій (небуферизований)
"b" блочний пристій (буферизований)

У нашому випадку myfile є звичайним файлом.

Тепер давайте роздивимось інші дев'ять символів "rwxr-x---".

Перші три символи вказують, чи дозволено читання, зміна чи виконання для власника цього файлу (у нашому випадку george). Якщо так, то відповідні символи (r, w або x) будуть відображені, інакше вони будуть замінені знаками "-". Так само наступні три символи вказують чи дозволені ці дії для користувачів групи (у нашому випадку administrators). Зрештою останні три символи вказують дозволи для усіх інших користувачів (у нашому випадку для усіх хто не входить до групи administrators).

Отже для нашого випадку набір дозволів файлу myfile "rwxr-x---" означає, що george має права виконувати всі три операції над цим файлом (читати, змінювати та виконувати), користувачі групи administrators можуть тільки читати (r) або виконувати (x) цей файл але не змінювати, а всі інші користувачі з цим файлом не можуть робити ніяких операцій.

Ви можете уявити, що цей файл був написаний користувачем george як скрипт, призначений для адміністраторів, але має бути недоступний для звичайних користувачів... Але це тільки приклад, не будемо занадто на ньому зосереджуватись. Головне, що тепер ви розумієте концепцію дозволів та знаєте як передивитися їх командою "ls -l". Наступний крок це навчитися змінювати їх.

Зміна дозволів: chmod

Ви можете змінювати дозволи своїх файлів (або чужих, якщо ви увійшли до системи як суперкористувач root) за допомогою команди "chmod". Синтаксис цієї команди дуже простий. Наприклад george вирішив надати адміністраторам право на зміну файлу, він вводить команду:

chmod g+w myfile

де g вказує що змінюються дозволи групи, w вказує на дозвіл на зміну файлу а "+" вказує що зазначений дозвіл треба додати.

Якщо Georg тепер подивиться на дозволи файлу командою "ls -l" то він побачить таке:

ls -l myfile
-rwxrwx---  1 george administrators 10 2006-03-09 21:31 myfile

Як ми бачимо, тепер адміністратори мають право запису до цього файлу та дозвіл вносити зміни у його зміст.

Команда "chmod" приймає 4 параметри:

  • для кого призначений даний дозвіл ("u" - для власника, "g" - для групи, "o" - для всіх інших, з них можна утворювати комбінації або вказати "a" для усіх трьох)
  • дія, що виконується над дозволом ("+" - додати, "-" - прибрати та "=" - встановити)
  • власне сам дозвіл (r для читання, w для запису та x для виконання)
  • файл або група файлів, до яких впроваджуються дозволи (файли вказуються ім'ям а декілька фалів маскою на кшталт myfile.* для файлів myfile.txt, myfile.so та myfile.sh)

Давайте розглянемо декілька прикладів:

  • chmod o+r myfile - додати дозвіл на читання файлу myfile для усіх інших користувачів;
  • chmod ug+rx myfile - додати дозвіл на читання (r) та виконання (x) для власника та групи;
  • chmod a-rwx myfile - прибрати всі права для всіх користувачів системи, включаючи власника;
  • chmod a=rw *.txt - встановити дозволи на читання та запис (але прибрати право виконання) для всіх користувачів системи на файли, що закінчуються на ".txt".

Вісімкові дозволи

Команда chmod також має інший синтаксис, що досить популярний серед системних адміністраторів, це запис у вісімковій системі. Замість використання символів u, g, o, a, r, w та x ви можете скористатися... вісімковим числом. Головна перевага такого запису це те що скориставшись одного разу ви зрозумієте, це швидше, ви встановлюєте повний набір дозволів файлу одночасно (для власника, групи та інших). Більше того, таке встановлення дозволів, замість додавання та видалення, не дасть вам випадково чогось пропустити. Ось як працюють вісімкові числа:

Козному дозволу відповідає значення:

дозвіл значення
- 0
x 1
w 2
r 4

Якщо вам потрібна комбінація дозволів, то значення додаються. Тобто дозволи можуть приймати значення від 0 (не дано жодного дозволу) до 7 (дозвіл на будьякі дії):

дозволи значення
--- 0
--x 1
-w- 2
-wx 3
r-- 4
r-x 5
rw- 6
rwx 7

Врешті, значення задаються для кожного типу користувачів (власника, групи та інших) та ці три цифри (від 0 до 7) подаються разом у вигляді вісімкового числа. Це число ви і можете використовувати у команді "chmod".

Наприклад:

chmod 750 myfile

750 означає 7 (rwx) для власника, 5 (r-x) для групи та 0 (---) для інших. Як результат будемо мати дозволи "rwxr-x---". Ця команда еквівалентна до такого:

chmod u=rwx,g=rx myfile
chmod o-rwx myfile

Числом коротше, чи не так? Ось ще декілька часто використовуваних прикладів:

chmod 755 myfile : rwxr-xr-x, усі права для власника, всі інші можуть тільки читати та виконувати;

chmod 644 myfile : rw-r--r--, власник може читати та змінювати, всі інші тільки читати;

chmod 777 myfile : у деяких випадках це погана практика, повний доступ усім.

Зміна власника та групи файлу: команди chown та chgrp

Ви можете передати ваш файл у власність іншому користувачеві, або змінити групу, якій цей файл належить, використовуючи команди відповідно chown та chgrp.

Як приклад, якщо Джордж вирішив віддати файл myfile Роберту, він просто набирає команду:

chown robert myfile

Або якщо пізніше Роберт вирішить зробити цей файл доступним лише користувачам групи senioradmin замість administrators, він дає команду:

chgrp senioradmin myfile

Примітка: команда chown також може змінювати і групу файлу, насправді, Джордж може безпосередньо це зробити командою:

chown robert:senioradmin myfile

Встановлення "липкого" (sticky) біта для директорії: chmod +t

Якщо ви поглянете на дозволи директорії /tmp то на більшості Unix системах (включаючи Linux) ви побачите таке:

clem@pluto:~$ ls -l / | grep tmp
drwxrwxrwt   20 root root 20480 Кві 15 23:46 tmp

Закінчення "t" дозволів називається "липкий біт" (sticky bit). Він займає місце останнього "x" та означає що у цій директорії файли можуть бути видалені тільки їхнім власником, власником директорії або суперкористувачем "root". Таким чином щоб видалити файл з такої директорії не достатньо мати дозвіл на запис, треба ще й бути власником цього файлу.

Щоб встановити або скинути "липкий біт" використовуйте такі команди:

chmod +t tmp
chmod -t tmp

Встановлення SGID атрибуту на директорії: chmod g+s

Якщо SGID (Set Group Identification: встановити ідентифікацію групи) атрибут встановлено на директорії, то файли створені у цій директорії будуть належати тій же самій групі, що й директорія, не залежно від групи користувача, що створює файл. Якщо ж SGID не встановлено, то файли будуть належати групі користувача, що створює файл.

Щоб встановити або скинути SGID на директорії використовуйте наступні команди:

chmod g+s directory
chmod g-s directory

Коли атрибут SGID встановлено, то це буде відображатися символом "s", що замінить "x" у дозволах групи:

ls -l directory
drwxrwsr-x  10 george administrators  4096 2006-03-10 12:50 directory

Встановлення SUID та SGID атрибутів для виконуваних файлів: chmod u+s, chmod g+s

Попередження: Використання атрибутів SUID та SGID може бути небезпечним! Уявіть що у вас є файл який потребує для виконання прав суперкористувача root (наприклад для доступу до паралельного порту), та ви надали якомусь користувачеві право на зміну цього файлу. Тоді цей користувач може відредагувати цей файл так, що зможе виконати будь яку команду системи з правами власника (тобто root) та, наприклад, видалити системні файли та знищити систему в цілому. Ніколи не використовуйте SGID та SUID атрибути якщо ви не можете передбачити усі наслідки такої дії або якщо без них можна обійтись.

За звичай коли користувач виконує якийсь файл, то процес, що виникає під час виконання має ті ж самі права що й користувач, що його запускає. Фактично процес наслідує усі його права.

Але якщо ви встановите SUID атрибут на виконуваний файл то процес що буде запущений буде мати права не того користувача, що запустив файл, а того хто володіє файлом.

Наприклад ми маємо скрипт myscript.sh, що намагається записувати у файл mylog.log:

ls -l 
-rwxrwx--x 10 george administrators 4096 2006-03-10 12:50 myscript.sh
-rwxrwx--- 10 george administrators 4096 2006-03-10 12:50 mylog.log

Як бачимо Джордж дає дозвіл на виконання скрипту усім користувачам системи, не дає дозволу читати або змінювати лог файл користувачам, що не належать групі administrators, тобто він хоче щоб лог файл був змінений тільки програмою myscript.sh. Коли Роберт виконує myscript.sh, то процес переймає його права та групу (robert:senioradmin). Як наслідок myscript.sh видасть помилку, бо не зможе записати у файл логу.

Щоб виправити ситуацію Джордж може дати дозвіл на запис у файл логу усім користувачам, але тоді не буде гарантії того що цей файл буде змінено тільки програмою myscript.sh а не вручну якимось користувачем. Для цього треба встановити SUID атрибут на файл myscript.sh:

chmod u+s myscript.sh

Як наслідок, коли користувач запустить скрипт, то процес буде використовувати права Джорджа, як власника скрипта, замість прав користувача що запускає. Це вирішує проблему запису до логу у нашому прикладі, коли ніхто не має права записувати у лог файл але будьхто має право виконати скрипт що пише у лог.

Подібним чином встановлюється і SGID атрибут, що дає можливість процесу, що виконує файл перейняти права групи власника файлу замість користувача, що запустив файл. Встановити SGID атрибут можна так:

chmod g+s myscript.sh

Встановлюючи SUID та SGID атрибути власник файлу надає можливість користувачам, що запускають файл на виконання, виконувати його так якби його запускав власник файлу.

Коли атрибути SUID або SGID встановлено, то це буде відображатися символом "s", що замінить "x" у дозволах власника або групи відповідно:

chmod u+s myscript.sh
ls -l
-rwsrwxrwx  10 george administrators  4096 2006-03-10 12:50 myscript.sh
chmod u-s myscript.sh
chmod g+s myscript.sh
ls -l
-rwxrwsrwx  10 george administrators  4096 2006-03-10 12:50 myscript.sh

Встановлення типових дозволів для новостворених файлів: umask

Коли створюється новий файл, йому встановлюються дозволи відповідно до значення umask. Ці значення зазвичай встановлюються у файлі /etc/profile для всіх користувачів та можуть бути переглянуті командою:

umask

На більшості Unix систем, umask має типове значення 0022. Це вісімкове число, що вказує які дозволи треба прибрати для усіх нових файлів. Наприклад, 0022 вказує що дозвіл на запис файлу буде знято для групи та інших користувачів.

За звичай, коли umask має значення 0000, нові файли здобувають дозволи 666 (-rw-rw-rw-) а директорії 777 (drwxrwxrwx). Як наслідок, зі значенням umask 0022, нові файли будуть мати дозволи 644 або -rw-r--r-- (666 - 022 = 644) а директорії 755 або drwxr-xr-x (777 - 022 = 755).

Для того щоб змінити значення umask просто дайте команді umask вісімкове число як аргумент. Наприклад, якщо ви хочете щоб усі ваші нові директорії мали дозволи rwxr-xr--- а файли rw-r----- (750 та 640 відповідно), вам треба використати значення umask що видалить усі дозволи для інших та дозвіл на запис для групи: 027. Команда буде виглядати так:

umask 027

Сподіваюсь ця коротка стаття буде корисна для вас.