ENote
  • ✨Home
    • Відмова від відповідальності
  • Progr
    • Python
      • Модулі
        • pip
        • cgitb
        • datetime
          • Класс datetime() модуля datetime
            • Методы объекта datetime.datetime()
            • datetime.datetime examples
          • Класс timedelta() модуля datetime
            • datetime.timedelta examples
          • Класс date() модуля datetime
            • datetime.date examples
          • Класс time() модуля datetime
            • Формат для функций .strftime() и .strptime(). модуля datetime
        • os.path
        • pathlib
          • pathlib to str
        • subproces
        • os
        • Jinja
          • Синтаксис шаблонів Jinja
          • Клас Environment()
          • Простой пример cgi-скрипта c Jinja-шаблоном
          • Создание переменных
            • Як оновити глобальну змінну зсередини оператора IF / ELSE або циклу FOR
          • Фільтри і методи
          • Число у рядок, slices
          • Вбудовані фільтри Jinja2
        • re
          • re.search - example
          • re.findall - example
        • email / smtplib
          • Как отправлять электронные письма с помощью Python
        • requests
          • Як зберегти та завантажити файли cookie в запитах Python?
          • Извлечение и установка cookies с модулем requests в Python
          • Links
        • http.cookies
          • Всё о работе с cookie в Python — класс http.cookies
        • xlrd
        • xlwt
        • borb
          • ChunkOfText
          • send_usage_statistics
          • borb clear
          • 2.1.3 vs 2.1.15
          • QR-code
          • Залежності borb
        • JSON
          • Кирилиця в JSON
        • matplotlib
        • argparse
        • click
        • configparser
        • traceback
        • sys
          • exit()
        • mysql-connector-python
        • logging
        • icrawler
        • Auto Plates
        • rembg
        • random
      • Strings
        • Built-in methods
        • Форматування виводу
        • Початкові нулі
        • Рядок в число
      • list
        • Об’єднання списків
        • list.sort(), sorted()
        • list.reverse(), reversed()
        • all(), any()
        • sum(), min(), max()
        • map(), filter(), reduce()
        • join(), split()
      • tuple
      • dict
        • Об'єднання / злиття словників
        • Сортування словника Python: значення, ключі тощо
      • set
      • class Enum
      • Середнє арифметичне
      • Virtual environment
        • web-app
      • type(), isinstance()
      • __main__
      • Files & Dirs
        • Try except for exception handling
        • Cписок файлов директории
        • User Home Dir
        • Copy file
      • *args, **qwargs
      • Links
      • Область видимости
      • Handling a File Error
      • assert
      • if
      • Числа
        • Округлення чисел
        • Отримати число з рядка
      • Обработка исключений в Python
      • Файлы и сериализация данных
      • OOP
      • Net and Web
      • Структура проекта на Python
      • Распаковка итерируемых объектов
      • Links
      • Algorithms
      • Python exit commands: quit(), exit(), sys.exit() and os._exit()
      • Цикли for / while
      • uuid
    • JavaScript
      • String
        • replaceAll() polyfill
        • Шаблонные строки
      • Array
        • Все способы перебора массива в JavaScript
      • Object
      • document.location
      • RegExp
      • Examples
        • Вычисление остатка от деления
        • Остаток от деления и деление без остатка
        • Округление числа
      • XMLHttpRequest
      • alert, prompt, confirm
      • onclick
      • hidden, display:none
      • LocalStorage, sessionStorage
      • null, undefined
      • cookies (js)
      • var, let и const
        • var vs let
        • const
      • Модифікація DOM
        • DOM select
      • JSON
        • Try
      • fetch
      • typeof
      • FormData не включає disabled набори полів
      • FormData, fdata
      • Більше одного відео YouTube на одній сторінці
    • HTML, CSS
      • favicon
      • Деякі спецсимволи
      • meta
      • ASCII table
      • lang
      • Псевдоелементи ::after і ::before
      • Cursor
      • Об использовании нестандартных пробелов
      • Картинка фоном
      • Безпечні веб-шрифти
      • Завжди внизу, незалежно від пропорцій екрану
      • напівпрозорий елемент
      • Символи з тінью
      • SVG (bootstrap)
      • rel = canonical
      • link stylesheet: integrity & crossorigin
      • rel = noopener
    • Bootstrap
      • Form Validate
      • Password show/hide
    • Errors
  • Dev
    • Git
      • clone
      • git-scm (book)
      • git config
        • files .git*
        • core.filemode
        • core.sharedRepository
      • .gitignore
      • .gitkeep
      • Видалити з репозиторію
        • Видалений файл з однієї гілки...
      • Пам’ятка
        • Перегляд історії комітів
        • Скасувати git add
        • revert
        • Скасувати внесені зміни у файл
        • Додати до коміту файл
        • Видалити історію попередніх коммітів, та почати "з нуля"
        • Додати файли в останній коміт
      • Робота з гілками
        • Порівняти гілки
      • Git за полчаса
      • Три розділи проєкту Git
      • Merge conflict
      • Pull error
        • Git Error: You have divergent branches...
      • diff
      • Video
      • Merge скасувати
      • .gitignore: Permission denied
    • GitHub
      • SSH-підключення до GitHub
      • Перенести на сервер локальный репозиторий
      • Перенести на сервер репозиторій разом з історією
      • Створення змісту
    • Security
      • robots.txt
      • Cookies
    • Аутентифікація і cookies
      • ChatGPT
  • data
    • MySQL
      • MyISAM vs InnoDB
      • Типи даних
        • NULL (todo)
        • TIMESTAMP
        • YEAR
        • JSON
        • Требования к памяти для символьных типов
        • Поиск записей в таблице, которым нет соответствия в другой
      • Приклад створення БД, та користувача
        • Права для пользователей
      • Переглянути всі індекси таблиці
      • Копіювання, клонування таблиць
      • TEMPORARY TABLE
      • JOIN
      • ALTER TABLE
      • AUTO_INCREMENT
        • AUTO_INCREMENT у складовому індексі
      • LIMIT
        • Использование MySQL LIMIT
      • 10 Примеров входной загрузки данных из текстового файла в таблицы MySQL
      • Рішення
        • Выявление и удаление несвязанных записей
        • Выборка произвольных записей
        • Коректне сортування українських літер
        • Найти записи, которые присутствуют в одной таблице и отсутствуют во второй
        • Как удобно посмотреть данные...
        • Нахождение "дыр" в нумерации
        • Знайти дубликати полів в одній таблиці
        • Дані колонки 1 табл. перенести в 2 табл.
      • Функції
        • LAST_INSERT_ID()
        • GROUP_CONCAT
        • COUNT + DISTINCT
        • Функции для работы с датами и временем
      • Автоматизируйте создание бэкапов
      • mysqldump
        • Time Zone UTC
      • Результат запиту у файл
      • Результат запиту у змінну
      • Пособие по MySQL на Python
      • Змінні
      • Эмуляция функции row_number() в MySQL
      • Изучаем хранимые процедуры MySQL
      • SELECT DISTINCT
      • Dump всієї бази даних
      • Індекси
      • FOREIGN KEY
      • MAX(), MIN()
      • LENGTH, CHAR_LENGTH
      • Встановлення
    • MariaDB
    • PostgreSQL
      • Работа с базой данных PostgreSQL
      • Работаем с PostgreSQL через командную строку в Linux
    • Domains
      • Життєвий цикл доменів
      • Статус домена
    • SQLite, MySQL и PostgreSQL: сравниваем популярные реляционные СУБД
  • Linux
    • DNS
      • Как в DNS прописать 301 редирект
      • mail
        • SPF
          • Mirohost
        • _dmarc _domainkey
        • DKIM
        • Прописати ключі DKIM в exim
        • Листи з неіснуючим адресатом
    • Server
      • Zomro
        • pip
        • SSH-доступ по ключу (zomro)
        • venv
        • UnicodeEncodeError: 'latin-1' codec can't encode character
        • Mail Ports
        • Редірект з SSL-сертификатом на транзитному сайті
        • Редірект з SSL за допомогою .htaccess
      • Створення нового користувача з привілеями sudo в Ubuntu
      • SSH-доступ по ключу
      • Часовий пояс в Ubuntu 20.04
      • SSH-підключення командний рядок
      • Як встановити Python 3.9 (нижчу) на Ubuntu 22.04
      • Автозагрузка сервисов в Ubuntu
      • Підвищення безпеки SSH
      • Ubuntu Server
        • Art 01
    • Commands
      • adduser
      • apt
      • cat
      • ls
      • tar
      • ln
      • find
      • chmod
      • chown
      • mv
      • dig
      • ping
      • passwd
      • htpasswd
      • umask
      • usermode
      • history
      • cmp
      • chattr +i
    • Config
      • Keyboard
      • windows
      • My kbdswtch
      • Затримка при завантаженні системи
      • Files
        • /etc/resolv.conf
        • /boot/grub/grub.cfg
        • .config/user-dir.dirs
        • /etc/fstab
      • Як встановити шрифти
    • Apache
      • Встановлення
      • Подключить виртуальный хост
      • Файл .htaccess
        • Установка индексного файла
        • Фільтр IP-адрес
        • ModRewrite
          • Заборонити доступ за User-Agent
          • Перенаправити на іншу сторінку
          • Додавати слеш до адреси
        • Включити SSI
        • Виконувати скрипти CGI
        • Тимчасовий перехід з одного домену на інший
      • SSI
      • SSL
      • Відключити старт Apache з системою
      • Помилки
        • Скрипт не працює
        • CGI-скрипт не виводить кирилицю
        • Could not reliably determine
        • Permissions are missing on a component of the path
        • Symbolic link not allowed or link target not accessible
      • AddType, AddLanguage, AddCharset
    • Nginx
      • 301 редирект з www. та http: на https://(без www.)domain
    • Soft
      • SublimeText
        • Plugins
      • Firefox
      • Gwenview
      • inkscape
      • Double Commander
      • nano
      • mc
        • Знайти потрібний файл
      • meld / diffuse
      • hexedit
      • Kazam - відео з екрану
      • VeraCrypt
      • XnView MP
      • LibreOffice
      • xdotool
      • System Load Monitor
      • Battery Monitor
      • qBittorrent
    • Перетворення .RPM в .DEB
    • Bash
      • Конкатенация строк в Bash
      • Page
    • Файлові часові позначки в Linux: atime, mtime, ctime
    • Права доступу для файлів і каталогів
    • Зміна паролю root
    • Быстро удалить огромное количество файлов в каталоге
    • Як узнати версію Linux?
    • USB Flash ext4
    • Clear Cache
    • Доступ до спільної папки на Windows
    • Віртуальні консолі TTY1–TTY6
    • APT. Заборона оновлення
  • Різне
    • GitBook
    • Банковское округление
    • Ім’я користувача Youtube
  • Hard
    • Hardware
      • Acer Extensa
      • Таймер Feron TM22
      • WD My Book World Edition 2Tb
        • FTP
        • SSH
          • Проблеми
        • SSHFS
      • Canon PIXMA E3340
      • Термометри
    • Auto
      • Акумулятор
    • Electro
    • USB Flash recovery
Powered by GitBook
On this page
  • Що являє собою SSH з’єднання
  • Налаштування параметрів підключення по SSH
  • Закриття порту SSH
  1. Linux
  2. Server

Підвищення безпеки SSH

https://vps.ua/wiki/ukr/enhancing-ssh-security/

PreviousАвтозагрузка сервисов в UbuntuNextUbuntu Server

Last updated 1 year ago

Можливість підключитися до сервера чи комп’ютера, фізично перебуваючи іншому кінці міста, країни, земної кулі, є незаперечним благом. Однак, як це часто буває, переваги отримують не лише законні користувачі, а й зловмисники. Віддалений доступ за SSH протоколом не став винятком.

Що ж являє собою цей спосіб зв’язку з сервером і як зробити підключення максимально безпечним?

Що являє собою SSH з’єднання

SSH (Secure shell) — мережевий протокол, призначений для отримання безпечного віддаленого доступу до операційної системи та керування нею.

У Linux системах підключення за захищеним протоколом здійснюється за допомогою наступної команди:

ssh user_name@remote_host

Під віддаленим хостом у разі мається на увазі IP-адреса чи домен, до якого ви хочете подключиться. Для входу на сервер, система запросить ввести пароль авторизації. Після успішного підключення ви отримаєте доступ до керування пристроєм через командний рядок.

Щоб перервати з’єднання і повернутися до локальної сесії, достатньо ввести в консолі exit.

У разі використання операційної системи Windows можна скористатися SSH-клієнтом PuTTy, робота з яким описана .

Налаштування параметрів підключення по SSH

Необхідно розуміти, що використання такого блага як ssh-з’єднання тягне за собою і ризик зазнати хакерської атаки. Зловмисники можуть спробувати проникнути на ваш віддалений сервер, використовуючи логін та пароль. Щоб звести можливість успішної атаки до мінімуму, скористаємося доступними нам засобами, а саме — зміною налаштувань підключення.

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

Про всяк випадок створюємо резервну копію конфігураційного файлу з налаштуваннями:

cp /etc/ssh/sshd_config{,.bak}

Приставка {,.bak} дозволяє скопіювати файл із зазначеним ім’ям та розширенням bak, яке присвоюється резервним копіям.

  1. PermitRootLogin

  2. AllowUsers, AllowGroups

  3. DenyUsers, DenyGroups

  4. Port

  5. ListenAddress

  6. Login GraceTime

  7. ClientAliveInterval

  8. HostbasedAuthentication.

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

PermitRootLogin Цей параметр встановлює дозвіл на вхід у систему як користувач. Для підвищення безпеки з’єднання рекомендується вимкнути таку можливість. змінити встановлене у файлі значення «Yes» на «No»:

PermitRootLogin no

За таких умов виконувати команди з правами користувача після входу на сервер можна буде за допомогою функцій su або sudo.

AllowUsers, AllowGroups Коли в системі створено багато користувачів, то згідно з початковими налаштуваннями кожен з них має можливість віддаленого доступу по SSH. Щоб дозволити доступ лише для певного кола осіб (і, відповідно, заборонити його для всіх інших), існують параметри AllowUsers та AllowGroups. Запис у конфігураційному файлі має, відповідно, вигляд:

AllowUsers user1 user2 user3
AllowGroups group1 group2 group3

де через пропуск перераховані імена користувачів та назви груп, яким дозволено підключення до сервера за SSH.

DenyUsers, DenyGroups Коли користувачів у системі багато і потрібно надати віддалений доступ більшості з них, при цьому заборонивши його окремим особам та групам, файл sshd_config вносить правки до параметрів DenyUsers, DenyGroups. Навпроти цих параметрів, аналогічно до прикладу з AllowUsers, AllowGroups, перераховуємо імена користувачів та груп, яким буде відмовлено у доступі на сервер SSH.

DenyUsers user1 user2
DenyGroups group1 group2

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

Port Щоб ускладнити завдання хакерам, варто подбати про гарне маскування свого ssh-порту.

Port 22540

ListenAddress Крім того, що ssh-з’єднання налаштовано на певному порті, підключення здійснюється на різних мережевих інтерфейсах. Іншими словами, сервер слухає безліч IP-адрес. Існує можливість вказати в конфігураційному файлі конкретні адреси інтерфейсів для входу на сервер за допомогою ListenAddress. Наприклад:

ListenAddress 192.168.1.2

Login GraceTime За замовчуванням, при підключенні до сервера по ssh користувач має 2 хвилини для введення логіну і пароля. Такого проміжку більш ніж достатньо, причому не лише для авторизованого користувача, а й для хакера. Тому час очікування на введення цих даних варто обмежити до 30-60 секунд, залежно від ваших уподобань.

Login GraceTime 30

ClientAliveInterval Цей параметр призначений для визначення часу бездіяльності користувача, після якого з’єднання автоматично розривається. Період очікування необхідно вказати в секундах, наприклад:

ClientAliveInterval 300

HostbasedAuthentication Також варто вимкнути авторизацію користувача на основі хоста за допомогою директиви:

HostbasedAuthentication не

Найкраще скористатися автентифікацією на основі ключів.

Закриття порту SSH

Ще однією перешкодою для злому вашого сервера є закриття SSH-порту або port knocking. Особливо актуально використовувати цю технологію для серверів, які не призначені для загального доступу (наприклад, сервери зберігання конфіденційних даних компанії тощо).

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

Механізм роботи port knocking досить простий. Ви встановлюєте на сервер демон knockd, налаштовуєте необхідну послідовність стуків у файлі /etc/knockd.conf і отримуєте нехитрий у використанні, але надійний на практиці інструмент протидії хакерам. Справа в тому, що в інтернет-просторі налічується близько 60 000 вільних портів, через які можна здійснити SSH-підключення. Для доступу до порту використовують, як правило, послідовність з трьох стуків. Це означає, що підібрати правильний набір портів випадковим чином або їх прорахувати стає дуже складно, а це саме те, чого ми домагаємося.

Отже, встановлюємо knockd демон:

sudo apt-get install knockd – для Ubuntu sudo aptitude install knockd – для Debian

Тепер у конфігураційному файлі /etc/knockd.conf налаштовуємо послідовність стуків, яка відкриватиме наш порт. Для цього в секції sequence перераховуємо через кому без пропуску номери портів, наприклад:

sequence = 6240,7000,8490

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

sequence = 6240,7000: udp, 8490

Пакети TCP, які надходять на сервер, потребують різних дій з боку системи. Щоб уникнути зайвого навантаження та відфільтрувати зайве, використовують параметр TCPFlags, який також прописують у файлі /etc/knockd.conf:

tcpflags = syn

Прапор SYN означає запит на з’єднання. Тобто демон knockd скануватиме лише ті пакети, які містять запит на з’єднання з сервером.

Вище ми говорили, що SSH-підключення здійснюється на різних мережевих інтерфейсах. За замовчуванням knockd розрахований на роботу з eth0. Щоб дати можливість демону контролювати інші інтерфейси, наприклад, eth1, до файлу /etc/knockd.conf додамо рядок:

Interface=eth1

Щоб «постукати» в порт, потрібен певний час. Якщо ви знаєте, яку послідовність потрібно ввести, достатньо 15-30 секунд. Саме цією межею варто обмежити максимальний час, необхідний для завершення послідовності стуків:

seq_timeout = 20

Згідно з прикладом, через 20 секунд система зчитує введену інформацію. Відповідно, якщо правильна послідовність не була завершена до закінчення цього часу, вам буде відмовлено у доступі та порт не відкриється.

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

cmd_timeout = 30

Відповідно, через 30 секунд порт закриється, якщо дані для авторизації не будуть успішно введені.

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

Для цього існують команди start_command та stop_command, відповідно.

Якщо послідовність стуків вірна, демон повинен відкрити порт SSH, через який необхідно здійснити підключення. Для цього у конфігураційному файлі /etc/knockd.conf прописуємо команду для start_command:

start_command= /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT

У разі, коли стуки були неправильними або користувач не встиг її ввести повністю до закінчення відведеного часу, knockd робить порт недоступним (невидимим).

stop_command= /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT

Фактично ми налаштовуємо правила iptables (брандмауера), де:

  • INPUT означає вхідний пакет

  • -A та -D — додавання та видалення правила, відповідно

  • -s — IP джерело пакету

  • %IP% — адреса, з якої йде запит на відкриття порту

  • -p — протокол (у разі tcp)

  • –dport — SSH-порт, який ми хочемо відкрити

  • -j — ключ, що вказує на дію над пакетом (accept — прийняти)

Коли все налаштовано та готове до роботи, запускаємо демон у фоновому режимі за допомогою команди knockd -d.

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

knock адреса_сервера 6240 7000:udp 8490
ssh адреса_сайту -p 22716 -o ConnectTimeout=30
Password:

Як бачите, на введення даних дається 30 секунд.

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

  • IP-адресою;

  • хостнеймом.

У першому випадку запит на підключення буде виглядати так:

ssh -p 22716 username@1.1.1.1

Якщо підключення йде до сервера через hostname, запит має такий вигляд:

ssh -p 22716 username@server.vps.ua

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

Тепер через текстовий редактор, наприклад, vim, emacs, , відкриваємо файл /etc/ssh/sshd_config і вносимо в нього основні правки. З метою підвищення безпеки SSH з’єднання нас цікавлять такі параметри:

За замовчуванням ssh-з’єднання здійснюватиметься через 22-й порт. Щоб порт для підключення не був такий очевидний, на будь-який інший, бажано найменш стандартний, наприклад:

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

Що являє собою SSH з’єднання
Налаштування параметрів підключення до SSH
Закриття порту SSH
в нашій статті
nano
змініть порт SSH
Змінити пароль на сервері