110.2 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
110 Безпека |
Тема: |
110.2 Налаштування безпеки хоста |
Урок: |
1 з 1 |
Вступ
У цьому розділі пояснюється чотири основні способи підвищення безпеки хоста:
-
Деякі основні команди та параметри конфігурації для покращення безпеки автентифікації за допомогою тіньових паролів.
-
Як використовувати супердемони для прослуховування вхідних мережних з’єднань.
-
Перевірка мережних служб на непотрібні демони.
-
Обгортки TCP у якості простого брандмауера.
Покращення безпеки автентифікації за допомогою тіньових паролів
Основні компоненти даних облікового запису користувача зберігаються у файлі /etc/passwd
. Цей файл містить сім полів: ім’я для входу, ідентифікатор користувача, ідентифікатор групи, пароль, коментар (він же GECOS), розташування домашнього каталогу та, нарешті, оболонку за замовчуванням. Простий спосіб запам’ятати порядок цих полів — подумати про процес входу користувача: спочатку ви вводите ім’я для входу, по-друге, система зіставить його з ідентифікатором користувача (uid), а по-третє, ідентифікатором групи (gid). Четвертий крок запитує пароль, п’ятий шукає коментар, шостий визначає домашній каталог користувача, а сьомий крок встановлює оболонку за замовчуванням.
Хоча в сучасних системах пароль більше не зберігається у файлі /etc/passwd
. Натомість поле пароля містить лише літеру x
у нижньому регістрі. Файл /etc/passwd
має бути доступним для читання всім користувачам. Тому не варто зберігати там паролі. x
означає, що зашифрований (хешований) пароль фактично зберігається у файлі /etc/shadow
. Цей файл не повинен бути доступним для читання всім користувачам.
Параметри пароля налаштовуються за допомогою команд passwd
і chage
. Обидві команди змінять запис для користувача emma
у файлі /etc/shadow
. Як суперкористувач ви можете встановити пароль для користувача emma
за допомогою такої команди:
$ sudo passwd emma New password: Retype new password: passwd: password updated successfully
Потім вам двічі буде запропоновано підтвердити новий пароль.
Щоб переглянути час закінчення терміну дії пароля та інші налаштування терміну дії пароля для користувача emma
, виконайте наступні дії:
$ sudo chage -l emma Last password change : Apr 27, 2020 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
Щоб запобігти входу користувача emma
в систему, суперкористувач може встановити термін дії пароля, який передує поточній даті. Наприклад, якщо сьогоднішня дата 2020-03-27, ви можете закінчити термін дії пароля користувача, використовуючи старішу дату:
$ sudo chage -E 2020-03-26 emma
Крім того, суперкористувач може використовувати наступний варіант:
$ sudo passwd -l emma
щоб тимчасово заблокувати обліковий запис за допомогою опції -l
для passwd
. Щоб перевірити вплив цих змін, спробуйте увійти з обліковим записом emma
:
$ sudo login emma Password: Your account has expired; please contact your system administrator Authentication failure
Щоб запобігти тимчасово входу в систему всіх користувачів, окрім користувача root, суперкористувач може створити файл під назвою /etc/nologin
. Цей файл може містити повідомлення для користувачів про те, чому вони не можуть увійти (наприклад, сповіщення про технічне обслуговування системи). Для отримання додаткової інформації див. man 5 nologin
. Зауважте, що існує також команда nologin
, яку можна використати для запобігання входу, якщо її встановлено як оболонку за замовчуванням для користувача. Наприклад:
$ sudo usermod -s /sbin/nologin emma
Дивіться man 8 nologin
для отримання додаткової інформації.
Як використовувати Superdaemon для прослуховування вхідних мережних підключень
Мережні служби, такі як веб-сервери, сервери електронної пошти та сервери друку, зазвичай працюють як окрема служба, яка прослуховує виділений мережний порт. Усі ці автономні служби працюють паралельно. У класичній системі на основі Sys-V-init кожною з цих служб можна керувати командою service
. У поточних системах на базі systemd використовується systemctl
для керування службою.
У минулі часи доступність комп’ютерних ресурсів була набагато меншою. Запуск багатьох служб в автономному режимі в тандемі не був прийнятним варіантом. Замість цього використовувався так званий супердемон для прослуховування вхідних мережних з’єднань і запуску відповідної служби на вимогу. Цей спосіб побудови мережного підключення займав трохи більше часу. Добре відомими супердемонами є inetd
і xinetd
. У поточних системах, заснованих на systemd, блок systemd.socket
можна використовувати подібним чином. У цьому розділі ми будемо використовувати xinetd
для перехоплення з’єднань із демоном sshd
і запускати цей демон за запитом, щоб продемонструвати, як використовувався супердемон.
Перед налаштуванням служби xinetd
необхідна певна підготовка. Немає значення, чи використовуєте ви систему на основі Debian чи Red Hat. Хоча ці пояснення перевірено на Debian/GNU Linux 9.9, вони мають працювати на будь-якій поточній системі Linux із системою systemd без будь-яких суттєвих змін. Спочатку переконайтеся, що встановлено пакунки openssh-server
і xinetd
. Тепер переконайтеся, що служба SSH працює з:
$ systemctl status sshd ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2020-04-27 09:33:48 EDT; 3h 11min ago Docs: man:sshd(8) man:sshd_config(5) Process: 430 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) Main PID: 460 (sshd) Tasks: 1 (limit: 1119) Memory: 5.3M CGroup: /system.slice/ssh.service └─460 /usr/sbin/sshd -D
Також перевірте, чи служба SSH прослуховує стандартний мережний порт 22:
# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1194 root 3u IPv4 16053268 0t0 TCP *:ssh (LISTEN) sshd 1194 root 4u IPv6 16053270 0t0 TCP *:ssh (LISTEN)
Нарешті зупиніть службу SSH за допомогою:
$ sudo systemctl stop sshd.service
У випадку, якщо ви бажаєте зробити цю зміну постійною і після перезавантаження, використовуйте systemctl disable sshd.service
.
Тепер ви можете створити файл конфігурації xinetd /etc/xinetd.d/ssh
з деякими основними налаштуваннями:
service ssh { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/sshd server_args = -i flags = IPv4 interface = 192.168.178.1 }
Перезапустіть службу xinetd за допомогою:
$ sudo systemctl restart xinetd.service
Перевірте, яка служба зараз прослуховує вхідні з’єднання SSH.
$ sudo lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME xinetd 24098 root 5u IPv4 7345141 0t0 TCP 192.168.178.1:ssh (LISTEN)
Ми бачимо, що служба xinetd взяла під контроль доступ до порту 22.
Ось деякі додаткові відомості про конфігурацію xinetd
. Основний файл конфігурації – /etc/xinetd.conf
:
# Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults { # Please note that you need a log_type line to be able to use log_on_success # and log_on_failure. The default is the following : # log_type = SYSLOG daemon info } includedir /etc/xinetd.d
Окрім налаштувань за замовчуванням, існує лише одна директива для встановлення каталогу включення. У цьому каталозі ви можете налаштувати окремий файл конфігурації для кожної служби, яку ви хочете обробляти xinetd
. Ми зробили це вище для служби SSH і назвали файл /etc/xinetd.d/ssh
. Назви файлів конфігурації можна вибирати довільно, за винятком імен файлів, які містять крапку (.
) або закінчуються тильдою (~
). Але поширеною практикою є назвати файл за назвою служби, яку ви хочете налаштувати.
Деякі конфігураційні файли в каталозі /etc/xinet.d/
вже надаються дистрибутивом:
$ ls -l /etc/xinetd.d total 52 -rw-r--r-- 1 root root 640 Feb 5 2018 chargen -rw-r--r-- 1 root root 313 Feb 5 2018 chargen-udp -rw-r--r-- 1 root root 502 Apr 11 10:18 daytime -rw-r--r-- 1 root root 313 Feb 5 2018 daytime-udp -rw-r--r-- 1 root root 391 Feb 5 2018 discard -rw-r--r-- 1 root root 312 Feb 5 2018 discard-udp -rw-r--r-- 1 root root 422 Feb 5 2018 echo -rw-r--r-- 1 root root 304 Feb 5 2018 echo-udp -rw-r--r-- 1 root root 312 Feb 5 2018 servers -rw-r--r-- 1 root root 314 Feb 5 2018 services -rw-r--r-- 1 root root 569 Feb 5 2018 time -rw-r--r-- 1 root root 313 Feb 5 2018 time-udp
Ці файли можна використовувати як шаблони у рідкісних випадках, коли вам доведеться використовувати деякі застарілі служби, такі як daytime
, дуже рання реалізація сервера часу. Усі ці файли шаблонів містять директиву disable = yes
.
Ось деякі додаткові відомості про директиви, які використовуються у файлі прикладу /etc/xinetd.d/ssh
для ssh вище.
service ssh { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/sshd server_args = -i flags = IPv4 interface = 192.168.178.1 }
service
-
Виводить службу, якою має керувати xinetd. Ви можете використовувати або номер порту, наприклад 22, або назву, зіставлену з номером порту в
/etc/services
, наприклад.ssh
. {
-
Детальні параметри починаються з відкриваючої фігурної дужки.
disable
-
Щоб активувати ці параметри, встановіть значення
no
. Якщо ви хочете тимчасово вимкнути це налаштування, ви можете встановити для нього значенняyes
. socket_type
-
Ви можете вибрати
stream
для сокетів TCP абоdgram
для сокетів UDP тощо. protocol
-
Виберіть TCP або UDP.
wait
-
Для TCP-з’єднань зазвичай встановлено значення
no
. user
-
Сервіс, запущений у цьому рядку, буде належати цьому користувачеві.
server
-
Повний шлях до служби, яку має запустити
xinetd
. server_args
-
Тут можна додати опції сдужби. Якщо запущено суперсервером, для багатьох служб потрібна спеціальна опція. Для SSH це буде параметр
-i
. flags
-
Ви можете вибрати IPv4, IPv6 та інші.
interface
-
Мережний інтерфейс, яким має керувати
xinetd
. Примітка: ви також можете вибрати директивуbind
, яка є лише синонімомinterface
. }
-
Завершіть закриттям фігурної дужки.
Спадкоємцями служб, запущених суперсервером xinetd
, є модулі сокетів systemd. Налаштування модуля сокета systemd дуже просте, тому що вже є попередньо визначений модуль сокета systemd для SSH. Переконайтеся, що служби xinetd
і SSH не запущені.
Тепер вам просто потрібно запустити модуль SSH-сокета:
$ sudo systemctl start ssh.socket
Щоб перевірити, яка служба зараз прослуховує порт 22, ми знову використовуємо lsof
. Зауважте, що опція -P
була використана для показу номера порту замість назви служби у виведенні:
$ sudo lsof -i :22 -P COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 57u IPv6 14730112 0t0 TCP *:22 (LISTEN)
Щоб завершити цей сеанс, ви повинні спробувати ввійти на свій сервер за допомогою свого обраного SSH-клієнта.
Tip
|
Якщо |
Перевірка служб на непотрібні демони
З міркувань безпеки, а також для контролю системних ресурсів важливо знати, які служби працюють. Служби, які непотрібні та не використовуються, слід відключити. Наприклад, якщо вам не потрібно розповсюджувати веб-сторінки, не потрібно запускати веб-сервер, такий як Apache або nginx.
У системах на основі SyS-V-init ви можете перевірити стан усіх служб за допомогою наступної команди:
$ sudo service --status-all
Перевірте, чи потрібні всі служби, перелічені у виведенні команди, і вимкніть усі непотрібні служби для систем на основі Debian:
$ sudo update-rc.d SERVICE-NAME remove
або в системах на основі Red Hat:
$ sudo chkconfig SERVICE-NAME off
У сучасних системах на базі systemd ми можемо використовувати наступне, щоб вивести всі запущені служби:
$ systemctl list-units --state active --type service
Потім ви вимкнете кожну непотрібну службу за допомогою:
$ sudo systemctl disable UNIT --now
Ця команда зупинить службу та видалить її зі списку служб, щоб запобігти її запуску під час наступного завантаження системи.
Крім того, щоб отримати перелік мережних служб, які перебувають в стані прослуховування, ви можете використовувати netstat
на старих системах (за умови, що у вас встановлено пакет net-tools
):
$ netstat -ltu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN tcp6 0 0 [::]:http [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
Або в сучасних системах ви можете використати еквівалентну команду ss
(для “служб сокетів”):
$ ss -ltu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 0.0.0.0:bootpc 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* tcp LISTEN 0 80 127.0.0.1:mysql 0.0.0.0:* tcp LISTEN 0 128 *:http *:* tcp LISTEN 0 128 [::]:ssh [::]:*
TCP обгортки як простий міжмережний екран
У часи, коли для Linux не було доступних брандмауерів, для захисту мережних з’єднань із хостом використовувалися TCP-обгортки. Зараз багато програм більше не працюють під обгортками TCP. В останніх дистрибутивах Red Hat (наприклад, Fedora 29) підтримку TCP-обгорток було повністю вилучено. Щоб підтримувати застарілі системи Linux, які все ще використовують TCP-обгортки, корисно мати деякі базові знання про цю конкретну технологію.
Ми ще раз використаємо SSH-службу як базовий приклад. Сервіс в нашому прикладі хосту має бути доступним лише з локальної мережі. Спочатку ми перевіряємо, чи використовує SSH-демон бібліотеку libwrap
, яка пропонує підтримку TCP-обгорток:
$ ldd /usr/sbin/sshd | grep "libwrap" libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f91dbec0000)
Тепер ми додаємо такий рядок у файл /etc/hosts.deny
:
sshd: ALL
Нарешті ми налаштовуємо виняток у файлі /etc/hosts.allow
для SSH-з’єднань з локальної мережі:
sshd: LOCAL
Зміни набувають чинності зразу, перезапускати жодну службу не потрібно. Ви можете перевірити це за допомогою клієнта ssh
.
Вправи до посібника
-
Як можна розблокувати раніше заблокований обліковий запис
emma
? -
Раніше обліковий запис
emma
мав встановлений термін дії. Як можна встановити термін придатності наnever
? -
Уявіть, що служба друку CUPS, яка обробляє завдання друку, не потрібна на вашому сервері. Як відключити послугу назавжди? Як перевірити, що відповідний порт більше не активний?
-
Ви встановили веб-сервер nginx. Як можна перевірити, чи підтримує nginx TCP-обгортки?
Дослідницькі вправи
-
Перевірте, чи наявність файлу
/etc/nologin
не перешкоджає входу користувачаroot
? -
Чи наявність файлу
/etc/nologin
запобігає входу без пароля за допомогою SSH-ключів? -
Що відбувається під час входу, якщо файл
/etc/nologin
містить тільки цей рядок текстуlogin currently is not possible
? -
Чи може звичайний користувач
emma
отримати інформацію про користувачаroot
, що міститься у файлі/etc/passwd
, наприклад, за допомогою командиgrep root /etc/passwd
? -
Чи може звичайний користувач
emma
отримати інформацію про свій власний хешований пароль, що міститься у файлі/etc/shadow
, наприклад, за допомогою командиgrep emma /etc/shadow
? -
Які кроки потрібно зробити, щоб увімкнути та перевірити застарілу службу daytime, яку оброблятиме xinetd? Зауважте, що це лише дослідницька вправа, не робіть цього у робочому середовищі.
Підсумки
На цьому уроці ви дізналися про:
-
У якому файлі зберігаються паролі, а також деякі налаштування безпеки паролів, наприклад, термін придатності.
-
Призначення супердемона
xinetd
і як його запустити, а також запуск службиsshd
за вимогою. -
Як перевірити, які мережні служби запущені та як вимкнути непотрібні служби.
-
Використання TCP-обгорток у якості простого міжмережного екрану.
Команди, які використовуються в лабораторних роботах і вправах:
chage
-
Змінити термін дії пароля користувача.
chkconfig
-
Класична команда, спочатку використовувалася в системах на базі Red Hat, щоб установити, чи запускатиметься служба під час завантаження чи ні.
netstat
-
Класична утиліта (тепер у пакеті
net-tools
), що відображає демони, які отримують доступ до мережних портів у системі та їхнє використання. nologin
-
Команда, яку можна використовувати замість оболонки користувача, щоб запобігти входу в систему.
passwd
-
Використовується для створення або зміни пароля користувача.
service
-
Застарілий метод керування статусом демона, наприклад зупинка або запуск служби.
ss
-
Сучасний еквівалент
netstat
, але також відображає більше інформації про різні сокети, що використовуються в системі. systemctl
-
Команда керування системою, яка використовується для керування різними аспектами служб і сокетів на комп’ютері за допомогою systemd.
update-rc.d
-
Класична команда, подібна до
chkconfig
, яка дозволяє або вимикає запуск системи під час завантаження дистрибутивів на основі Debian. xinetd
-
Супердемон, який може контролювати доступ до мережної служби на вимогу, таким чином залишаючи службу неактивною, доки її фактично не викличуть для виконання певного завдання.
Відповіді до вправ посібника
-
Як можна розблокувати раніше заблокований обліковий запис
emma
?Суперкористувач може запустити
passwd -u emma
, щоб розблокувати обліковий запис. -
Раніше обліковий запис
emma
мав встановлений термін дії. Як можна встановити термін придатності наnever
?Суперкористувач може використвати
chage -E -1 emma
, щоб встановити нескінченим термін дії. Цей параметр можна перевірити за допомогоюchage -l emma
. -
Уявіть, що служба друку CUPS, яка обробляє завдання друку, не потрібна на вашому сервері. Як відключити послугу назавжди? Як перевірити, що відповідний порт більше не активний?
Від імені суперкористувача запустити
systemctl disable cups.service --now
Тепер можна перевірити
netstat -l | grep ":ipp "` or `ss -l | grep ":ipp "
-
Ви встановили веб-сервер nginx. Як можна перевірити, чи підтримує nginx TCP-обгортки?
Команда
ldd /usr/sbin/nginx | grep "libwrap"
покаже запис, якщо nginx підтримує TCP-обгортки.
Відповіді до дослідницьких вправ
-
Перевірте, чи наявність файлу
/etc/nologin
не перешкоджає входу користувачаroot
?Користувач
root
все ще може ввійти. -
Чи наявність файлу
/etc/nologin
запобігає входу без пароля за допомогою SSH-ключів?Так, вхід без пароля також заборонено.
-
Що відбувається під час входу, якщо файл
/etc/nologin
містить тільки цей рядок текстуlogin currently is not possible
?Буде показано повідомлення
login currently is not possible
, і вхід буде заборонено. -
Чи може звичайний користувач
emma
отримати інформацію про користувачаroot
, що міститься у файлі/etc/passwd
, наприклад, за допомогою командиgrep root /etc/passwd
?Так, оскільки всі користувачі мають дозвіл на читання цього файлу.
-
Чи може звичайний користувач
emma
отримати інформацію про свій власний хешований пароль, що міститься у файлі/etc/shadow
, наприклад, за допомогою командиgrep emma /etc/shadow
?Ні, оскільки звичайні користувачі не мають дозволу на читання цього файлу.
-
Які кроки потрібно зробити, щоб увімкнути та перевірити застарілу службу daytime, яку оброблятиме xinetd? Зауважте, що це лише дослідницька вправа, не робіть цього у робочому середовищі.
Спочатку змініть файл
/etc/xinetd.d/daytime
і встановіть директивуdisable = no
. Потім перезапустіть службу xinetdsystemctl restart xinetd.service
(абоservice xinetd restart
на системах із SyS-V-Init). Тепер ви можете перевірити, чи працюєnc localhost daytime
. Замістьnc
ви також можете використовуватиnetcat
.