Обмеження доступу користувачів


Деніс Колісниченко

У статті розглядається обмеження доступу за допомогою демона tcpd, таблиць доступу користувачів, програми sendmail, а також за допомогою сервера ProFTPD. Природно, є багато способів обмеження доступу. Практично кожна служба має директиви, що забороняють або дозволяють окремим користувачам доступ до неї. Наприклад, можна обмежити доступ до сервера Apache або проксі-сервера Squid, а також задати час роботи сервісу за допомогою суперсервера xinetd, але розгляд всього цього виходить за рамки цієї статті.

Обмеження доступу до сайту

Демон tcpd аутентифікує віддалених користувачів та перевіряє коректність їхніх запитів. За допомогою цього демона можна обмежити запити віддалених комп'ютерів. Файл hosts.allow містить список хостів, яким дозволено підключатися до вашої системи, а hosts.deny – заборонено. Записи мають формат

служба:хост.домен
Якщо ви бажаєте дозволити або заборонити доступ всім, Використовуйте модифікатор ALL. Запис ALL:ALL відкриває або закриває доступ до вашого машині всім комп'ютерам всім видів сервісів (див. листинг 1).

Листинг 1. Файл /etc/hosts.allow

https:ALL
ftp:ALL
ALL:main.dhsilabs.com

У лістингу 1 доступ до http і ftp дозволено всім, доступ до ВСІХ сервісів дозволено лише комп'ютеру main.dhsilabs.com.

Зазвичай налаштування доступу рекомендується проводити наступним чином. Спочатку забороняється доступ усім вузлам, а потім дозволяється окремим вузлам (або підмережам) у міру потреби.

Обмеження надсилання пошти

Для обмеження пересилання пошти через ваш сервер використовується файл /etc/mail/access (точніше access.db, на який перетворюється файл access). Цей файл використовується програмою sendmail. У ньому ви можете вказати вузли, яким дозволено (заборонено) використовувати сервер SMTP. Формат цього файлу такий:

вузол | мережа | користувач дія
Наприклад:
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 OK
spammer@spamworld.com REJECT
spamworld.com ERROR:"550 Access denied"
192.168.1 RELAY
host.mydomain.com REJECT
mydomain.com RELAY

У першому-третьому рядках ми дозволяємо самим собі використовувати SMTP сервер. Потім ми забороняємо пересилання пошти користувачу spammer@spamworld.com, а також усьому домену spamworld.com. Шостий рядок дозволяє пересилання пошти всієї нашої локальної підмережі – 192.168.1.*. Останній рядок дозволяє використовувати сервер SMTP до домену, а передостання забороняє використовувати наш сервер одному вузлу з домену mydomain.com – host. Різниця між дією OK і RELAY полягає в тому, що в першому випадку (ОК) пересилання дозволяється, навіть якщо інші правила sendmail заборонили Пересилання пошти, наприклад, ім'я вузла не дозволяється (при використанні DNS).

Для заборони пересилання можна просто використовувати REJECT. Тоді користувач побачить повідомлення Access denied. Дія ERROR більш інформативна, так як ви можете вказати будь-яке повідомлення (встановити реакцію на помилку). Дію ERROR можна записати інакше: ERROR:D.S.N:Message, де D.S.N - це код помилки відповідно до RFC 1893 року.

Для того, щоб нові правила доступу набрали чинності, введіть команду:

makemap hash /etc/mail/access < /etc/mail/access

Зміни набудуть чинності відразу після завершення роботи програми makemap. Перезавантажувати sendmail при цьому не потрібно!

Обмеження доступу користувачів

Для обмеження доступу можна використовувати такі файли:

  1. access.conf
  2. console.perms
  3. limits.conf

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

Формат файлу access.conf такий:

Дозвіл : Користувачі : Доступ

Перше поле може містити або символ "+", який означає, що доступ дозволено, або символ "-", що забороняє доступ. Поле Користувачі містить список імен користувачів, розділених пробілами. Можна вказувати Ім'я користувача у форматі user@host. Такий запис описує користувача user, який реєструється з машини host. Для позначення всіх користувачів можна вказати ALL як значення другого поля.

Третє поле (Доступ) може містити список терміналів, з яких дозволена (або заборонена – залежно від значення першого поля) реєстрація користувачів (для локальної реєстрації). Еякщо вас цікавить реєстрація по мережі, ви можете вказати тут ім'я вузла, IP-адресу вузла, адресу мережі (закінчується (точкою), імена доменів або імена вузлів локальної мережі (не містять точки). Для визначення всіх вузлів локальної мережі можна використовувати модифікатор LOCAL.

Можна також використовувати модифікатор EXCEPT (крім) для виключення деяких елементів списку (у другому та третьому полях)

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

-:ALL EXCEPT den user serge:LOCAL .microsoft.com
+:reboot shutdown:LOCAL
+:root:tty1
-:root:LOCAL
-:den user serge:LOCAL EXCEPT host1

Перше правило забороняє реєстрацію всіх користувачів, крім (EXCEPT) den, user, serge з будь-якого хоста локальної мережі та домену .microsoft.com. Але ці користувачі можуть реєструватися з іншого домену.

Друге правило дозволяє реєстрацію користувачів reboot та shutdown з будь-якого вузла локальної мережі. Третє правило дозволяє реєстрацію користувача root з терміналу tty1, а наступне правило – забороняє реєстрацію користувача root по мережі (локальної). Останнє правило забороняє реєстрацію користувачів den, user, serge з будь-якого вузла локальної мережі, крім вузла host1.

З погляду безпеки наведені приклади немає сенсу. Я навів цей приклад лише з демонстраційною метою. По-перше, як видно з імен користувачів у другому правилі, перший використовується для перезавантаження системи, а другий - для її зупинки. Тобто під час реєстрації цих користувачів система, відповідно, або перезавантажується чи зупиняється. Подібне практикується багатьма системними адміністраторами, яких я знаю. Як вони кажуть, цих користувачів створили для зручності: якщо потрібно перезавантажити машину потрібно просто увійти в систему під користувачем reboot. Така зручність вам може дорого обійтися, якщо хтось, дізнавшись ваш пароль, зупинить машину під час вашої відсутності, тому не рекомендую вам створювати подібних користувачів взагалі. Третє правило дозволяє реєстрацію користувача root з терміналу tty1 (локальна реєстрація), але не забороняє реєстрацію з решти. Можна було б вказати правило -:root:ALL перед третім правилом, але спеціально для цього служить файл /etc/securetty, про який ми поговоримо трохи згодом.

Тепер перейдемо до другого файлу - console.perms. Цей файл визначає повноваження привілейованих користувачів, які будуть їм присвоєні при реєстрації через консоль системи (локальна реєстрація). Швидше за все, Вам не потрібно буде редагувати цей файл. Після внесення змін до цей файл виконайте команду:

pam_console_apply -r

Зазвичай ця команда поміщається в один із ініціалізаційних сценаріїв системи. Для отримання докладнішої інформації зверніться до довідкової системи.

У файлі limits.conf визначаються квоти системних ресурсів, наприклад, максимальна кількість процесів або максимальний час процесора. Насамперед чим обмежити користувачів, розглянемо як можна обмежити себе, тобто користувача root. У файлі /etc/securetty, що вже згадувався вище, вказуються термінали та віртуальні консолі, з яких може реєструватися Користувач root. Я рекомендую взагалі заборонити реєстрацію користувача root з консолі. Для цього видаліть (або закоментуйте) усі рядки у файлі securetty. Якщо вам потрібні максимальні привілеї, використовуйте команду su (super user). Після введення цієї команди програма запросить у вас пароль користувача root, і якщо пароль правильний, ви отримаєте привілеї користувача root.

У файлі limits.conf визначаються обмеження ресурсів системи для користувача чи групи користувачів. Формат файлу такий:


<domain> <type> <item> <value>

Перше поле (domain) може містити:

  1. Ім'я користувача
  2. Назва групи. Перед іменем групи потрібно вказати символ "@"
  3. Символ "*". Це обмеження буде обмеженням за промовчанням.
Друге поле - це тип обмеження: м'яке (soft) чи жорстке (hard). М'яке обмеження визначає число системних ресурсів, яке користувач все ще може перевищити, жорстке обмеження перевищити неможливо. При спробі зробити це, користувач отримає повідомлення про помилку.
Елементом обмеження (item) може бути:
  1. core - обмеження розміру файлу core (Кб)
  2. data – максимальний розмір даних (Кб)
  3. fsize – максимальний розмір файлу (Кб)
  4. memlock - максимальний заблокований адресний простір (КБ)
  5. nofile - максимальна кількість відкритих файлів
  6. stack – максимальний розмір стека (Кб)
  7. cpu - максимальний час процесора (хвилини)
  8. nproc - максимальна кількість процесів
  9. as - обмеження адресного простору
  10. maxlogins - максимальне число однетимчасових реєстрацій у системі
  11. locks - максимальна кількість файлів блокування
Розглянемо кілька прикладів. Наприклад, нам потрібно встановити максимальне число процесів для користувача користувача. Це можна зробити за допомогою таких записів
user soft nproc 50
user hard nproc 60

Перший рядок визначає м'яке обмеження (рівне 50), а другий - тверде.

Допустимо, у нас є групи dialup1 і dialup2. У кожну групу входять 30 користувачів. У нас є лише 30 вхідних ліній, тому потрібно забезпечити Одночасну роботу не більше 15 користувачів з кожної групи. Це робиться так:

@dialup1 - maxlogins 14
@dialup2 - maxlogins 14

У першому та другому випадку з кожної групи користувачів одночасно працювати зможуть не більше 15 (maxlogins 14 - відлік починається з нуля). Під час реєстрації шістнадцятий користувач побачить повідомлення:

Too many logins for 'dialup1'

Обмеження доступу до FTP-сервера

При використанні сервера ProFTPD обмежити реєстрацію користувачів ви можете за допомогою блоку Limit, який вказується у файлі конфігурації /etc/proftpd.conf. За допомогою цього блоку можна обмежити інші дії користувачів, наприклад, запис до каталогів сервера FTP, збереження (завантаження) файлів. Блок Limit може вказуватись у блоці Directory або Anonymous. приклад блоку Limit:

<Limit LOGIN>
DenyAll
AllowUser user1
MaxClients 1
Deny from 123.141.181.191
Deny від 192.168.2.
</Limit>

Перша директива в блоці Limit забороняє реєстрацію всім користувачам, друга дозволяє лише реєстрацію користувача user1, третя - задає максимальна кількість клієнтів (1). Останні дві директиви забороняють реєстрацію з вузла 123.141.181.191, а також із підмережі 192.168.2. Окрім директив DenyAll та AllowUser існують протилежні їм за діяльністю - AllowAll та DenyUser відповідно.