- •1.1. Поняття операційної системи, її призначення та функції
- •1.1.1. Поняття операційної системи
- •1.1.2. Призначення операційної системи
- •1.1.3. Операційна система як розширена машина
- •1.1.4. Операційна система як розподілювач ресурсів
- •1.2. Історія розвитку операційних систем
- •1.3. Класифікація сучасних операційних систем
- •1.4. Функціональні компоненти операційних систем
- •1.4.1. Керування процесами й потоками
- •1.4.2. Керування пам'яттю
- •1.4.3. Керування введенням-виведенням
- •1.4.4. Керування файлами та файлові системи
- •1.4.5. Мережна підтримка
- •1.4.6. Безпека даних
- •1.4.7. Інтерфейс користувача
- •2.1. Базові поняття архітектури операційних систем
- •2.1.1. Механізми і політика
- •2.1.2. Ядро системи. Привілейований режим і
- •2.2. Реалізація архітектури операційних систем
- •2.2.1. Монолітні системи
- •2.2.2. Багаторівневі системи
- •2.2.3. Системи з мікроядром
- •2.2.4. Концепція віртуальних машин
- •2.3.1. Взаємодія ос і апаратного забезпечення
- •2.3.2. Взаємодія ос і виконуваного програмного коду
- •2.4.1. Базова архітектура unix
- •2.4.2. Архітектура Linux
- •2.5. Особливості архітектури: Windows хр
- •2.5.1. Компоненти режиму ядра
- •2.5.2. Компоненти режиму користувача
- •2.5.3. Об'єктна архітектура Windows хр
- •3.1. Базові поняття процесів і потоків
- •3.1.1. Процеси і потоки в сучасних ос
- •3.1.2. Моделі процесів і потоків
- •3.1.3. Складові елементи процесів і потоків
- •3.2. Багатопотоковість та її реалізація
- •3.2.1. Поняття паралелізму
- •3.2.2. Види паралелізму
- •3.2.3. Переваги і недоліки багатопотоковості
- •3.2.4. Способи реалізації моделі потоків
- •3.3. Стани процесів і потоків
- •3.4. Опис процесів і потоків
- •3.4.1. Керуючі блоки процесів і потоків
- •3.4.2. Образи процесу і потоку
- •3.5. Перемикання контексту й обробка переривань
- •3.5.1. Організація перемикання контексту
- •3.5.2. Обробка переривань
- •3.6. Створення і завершення процесів і потоків
- •3.6.1.Створення процесів
- •3.6.2.Ієрархія процесів
- •3.6.3.Керування адресним простором під час створення процесів
- •3.6.4. Особливості завершення процесів
- •3.6.5. Синхронне й асинхронне виконання процесів
- •3.6.6. Створення і завершення потоків
- •4.1. Загальні принципи планування
- •4.1.1. Особливості виконання потоків
- •4.1.2. Механізми і політика планування
- •4.1.3. Застосовність принципів планування
- •4.2. Види планування
- •4.2.1. Довготермінове планування
- •4.2.2. Середньотермінове планування
- •4.2.3. Короткотермінове планування
- •4.3. Стратегії планування. Витісняльна і невитісняльна багатозадачність
- •4.4. Алгоритми планування
- •4.4.1. Планування за принципом fifo
- •4.4.2. Кругове планування
- •4.4.3. Планування із пріоритетами
- •4.4.4. Планування на підставі характеристик подальшого виконання
- •4.4.5. Багаторівневі черги зі зворотним зв'язком
- •4.4.6. Лотерейне планування
- •4.5. Реалізація планування в Linux
- •4.5.1. Планування процесів реального часу в ядрі
- •6.1. Види міжпроцесової взаємодії
- •6.1.1.Методи розподілюваної пам'яті
- •6.1.2.Методи передавання повідомлень
- •6.1.3.Технологія відображуваної пам'яті
- •6.1.4.Особливості міжпроцесової взаємодії
- •6.2. Базові механізми міжпроцесової взаємодії
- •6.2.1. Міжпроцесова взаємодія на базі спільної пам'яті
- •6.2.2. Основи передавання повідомлень
- •6.2.3. Технології передавання повідомлень
- •8.1. Основи технології віртуальної пам'яті
- •8.1.1. Поняття віртуальної пам'яті
- •8.1.2. Проблеми реалізації віртуальної пам'яті. Фрагментація пам'яті
- •8.1.4. Підхід базового і межового регістрів
- •8.2. Сегментація пам'яті
- •8.2.1. Особливості сегментації пам'яті
- •8.2.2. Реалізація сегментації в архітектурі іа-32
- •8.3. Сторінкова організація пам'яті
- •8.3.1. Базові принципи сторінкової організації пам'яті
- •8.3.2. Порівняльний аналіз сторінкової організації пам'яті та сегментації
- •8.3.3. Багаторівневі таблиці сторінок
- •8.3.4. Реалізація таблиць сторінок в архітектурі іа-32
- •8.3.5. Асоціативна пам'ять
- •8.4. Сторінково-сегментна організація пам'яті
- •8.5. Реалізація керування основною пам'яттю: Linux
- •8.5.1. Використання сегментації в Linux. Формування логічних адрес
- •8.5.2. Сторінкова адресація в Linux
- •8.5.3. Розташування ядра у фізичній пам'яті
- •8.5.4.Особливості адресації процесів і ядра
- •8.5.5.Використання асоціативної пам'яті
- •8.6. Реалізація керування основною пам'яттю: Windows хр
- •8.6.1.Сегментація у Windows хр
- •8.6.2.Сторінкова адресація у Windows хр
- •8.6.3.Особливості адресації процесів і ядра
- •8.6.4. Структура адресного простору процесів і ядра
- •11.1. Поняття файла і файлової системи
- •11.1.1. Поняття файла
- •11.1.2.Поняття файлової системи
- •11.1.3.Типи файлів
- •11.1.4. Імена файлів
- •11.2. Організація інформації у файловій системі
- •11.2.1. Розділи
- •11.2.2. Каталоги
- •11.2.3. Зв'язок розділів і структури каталогів
- •11.3. Зв'язки
- •11.3.1. Жорсткі зв'язки
- •11.3.2. Символічні зв'язки
- •11.4. Атрибути файлів
- •11.5. Операції над файлами і каталогами
- •11.5.1. Підходи до використання файлів процесами
- •12.1. Базові відомості про дискові пристрої
- •12.1.1. Принцип дії жорсткого диска
- •12.1.2. Ефективність операцій доступу до диска
- •12.2. Розміщення інформації у файлових системах
- •12.2.1. Фізична організація розділів на диску
- •12.2.2. Основні вимоги до фізичної організації файлових систем
- •12.2.3. Неперервне розміщення файлів
- •12.2.4. Розміщення файлів зв'язними списками
- •12.2.5. Індексоване розміщення файлів
- •12.2.6. Організація каталогів
- •15.1. Завдання підсистеми введення-виведення
- •15.1.1. Забезпечення ефективності доступу до пристроїв
- •15.1.2. Забезпечення спільного використання зовнішніх пристроїв
- •15.1.3. Універсальність інтерфейсу прикладного програмування
- •15.1.4. Універсальність інтерфейсу драйверів пристроїв
- •15.2. Організація підсистеми введення-виведення
- •15.2.1. Символьні, блокові та мережні драйвери пристроїв
- •15.2.2. Відокремлення механізму від політики за допомогою
- •15.3. Способи виконання операцій введення-виведення
- •15.3.1. Опитування пристроїв
- •15.3.2. Введення-виведення, кероване перериваннями
- •15.3.3. Прямий доступ до пам'яті
- •15.4. Підсистема введення-виведення ядра
- •15.4.1. Планування операцій введення-виведення
- •15.4.2. Буферизація
- •15.7. Керування введенням-виведенням: unix і Linux
- •15.7.1. Інтерфейс файлової системи
- •15.7.2. Передавання параметрів драйверу
- •15.7.3. Структура драйвера
- •15.7.4. Виконання операції введення-виведення для пристрою
- •15.8. Керування введенням-виведенням: Windows хр
- •15.8.1. Основні компоненти підсистеми введення-виведення
- •15.8.2. Виконання операції введення-виведення для пристрою
- •15.8.3. Передавання параметрів драйверу пристрою
- •17.1. Термінальне введення-виведення
- •17.1.1. Організація термінального введення-виведення
- •17.1.3. Термінальне введення-виведення у Win32 api
- •17.2. Командний інтерфейс користувача 17.2.1.
- •17.2.2. Переспрямування потоків введення-виведення
- •17.2.3. Використання каналів
- •17.3. Графічний інтерфейс користувача
- •17.3.1. Інтерфейс віконної та графічної підсистеми Windows хр
- •17.3.2. Система X Window
- •17.4. Процеси без взаємодії із користувачем
- •17.4.1. Фонові процеси на основі posix
- •17.4.2. Служби Windows хр
- •16.1. Загальні принципи мережної підтримки
- •16.1.1. Рівні мережної архітектури і мережні сервіси
- •16.1.2. Мережні протоколи
- •16.2. Реалізація стека протоколів Інтернету
- •16.2.1. Рівні мережної архітектури tcp/ip
- •16.2.2. Канальний рівень
- •16.2.3. Мережний рівень
- •16.2.4. Транспортний рівень
- •16.2.5. Передавання даних стеком протоколів Інтернету
- •16.3. Система імен dns
- •16.3.1. Загальна характеристика dns
- •16.3.2. Простір імен dns
- •16.3.3. Розподіл відповідальності
- •16.3.4. Отримання ір-адрес
- •16.3.5. Кешування ір-адрес
- •16.3.6. Типи dns-ресурсів
- •16.4. Програмний інтерфейс сокетів Берклі
- •16.4.1. Особливості роботи з адресами
- •16.4.2. Створення сокетів
- •16.4.3. Робота з потоковими сонетами
- •16.4.4. Введення-виведення з повідомленням
- •19.1. Загальні принципи завантаження ос
- •19.1.1. Апаратна ініціалізація комп'ютера
- •19.1.2. Завантажувач ос
- •19.1.3. Двоетапне завантаження
- •19.1.4. Завантаження та ініціалізація ядра
- •19.1.5. Завантаження компонентів системи
- •19.2. Завантаження Linux
- •19.2.1. Особливості завантажувача Linux
- •19.2.2. Ініціалізація ядра
- •19.2.3. Виконання процесу init
- •19.3. Завантаження Windows хр
- •20.1. Багатопроцесорні системи
- •20.1.1. Типи багатопроцесорних систем
- •20.1.2. Підтримка багатопроцесорності в операційних системах
- •20.1.3. Продуктивність багатопроцесорних систем
- •20.1.4. Планування у багатопроцесорних системах
- •20.1.5. Спорідненість процесора
- •20.1.6. Підтримка багатопроцесорності в Linux
- •20.1.7. Підтримка багатопроцесорності у Windows хр
- •20.2. Принципи розробки розподілених систем
- •20.2.1. Віддалені виклики процедур
- •20.2.2. Використання Sun rpc
- •20.2.3. Використання Microsoft rpc
- •20.2.4. Обробка помилок і координація в розподілених системах
- •20.3. Розподілені файлові системи
- •20.3.1. Організація розподілених файлових систем
- •20.3.2. Файлова система nfs
- •20.3.3. Файлова система Microsoft dfs
- •20.4. Сучасні архітектури розподілених систем
- •20.4.1. Кластеры системи
- •20.4.2. Grid-системи
- •18.1. Основні завдання забезпечення безпеки
- •18.2. Базові поняття криптографії
- •18.2.1. Поняття криптографічного алгоритму і протоколу
- •18.2.2. Криптосистеми з секретним ключем
- •18.2.3. Криптосистеми із відкритим ключем
- •18.2.4. Гібридні криптосистеми
- •18.2.5. Цифрові підписи
- •18.2.6. Сертифікати
- •18.3. Принципи аутентифікаціїі керування доступом
- •18.3.1. Основи аутентифікації
- •18.3.2. Основи керування доступом
- •18.4. Аутентифікація та керування доступом в unix
- •18.4.1. Облікові записи користувачів
- •18.4.2. Аутентифікація
- •18.4.3. Керування доступом
- •18.5. Аутентифікація і керування доступом у Windows xp
- •18.5.1. Загальна архітектура безпеки
- •18.5.2. Аутентифікація
- •18.5.3. Керування доступом
- •18.6. Аудит
- •18.6.1. Загальні принципи організації аудиту
- •18.6.2. Робота із системним журналом unix
- •18.6.3. Журнал подій Windows xp
- •18.7. Локальна безпека даних
- •18.7.1. Принципи шифрування даних на файлових системах
- •18.7.2. Підтримка шифрувальних файлових систем у Linux
- •18.7.3. Шифрувальна файлова система Windows xp
- •18.8. Мережна безпека даних
- •18.8.1. Шифрування каналів зв'язку
- •18.8.2. Захист інформації на мережному рівні
- •18.8.3. Захист інформації на транспортному рівні
- •18.9. Атаки і боротьба з ними
- •18.9.1. Переповнення буфера
- •18.9.2. Відмова від обслуговування
- •18.9.3. Квоти дискового простору
- •18.9.4. Зміна кореневого каталогу застосування
18.5.3. Керування доступом
Під час створення будь-якого об'єкта Windows XP1 який може бути використаний більш як одним процесом (включаючи файли, поіменовані канали, синхронізаційні об'єкти тощо), йому присвоюють дескриптор захисту (security descriptor). До найважливіших елементів дескриптора захисту належать:
♦ SID власника об'єкта (власник завжди може змінювати атрибутибезпеки об'єкта, навіть якщо в нього немає прав на доступ до його даних);
♦ список контролю доступу (ACL), що визначає права доступу до об'єкта. Кожний елемент списку контролю доступу (ACE) містить такі елементи:
♦ тип ACE (виділяють, зокрема, дозволяючі і забороняючі АСЕ);
♦ ідентифікатор безпеки (SID);
♦ набір прав доступу (читання, записування, повний контроль тощо).
Сума прав доступу, наданих окремими АСЕ, формує загальний набір прав доступу, наданих ACL.
Розглянемо спрощений приклад ACL для файлового об'єкта (рис. 18.2).
Якщо файловий об'єкт володіє таким ACL, користувач може чигати з відповідного файла, коли:
♦ під час пошуку в ACL файлового об'єкта знайдено АСЕ, що містить SID цього користувача або однієї із груп, куди він входить;
♦ цей ACE дозволяє доступ;
♦ у ньому є право на читання даних.
Щоб визначити , який ACL має призначатися новому об’єкту , система захисту застосовує три правила в такому порядку.
новому об'єкту, система захисту застосовує три правила в такому порядку.
1. Якщо ACL явно задано під час створення об'єкта, то система захисту присвоює його об'єкту.
2. Якщо ACL не задано, і в об'єкта є ім'я, система захисту шукає ACL каталогу об'єктів, де збережеться ім'я цього об'єкта (для файла таким каталогом буде каталог файлової системи). Деякі ACE каталогу можуть бути позначені як «успадковувані». Це означає, що вони присвоюються новим об'єктам, створеним у цьому каталозі. Якщо такі успадковувані ACE є, із них складають ACL, що призначають новому об'єкту.
3. Якщо жоден із перших двох випадків не стався, об'єкту присвоюють ACL за замовчуванням із маркера доступу процесу, що робив виклик.
Використання списків контролю доступу
Коли потік намагається відкрити дескриптор об'єкта, диспетчер об'єктів і підсистема захисту зіставляють інформацію із маркера доступу відповідного процесу (що визначає власника процесу) і дескриптора захисту об'єкта (що визначає користувачів, які можуть мати доступ до об'єкта), щоб встановити, чи можна надати потоку запитаний дескриптор.
Подивимося, що відбувається, коли потік, запущений користувачем stud (що входить у групу Students), відкриває файл для читання, викликавши функцію
CreateFile("myfile.txt". GENERIC_READ. ...);
У цьому разі підсистема безпеки переглядає список контролю доступу для файла myfile.txt, починаючи з першого АСЕ. Якщо під час перегляду в одному з ACE цього списку виявляють SID потоку, що робив виклик (узятий із його маркера доступу, в нашому випадку це буде SID для stud), або його групи, перегляд зупиняють і перевіряють, чи дозволяє цей ACE доступ для читання. Коли так, пошук зупиняють, і CreateFile() повертає дескриптор файла. Якщо SID користувача або групи не знайдено (або знайдено в ACE із забороняючим доступом), CreateFile() поверне помилку.
Елементи, що забороняють доступ, поміщають у початок ACL. Інакше виникла б можлива ситуація, коли дозволяючий ACE з SID-групи, куди входить користувач, перебував перед забороняючим ACE з SID власне цього користувача, внаслідок чого той отримував би доступ до об'єкта, незважаючи на явну заборону.
Якщо ACL для дескриптора безпеки заданий, але не містить жодного елемента, ніхто із користувачів системи не має прав на роботу із цим об'єктом. Якщо ж ACL не заданий (дорівнює NULL), це означає, що будь-який користувач може виконувати будь-які дії з об'єктом. Це становить загрозу безпеці системи, оскільки за такої ситуації зловмисник може змінити права на цей об'єкт, наприкладзакрити його для читання від усіх, вивівши цим із ладу застосування, що його використовують.
Задання прав доступу під час створення файла
Система прав доступу в OC лінії Windows XP досить складна для розуміння і використання. Далі розглянемо простий приклад задання прав доступу для читання і записування під час створення файла [32, 50].
Ha першому етапі необхідно отримати доступ до SID1 які заносяться у список контролю доступу. Для цього можна використати функцію LookupAccountName().
Далі потрібно розмістити у пам'яті та проініціалізувати список контролю доступу. Для цього треба розрахувати обсяг пам'яті, необхідний для його зберігання, і виділити пам'ять у динамічній ділянці. Цей обсяг отримують додаванням розмірів усіх ACE (що включають розміри АСЕ-структури і SID) і розміру ACL. Розмір SID повертає функція GetLengthSid():
// PSIDivanov_sid; LookupAccountName("ivanov". ... ivanov_sid, ...);
// два дозволяючих ACE - для читання і записування
DWORD acl_size - 2 * (GetLengthSid(ivanov_sid) +
sizeof(ACCESS_ALLOWED_ACE)) + sizeof(ACL) ;
PACL pacl - (PACL)HeapAlloc(GetProcessHeap(). 0. acl_size);
Після виділення пам'яті її треба проініціалізувати за допомогою функції Ini-tia1izeAcl(). Першим параметром вона приймає покажчик на виділену пам'ять, другим - її обсяг у байтах
InitializeAcl(pacl. acl_size. ACLREVISION);
Кожний елемент контролю доступу потрібно додати в ACL. Для створення і додавання в ACL дозволяючих елементів використовують функцію AccessAl 1 owedAce(), заборонних-AccessDeniedAce():
BOOL AddAccessAllowedAce(PACL pacl. DWORD rev. DWORD amask. PSID pSid):
де: pacl - покажчик на ACL;
amask - маска прапорців прав доступу (GENERIC_READ, GENERIC_WRITE тощо, повні права задають як GENERIC_ALL);
psid - покажчик на SID, для якого цей елемент задає права. Ось приклад використання цих двох функцій:
// доступ для читання
AddAccessAllowedAce(pacl. ACL_REVISI0N. GENERIC_READ. ivanov_sid);
// доступ для записування
AddAccessAllowedAce(pacl. ACLREVISION. GENERIC_WRITE. ivanov_sid);
Ha цьому етапі потрібний ACL повністю сформовано. Тепер необхідно сформувати дескриптор безпеки. Для цього слід розмістити у пам'яті структуру типу SECURITY_ DESCRIPTOR і проініціалізувати її за допомогою функцїї InitializeSecuntyDescriptor():ї
SECURITYDESCRIPTOR sd;
InitializeSecurityDescriptor(&sd. SECURITY_DESCRIPTOR_REVISION):
Далі в цю структуру додають ACL за допомогою функції SetSecurityDescrip-torDacl():
B00L SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR psd.
B00L dacl_present. PACL pdacl. B00L dacl_from_default);
де: psd - покажчик на дескриптор безпеки, для якого задають ACL;
dacl_present - TRUE, якщо ACL задають, FALSE - якщо очищують;
pdacl - покажчик на ACL.
Наведемо код, який додає ACL у дескриптор безпеки.
SetSecurityDescriptorDacl(&sd. TRUE. pacl. FALSE);
Після створення дескриптора безпеки його потрібно передати у функцію створення файла. Як уже було видно, у цю функцію (і в багато інших) як параметр передають покажчик на структуру SECURITY_ATTRIBuTES. Покажчик на дескриптор безпеки задано як поле 1 pSecuri tyDescri ptor цієї структури.
SECURITY_ATTRIBUTES sa = { 0 }:
sa.nLength = sizeof(sa) :
sa.lpSecurityDescriptor = &sd;
HANDLE hf = CreateFile("f:Wtest.txt". GENERIC_READ | GENERIC_WRITE. 0.
&sa. CREATE_ALWAYS. FILE_ATTRIBUTE_N0RMAL. NULL):
Після завершення роботи потрібно вивільнити пам'ять, виділену для структур ACL і SID, а також закрити дескриптор файла:
HeapFree(GetProcessHeap(). 0. pacl);
FreeSid(і vanov_sid);
CloseHandle(hf);