Hosts.allow – Команда Linux

Пошук дозволених хостів

Ймовірно, ви потрапили сюди в пошуках способу побачити хости (інші комп’ютери), яким дозволено отримати доступ до вашого Linux системи. Ну, якщо ви вже не встановили обмеження, за замовчуванням, ймовірно, намагається будь-який комп’ютер.

Насправді, це не зовсім так. Без будь-яких правил, визначених у файлі /etc/hosts.allow або /etc/hosts.deny, ваш комп’ютер передасть підключення до відповідних програм. Отже, якщо хтось спробує підключитися SSH, з’єднання надійде до вашої системи Linux, де воно буде передане на SSH для входу. Якщо відповідні облікові дані не надано, підключення буде відхилено.

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

Ви можете перевірити свої дозволені хости, перерахувавши вміст файлу /etc/hosts.allow.

cat /etc/hosts.allow. 

Якщо ви нічого там не бачите, ваша система, швидше за все, пропустить будь-яке з’єднання.

Чоловіки, які працюють на комп'ютері в офісі
 Yuri_Arcurs/Getty Images

Використання файлу Hosts.allow

Файл /etc/hosts.allow дозволяє вибрати, які комп’ютери можуть отримати доступ до вашої системи. У файлі ви можете вказати прості правила у вигляді простого тексту, щоб розповісти вашому комп’ютеру, як обробляти з’єднання. Для початку створіть правило, що дозволяє будь-якому комп’ютеру використовувати всі служби.

ВСІ: ВСЕ. 

Це так просто. Тоді, якщо ви хочете виключити проблемний комп’ютер, ви також можете це зробити.

ВСІ: УСІ, КРІМ 192.168.1.110. 

Є кілька інших ключових слів, які можна використовувати для роботи з різними наборами комп’ютерів. Наприклад, ви можете дозволити весь локальний трафік таким чином:

ВСЕ: 192.168.1.0/24. 

Або замість цього можна використовувати ключове слово "LOCAL".

УСІ: МІСЦЕВІ. 

Ви також можете використовувати доменні імена. Наприклад:

УСІ: .example.com. 

Ви також можете використовувати ключове слово "EXCEPT", щоб виключити потенційно проблемний субдомен.

УСІ: .example.com, КРІМ testing.example.com. 

Ви також можете вказати правила для певних демонів. Отже, якщо ви хочете контролювати доступ по SSH, ви повинні налаштувати правила для 'sshd'.

sshd: ЛОКАЛЬНИЙ. 

Файл hosts.allow підтримує перерахування демонів у тому самому рядку, якщо їхні правила однакові. Наприклад:

sshd, in.ftpd: ЛОКАЛЬНИЙ. 

Зверніть увагу на "в". частина в "in.ftpd?" Це дозволяє вказати вхідний трафік.

Тоді у вас є можливість об’єднати все це разом.

sshd, in.ftpd: ЛОКАЛЬНИЙ, КРІМ 192.168.1.110. 

Це найпоширеніші способи використання файлу /etc/hosts.allow у вашій системі Linux. Щоб отримати повну технічну інформацію про те, що ви можете зробити з файлом /etc/hosts.allow, перейдіть до наступного розділу.

Технічна поломка

Ця сторінка посібника описує Linux як просту мову керування доступом, яка базується на клієнті (ім’я хоста/адреса, ім’я користувача) та сервер (ім'я процесу, ім'я/адреса хоста) шаблони. Приклади наведено в кінці. Нетерплячому читачеві рекомендується перейти до розділу «Приклади» для швидкого вступу. Розширена версія мови контролю доступу описана в hosts_options (5) документ. Розширення вмикаються під час складання програми шляхом створення —DPROCESS_OPTIONS.

У наступному тексті демон це назва процесу процесу мережевого демона, і клієнта це ім'я та/або адреса хоста, який запитує послугу. Імена процесів мережевого демона вказуються у файлі конфігурації inetd.

Файли контролю доступу

Програмне забезпечення контролю доступу консультує двох файлів. Пошук припиняється на першому збігу.

Доступ буде надано, коли пара (демон, клієнт) збігається із записом у файлі /etc/hosts.allowфайл.

Інакше у доступі буде заборонено, коли пара (демон, клієнт) збігається із записом у файлі/etc/hosts.deny файл.

В іншому випадку доступ буде надано.

Неіснуючий файл контролю доступу розглядається як порожній файл. Таким чином, контроль доступу можна вимкнути, не надавши файли контролю доступу.

Правила контролю доступу

Кожен файл контролю доступу складається з нуля або більше рядків тексту. Ці рядки обробляються в порядку їх появи. Пошук припиняється, коли знайдено відповідність.

Символ нового рядка ігнорується, коли йому передує символ зворотної косої риски. Це дозволяє розбивати довгі рядки, щоб їх було легше редагувати.

Порожні рядки або рядки, які починаються з символу `#', ігноруються. Це дозволяє вставляти коментарі та пробіли, щоб таблиці було легше читати.

Усі інші рядки мають відповідати наступному формату, значення між [] необов’язковими:

daemon_list: client_list [: shell_command]

daemon_list є списком одного або кількох імен процесів-демона (значення argv[0]) або символів підстановки (див. нижче).

список_клієнтів - це список одного або кількох імен хостів, адрес хостів, шаблонів або символів підстановки (див. нижче), які будуть відповідати імені або адресу хоста клієнта.

Більш складні форми daemon@host і користувач@хост пояснюються в розділах про шаблони кінцевих точок сервера та про пошук імені користувача клієнта відповідно.

Елементи списку мають бути розділені пробілами та/або комами.

За винятком Пошук мережевих груп NIS (YP)., усі перевірки контролю доступу не чутливі до регістру.

Візерунки

Мова керування доступом реалізує такі шаблони:

Рядок, який починається з `.' характер. Ім’я хоста збігається, якщо останні компоненти його імені відповідають вказаному шаблону. Наприклад, шаблон `.tue.nl' відповідає імені хоста `wzv.win.tue.nl'.

Рядок, який закінчується символом "." характер. Адреса хоста збігається, якщо її перші числові поля відповідають заданому рядку. Наприклад, шаблон `131.155.' відповідає адресі (майже) кожного хоста в мережі Ейндховенського університету (131.155.x.x).

Рядок, який починається з символу `@', розглядається як ім'я мережі мережі NIS (раніше YP). А ім'я хоста збігається, якщо він є членом хоста вказаної мережевої групи. Збіги мережевих груп не підтримуються для імен процесів-демона або для імен користувачів клієнта.

Вираз у формі "n.n.n.n/m.m.m.m" інтерпретується як пара "net/mask". Адреса хоста IPv4 збігається, якщо `net' дорівнює побітовому І адреси та `маски'. Наприклад, шаблон мережі/маски "131.155.72.0/255.255.254.0" відповідає кожній адресі в діапазоні від "131.155.72.0" до "131.155.73.255".

Вираз у вигляді `[n: n: n: n: n: n: n: n]/m' інтерпретується як пара `[net]/prefixlen'. Адреса хоста IPv6 збігається, якщо біти `prefixlen' мережі `net' дорівнюють бітам `prefixlen' адреси. Наприклад, шаблон [net]/prefixlen `[3ffe: 505:2:1::]/64' відповідає кожній адресі в діапазоні від `3ffe: 505:2:1::' до `3ffe: 505:2: 1:ffff: ffff: ffff: ffff'.

Рядок, який починається з символу `/', розглядається як a ім'я файлу. Ім’я або адреса хоста збігаються, якщо вони збігаються з будь-яким ім’ям хоста чи шаблоном адреси, перерахованим у іменованому файлі. Формат файлу – це нуль або більше рядків із нульовою чи більше іменами хостів або шаблонами адрес, розділених пробілами. Шаблон імені файлу можна використовувати будь-де, де можна використовувати ім'я хоста або шаблон адреси.

Підстановкові знаки `*' та `?' можна використовувати для відповідності імен хостів або IP-адреси. Цей метод зіставлення не можна використовувати разом із зіставленням `net/mask', відповідність імені хоста починається з `.' або відповідність IP-адреси, що закінчується на ".".

Підстановкові знаки

Мова керування доступом підтримує явні символи підстановки, включаючи:

  • "УСІ" — Універсальний підстановковий знак, завжди збігається.
  • "МІСЦЕВИЙ" —Збігається з будь-яким хостом, ім’я якого не містить символу крапки.
  • "НЕВІДОМИЙ" —Збігається з будь-яким користувачем, ім’я якого невідоме, і збігається з будь-яким хостом, чиє ім’я або адреса невідомі. Цей шаблон слід використовувати обережно: імена хостів можуть бути недоступні через тимчасові проблеми сервера імен. А мережева адреса буде недоступним, якщо програмне забезпечення не може визначити, з якою мережею воно розмовляє.
  • 'ВІДОМИЙ' —Збігається з будь-яким користувачем, чиє ім’я відоме, і збігається з будь-яким хостом, чиє ім’я і адреса відома. Цей шаблон слід використовувати обережно: імена хостів можуть бути недоступні через тимчасові проблеми сервера імен. Мережева адреса буде недоступна, якщо програмне забезпечення не може визначити, з яким типом мережі воно розмовляє.
  • "ПАРАНОЇД" —Збігається з будь-яким хостом, ім’я якого не збігається з його адресою. Коли tcpd побудовано з -DPARANOID (режим за замовчуванням), він відкидає запити від таких клієнтів навіть до того, як перегляне таблиці контролю доступу. Створюйте без -DPARANOID, якщо вам потрібно більше контролю над такими запитами.

"ОПЕРАТОРИ"

  • "ОКРІМ" —Заплановано використання має вигляд: `список_1 КРІМ списку_2'; ця конструкція відповідає всьому, що відповідає список_1 якщо не збігається список_2. Оператор EXCEPT можна використовувати в daemon_lists і в client_lists. Оператор EXCEPT може бути вкладеним: якщо мова керування дозволяє використовувати дужки, `a EXCEPT b EXCEPT c' буде аналізуватися як `(a EXCEPT (b EXCEPT c))'.
  • Команди оболонки —Якщо правило контролю доступу, яке відповідає першому, містить команду оболонки, ця команда піддається %підстановкам (див. наступний розділ). Результат виконується за допомогою a /bin/sh дочірній процес зі стандартним введенням, виводом і помилкою, підключеним до /dev/null. Вкажіть "&" в кінці команду терміналу якщо ви не хочете чекати, поки він завершиться. Команди оболонки не повинні покладатися на параметр PATH файлу inetd. Замість цього вони повинні використовувати абсолютні імена шляхів, або вони повинні починатися з явного оператора PATH=whatever.

The hosts_options(5) документ описує альтернативну мову, яка використовує командне поле оболонки іншим і несумісним способом.

% розширень

У командах оболонки доступні такі розширення:

  • %a (%A) — Клієнт (сервер) господар адреса.
  • %c — Інформація про клієнта: user@host, user@address, ім’я хоста або просто адреса, залежно від того, скільки інформації доступно.
  • %d — Ім’я процесу демона (значення argv[0]).
  • %h (%H) — Ім’я або адреса клієнта (сервера), якщо ім’я хоста недоступне.
  • %n (%N) — Ім’я хоста клієнта (сервера) (або «невідоме», чи «параноїдальне»).
  • %p — Ідентифікатор процесу демона.
  • %s — Інформація про сервер: daemon@host, daemon@address або просто ім’я демона, залежно від того, скільки інформації доступно.
  • %u — Ім’я користувача клієнта (або «невідоме»).
  • %% — Розгортається до одного символу `%'.

Символи у % розширень, які можуть заплутати оболонку, замінюються символами підкреслення.

Шаблони кінцевих точок сервера

Щоб розрізняти клієнтів за мережевою адресою, до якої вони підключаються, використовуйте шаблони у вигляді:

process_name@host_pattern: client_list... 

Подібні шаблони можна використовувати, коли машина має різні інтернет-адреси з різними іменами хостів. Постачальники послуг можуть використовувати цю можливість, щоб пропонувати архіви FTP, GOPHER або WWW з іменами в Інтернеті, які можуть навіть належати іншим організаціям. Дивіться також параметр `twist' в документі hosts_options (5). Деякі системи (Solaris, FreeBSD) можуть мати більше однієї інтернет-адреси на одному фізичному інтерфейсі; з іншими системами вам, можливо, доведеться вдатися до псевдоінтерфейсів SLIP або PPP, які живуть у виділеному просторі мережевих адрес.

Шаблон host_pattern підпорядковується тим же правилам синтаксису, що й імена та адреси хостів у контексті client_list. Зазвичай інформація про кінцеву точку сервера доступна лише для служб, орієнтованих на підключення.

Пошук імені користувача клієнта

Коли клієнт-хост підтримує протокол RFC 931 або одного з його нащадків (TAP, IDENT, RFC 1413), програми-обгортки можуть отримати додаткову інформацію про власника з’єднання. Інформація про ім’я користувача клієнта, якщо доступна, реєструється разом з ім’ям хосту клієнта і може використовуватися для відповідності таким шаблонам, як:

daemon_list:... user_pattern@host_pattern... 

Обгортки демона можна налаштувати під час компіляції, щоб виконувати пошук імен користувача на основі правил (за замовчуванням) або завжди запитувати хост клієнта. У випадку пошуку імені користувача на основі правил, вищезгадане правило спричинить пошук імені користувача лише тоді, коли обидва daemon_list і шаблон_хостаматч.

Шаблон користувача має той самий синтаксис, що й шаблон процесу демона, тому застосовуються ті самі символи підстановки (членство в мережевій групі не підтримується). Однак не варто захоплюватися пошуком імені користувача.

Інформації про ім’я користувача клієнта не можна довіряти, коли вона найбільше потрібна, тобто коли клієнтська система була скомпрометована. Загалом, ALL і (UN)KNOWN – це єдині шаблони імен користувача, які мають сенс.

Пошук імен користувача можливий лише за допомогою служб на основі TCP і лише тоді, коли клієнтський хост запускає відповідний демон; у всіх інших випадках результат «невідомий».

Відомий UNIX Помилка ядра може призвести до втрати служби, коли пошук імені користувача блокується брандмауером. Обгортка документа README описує процедуру, щоб дізнатися, чи є у вашому ядрі ця помилка.

Пошук імені користувача може спричинити помітні затримки для користувачів, які не користуються UNIX. За замовчуванням час очікування для пошуку імені користувача становить 10 секунд: занадто короткий, щоб впоратися з повільними мережами, але досить довгий, щоб дратувати користувачів ПК.

Вибірковий пошук імені користувача може полегшити останню проблему. Наприклад, таке правило:

daemon_list: @pcnetgroup ALL@ALL. 

буде відповідати членам мережевої групи ПК без пошуку імені користувача, але виконуватиме пошук імені користувача з усіма іншими системами.

Виявлення атак підміни адреси

Помилка в генераторі порядкових номерів багатьох Реалізації TCP/IP дозволяє зловмисникам легко видавати себе за довірених хостів і проникати, наприклад, через службу віддаленої оболонки. Службу IDENT (RFC931 тощо) можна використовувати для виявлення таких та інших атак підробки адреси хоста.

Перш ніж прийняти запит клієнта, обгортки можуть використовувати службу IDENT, щоб дізнатися, що клієнт взагалі не надсилав запит. Коли хост клієнта надає послугу IDENT, негативний результат пошуку IDENT (клієнт відповідає `UNKNOWN@host') є вагомим доказом атаки підробки хоста.

Позитивний результат пошуку IDENT (клієнт відповідає `KNOWN@host') менш надійний. Зловмисник може підробити як клієнтське з’єднання, так і пошук IDENT, хоча зробити це набагато складніше, ніж підробити лише клієнтське з’єднання. Можливо також, що сервер IDENT клієнта бреше.

Пошук IDENT не працює зі службами UDP.

Більше прикладів

Мова є достатньо гнучким, щоб різні типи політики контролю доступу могли бути виражені з мінімумом суєти. Хоча мова використовує дві таблиці контролю доступу, найпоширеніші політики можуть бути реалізовані, коли одна з таблиць буде тривіальною або навіть порожньою.

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

У прикладах використовуються імена хостів і доменів. Їх можна покращити, включивши інформацію про адресу та/або мережу/маску мережі, щоб зменшити вплив тимчасових помилок пошуку сервера імен.

В основному закриті

У цьому випадку доступ за замовчуванням заборонений. Доступ мають лише явно авторизовані хости.

Політика за замовчуванням (без доступу) реалізується за допомогою тривіального файлу заборони:

/etc/hosts.deny:

ВСІ: ВСЕ. 

Це забороняє всі служби для всіх хостів, якщо їм не дозволено доступ за допомогою записів у файлі дозволу.

Явно авторизовані хости перераховані у файлі дозволу. Наприклад:

/etc/hosts.allow:

УСІ: ЛОКАЛЬНІ @some_netgroup
УСІ: .foobar.edu, КРІМ terminalserver.foobar.edu.

Перше правило дозволяє доступ з хостів у локальний домен (без `.' в імені хоста) та від членів some_netgroup мережева група. Друге правило дозволяє доступ з усіх хостів уfoobar.edu домену (зверніть увагу на провідну крапку), за винятком terminalserver.foobar.edu.

В основному відкриті

Тут доступ надається за замовчуванням; тільки явно вказаним хостам відмовляється в обслуговуванні.

Політика за замовчуванням (доступ надано) робить файл дозволу зайвим, щоб його можна було пропустити. Явно неавторизовані хости перераховані у файлі заборони. Наприклад:

/etc/hosts.deny:

ALL: some.host.name, .some.domain
УСІ: УСІ, КРІМ in.fingerd: other.host.name, .other.domain.

Перше правило забороняє деяким хостам і доменам усі послуги; друге правило все ще дозволяє запити пальців від інших хостів і доменів.

Мини-пастки

Наступний приклад дозволяє tftp запити з хостів у локальному домені (зверніть увагу на провідну крапку). Запити від будь-яких інших хостів відхиляються. Замість запитуваного файлу на хост-порушник надсилається датчик пальця. Результат надсилається суперкористувачу.

/etc/hosts.allow:

in.tftpd: ЛОКАЛЬНИЙ, .my.domain
/etc/hosts.deny:
in.tftpd: ВСІ: породжувати (/some/where/safe_finger -l @%h | \
/usr/ucb/mail -s %d-%h root) &

Команда safe_finger постачається разом із оболонкою tcpd і має бути встановлена ​​у відповідному місці. Це обмежує можливу шкоду від даних, надісланих віддаленим сервером finger. Це забезпечує кращий захист, ніж стандартна команда пальців.

Розширення послідовностей %h (хост клієнта) і %d (ім’я служби) описано в розділі про команди оболонки.

Не захоплюйте демона свого пальця, якщо ви не готові до нескінченних циклів пальців.

У мережі системи брандмауера цей трюк можна запровадити ще далі. Типовий мережевий брандмауер надає лише обмежений набір послуг для зовнішнього світу. Усі інші служби можна «підслуховувати» так само, як у наведеному вище прикладі tftp. Результатом є чудова система раннього попередження.

Дивись також

tcpd (8) програма обгортки демона tcp/ip.
tcpdchk (8), tcpdmatch (8), тестові програми.

Використовувати чоловік команда (% чоловік), щоб побачити, як команда використовується на вашому комп’ютері.