- •Введення
- •1. Структура та обсяг дисципліни
- •2. Основи програмування на мові с
- •2.1 Найпростіші конструкції мови
- •2.2 Типи даних
- •2.4 Операції мови с
- •2.5 Структура простої с програми
- •2.6 Організація введення-виведення
- •2.7 Компіляція в системі Linux
- •2.8 Організація розгалужень в програмі
- •2.9 Організація циклів
- •2.10 Оператор break
- •2.11 Оператор continue
- •2.11 Масиви
- •2.12 Функції
- •2.13 Вызов функции с переменным числом параметров
- •2.14 Рекурсивні функції
- •2.15 Читання і запис текстових файлів
- •2.16 Структури даних
- •2.17 Перелік|перерахування| (enumeration)
- •2.18 Об'єднання (union)
- •3. Операційні системи і системне програмування
- •3.1. Поняття операційної системи
- •4. Корисні команди Linux
- •4.1. Загальні|спільні| команди
- •4.1.1. Команда arch – виведення архітектури комп'ютера
- •4.1.2. Команда clear – очищення екрану
- •4.1.3. Команда date
- •4.1.9. Команда uptime – інформація про роботу системи
- •4.1.10. Команда users – інформація про користувачів
- •4.1.11. Команди w, who і whoami інформація про користувачів
- •4.1.12. Команда xf8config – настройка графічної підсистеми
- •4.2. Команди для роботи з текстом
- •4.2.1. Команди diff і cmp
- •4.2.2. Команди grep і egrep – текстовий фільтр
- •4.2.3. Команди more и less – посторінкове виведення
- •4.2.4. Команди head і tail – виведення начала і хвоста файлу
- •4.2.5. Команда wc – підрахунок слів у файлі
- •5. Захист інформації в інформаційних системах
- •5.1 Основні завдання забезпечення безпеки
- •5.2 Базові поняття криптографії
- •5.2.1 Поняття криптографічного алгоритму і протоколу
- •5.2.2 Криптосистеми з секретним ключем
- •5.2.3 Криптосистеми із відкритим ключем
- •5.2.4. Гибридні криптосистеми
- •5.2.5. Цифрові підписи
- •5.2.6. Сертифікати
- •5.3. Принципи аутентифіекації і керування доступом
- •5.3.1. Основи аутентифікації
- •5.3.2. Основи керування доступом
- •5.4. Аутентифікація та керування доступом в unix
- •5.4.1. Облікові записи користувачів
- •5.4.2. Аутентифікація
- •5.4.3. Керування доступом
- •6. Програмний інтерфейс unix. Системні виклики і функції стандартних бібліотек
- •6.1. Підтримка програмування в oc unix. Вивчення передачі інформації
- •6.2. Змінні оточення
- •6.3. Обробка помилок
- •6.4. Правила формування і засоби розбору командних рядків
- •7. Операції над файлами
- •7.1 Файлові операції posix
- •7.2. Збирання інформації про атрибути файла
- •7.3. Операції над каталогами
- •Література
5.4.2. Аутентифікація
Для стандартної аутентифікації UNIX використовують підхід із використанням односторонньої функції від пароля і солі. Такою функцією був традиційно алгоритм DES, яким шифрувався рядок, що складався із нулів, при цьому в ролі ключа використовували значення пароля, об’єднане із сіллю. У сучасних версіях UNIX замість DES використовують односторонню функцію (звичайно MD5).
За вхід користувача у систему відповідають дві утиліти: getty – ініціалізує термінал, видає підказку “login:”і приймає ім’я користувача, і login, що видає підказку “password:”, приймає значення пароля, робить аутентифікацію і починає сесію користувача (переходить у домашній каталог і запускає командний інтерпретатор).
Зберігання інформації про облікові записи
Інформацію про користувачів у UNIX зберігають у файлі /etc/passwd, який відіграє роль бази даних облікових записів. кожному користувачу відповідає один рядок цього файла, що має таку структуру:
ім’я_користувача:шифрований_пароль:uid:gid:відомості:home_каталог:shell
де:
ім’я_користувача –вхідне ім’я цього користувача;
шифрований_пароль – одностороння функція від пароля, обчислена із використанням DES, MD5 тощо (якщо значення цього пароля починається з ‘*’, користувач не може інтерактивно входити у систему);
uid іgid - чисельні ідентифікатори користувача та його основної групи (користувач може належити до кількох груп, інформація про це зберігається у файлі /etc/group);
відомості – додаткова інформація про користувача (його повне ім’я тощо);
home-каталог – місце знаходження домашнього каталогу користувача;
shell – версія командного інтерпретатора, який запускається для користувача, коли він входить у систему (у Linux це звичайно /bin/bash).
Наприклад:
ivanov:10.elXw3GYJE:540:102:Іванов І. В.:/home/ivanov:/bin/bash
Інформацію про групи зберігають у файлі /etc/groupю Рядок цього файлу має синтаксис:
ім’я_групи:пароль_групи:gid:список_членів
де:
gid – чисельний ідентифікатор групи (той самий, що в /etc/passwd);
список_членів – список імен усіх користувачів, які входять у групи, розділений комами.
Наприклад:
student::102:ivanov,petrov,sidorov
Програмний доступ до облікових записів
Для доступу із застосувань до інформації, яку зберігають у /etc/passwd, можна використовувати функції. описані в <pwd.h>:
//доступ до інформації для заданого uid
struct passwd *getpwuid(uid_t uid);
//доступ до інформації для заданого імені користувача
struct passwd *getpwnam(char *name);
Обидві ці функції повертають покажчик на структуру passwd. У таблиці наведена відповідність її полів елементам рядка файла /etc/passwd.
Таблиця ???. Відповідність полів структури passwd елементам рядка файла /etc/passwd
Поле структури passwd |
Елемент рядка /etc/passwd |
pw_name |
ім'я_користувача |
pw_passwd |
шифрований_пароль |
pw_gecos |
відомості |
pw_dir |
home_каталог |
pw_shell |
shell |
Усі наведені поля є рядками символів.
приклад отримання інформації із цього файла:
struct passwd *pwd;
pwd=getpwuid(getuid());
printf(“ім’я користувача: %s, домашній каталог: %s”, pwd->pw_name, pwd->pw_dir);
Заздалегідь виділяти пам’ять під структуруpasswd не потрібно – її розміщують у статичній пам’яті під час першого виклику однієї із наведених функцій. Наступні виклики використовують ту саму пам’ять, затираючи попередній результат, тому, якщо потрібно зберігти результат виклику, його копіюють в окрему пам’ять.
Тіньові паролі
У традиційних UNIX-системах до файла /etc/passwd мав доступ будь-який користувач ОС. А тому зловмисникові достатньо було отримати непривілейований доступ до системи, щоб побачити словникову атаку на цей файл.
Для вирішення даної проблеми потрібно заборонити доступ до цього файла для всіх користувачів, крім root. Проте таке рышення не э прийнятним, оскільки в цьому файлі, крім інформації про паролі, містяться імена та ідентифікатори користувачів, розташування їхнії домашніх каталогів та інші дані, необхідні більшості застосувань. У результаті всі програми, якім потрібна така інформація, довелося б запускати із правами суперкористувача.
У сучасних UNIX-системах (зокрема в Linux) застосовують інший підхіх – технологію тіньових паролів (shadow passwords). При цьому інформацію про паролі переносять із /etc/passwd в окремий тіньовий файл паролів (який зазвичай називають /etc/shadow). До нього може звертатися тільки суперкористувач. Іншу інформацію (імена та ідентифікатори користувачів тощо) зберігають у /etc/passwd, що залишається доступним для всіх користувачів. Тіньові паролі дають змогу значно підвищити надійність схеми аутентифікації системи.
Головною проблемою цього підходу є те, що в разі переходу до використання тіньових паролів усі прикладні програми, які працюють із паролями (login тощо), необхідно змінити та перекомпілювати. Найгнучкішим вирішенням у цьому разі є застосування підключуваних модулів аутентифікації (Pluggable Authentication Modules, PAM), які дають можливість під час роботи системи визначити і налогоджувати процедуру аутентифікації для різних застосувань без зміни їхнього коду.
