Inode та каталоги

З кожним файлом в ОС Unix пов'язана особлива структура даних - індексний дескриптор (inode ), що зберігає метаінформацію файлу (власник, права доступу тощо).

Індексні дескриптори у традиційній файловій системі (ФС) Unix об'єднувалися в послідовно нумерований масив, що й дало назву самій структурі (індексований node). Для зберігання масиву індексних дескрипторів у традиційній ФС на диску виділялася безперервна ділянка логічних блоків. Розмір цієї ділянки визначав максимальну кількість файлів, які могли бути створені у ФС. У сучасних ФС ця структура може мати різні розміри та набір полів або відсутні зовсім. Відповідно, класичні утиліти моніторингу ФС можуть видавати невірні дані про кількість зайнятих та вільних іноді ФС.

Індексний дескриптор можна розглядати у двох іпостасях:

У реалізації API доступу до ФС це стандартизована структура даних для узагальненого представлення атрибутів файлу. В оперативній пам'яті індексний дескриптор може бути представлений у віртуальному вигляді -vnode. Для ФС, що не зберігають індексні дескриптори,vnode створюється на основі інших відповідних джерел даних.

Номер індексного дескриптора унікальний у межах однієї ФС, однак, при монтуванні кількох ФС в одне дерево номери індексних дескрипторів повторюватимуться. Томуvnode зберігає номер індексного дескриптора плюс ідентифікатор ФС, в якій він знаходиться. Для дискових ФС у Linux номером ФС є число, складене з мажору та мінору блокового пристрою, на якому ФС розташована. Для NFS, схоже, номер ФС визначається порядком монтування та послідовно зростає починаючи з 1Ah.

Деревоподібну структуру файлової системи в Unix забезпечують каталоги, які зберігають таблицювідповідностей ІМ'Я->inode. У цій таблиці потрібна унікальність імен, але не унікальність номерів Inode. Завдяки цьому кожен об'єкт ФС може мати кілька імен. Лічильник імен зберігається в inode об'єкта.

каталоги мають одне "нормальне" ім'я в каталозі верхнього рівня, ім'я '.' у самому каталозі, та ім'я '..' у кожному з підкаталогів. У Linux інші імена для каталогу не можна створити. Порушення цього правила призвело до того, що в структурі файлової системи могли б утворитися цикли, а це порушило б роботу алгоритмів обходу дерева каталогів.

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

З кожним об'єктом ФС Unix пов'язані три мітки часу:

  • ctime – час модифікації атрибутів файлу (inode ). Змінюється при зміні прав доступу, власника або групи файлів та зміні вмісту файлу.
  • mtime – час останнього запису у файл.
  • atime – час останнього доступу до файлу. Залежно від опцій ФС може залишатися незмінним (оптимізація), змінюватися під час відкриття файлу, змінюватися кожні n-секунд доки файл залишається відкритим. Викликstat не змінюєatime.

Користувач може довільно змінитиmtime таatime, у тому числі на минулий або майбутній час (наприклад, touch -t 200012311800 time.txt ). При цьомуctime зміниться на момент виконання операції.

Мітка часу створення файлів у класичному Unix відсутня, що доситьнезручно для адміністраторів.

У конкретних реалізаціях ФС можуть бути інші мітки, але вони недоступні через стандартні функції API. Наприклад, у ex2fs є поле для зберігання часу видалення файлуdtime, а в Sun StorEdge QFS зберігається час створення файлуcreation time.

Права доступу на файли та каталоги

У Unix права доступу до об'єкта ФС зберігаються у бітовому полі індексного дескриптора (inode ). Шістнадцятирозрядне бітове поле, званеmode, включає чотири біти, що визначають тип об'єкта, три біти особливих ознак (suid,sgid,sticky ) та дев'ять біт прав доступу. Правила інтерпретації прапорівmode (особливоsuid,sgid,sticky ) та правила маніпуляції ними можуть відрізнятися в різних ОС. У цьому тексті описуються правила Linux.

Змінювати права доступу (записувати в inode) може власник файлу чи адміністратор. Члени групи файлу ніяких особливих прав на inode не мають. Користувач може відібрати власні права на читання і запис у файл, але право на запис в inode (в т.ч. право на зміну прав) зберігається у власника файлу за будь-яких обставин. Користувач не може передати право власності на файл іншому користувачеві та не може забрати право власності на файл іншого користувача.

При зміні власника або групи прапориsuid таsgid скидаються. Користувач не може встановити прапорsgid на власний файл, якщо файл належить до групи, до якої сам користувач не входить.

Під час створення файлу йому завжди призначається основна група власника. Надалі власник може призначити файлу групу, куди входить сам. Існує щонайменше два винятки з цих правил:

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

Права доступу включають право на читання (R__ead), запис (__W__rite) та виконання (e__X__ecute). Існує три набори прав __rwx для власника файлу (U__ser), групи файлу (__G__roup) та інших (__O__ther). Традиційно права записуються у вигляді рядка із трьох трійок __rwx. Трійки розташовані зліва направо у порядкуugo. Відсутнє право позначається прочерком. Набір прав також може бути представлений у вигляді тризначного восьмеричного числа, в якому відповідає наявності права, а 0 відсутності. Наприклад,rwxr-xr-- еквівалентно 7548. Утилітаstat дозволяє видати права доступу до файлу у вісімковому вигляді шляхом завдання формату%a. Наприклад, для каталогу/tmp встановлені всі права для всіх таsticky bit :

Права доступу перевіряються в момент виконання системних викликів, пов'язаних з доступом до файлів і каталогів, таких як creat(), open(), unlink(), exec(). З трьох наборів прав вибирається той, який найбільш точно характеризує користувача, який намагається отримати доступ до файлу. Права для власника перекривають йому права для групи та інших, для решти членів групи права для групи перекривають права для інших.

Права доступу до файлів

Для файлу праваrw перевіряються під час виконання виклику ядраopen(). При цьому права доступу звіряються з прапорами доступу, що передаютьсяopen. Правоx перевіряється у момент виконання викликуexec(). Для виконання двійкових файлів право начитання необов'язково. Захищені від читання файли, що виконуються, не можна запустити під налагоджувачем. Для скриптів запуск означає запуск програми інтерпретатора, яка отримує першим параметром ім'я файлу скрипта. У цьому випадку інтерпретатор повинен відкрити файл скрипту для читання і правоr необхідно.

Прапориsuid таsgid у поєднанні з правом на виконання змінюють ефективні права процесу в момент виконання програми з цього файлу викликомexec. Ефективні права відповідають власнику (групі власників) файлу. За наявності права виконанняsuid іsgid відображаються буквоюs у позиції прапора права виконання. Прапорsuid (sgid ) може бути призначений файлу, який не має прапора права на виконання для власника (групи). За відсутності права виконанняsuid іsgid відображаються буквоюS у позиції прапора права виконання. Прапорsuid без права виконання власником ні на що не впливає. Прапорsgid без права на виконання групою використовується як ознака примусового блокування файлу при виконанні системного викликуfcntl(fd, F_SETLK. ).

Прапорsticky bit не впливає на Linux на роботу з файлом. Більш того, системний викликchmod() мовчки ігнорує спроби встановити , не видаючи помилки, але і не виконуючи дії. У старих версіях Unixsticky bit у поєднанні з прапором прав на виконання вказував, що після завершення програми код повинен бути збережений в області свопу для швидкого повторного запуску.

Права доступу до каталогів

Каталог можна подати як таблицю, що містить багато записів, кожна з яких складається з двох полів: ім'я та номер індексного дескриптора. У цій моделі право на запис укаталог означає право створення та видалення записів, тобто. створення файлів у каталозі, створення нових імен для існуючих файлів (link ), видалення імен файлів (можливо разом із файлами) (unlink ). Для видалення файлу немає необхідності мати право на операції з файлом, достатньо мати право на запис до каталогу, в якому зберігається його останнє ім'я.

Право на читання означає для каталогу право на отримання списку імен (лівої колонки у нашій моделі), а право на виконання – доступ до номерів індексних дескрипторів (правої колонки). У нормі обидва права мають використовуватися одночасно. Якщо немає права на виконання, то той, хто має право на читання, отримає список імен файлів у каталозі, але не зможе ні дізнатися їх метадані (власник, розмір тощо), ні отримати доступ до даних. Якщо немає права на читання, стає неможливо дізнатися імена файлів у каталозі. Однак, якщо ім'я відомо з інших джерел, доступ до файлу можна отримати стандартним чином.

sticky біт використовується для каталогів, запис яких дозволено групі або іншим. Даний біт вказує на те, що створювати записи в каталозі може будь-хто, хто має право на запис, а видаляти тільки власник об'єкта, на який вказує запис або власник каталогу.sTicky біт позначається буквоюt у позиції права на виконання для інших, якщо саме право є, і буквоюT, якщо такого права немає.

Прапорsetgid, встановлений на каталог, призводить до того, що всі об'єкти, створювані в цьому каталозі, успадковують групу каталогу. Підкаталоги, що створюються, додатково успадковують сам бітsetgid.

Прапорsetuid, встановлений на каталог System V і Linux, ігнорується. В системах BSDsetuid, встановлений на каталог,діє аналогічноsetgid.

Традиційні права доступу, що зберігаються в поліmode, не дозволяють встановити права доступу з точністю до користувача або до групи. Скажімо, не можна розподілити права доступу так, щоб користувач user1 мав право лише на читання, user2 – тільки на запис, а user3 – тільки на виконання.

Для подолання таких обмежень сучасні реалізації Unix підтримують списки доступу (Access Lists) -ACL. Для зберігання списків доступу може резервуватися окремийinode, що дозволяє виділяти їм місце у області даних ФС, не створюючи у своїй окремого видимого файла.

Списки доступу складаються із записів, що містять тип запису (користувач, група, інші, маска), ідентифікатор користувача або групи, прапори прав на читання, запис та виконання. Права доступу, які уinode обов'язково дублюються трьома записами вACL - власник, група, інші. Маска визначає максимальні права, доступні черезACL. Якщо дати комусь праваrwx, а маска дорівнюєr--, то результатом буде правоr--. Дія маски не поширюється на власника файлу та інших.

Для індикації наявностіACL інформаційні утиліти додають символ+ після стандартного списку прав доступу