Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
How-To-Secure-A-Linux-Server — Пошаговое руководство по усилению безопасности Linux-сервера, охватывающее безопасность SSH, межсетевые экраны, обнаружение вторжений, аудит и настройку системы для уменьшения поверхности атаки и улучшения защиты. | Kitploit
Инструменты/GitHubGitHub/imthenachoman/how-to-secure-a-linux-server
Сканеры уязвимостейАудит конфигурацииСетевая безопасностьАнализ вредоносных программАутентификацияОбнаружение ВторженийОбучение и ОбразованиеРеагирование на ИнцидентыПодобранные Ресурсы
Анализ Журналов
GitHubimthenachoman/how-to-secure-a-linux-server

How-To-Secure-A-Linux-Server

Пошаговое руководство по усилению безопасности Linux-сервера, охватывающее безопасность SSH, межсетевые экраны, обнаружение вторжений, аудит и настройку системы для уменьшения поверхности атаки и улучшения защиты.

Репозиторий
30.3k2.0k233 дней назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

How To Secure A Linux Server

Развивающееся руководство по обеспечению безопасности Linux-сервера, которое, надеюсь, также научит вас немного основам безопасности и объяснит, почему это важно.

CC-BY-SA

Содержание

  • Введение
    • Цель руководства
    • Зачем защищать свой сервер
    • Зачем ещё одно руководство
    • Другие руководства
    • Что нужно сделать / Добавить
  • Обзор руководства
    • Об этом руководстве
    • Мой сценарий использования
    • Редактирование конфигурационных файлов — для ленивых
    • Участие
  • Перед началом
    • Определите свои принципы
    • Выбор дистрибутива Linux
    • Установка Linux
    • Требования до/после установки
    • Другие важные замечания
    • Использование Ansible playbook для защиты Linux-сервера
  • SSH-сервер
    • Важное замечание перед внесением изменений в SSH
  • Публичные/приватные ключи SSH
  • Создание SSH-группы для AllowGroups
  • Безопасная настройка /etc/ssh/sshd_config
  • Удаление коротких ключей Диффи-Хеллмана
  • 2FA/MFA для SSH
  • Основы
    • Ограничение использования sudo
    • Ограничение использования su
    • Запуск приложений в изолированной среде с FireJail
    • NTP-клиент
    • Защита /proc
    • Принудительное использование надёжных паролей
    • Автоматические обновления безопасности и оповещения
    • Более безопасный пул случайных чисел (в разработке)
    • Добавление панического/вторичного/фейкового пароля для входа
  • Сеть
    • Межсетевой экран с UFW (Uncomplicated Firewall)
    • Обнаружение и предотвращение вторжений на уровне iptables с PSAD
    • Обнаружение и предотвращение вторжений на уровне приложений с Fail2Ban
    • Обнаружение и предотвращение вторжений на уровне приложений с CrowdSec
  • Аудирование
    • Мониторинг целостности файлов/папок с AIDE (в разработке)
    • Антивирусное сканирование с ClamAV (в разработке)
    • Обнаружение руткитов с Rkhunter (в разработке)
    • Обнаружение руткитов с chrootkit (в разработке)
    • logwatch — анализатор и отчётчик системных логов
    • ss — просмотр портов, которые прослушивает ваш сервер
    • Lynis — аудит безопасности Linux
    • OSSEC — обнаружение вторжений на хосте
  • Опасная зона
  • Разное
    • MSMTP (простой Sendmail) с Google
    • Gmail и Exim4 в качестве MTA с неявным TLS
    • Отдельный файл логов iptables
  • Оставшееся
    • Связь со мной
    • Полезные ссылки
    • Благодарности
    • Лицензия и авторские права
  • (Содержание создано с помощью nGitHubTOC)

    Введение

    Цель руководства

    Цель этого руководства — научить вас обеспечивать безопасность Linux-сервера.

    Существует множество способов защитить Linux-сервер, и это руководство постарается охватить как можно больше из них. Дополнительные темы/материалы будут добавляться по мере моего обучения или поступления вклада от участников.

    Ansible playbooks для этого руководства доступны в репозитории How To Secure A Linux Server With Ansible от moltenbit.

    (К содержанию)

    Зачем защищать свой сервер

    Я предполагаю, что вы используете это руководство, потому что, надеюсь, уже понимаете, почему хорошая безопасность важна. Это обширная тема сама по себе, и её детальное рассмотрение выходит за рамки данного руководства. Если вы не знаете ответа на этот вопрос, рекомендую сначала изучить его.

    На высоком уровне: как только устройство, например сервер, оказывается в публичном доступе — то есть видимо для внешнего мира — оно становится целью для злоумышленников. Незащищённое устройство — это игровая площадка для злоумышленников, которые хотят получить доступ к вашим данным или использовать ваш сервер как ещё один узел для масштабных DDOS-атак.

    Что ещё хуже, без хорошей безопасности вы можете никогда не узнать, что ваш сервер был скомпрометирован. Злоумышленник мог получить несанкционированный доступ к вашему серверу и скопировать ваши данные, ничего не изменив, так что вы бы и не узнали. Или ваш сервер мог быть частью DDOS-атаки, и вы бы не знали об этом. Посмотрите на многие масштабные утечки данных в новостях — компании часто обнаруживали утечку или вторжение лишь спустя долгое время после того, как злоумышленники уже ушли.

    Вопреки распространённому мнению, злоумышленники не всегда хотят что-то изменить или заблокировать вам доступ к данным ради выкупа. Иногда им просто нужны данные с вашего сервера для их хранилищ данных (в больших данных большие деньги) или чтобы скрытно использовать ваш сервер для своих неблаговидных целей.

    (К содержанию)

    Зачем ещё одно руководство

    Это руководство может показаться дублирующим/излишним, потому что в интернете бесчисленное множество статей, рассказывающих как защитить Linux, но информация разбросана по разным статьям, которые охватывают разные вещи и разными способами. У кого есть время просматривать сотни статей?

    Когда я проводил исследование для своей сборки Debian, я делал заметки. В итоге я понял, что вместе с тем, что я уже знал, и тем, что я изучал, у меня получилось нечто похожее на руководство. Я решил выложить его в интернет, чтобы помочь другим учиться и экономить время.

    Я никогда не встречал одного руководства, которое охватывало бы всё — это руководство — моя попытка.

    Многие вещи, описанные в этом руководстве, могут быть довольно базовыми/тривиальными, но большинство из нас не устанавливает Linux каждый день, и легко забыть эти базовые вещи.

    (К содержанию)

    Другие руководства

    Существует множество руководств от экспертов, лидеров отрасли и самих дистрибутивов. Невозможно, а иногда и запрещено авторским правом, включать сюда всё из этих руководств. Рекомендую ознакомиться с ними перед началом работы с этим руководством.

    • Центр интернет-безопасности (CIS) предоставляет бенчмарки, которые являются исчерпывающими, надёжными в отрасли пошаговыми инструкциями по обеспечению безопасности многих вариантов Linux. Ознакомьтесь со страницей О нас для подробностей. Моя рекомендация — сначала пройти это руководство (то, которое вы читаете), а затем руководство CIS. Таким образом, их рекомендации будут иметь приоритет над любыми рекомендациями в этом руководстве.
    • Для конкретных руководств по усилению/безопасности дистрибутива обратитесь к документации вашего дистрибутива.
    • https://security.utexas.edu/os-hardening-checklist/linux-7 - Контрольный список усиления защиты Red Hat Enterprise Linux 7
    • https://cloudpro.zone/index.php/2018/01/18/debian-9-3-server-setup-guide-part-1/ - # Руководство по настройке сервера Debian 9.3
    • https://blog.vigilcode.com/2011/04/ubuntu-server-initial-security-quick-secure-setup-part-i/ - Руководство по начальной безопасности сервера Ubuntu
    • https://www.tldp.org/LDP/sag/html/index.html
    • https://seifried.org/lasg/
    • https://news.ycombinator.com/item?id=19178964
    • https://wiki.archlinux.org/index.php/Security - многие также рекомендовали этот
    • https://securecompliance.co/linux-server-hardening-checklist/

    (К содержанию)

    Что нужно сделать / Добавить

    • Пользовательские jail для Fail2ban
    • MAC (Mandatory Access Control) и модули безопасности Linux (LSM)
      • https://wiki.archlinux.org/index.php/security#Mandatory_access_control
      • Security-Enhanced Linux / SELinux
        • https://en.wikipedia.org/wiki/Security-Enhanced_Linux
        • https://linuxtechlab.com/beginners-guide-to-selinux/
        • https://linuxtechlab.com/replicate-selinux-policies-among-linux-machines/
        • https://teamignition.us/how-to-stop-being-a-scrub-and-learn-to-use-selinux.html
      • AppArmor
        • https://wiki.archlinux.org/index.php/AppArmor
        • https://security.stackexchange.com/questions/29378/comparison-between-apparmor-and-selinux
        • http://www.insanitybit.com/2012/06/01/why-i-like-apparmor-more-than-selinux-5/
    • шифрование диска
    • Rkhunter и chrootkit
      • http://www.chkrootkit.org/
      • http://rkhunter.sourceforge.net/
      • https://www.cyberciti.biz/faq/howto-check-linux-rootkist-with-detectors-software/
      • https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/
    • отправка/резервное копирование логов - https://news.ycombinator.com/item?id=19178681
    • CIS-CAT - https://learn.cisecurity.org/cis-cat-landing-page
    • debsums - https://blog.sleeplessbeastie.eu/2015/03/02/how-to-verify-installed-packages/

    (К содержанию)

    Обзор руководства

    Об этом руководстве

    Это руководство...

    • ...является работой в процессе.
    • ...сосредоточено на домашних Linux-серверах. Все концепции/рекомендации здесь применимы и к более крупным/профессиональным средам, но такие сценарии требуют более продвинутых и специализированных конфигураций, которые выходят за рамки этого руководства.
    • ...не учит вас Linux, установке Linux или его использованию. Загляните на https://linuxjourney.com/, если вы новичок в Linux.
    • ...предназначено быть независимым от дистрибутива Linux.
    • ...не рассказывает всё, что нужно знать о безопасности, и не углубляется во все аспекты безопасности системы/сервера. Например, физическая безопасность выходит за рамки этого руководства.
    • ...не описывает работу программ/инструментов и не углубляется во все их тонкости. Большинство программ/инструментов, упомянутых в этом руководстве, очень мощные и настраиваемые. Цель — охватить самое необходимое — достаточно, чтобы разжечь аппетит и побудить вас узнать больше.
    • ...стремится сделать всё просто, предоставляя код, который можно скопировать и вставить. Возможно, вам потребуется изменить команды перед вставкой, так что держите под рукой ваш любимый текстовый редактор.
    • ...организован в порядке, который имеет для меня логический смысл — то есть защита SSH перед установкой межсетевого экрана. Таким образом, это руководство предполагается проходить в том порядке, в котором оно представлено, но это не обязательно. Просто будьте осторожны, если будете делать что-то в другом порядке — некоторые разделы требуют выполнения предыдущих.

    (К содержанию)

    Мой сценарий использования

    Существует множество типов серверов и различных сценариев использования. Хотя я хочу, чтобы это руководство было максимально общим, некоторые вещи могут не подходить для всех/других сценариев. Используйте своё лучшее суждение при прохождении этого руководства.

    Чтобы дать контекст многим темам, рассматриваемым в этом руководстве, мой сценарий использования/конфигурация:

    • Настольный компьютер...
    • С одним сетевым интерфейсом...
    • Подключённый к потребительскому маршрутизатору...
    • С динамическим WAN IP от провайдера...
    • С WAN+LAN на IPV4...
    • И LAN с использованием NAT...
    • К которому я хочу иметь возможность подключаться по SSH удалённо с неизвестных компьютеров и из неизвестных мест (например, из дома друга).

    (К содержанию)

    Редактирование конфигурационных файлов — для ленивых

    Я очень ленив и не люблю редактировать файлы вручную, если в этом нет необходимости. И я предполагаю, что все остальные такие же. :)

    Поэтому, когда и где это возможно, я предоставил фрагменты кода для быстрого выполнения необходимого, например, добавления или изменения строки в конфигурационном файле.

    Фрагменты кода используют базовые команды, такие как echo, cat, sed, awk и grep. Как работают фрагменты кода, например, что делает каждая команда/часть, выходит за рамки этого руководства — страницы man вам в помощь.

    Примечание: Фрагменты кода не проверяют/подтверждают, что изменение прошло — то есть строка была фактически добавлена или изменена. Я оставлю проверку на ваше усмотрение. Шаги в этом руководстве включают создание резервных копий всех файлов, которые будут изменены.

    Не все изменения можно автоматизировать с помощью фрагментов кода. Эти изменения требуют хорошего, старого, ручного редактирования. Например, вы не можете просто добавить строку в файл типа INI. Используйте ваш любимый текстовый редактор Linux.

    (К содержанию)

    Участие

    Я хотел разместить это руководство на GitHub, чтобы упростить совместную работу. Чем больше людей внесут вклад, тем лучше и полнее станет это руководство.

    Чтобы внести вклад, вы можете сделать форк и отправить pull request или создать новую задачу.

    (К содержанию)

    Перед началом

    Определите свои принципы

    Перед началом вам нужно определить свои принципы. Какова ваша модель угроз? Вот что стоит обдумать:

    • Зачем вы хотите защитить свой сервер?
    • Как много безопасности вы хотите или не хотите?
    • Насколько удобством вы готовы пожертвовать ради безопасности и наоборот?
    • Какие угрозы вы хотите предотвратить? Каковы особенности вашей ситуации? Например:
      • Является ли физический доступ к вашему серверу/сети возможным вектором атаки?
      • Будете ли вы открывать порты на маршрутизаторе, чтобы иметь доступ к серверу извне дома?
      • Будете ли вы размещать общую папку на сервере, которая будет монтироваться на настольном компьютере? Какова вероятность заражения настольного компьютера и, в свою очередь, заражения сервера?
    • Есть ли у вас способ восстановления, если ваша реализация безопасности заблокирует вам доступ к вашему собственному серверу? Например, вы отключили вход root или защитили GRUB паролем.

    Это лишь несколько вещей, которые стоит обдумать. Прежде чем начать защищать свой сервер, вы должны понять, от чего вы пытаетесь защититься и почему, чтобы знать, что вам нужно делать.

    (К содержанию)

    Выбор дистрибутива Linux

    Это руководство предназначено быть независимым от дистрибутива, чтобы пользователи могли использовать любой дистрибутив по своему желанию. Тем не менее, есть несколько моментов, которые стоит учитывать:

    Вам нужен дистрибутив, который...

    • ...стабилен. Если вам не нравится отлаживать проблемы в 2 часа ночи, вы не хотите, чтобы неконтролируемое обновление или ручное обновление пакетов/системы сделало ваш сервер неработоспособным. Но это также означает, что вы согласны не использовать самое новейшее, лучшее, передовое программное обеспечение.
    • ...своевременно получает исправления безопасности. Вы можете защитить всё на своём сервере, но если основная ОС или запущенные приложения имеют известные уязвимости, вы никогда не будете в безопасности.
    • ...вам знаком. Если вы не знаете Linux, я советую сначала поиграть с одним из них, прежде чем пытаться его защитить. Вы должны чувствовать себя уверенно и знать, что к чему, например, как устанавливать программное обеспечение, где находятся конфигурационные файлы и т.д.
    • ...хорошо поддерживается. Даже самый опытный администратор время от времени нуждается в помощи. Наличие места, куда можно обратиться за помощью, сохранит ваше душевное равновесие.

    (К содержанию)

    Установка Linux

    Установка Linux выходит за рамки этого руководства, потому что каждый дистрибутив делает это по-своему, и инструкции по установке обычно хорошо документированы. Если вам нужна помощь, начните с документации вашего дистрибутива. Независимо от дистрибутива, общий процесс обычно выглядит так:

    1. скачайте ISO
    2. запишите/скопируйте/перенесите его на ваш установочный носитель (например, CD или USB-флешку)
    3. загрузите сервер с установочного носителя
    4. следуйте подсказкам для установки

    Где это применимо, используйте опцию экспертной установки, чтобы иметь более строгий контроль над тем, что запущено на вашем сервере. Устанавливайте только то, что вам абсолютно необходимо. Я лично не устанавливаю ничего, кроме SSH. Также отметьте опцию шифрования диска.

    (К содержанию)

    Требования до/после установки

    • Если вы открываете порты на маршрутизаторе для доступа к серверу извне, отключите перенаправление портов, пока система не будет поднята и защищена.
    • Если вы не делаете всё, физически подключившись к серверу, вам понадобится удалённый доступ, поэтому убедитесь, что SSH работает.
    • Поддерживайте систему в актуальном состоянии (например, sudo apt update && sudo apt upgrade в системах на базе Debian).
    • Убедитесь, что вы выполнили все задачи, специфичные для вашей настройки, такие как:
      • Настройка сети
      • Настройка точек монтирования в /etc/fstab
      • Создание начальных учётных записей пользователей
      • Установка базового ПО, которое вам понадобится, например man
      • И т.д.
    • Ваш сервер должен иметь возможность отправлять электронные письма, чтобы вы могли получать важные оповещения безопасности. Если вы не настраиваете почтовый сервер, ознакомьтесь с разделом Gmail и Exim4 в качестве MTA с неявным TLS.
    • Я также рекомендую прочитать бенчмарки CIS перед началом работы с этим руководством, просто чтобы усвоить/понять, что они говорят. Моя рекомендация — сначала пройти это руководство (то, которое вы читаете), а затем руководство CIS. Таким образом, их рекомендации будут иметь приоритет над любыми рекомендациями в этом руководстве.

    (К содержанию)

    Другие важные замечания

    • Это руководство пишется и тестируется на Debian. Большинство приведённых ниже вещей должны работать и на других дистрибутивах. Если вы найдёте что-то, что не работает, пожалуйста, свяжитесь со мной. Основное отличие каждого дистрибутива — это его система управления пакетами. Поскольку я использую Debian, я буду предоставлять соответствующие команды apt, которые должны работать во всех дистрибутивах на основе Debian. Если кто-то захочет предоставить соответствующие команды для других дистрибутивов, я их добавлю.
    • Пути к файлам и настройки также могут немного различаться — обратитесь к документации вашего дистрибутива, если возникнут проблемы.
    • Прочитайте всё руководство перед началом. Ваш сценарий использования и/или принципы могут потребовать отказа от некоторых действий или изменения порядка.
    • Не копируйте и не вставляйте вслепую, не понимая, что вы вставляете. Некоторые команды нужно будет изменить под ваши нужды, чтобы они заработали — например, имена пользователей.

    (К содержанию)

    Использование Ansible playbook для защиты Linux-сервера

    Ansible playbooks для этого руководства доступны в репозитории How To Secure A Linux Server With Ansible.Убедитесь, что вы отредактировали переменные в соответствии со своими потребностями и прочитали все задачи заранее, чтобы убедиться, что это не нарушит работу вашей системы. После запуска playbooks убедитесь, что все настройки настроены по вашему желанию!

    1. Установите Ansible
    2. git clone How To Secure A Linux Server With Ansible
    3. Create SSH-Public/Private-Keys ``` ssh-keygen -t ed25519
    root@kitploit:~
    Измените все переменные в *group_vars/variables.yml* в соответствии с вашими потребностями.
    6. Включите SSH-доступ от root перед запуском playbooks:  ```
    nano /etc/ssh/sshd_config
    [...]
    PermitRootLogin yes
    [...]
    
    1. Рекомендуется: настроить статический IP-адрес вашей системы.
    2. Добавьте IP-адрес вашей системы в hosts.yml.

     

    Запустите плейбук требований, используя пароль root, который вы указали при установке сервера:

    root@kitploit:~
    ansible-playbook --inventory hosts.yml --ask-pass requirements-playbook.yml
    

     

    Запустите основной плейбук с паролем нового пользователя, который вы указали в файле variables.yml:

    root@kitploit:~
    ansible-playbook --inventory hosts.yml --ask-pass main-playbook.yml
    

     

    Если вам нужно запускать плейбуки несколько раз, не забудьте использовать SSH-ключ и новый SSH-порт:

    root@kitploit:~
    ansible-playbook --inventory hosts.yml -e ansible_ssh_port=SSH_PORT --key-file /PATH/TO/SSH/KEY main-playbook.yml
    

    (Содержание)

    SSH-сервер

    Важное примечание перед внесением изменений в SSH

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

    Спасибо Sonnenbrand за эту идею.

    Публичные/приватные ключи SSH

    Зачем

    Использование публичных/приватных ключей SSH более безопасно, чем использование пароля. Это также упрощает и ускоряет подключение к нашему серверу, поскольку вам не нужно вводить пароль.

    Как это работает

    Обратитесь к ссылкам ниже для получения более подробной информации, но на высоком уровне публичные/приватные ключи работают, используя пару ключей для проверки личности.

    1. Один ключ — публичный ключ — может только шифровать данные, но не расшифровывать их
    2. Другой ключ — приватный ключ — может расшифровывать данные

    Для SSH на клиенте создаётся публичный и приватный ключ. Вы должны хранить оба ключа в безопасности, особенно приватный ключ. Несмотря на то, что публичный ключ предназначен для распространения, разумно убедиться, что ни один из ключей не попадёт в чужие руки.

    Когда вы подключаетесь к SSH-серверу, SSH ищет публичный ключ, соответствующий клиенту, с которого вы подключаетесь, в файле ~/.ssh/authorized_keys на сервере, к которому вы подключаетесь. Обратите внимание, что файл находится в домашней папке учётной записи, под которой вы пытаетесь подключиться. Итак, после создания публичного ключа его нужно добавить в ~/.ssh/authorized_keys. Один из подходов — скопировать его на USB-накопитель и физически перенести на сервер. Другой подход — использовать ssh-copy-id для передачи и добавления публичного ключа.

    После того как ключи созданы и публичный ключ добавлен в ~/.ssh/authorized_keys на хосте, SSH использует публичный и приватный ключи для проверки личности и установления защищённого соединения. То, как проверяется личность, — сложный процесс, но у Digital Ocean есть очень хорошее описание того, как это работает. На высоком уровне личность проверяется сервером: он шифрует проверочное сообщение публичным ключом, затем отправляет его клиенту. Если клиент не может расшифровать проверочное сообщение приватным ключом, личность не может быть подтверждена, и соединение не будет установлено.

    Они считаются более безопасными, потому что для установления SSH-соединения требуется приватный ключ. Если вы установите PasswordAuthentication no в /etc/ssh/sshd_config, то SSH не позволит вам подключиться без приватного ключа.

    Вы также можете установить кодовую фразу для ключей, что потребует ввода кодовой фразы ключа при подключении с использованием публичных/приватных ключей. Имейте в виду, что это делает ключ непригодным для автоматизации, поскольку у вас не будет способа отправить кодовую фразу в ваших скриптах. ssh-agent — это программа, которая поставляется со многими дистрибутивами Linux (и обычно уже запущена) и позволяет хранить расшифрованный приватный ключ в памяти в течение настраиваемого времени. Просто выполните ssh-add, и он запросит вашу кодовую фразу. Вас не будут снова запрашивать кодовую фразу до истечения настраиваемого времени.

    Мы будем использовать ключи Ed25519, которые, согласно https://linux-audit.com/:

    Использует схему подписи на эллиптических кривых, что обеспечивает лучшую безопасность, чем ECDSA и DSA. В то же время она также обладает хорошей производительностью.

    Цели

    • Публичные/приватные ключи SSH Ed25519:
      • приватный ключ на вашем клиенте
      • публичный ключ на вашем сервере

    Примечания

    • Этот шаг необходимо выполнить для каждого компьютера и учётной записи, с/под которыми вы будете подключаться к вашему серверу.

    Ссылки

    • https://www.ssh.com/ssh/public-key-authentication
    • https://help.ubuntu.com/community/SSH/OpenSSH/Keys
    • https://linux-audit.com/using-ed25519-openssh-keys-instead-of-dsa-rsa-ecdsa/
    • https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process
    • https://wiki.archlinux.org/index.php/SSH_Keys
    • https://www.ssh.com/ssh/copy-id
    • man ssh-keygen
    • man ssh-copy-id
    • man ssh-add

    Шаги

    1. На компьютере, который вы будете использовать для подключения к вашему серверу, на клиенте, а не на самом сервере, создайте ключ Ed25519 с помощью ssh-keygen:

      root@kitploit:~
      ssh-keygen -t ed25519
      
      root@kitploit:~
      Generating public/private ed25519 key pair.
      Enter file in which to save the key (/home/user/.ssh/id_ed25519):
      Created directory '/home/user/.ssh'.
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in /home/user/.ssh/id_ed25519.
      Your public key has been saved in /home/user/.ssh/id_ed25519.pub.
      The key fingerprint is:
      SHA256:F44D4dr2zoHqgj0i2iVIHQ32uk/Lx4P+raayEAQjlcs user@client
      The key's randomart image is:
      +--[ED25519 256]--+
      |xxxx  x          |
      |o.o +. .         |
      | o o oo   .      |
      |. E oo . o .     |
      | o o. o S o      |
      |... .. o o       |
      |.+....+ o        |
      |+.=++o.B..       |
      |+..=**=o=.       |
      +----[SHA256]-----+
      

      Примечание: Если вы установили кодовую фразу, вам нужно будет вводить её каждый раз при подключении к серверу с использованием этого ключа, если вы не используете ssh-agent.

    2. Теперь вам нужно добавить публичный ключ ~/.ssh/id_ed25519.pub с вашего клиента в файл ~/.ssh/authorized_keys на вашем сервере. Поскольку мы, скорее всего, всё ещё в домашней локальной сети, мы, вероятно, в безопасности от атак MIM, поэтому мы воспользуемся ssh-copy-id для передачи и добавления публичного ключа:

      root@kitploit:~
      ssh-copy-id user@server
      
      root@kitploit:~
      /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub"
      The authenticity of host 'host (192.168.1.96)' can't be established.
      ECDSA key fingerprint is SHA256:QaDQb/X0XyVlogh87sDXE7MR8YIK7ko4wS5hXjRySJE.
      Are you sure you want to continue connecting (yes/no)? yes
      /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
      /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
      user@host's password:
      
      Number of key(s) added: 1
      
      Now try logging into the machine, with:   "ssh 'user@host'"
      and check to make sure that only the key(s) you wanted were added.
      
      root@kitploit:~

    Сейчас хорошее время для выполнения любых задач, специфичных для вашей настройки.

    (Содержание)

    Создание группы SSH для AllowGroups

    Зачем

    Чтобы упростить управление доступом к SSH на сервер. Используя группу, мы можем быстро добавлять/удалять учётные записи в/из группы, чтобы быстро разрешать или запрещать SSH-доступ к серверу.

    Как это работает

    Мы будем использовать опцию AllowGroups в конфигурационном файле SSH /etc/ssh/sshd_config, чтобы указать SSH-серверу разрешать вход только тем пользователям, которые являются членами определённой группы UNIX. Любой, кто не входит в группу, не сможет войти через SSH.

    Цели

    • группа UNIX, которую мы будем использовать в Secure /etc/ssh/sshd_config для ограничения тех, кто может подключаться к серверу по SSH

    Примечания

    • Это предварительное условие для поддержки настройки AllowGroup, устанавливаемой в Secure /etc/ssh/sshd_config.

    Ссылки

    • man groupadd
    • man usermod

    Шаги

    1. Создайте группу:

      root@kitploit:~
      sudo groupadd sshusers
      
    2. Добавьте учётные записи в группу:

      root@kitploit:~
      sudo usermod -a -G sshusers user1
      sudo usermod -a -G sshusers user2
      sudo usermod -a -G sshusers ...
      

      Это нужно сделать для каждой учётной записи на вашем сервере, которой требуется SSH-доступ.

    (Содержание)

    Защита /etc/ssh/sshd_config

    Зачем

    SSH — это дверь на ваш сервер. Особенно это актуально, если вы открываете порты на своём маршрутизаторе, чтобы иметь возможность подключаться к серверу по SSH из-за пределов домашней сети. Если он не настроен должным образом, злоумышленник может использовать его для получения несанкционированного доступа к вашей системе.

    Как это работает

    /etc/ssh/sshd_config — это файл конфигурации по умолчанию, который использует SSH-сервер. Мы будем использовать этот файл, чтобы указать, какие опции должен использовать SSH-сервер.

    Цели

    • безопасная конфигурация SSH

    Примечания

    • Убедитесь, что вы сначала выполнили Create SSH Group For AllowGroups.

    Ссылки

    • Рекомендации Mozilla по OpenSSH для OpenSSH 6.7+ на https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67
    • https://linux-audit.com/audit-and-harden-your-ssh-configuration/
    • https://www.ssh.com/ssh/sshd_config/
    • https://www.techbrown.com/harden-ssh-secure-linux-vps-server/ (недоступно; попробуйте http://web.archive.org/web/20200413100933/https://www.techbrown.com/harden-ssh-secure-linux-vps-server/)
    • https://serverfault.com/questions/660160/openssh-difference-between-internal-sftp-and-sftp-server/660325
    • man sshd_config
    • Спасибо than0s за способ поиска дублирующихся настроек.

    Шаги

    1. Сделайте резервную копию конфигурационного файла OpenSSH-сервера /etc/ssh/sshd_config и удалите комментарии, чтобы его было легче читать:

      root@kitploit:~
      sudo cp --archive /etc/ssh/sshd_config /etc/ssh/sshd_config-COPY-$(date +"%Y%m%d%H%M%S")
      sudo sed -i -r -e '/^#|^$/ d' /etc/ssh/sshd_config
      
    2. Отредактируйте /etc/ssh/sshd_config, затем найдите и отредактируйте или добавьте следующие настройки, которые должны применяться независимо от вашей конфигурации/настройки:

      Примечание: SSH не любит дублирующиеся противоречащие настройки. Например, если у вас есть ChallengeResponseAuthentication no, а затем ChallengeResponseAuthentication yes, SSH будет учитывать первую настройку и игнорировать вторую. В вашем файле /etc/ssh/sshd_config уже могут быть некоторые из перечисленных ниже настроек/строк. Чтобы избежать проблем, вам нужно будет вручную просмотреть файл /etc/ssh/sshd_config и устранить любые дублирующиеся противоречащие настройки.

      Примечание: Если вы используете OpenSSH 9.1 или новее, раскомментируйте строку RequiredRSASize 3072 в конфигурации ниже. Это устанавливает минимальный размер RSA-ключа в 3072 бит и будет отклонять более короткие RSA-ключи при аутентификации. Это касается только RSA-ключей. Если вы используете ключи ED25519 или ECDSA, это вас не касается. Вы можете проверить тип и размер вашего ключа с помощью ssh-keygen -l -f ~/.ssh/id_rsa. На более старых версиях OpenSSH оставьте строку закомментированной, так как это помешает запуску sshd.

      root@kitploit:~
      ########################################################################################################
      # start settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
      ########################################################################################################
      
      # Supported HostKey algorithms by order of preference.
      HostKey /etc/ssh/ssh_host_ed25519_key
      HostKey /etc/ssh/ssh_host_rsa_key
      HostKey /etc/ssh/ssh_host_ecdsa_key
      
      KexAlgorithms [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
      
      Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
      
      MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
      
      # LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear audit track of which key was using to log in.
      LogLevel VERBOSE
      
      # Use kernel sandbox mechanisms where possible in unprivileged processes
      # Systrace on OpenBSD, Seccomp on Linux, seatbelt on MacOSX/Darwin, rlimit elsewhere.
      # Note: This setting is deprecated in OpenSSH 7.5 (https://www.openssh.com/txt/release-7.5)
      # UsePrivilegeSeparation sandbox
      
      ########################################################################################################
      # end settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
      ########################################################################################################
      
      # don't let users set environment variables
      PermitUserEnvironment no
      
      # Log sftp level file access (read/write/etc.) that would not be easily logged otherwise.
      Subsystem sftp  internal-sftp -f AUTHPRIV -l INFO
      
      # disable X11 forwarding as X11 is very insecure
      # you really shouldn't be running X on a server anyway
      X11Forwarding no
      
      # disable port forwarding
      AllowTcpForwarding no
      AllowStreamLocalForwarding no
      GatewayPorts no
      PermitTunnel no
      
      # don't allow login if the account has an empty password
      PermitEmptyPasswords no
      
      # ignore .rhosts and .shosts
      IgnoreRhosts yes
      
      # verify hostname matches IP
      UseDNS yes
      
      Compression no
      
      # TCP keepalive is spoofable (runs outside the encrypted channel)
      # Use ClientAlive instead (runs inside the encrypted channel)
      TCPKeepAlive no
      
      AllowAgentForwarding no
      PermitRootLogin no
      
      # don't allow .rhosts or /etc/hosts.equiv
      HostbasedAuthentication no
      
      # OpenSSH 9.1 and later
      # Enforce a minimum RSA key size of 3072 bits
      # https://www.keylength.com/en/compare/
      # RequiredRSASize 3072
      
      # https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/115
      HashKnownHosts yes
      
    3. Затем найдите и отредактируйте или добавьте следующие настройки и укажите значения в соответствии с вашими требованиями:

    4. Убедитесь, что нет дублирующихся настроек, которые противоречат друг другу. Следующая команда не должна выводить ничего.

      root@kitploit:~
      awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
      
    5. Перезапустите ssh:

      root@kitploit:~
      sudo service sshd restart
      
    6. Вы можете проверить конфигурацию с помощью sshd -T и убедиться в правильности вывода:

      root@kitploit:~
      sudo sshd -T
      
      root@kitploit:~
      port 22
      addressfamily any
      listenaddress [::]:22
      listenaddress 0.0.0.0:22
      usepam yes
      logingracetime 30
      x11displayoffset 10
      maxauthtries 2
      maxsessions 2
      clientaliveinterval 15
      clientalivecountmax 3
      streamlocalbindmask 0177
      permitrootlogin no
      ignorerhosts yes
      ignoreuserknownhosts no
      hostbasedauthentication no
      ...
      subsystem sftp internal-sftp -f AUTHPRIV -l INFO
      maxstartups 2:30:2
      permittunnel no
      ipqos lowdelay throughput
      rekeylimit 0 0
      permitopen any
      

    (Содержание)

    Удаление коротких ключей Диффи-Хеллмана

    Зачем

    Согласно рекомендациям Mozilla по OpenSSH для OpenSSH 6.7+, «все модули Диффи-Хеллмана должны быть длиной не менее 3072 бит».

    Алгоритм Диффи-Хеллмана используется SSH для установления безопасного соединения. Чем больше модуль (размер ключа), тем надёжнее шифрование.

    Цели

    • удалить все ключи Диффи-Хеллмана длиной менее 3072 бит

    Ссылки

    • Рекомендации Mozilla по OpenSSH для OpenSSH 6.7+ на https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67
    • https://infosec.mozilla.org/guidelines/key_management
    • man moduli

    Шаги

    1. Сделайте резервную копию файла модулей SSH /etc/ssh/moduli:

      root@kitploit:~
      sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
      
    2. Удалите короткие модули:

      root@kitploit:~
      sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
      sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
      

    (Содержание)

    2FA/MFA для SSH

    Зачем

    Хотя SSH является довольно хорошим стражем безопасности для ваших дверей и окон, это всё же видимая дверь, которую злоумышленники могут заметить и попытаться подобрать пароль brute-force. Fail2ban будет отслеживать такие попытки brute-force, но не бывает слишком много безопасности. Требование двух факторов добавляет дополнительный уровень безопасности.

    Использование двухфакторной аутентификации (2FA) / многофакторной аутентификации (MFA) требует от каждого входящего иметь два ключа для входа, что затрудняет действия злоумышленников. Два ключа:

    1. Их пароль
    2. 6-значный токен, который меняется каждые 30 секунд

    Без обоих ключей они не смогут попасть внутрь.

    Почему нет

    Многим пользователям такой процесс может показаться громоздким или раздражающим. Кроме того, доступ к системе зависит от сопутствующего приложения-аутентификатора, которое генерирует код.

    Как это работает

    В Linux за аутентификацию отвечает PAM. У PAM есть четыре задачи, о которых вы можете прочитать на https://en.wikipedia.org/wiki/Linux_PAM. В этом разделе рассматривается задача аутентификации.

    Когда вы входите на сервер (напрямую через консоль или через SSH), дверь, через которую вы прошли, отправляет запрос на задачу аутентификации PAM, и PAM запрашивает и проверяет ваш пароль. Вы можете настроить правила для каждой двери. Например, у вас может быть один набор правил при входе напрямую через консоль и другой набор правил при входе через SSH.

    В этом разделе мы изменим правила аутентификации для входа через SSH, чтобы требовался как пароль, так и 6-значный код.Мы будем использовать PAM-модуль libpam-google-authenticator от Google для создания и проверки TOTP-ключа. В статьях https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/ и https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/ очень хорошо описана работа TOTP.

    Мы сделаем так: настроим конфигурацию PAM для SSH на сервере таким образом, чтобы сначала запрашивался пароль, а затем числовой токен. PAM проверит пароль пользователя и, если он верен, направит запрос аутентификации к libpam-google-authenticator, который запросит и проверит ваш 6-значный токен. Только если всё в порядке, аутентификация будет успешной, и пользователь получит доступ к входу.

    Цели

    • 2FA/MFA включена для всех SSH-подключений

    Примечания

    • Прежде чем выполнять это, вы должны иметь представление о том, как работает 2FA/MFA, и вам понадобится приложение-аутентификатор на телефоне для продолжения.
    • Мы будем использовать google-authenticator-libpam.
    • При описанной ниже конфигурации пользователю потребуется вводить код 2FA/MFA только при входе по паролю, но не при использовании SSH-ключей. Обратитесь к документации, чтобы изменить это поведение в соответствии с вашими требованиями.

    Ссылки

    • https://github.com/google/google-authenticator-libpam
    • https://en.wikipedia.org/wiki/Linux_PAM
    • https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm
    • https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/
    • https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/

    Шаги

    1. Установите libpam-google-authenticator.

      В системах на основе Debian:

      root@kitploit:~
      sudo apt install libpam-google-authenticator
      
    2. Убедитесь, что вы вошли под тем ID, для которого хотите включить 2FA/MFA, и выполните google-authenticator, чтобы создать необходимые данные токена:

      root@kitploit:~
      google-authenticator
      
      root@kitploit:~
      Вы хотите, чтобы токены были привязаны ко времени (y/n) y
      https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DR4ZWX34FQKZROVX7AGLJ64684Y%26issuer%3Dhost
      
      ...
      
      Ваш новый секретный ключ: R3NVX3FFQKZROVX7AGLJUGGESY
      Ваш проверочный код: 751419
      Ваши аварийные коды для восстановления:
        12345678
        90123456
        78901234
        56789012
        34567890
      
      Обновить файл "/home/user/.google_authenticator" (y/n) y
      
      Запретить повторное использование одного и того же токена?
      Это ограничит вас одним входом примерно каждые 30 секунд, но повысит
      шансы заметить или предотвратить атаки «человек посередине» (y/n) y
      
      По умолчанию токены действительны 30 секунд. Для компенсации
      возможного расхождения времени между клиентом и сервером мы разрешаем
      использовать дополнительный токен до и после текущего времени. Если у вас
      проблемы с плохой синхронизацией времени, вы можете увеличить окно
      с размера по умолчанию +-1 мин (размер окна 3) до примерно +-4 мин
      (размер окна 17 допустимых токенов).
      Вы хотите это сделать? (y/n) y
      
      Если компьютер, на который вы входите, не защищён от атак перебором,
      вы можете включить ограничение скорости для модуля аутентификации.
      По умолчанию это ограничивает атакующих не более чем 3 попытками
      входа каждые 30 секунд.
      Включить ограничение скорости? (y/n) y
      

      Обратите внимание: это не выполняется от root.

      Выберите вариант по умолчанию (y в большинстве случаев) для всех вопросов и не забудьте сохранить аварийные коды для восстановления.

    3. Сделайте резервную копию конфигурационного файла PAM для SSH /etc/pam.d/sshd:

      root@kitploit:~
      sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")
      
    4. Теперь необходимо включить его как метод аутентификации для SSH, добавив эту строку в /etc/pam.d/sshd:

      root@kitploit:~
      auth       required     pam_google_authenticator.so nullok
      

      Примечание: Значение nullok описано здесь.

      Для ленивых:

      root@kitploit:~
      echo -e "\nauth       required     pam_google_authenticator.so nullok         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/pam.d/sshd
      
    5. Сообщите SSH, чтобы он использовал это, добавив или отредактировав эту строку в /etc/ssh/sshd_config:

      root@kitploit:~
      ChallengeResponseAuthentication yes
      

      Для ленивых:

      root@kitploit:~
      sudo sed -i -r -e "s/^(challengeresponseauthentication .*)$/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/I" /etc/ssh/sshd_config
      echo -e "\nChallengeResponseAuthentication yes         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ssh/sshd_config
      
    6. Перезапустите ssh:

      root@kitploit:~
      sudo service sshd restart
      

    (Вернуться к содержанию)

    Основы

    Ограничение доступа к sudo

    Зачем

    sudo позволяет учётным записям выполнять команды от имени других учётных записей, включая root. Мы хотим быть уверены, что только нужные учётные записи могут использовать sudo.

    Цели

    • Привилегии sudo ограничены для тех, кто состоит в указанной группе

    Примечания

    • Возможно, ваша установка уже сделала это или уже имеет специальную группу для этой цели — проверьте сначала.
      • Debian создаёт группу sudo. Чтобы просмотреть пользователей, входящих в эту группу (имеющих привилегии sudo):

        root@kitploit:~
        cat /etc/group | grep "sudo"
        
      • RedHat создаёт группу wheel

    • См. https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/39 — замечание о некоторых дистрибутивах, где sudo не требует пароля. Спасибо sbrl за информацию.

    Шаги

    1. Создайте группу:

      root@kitploit:~
      sudo groupadd sudousers
      
    2. Добавьте учётную запись(и) в группу:

      root@kitploit:~
      sudo usermod -a -G sudousers user1
      sudo usermod -a -G sudousers user2
      sudo usermod -a -G sudousers  ...
      

      Это нужно сделать для каждой учётной записи на вашем сервере, которой требуются привилегии sudo.

    3. Сделайте резервную копию файла конфигурации sudo /etc/sudoers:

      root@kitploit:~
      sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
      
    4. Отредактируйте файл конфигурации sudo /etc/sudoers:

      root@kitploit:~
      sudo visudo
      
    5. Сообщите sudo, что только пользователи из группы sudousers могут использовать sudo, добавив эту строку, если её ещё нет:

      root@kitploit:~
      %sudousers   ALL=(ALL:ALL) ALL
      

    (Вернуться к содержанию)

    Ограничение доступа к su

    Зачем

    su также позволяет учётным записям выполнять команды от имени других учётных записей, включая root. Мы хотим быть уверены, что только нужные учётные записи могут использовать su.

    Цели

    • Привилегии su ограничены для тех, кто состоит в указанной группе

    Ссылки

    • Спасибо olavim за эту идею

    Шаги

    1. Создайте группу:

      root@kitploit:~
      sudo groupadd suusers
      
    2. Добавьте учётную запись(и) в группу:

      root@kitploit:~
      sudo usermod -a -G suusers user1
      sudo usermod -a -G suusers user2
      sudo usermod -a -G suusers  ...
      

      Это нужно сделать для каждой учётной записи на вашем сервере, которой требуются привилегии sudo.

    3. Сделайте так, чтобы только пользователи из этой группы могли выполнять /bin/su:

      root@kitploit:~
      sudo dpkg-statoverride --update --add root suusers 4750 /bin/su
      

    (Вернуться к содержанию)

    Запуск приложений в изолированной среде с FireJail

    Зачем

    Для многих приложений гораздо лучше работать в изолированной среде.

    Браузеры (особенно закрытые) и почтовые клиенты настоятельно рекомендуется запускать в песочнице.

    Цели

    • изолировать приложения в jail (нескольких безопасных каталогах) и блокировать доступ к остальной системе

    Ссылки

    • Спасибо FireJail

    Шаги

    1. Установите программное обеспечение:

      root@kitploit:~
      sudo apt install firejail firejail-profiles
      

      Примечание: для Debian 10 Stable рекомендуется официальный Backport:

      root@kitploit:~
      sudo apt install -t buster-backports firejail firejail-profiles
      
    2. Разрешите приложению (установленному в /usr/bin или /bin) запускаться только в песочнице (см. несколько примеров ниже):

      root@kitploit:~
      sudo ln -s /usr/bin/firejail /usr/local/bin/google-chrome-stable
      sudo ln -s /usr/bin/firejail /usr/local/bin/firefox
      sudo ln -s /usr/bin/firejail /usr/local/bin/chromium
      sudo ln -s /usr/bin/firejail /usr/local/bin/evolution
      sudo ln -s /usr/bin/firejail /usr/local/bin/thunderbird
      
    3. Запустите приложение как обычно (через терминал или лаунчер) и проверьте, работает ли оно в jail:

      root@kitploit:~
      firejail --list
      
    4. Чтобы разрешить приложению, запущенному в песочнице, снова работать как прежде (пример: firefox):

      root@kitploit:~
      sudo rm /usr/local/bin/firefox
      

    (Вернуться к содержанию)

    NTP-клиент

    Зачем

    Многие протоколы безопасности используют системное время. Если время на вашей системе неверно, это может негативно сказаться на работе сервера. NTP-клиент решает эту проблему, синхронизируя системное время с глобальными NTP-серверами.

    Как это работает

    NTP расшифровывается как Network Time Protocol (протокол сетевого времени). В контексте этого руководства NTP-клиент на сервере используется для обновления времени сервера с официальных серверов. Список всех публичных NTP-серверов доступен на https://www.pool.ntp.org/en/.

    Примечание: Начиная с Debian 13 (Trixie) классический пакет ntp удалён. Выполнение sudo apt install ntp завершится ошибкой "Package ntp has no installation candidate". Поскольку в этом руководстве NTP используется только как клиент (для синхронизации часов сервера), начиная с Debian 13 рекомендуется использовать systemd-timesyncd, который уже предустановлен и не требует дополнительных пакетов. См. шаги для Debian 13+ ниже.

    Цели

    • NTP-клиент установлен и поддерживает синхронизацию времени на сервере

    Ссылки

    • https://cloudpro.zone/index.php/2018/01/27/debian-9-3-server-setup-guide-part-4/
    • https://en.wikipedia.org/wiki/Network_Time_Protocol
    • https://www.pool.ntp.org/en/
    • https://serverfault.com/questions/957302/securing-hardening-ntp-client-on-linux-servers-config-file/957450#957450
    • https://tf.nist.gov/tf-cgi/servers.cgi

    Шаги

    Debian 13 (Trixie) и новее: systemd-timesyncd

    systemd-timesyncd — это лёгкий SNTP-клиент, уже включённый в Debian. В отличие от полного демона ntpd, он не прослушивает порты, что уменьшает поверхность атаки. Для целей этого руководства — синхронизации часов вашего сервера — его вполне достаточно.

    1. Включите синхронизацию NTP:

      root@kitploit:~
      sudo timedatectl set-ntp true
      
    2. Проверьте, что она работает:

      root@kitploit:~
      timedatectl status
      

      В выводе должно быть NTP service: active и System clock synchronized: yes.

    3. Настройте доверенные NTP-серверы. Сделайте резервную копию файла конфигурации, затем отредактируйте его:

      root@kitploit:~
      sudo cp --archive /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf-COPY-$(date +"%Y%m%d%H%M%S")
      

      Отредактируйте /etc/systemd/timesyncd.conf и раскомментируйте/задайте секцию [Time]:

      root@kitploit:~
      [Time]
      NTP=pool.ntp.org
      FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org
      

      Для ленивых:

      root@kitploit:~
      sudo sed -i -r -e "s/^#?NTP=.*$/NTP=pool.ntp.org         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
      sudo sed -i -r -e "s/^#?FallbackNTP=.*$/FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
      
    4. Перезапустите службу для применения изменений:

      root@kitploit:~
      sudo systemctl restart systemd-timesyncd
      
    5. Проверьте статус синхронизации:

      root@kitploit:~
      timedatectl timesync-status
      
      root@kitploit:~
             Server: 108.61.56.35 (pool.ntp.org)
      Poll interval: 32s (min: 32s; max: 34min 8s)
               Leap: normal
            Version: 4
            Stratum: 2
          Reference: C342F10A
          Precision: 1us (2^0)
       Root distance: 24.054ms (max: 5s)
             Offset: +2.156ms
              Delay: 48.567ms
             Jitter: 1.452ms
       Packet count: 3
      
    Debian 12 (Bookworm) и ранее: пакет ntp

    Примечание: Эти шаги применимы только к Debian 12 и более ранним версиям. На Debian 13+ пакет ntp больше не доступен — используйте вместо него шаги для systemd-timesyncd.

    1. Установите ntp.

      В системах на основе Debian:

      root@kitploit:~
      sudo apt install ntp
      
    2. Сделайте резервную копию конфигурационного файла NTP-клиента /etc/ntp.conf:

      root@kitploit:~
      sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
      
    3. Конфигурация по умолчанию, по крайней мере в Debian, уже достаточно безопасна. Единственное, что нужно сделать — убедиться, что используется директива pool, а не server. Директива pool позволяет NTP-клиенту прекратить использование сервера, если он не отвечает или выдаёт неверное время. Для этого закомментируйте все директивы server и добавьте в /etc/ntp.conf следующее:

      root@kitploit:~
      pool pool.ntp.org iburst
      

      Для ленивых:

      root@kitploit:~
      sudo sed -i -r -e "s/^((server|pool).*)/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/ntp.conf
      echo -e "\npool pool.ntp.org iburst         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ntp.conf
      

      Пример /etc/ntp.conf:

      root@kitploit:~
      driftfile /var/lib/ntp/ntp.drift
      statistics loopstats peerstats clockstats
      filegen loopstats file loopstats type day enable
      filegen peerstats file peerstats type day enable
      filegen clockstats file clockstats type day enable
      restrict -4 default kod notrap nomodify nopeer noquery limited
      restrict -6 default kod notrap nomodify nopeer noquery limited
      restrict 127.0.0.1
      restrict ::1
      restrict source notrap nomodify noquery
      pool pool.ntp.org iburst         # добавлено пользователем 2019-03-09 в 10:23:35
      
    4. Перезапустите ntp:

      root@kitploit:~
      sudo service ntp restart
      
    5. Проверьте статус службы ntp:

      root@kitploit:~
      sudo systemctl status ntp
      
      root@kitploit:~
      ● ntp.service - LSB: Start NTP daemon
         Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled)
         Active: active (running) since Sat 2019-03-09 15:19:46 EST; 4s ago
           Docs: man:systemd-sysv-generator(8)
        Process: 1016 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
        Process: 1028 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
          Tasks: 2 (limit: 4915)
         CGroup: /system.slice/ntp.service
                 └─1038 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:113
      
      Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 0 v6wildcard [::]:123
      Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 1 v4wildcard 0.0.0.0:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 2 lo 127.0.0.1:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 3 enp0s3 10.10.20.96:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 4 lo [::1]:123
      Mar 09 15:19:46 host ntpd[1038]: Listen normally on 5 enp0s3 [fe80::a00:27ff:feb6:ed8e%2]:123
      Mar 09 15:19:46 host ntpd[1038]: Listening on routing socket on fd #22 for interface updates
      Mar 09 15:19:47 host ntpd[1038]: Soliciting pool server 108.61.56.35
      Mar 09 15:19:48 host ntpd[1038]: Soliciting pool server 69.89.207.199
      Mar 09 15:19:49 host ntpd[1038]: Soliciting pool server 45.79.111.114
      
    6. Проверьте статус ntp:

      root@kitploit:~
      sudo ntpq -p
      
      root@kitploit:~
           remote           refid      st t when poll reach   delay   offset  jitter
      ==============================================================================
       pool.ntp.org    .POOL.          16 p    -   64    0    0.000    0.000   0.000
      *lithium.constan 198.30.92.2      2 u    -   64    1   19.900    4.894   3.951
       ntp2.wiktel.com 212.215.1.157    2 u    2   64    1   48.061   -0.431   0.104
      

    (Вернуться к содержанию)

    Защита /proc

    Зачем

    Цитата с https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/:

    Заглянув в /proc, вы обнаружите множество файлов и каталогов. Многие из них — просто числа, представляющие информацию о конкретном идентификаторе процесса (PID). По умолчанию системы Linux развёрнуты так, что все локальные пользователи могут видеть всю эту информацию. Сюда входит информация о процессах других пользователей, что может включать конфиденциальные данные, которыми вы, возможно, не хотите делиться. Применив некоторые настройки файловой системы, мы можем изменить это поведение и повысить безопасность системы.

    Примечание: Это может сломаться на некоторых системах с systemd. Подробнее см. https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/37. Спасибо nlgranger за информацию.

    Цели

    • /proc смонтирован с параметром hidepid=2, чтобы пользователи видели информацию только о своих процессах

    Ссылки

    • https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/
    • https://likegeeks.com/secure-linux-server-hardening-best-practices/#Hardening-proc-Directory
    • https://www.cyberciti.biz/faq/linux-hide-processes-from-other-users/

    Шаги

    1. Сделайте резервную копию /etc/fstab:

      root@kitploit:~
      sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
      
    2. Добавьте эту строку в /etc/fstab, чтобы /proc монтировался с hidepid=2:

      root@kitploit:~
      proc     /proc     proc     defaults,hidepid=2     0     0
      

      Для ленивых:

      root@kitploit:~
      echo -e "\nproc     /proc     proc     defaults,hidepid=2     0     0         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/fstab
      
    3. Перезагрузите систему:

      root@kitploit:~
      sudo reboot now
      

      Примечание: Как вариант, можно перемонтировать /proc без перезагрузки с помощью sudo mount -o remount,hidepid=2 /proc.

    (Вернуться к содержанию)

    Принуждение учётных записей к использованию надёжных паролей

    Зачем

    По умолчанию учётные записи могут использовать любые пароли, включая ненадёжные. pwquality/pam_pwquality устраняет этот пробел безопасности, предоставляя «способ настройки стандартных требований к качеству паролей для системных паролей» и проверяя «их надёжность по системному словарю и набору правил для выявления неудачных вариантов».

    Как это работает

    В Linux PAM отвечает за аутентификацию. Существует четыре задачи PAM, о которых можно прочитать на https://en.wikipedia.org/wiki/Linux_PAM. Этот раздел рассказывает о задаче пароля.Когда возникает необходимость установить или изменить пароль учётной записи, задачу пароля PAM обрабатывает этот запрос. В этом разделе мы укажем задаче пароля PAM передавать запрошенный новый пароль в libpam-pwquality, чтобы убедиться, что он соответствует нашим требованиям. Если требования выполнены, он используется/устанавливается; если нет — возникает ошибка, и пользователь уведомляется.

    Цели

    • Принудительное использование надёжных паролей

    Шаги

    1. Установите libpam-pwquality.

      В системах на основе Debian:

      root@kitploit:~
      sudo apt install libpam-pwquality
      
    2. Сделайте резервную копию файла конфигурации паролей PAM /etc/pam.d/common-password:

      root@kitploit:~
      sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
      
    3. Укажите PAM использовать libpam-pwquality для принудительного применения надёжных паролей, отредактировав файл /etc/pam.d/common-password и изменив строку, которая начинается так:

      root@kitploit:~
      password        requisite                       pam_pwquality.so
      

      на это:

      root@kitploit:~
      password        requisite                       pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec
      

      Приведённые выше параметры означают:

      • retry=3 = запрашивать у пользователя 3 раза перед возвратом ошибки.
      • minlen=10 = минимальная длина пароля с учётом любых кредитов (или дебетов) от:
        • dcredit=-1 = должен содержать хотя бы одну цифру
        • ucredit=-1 = должен содержать хотя бы одну заглавную букву
        • lcredit=-1 = должен содержать хотя бы одну строчную букву
        • ocredit=-1 = должен содержать хотя бы один не буквенно-цифровой символ
      • difok=3 = как минимум 3 символа нового пароля не должны были быть в старом пароле
      • maxrepeat=3 = разрешено не более 3 повторяющихся символов подряд
      • gecoschec = не допускать пароли, содержащие имя учётной записи

      Для ленивых:

      root@kitploit:~
      sudo sed -i -r -e "s/^(password\s+requisite\s+pam_pwquality.so)(.*)$/# \1\2         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n\1 retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/pam.d/common-password
      

    (Содержание)

    Автоматические обновления безопасности и оповещения

    Зачем

    Важно поддерживать сервер в актуальном состоянии с последними критическими исправлениями безопасности и обновлениями. В противном случае вы рискуете столкнуться с известными уязвимостями, которые злоумышленники могут использовать для получения несанкционированного доступа к вашему серверу.

    Если вы не планируете проверять сервер каждый день, вам понадобится способ автоматического обновления системы и/или получения писем о доступных обновлениях.

    Не стоит выполнять все обновления, так как с каждым обновлением есть риск что-то сломать. Важно устанавливать критические обновления, но всё остальное может подождать, пока у вас не будет времени сделать это вручную.

    Почему нет

    Автоматические и неконтролируемые обновления могут нарушить работу системы, и вас может не оказаться рядом с сервером, чтобы это исправить. Это было бы особенно проблематично, если бы они нарушили ваш SSH-доступ.

    Замечания

    • Каждый дистрибутив управляет пакетами и обновлениями по-своему. Пока у меня есть инструкции только для систем на основе Debian.
    • Для работы этого потребуется, чтобы ваш сервер мог отправлять электронные письма.

    Цели

    • Автоматические, неконтролируемые обновления критических исправлений безопасности
    • Автоматические письма об оставшихся ожидающих обновлениях

    Системы на основе Debian

    Как это работает

    В системах на основе Debian можно использовать:

    • unattended-upgrades для автоматического выполнения нужных обновлений системы (например, критических обновлений безопасности)
    • apt-listchanges для получения сведений об изменениях пакетов до их установки/обновления
    • apticron для получения писем об ожидающих обновлениях пакетов

    Мы будем использовать unattended-upgrades для применения критических исправлений безопасности. Также можно применять стабильные обновления, поскольку они уже тщательно протестированы сообществом Debian.

    Ссылки
    • https://wiki.debian.org/UnattendedUpgrades
    • https://debian-handbook.info/browse/stable/sect.regular-upgrades.html
    • https://blog.sleeplessbeastie.eu/2015/01/02/how-to-perform-unattended-upgrades/
    • https://www.vultr.com/docs/how-to-set-up-unattended-upgrades-on-debian-9-stretch
    • https://github.com/mvo5/unattended-upgrades
    • https://wiki.debian.org/UnattendedUpgrades#apt-listchanges
    • https://www.cyberciti.biz/faq/apt-get-apticron-send-email-upgrades-available/
    • https://www.unixmen.com/how-to-get-email-notifications-for-new-updates-on-debianubuntu/
    • /etc/apt/apt.conf.d/50unattended-upgrades
    Шаги
    1. Установите unattended-upgrades, apt-listchanges и apticron:

      root@kitploit:~
      sudo apt install unattended-upgrades apt-listchanges apticron
      
    2. Теперь нужно настроить unattended-upgrades для автоматического применения обновлений. Обычно это делается редактированием файлов /etc/apt/apt.conf.d/20auto-upgrades и /etc/apt/apt.conf.d/50unattended-upgrades, созданных пакетами. Однако, поскольку эти файлы могут быть перезаписаны при будущем обновлении, мы создадим новый файл. Создайте файл /etc/apt/apt.conf.d/51myunattended-upgrades и добавьте в него следующее:

      root@kitploit:~
      // Включить скрипт обновления/апгрейда (0=отключить)
      APT::Periodic::Enable "1";
      
      // Автоматически выполнять "apt-get update" каждые n дней (0=отключить)
      APT::Periodic::Update-Package-Lists "1";
      
      // Выполнять "apt-get upgrade --download-only" каждые n дней (0=отключить)
      APT::Periodic::Download-Upgradeable-Packages "1";
      
      // Выполнять "apt-get autoclean" каждые n дней (0=отключить)
      APT::Periodic::AutocleanInterval "7";
      
      // Отправлять отчёт по почте root
      //     0:  не отправлять отчёт       (или пустая строка)
      //     1:  отчёт о прогрессе        (фактически любая строка)
      //     2:  + вывод команд           (убрать -qq, убрать 2>/dev/null, добавить -d)
      //     3:  + трассировка   APT::Periodic::Verbose "2";
      APT::Periodic::Unattended-Upgrade "1";
      
      // Автоматически обновлять пакеты из этих
      Unattended-Upgrade::Origins-Pattern {
            "o=Debian,a=stable";
            "o=Debian,a=stable-updates";
            "origin=Debian,codename=${distro_codename},label=Debian-Security";
      };
      
      // Здесь можно указать собственные пакеты, которые НЕ будут автоматически обновляться
      Unattended-Upgrade::Package-Blacklist {
      };
      
      // Запускать dpkg --force-confold --configure -a, если обнаружено грязное состояние dpkg, чтобы гарантировать установку обновлений, даже если система была прервана во время предыдущего запуска
      Unattended-Upgrade::AutoFixInterruptedDpkg "true";
      
      // Выполнять обновление, когда машина работает, так как мы не будем часто выключать сервер
      Unattended-Upgrade::InstallOnShutdown "false";
      
      // Отправлять письмо на этот адрес с информацией о обновлённых пакетах.
      Unattended-Upgrade::Mail "root";
      
      // Всегда отправлять письмо
      Unattended-Upgrade::MailOnlyOnError "false";
      
      // Удалять все неиспользуемые зависимости после завершения обновления
      Unattended-Upgrade::Remove-Unused-Dependencies "true";
      
      // Удалять любые новые неиспользуемые зависимости после завершения обновления
      Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
      
      // Автоматически перезагружать БЕЗ ПОДТВЕРЖДЕНИЯ, если после обновления найден файл /var/run/reboot-required.
      Unattended-Upgrade::Automatic-Reboot "true";
      
      // Автоматически перезагружать, даже если пользователи вошли в систему.
      Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
      

      Примечания:

      • Проверьте /usr/lib/apt/apt.systemd.daily для получения подробной информации о параметрах APT::Periodic
      • Проверьте https://github.com/mvo5/unattended-upgrades для получения подробной информации о параметрах Unattended-Upgrade
    3. Выполните пробный запуск unattended-upgrades, чтобы убедиться, что ваш конфигурационный файл корректен:

      root@kitploit:~
      sudo unattended-upgrade -d --dry-run
      

      Если всё в порядке, вы можете позволить ему запускаться по расписанию или принудительно запустить с помощью unattended-upgrade -d.

    4. Настройте apt-listchanges по своему усмотрению:

      root@kitploit:~
      sudo dpkg-reconfigure apt-listchanges
      
    5. Для apticron настройки по умолчанию достаточно хороши, но вы можете проверить их в /etc/apticron/apticron.conf, если хотите изменить. Например, моя конфигурация выглядит так:

      root@kitploit:~
      EMAIL="root"
      NOTIFY_NO_UPDATES="1"
      

    (Содержание)

    Более безопасный пул энтропии случайных чисел (WIP)

    Зачем

    WIP

    Как это работает

    WIP

    Цели

    WIP

    Ссылки

    • Спасибо branneman за эту идею, предложенную в issue #33.
    • https://hackaday.com/2017/11/02/what-is-entropy-and-how-do-i-get-more-of-it/
    • https://www.2uo.de/myths-about-urandom
    • https://www.gnu.org/software/hurd/user/tlecarrour/rng-tools.html
    • https://wiki.archlinux.org/index.php/Rng-tools
    • https://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny
    • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator

    Шаги

    1. Установите rng-tools.

      В системах на основе Debian:

      root@kitploit:~
      sudo apt-get install rng-tools
      
    2. Теперь нужно указать аппаратное устройство, используемое для генерации случайных чисел, добавив это в /etc/default/rng-tools:

      root@kitploit:~
      HRNGDEVICE=/dev/urandom
      

      Для ленивых:

      root@kitploit:~
      echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
      
    3. Перезапустите службу:

      root@kitploit:~
      sudo systemctl stop rng-tools.service
      sudo systemctl start rng-tools.service
      
    4. Проверьте случайность:

      • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator
      • https://wiki.archlinux.org/index.php/Rng-tools

    (Содержание)

    Добавление панической/вторичной/поддельной системы входа с паролем (Panic/Secondary/Fake password Login Security System)

    Зачем

    Хороший инструмент для добавления дополнительной защиты паролем от физических атак (лично) — методы вымогательства/ограбления/нападения.

    Как это работает

    pamduress добавит пользователю X вторичный пароль (панический пароль). Когда этот пароль совпадает, запускается скрипт (этот скрипт делает то, что вы хотите, чтобы пользователь делал при входе с ЭТИМ паническим паролем).

    Практический и реальный пример: "Некий грабитель проникает в дом и крадёт сервер (содержащий ВАЖНЫЕ резервные копии бизнеса, личные воспоминания и т.д.). Никакого шифрования дисков/загрузки нет. Грабитель запускает сервер в своей 'безопасной зоне' и начинает атаку перебором. Он взломал локальный пароль по SSH с пользователя sudoer 'admin' успешно, да, слабый пароль, не надёжный/основной. Он начинает сессию SSH/физическую сессию с этим взломанным слабым/паническим паролем от пользователя sudoer 'admin'. Он начинает замечать, что сервер кажется слишком загруженным менее чем за 2 минуты, пока не зависает... 'что за чёрт?! давайте перезагрузим и продолжим красть информацию...' извини, друг. все данные и система были уничтожены.". Заключение: грабитель взломал слабый/панический/вторичный пароль, и с этим паролем связан скрипт, который удалит все файлы, конфигурацию, систему, загрузчик, а затем начнёт загружать RAM и CPU, чтобы вынудить грабителя перезагрузить систему.

    Цели

    Предотвратить доступ злоумышленника к информации сервера в случае получения пароля принудительным путём (нападение, оружие, выкуп). Конечно, это полезно и в других ситуациях.

    Ссылки

    • Спасибо nuvious за этот инструмент
    • Спасибо hellresistor за этот Lazy-Tool-Script

    Шаги

    1. Запустите это (Lazy-Tool-Script от hellresistor). ```` bash #!/bin/bash myownscript(){ #######################################################

    ***** EDIT THIS SCRIPT TO YOUR PROPOSES *****#

    cat > "$ScriptFile" <<-EOF #!/bin/bash sudo rm -rf /home

    FINISHED OWN SCRIPT

    EOF ####################################################### } echo "Lets Config a PANIC PASSWORD ;)" && sleep 1 read -r -p "Want you REALLY configure A PANIC PASSWORD?? Write [ OK ] : " PAMDUR if [[ "$PAMDUR" = "OK" ]]; then echo "Lets Config a PANIC USER, PASSWORD and SCRIPT ;)" && sleep 1 while [ -z "$PANICUSR" ] do read -r -p "WRITE a Panic User to your pam-duress user [ root ]: " PANICUSR PANICUSR=${PANICUSR:=root} done if [ -z "$ScriptLoc" ]; then read -r -p "SET Script Directory with FULL PATH [ /root/.duress ]: " ScriptLoc ScriptLoc=${ScriptLoc:=/root/.duress} ScriptFile="$ScriptLoc/PanicScript.sh" fi else echo "NOT Use PAM DURESS aKa Panic Password!!! Bye" exit 1 fi

    sudo apt install -y git build-essential libpam0g-dev libssl-dev

    cd "$HOME" || exit 1 git clone https://github.com/nuvious/pam-duress.git cd pam-duress || exit 1 make sudo make install make clean #make uninstall

    mkdir -p $ScriptLoc sudo mkdir -p /etc/duress.d myownscript duress_sign $ScriptFile chmod -R 500 $ScriptLoc chmod 400 $ScriptLoc/*.sha256 chown -R $PANICUSR $ScriptLoc

    sudo cp --preserve /etc/pam.d/common-auth /etc/pam.d/common-auth.bck

    echo " auth [success=2 default=ignore] pam_unix.so nullok_secure auth [success=1 default=ignore] pam_duress.so auth requisite pam_deny.so auth required pam_permit.so " | sudo tee /etc/pam.d/common-auth

    read -r -p "Press Key to Finish PAM DURESS Script!" exit 0

    root@kitploit:~
    ([Содержание](#table-of-contents))
    
    ## Сеть
    
    ### Брандмауэр с UFW (Uncomplicated Firewall)
    
    #### Зачем
    
    Можете считать меня параноиком, и вы не обязаны соглашаться, но я хочу запретить весь входящий и исходящий трафик на моем сервере, кроме того, что я явно разрешаю. Зачем моему серверу отправлять трафик, о котором я не знаю? И зачем внешнему трафику пытаться получить доступ к моему серверу, если я не знаю, кто или что это? Когда речь идет о хорошей безопасности, я считаю, что лучше отклонять/запрещать по умолчанию, а разрешать в порядке исключения.
    
    Конечно, если вы не согласны, это совершенно нормально, и вы можете настроить UFW под свои нужды.
    
    В любом случае, обеспечение того, чтобы разрешался только явно нами разрешенный трафик — это задача брандмауэра.
    
    #### Как это работает
    
    Ядро Linux предоставляет возможности для мониторинга и управления сетевым трафиком. Эти возможности становятся доступны конечному пользователю через утилиты брандмауэра. В Linux самым распространенным брандмауэром является [iptables](https://en.wikipedia.org/wiki/Iptables). Однако iptables довольно сложен и запутан (на мой взгляд). Здесь на помощь приходит UFW. Думайте о UFW как о интерфейсе для iptables. Он упрощает процесс управления правилами iptables, которые сообщают ядру Linux, что делать с сетевым трафиком.
    
    **UFW** работает, позволяя вам настраивать правила, которые:
    
    - **разрешают** или **запрещают**
    - **входящий** или **исходящий** трафик
    - **на** или **с** портов
    
    Вы можете создавать правила, явно указывая порты или с помощью конфигураций приложений, которые указывают порты.
    
    #### Цели
    
    - весь сетевой трафик, входящий и исходящий, заблокирован, кроме того, что мы явно разрешаем
    
    #### Примечания
    
    - По мере установки других программ, вам нужно будет включать необходимые порты/приложения.
    
    #### Ссылки
    
    - https://launchpad.net/ufw
    
    #### Шаги
    
    1. Установите ufw.
    
       На системах на основе Debian:
    
       ``` bash
       sudo apt install ufw
       ```
    
    1. Запретите весь исходящий трафик:
    
       ``` bash
       sudo ufw default deny outgoing comment 'deny all outgoing traffic'
       ```
    
       > ```
       > Default outgoing policy changed to 'deny'
       > (be sure to update your rules accordingly)
       > ```
    
       Если вы не так параноидальны, как я, и не хотите запрещать весь исходящий трафик, вы можете его разрешить:
    
       ``` bash
       sudo ufw default allow outgoing comment 'allow all outgoing traffic'
       ```
    
    1. Запретите весь входящий трафик:
    
       ``` bash
       sudo ufw default deny incoming comment 'deny all incoming traffic'
       ```
    
    1. Очевидно, мы хотим разрешить SSH-подключения. Использование `limit` вместо `allow` автоматически заблокирует подключения с IP-адреса, если он попытается установить 6 или более подключений за 30-секундный интервал:
    
       ``` bash
       sudo ufw limit in ssh comment 'allow SSH connections in'
       ```
    
       > ```
       > Rules updated
       > Rules updated (v6)
       > ```
    
    1. Разрешите дополнительный трафик по вашему усмотрению. Некоторые распространенные примеры использования:
    
       ``` bash
       # allow traffic out to port 53 -- DNS
       sudo ufw allow out 53 comment 'allow DNS calls out'
       
       # allow traffic out to port 123 -- NTP
       sudo ufw allow out 123 comment 'allow NTP out'
    
       # allow traffic out for HTTP, HTTPS, or FTP
       # apt might needs these depending on which sources you're using
       sudo ufw allow out http comment 'allow HTTP traffic out'
       sudo ufw allow out https comment 'allow HTTPS traffic out'
       sudo ufw allow out ftp comment 'allow FTP traffic out'
    
       # allow whois
       sudo ufw allow out whois comment 'allow whois'
       
       # allow mails for status notifications -- choose port according to your provider
       sudo ufw allow out 25 comment 'allow SMTP out'
       sudo ufw allow out 587 comment 'allow SMTP out'
    
       # allow traffic out to port 68 -- the DHCP client
       # you only need this if you're using DHCP
       sudo ufw allow out 67 comment 'allow the DHCP client to update'
       sudo ufw allow out 68 comment 'allow the DHCP client to update'
       ```
       
       **Примечание**: Вам нужно будет разрешить HTTP/HTTPS для установки пакетов и многих других вещей.
    
    1. Запустите ufw:
    
       ``` bash
       sudo ufw enable
       ```
    
       > ```
       > Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
       > Firewall is active and enabled on system startup
       > ```
    
    1. Если хотите увидеть статус:
    
       ``` bash
       sudo ufw status
       ```
    
       > ```
       > Status: active
       > 
       > To                         Action      From
       > --                         ------      ----
       > 22/tcp                     LIMIT       Anywhere                   # allow SSH connections in
       > 22/tcp (v6)                LIMIT       Anywhere (v6)              # allow SSH connections in
       > 
       > 53                         ALLOW OUT   Anywhere                   # allow DNS calls out
       > 123                        ALLOW OUT   Anywhere                   # allow NTP out
       > 80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
       > 443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
       > 21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
       > Mail submission            ALLOW OUT   Anywhere                   # allow mail out
       > 43/tcp                     ALLOW OUT   Anywhere                   # allow whois
       > 53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
       > 123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
       > 80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
       > 443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
       > 21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
       > Mail submission (v6)       ALLOW OUT   Anywhere (v6)              # allow mail out
       > 43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
       > ```
    
       или
    
       ``` bash
       sudo ufw status verbose
       ```
    
       > ```
       > Status: active
       > Logging: on (low)
       > Default: deny (incoming), deny (outgoing), disabled (routed)
       > New profiles: skip
       > 
       > To                         Action      From
       > --                         ------      ----
       > 22/tcp                     LIMIT IN    Anywhere                   # allow SSH connections in
       > 22/tcp (v6)                LIMIT IN    Anywhere (v6)              # allow SSH connections in
       > 
       > 53                         ALLOW OUT   Anywhere                   # allow DNS calls out
       > 123                        ALLOW OUT   Anywhere                   # allow NTP out
       > 80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
       > 443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
       > 21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
       > 587/tcp (Mail submission)  ALLOW OUT   Anywhere                   # allow mail out
       > 43/tcp                     ALLOW OUT   Anywhere                   # allow whois
       > 53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
       > 123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
       > 80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
       > 443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
       > 21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
       > 587/tcp (Mail submission (v6)) ALLOW OUT   Anywhere (v6)              # allow mail out
       > 43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
       > ```
    
    7. Если нужно удалить правило
    
       ``` bash
       sudo ufw status numbered
       [...]
       sudo ufw delete 3 #номер строки правила, которое вы хотите удалить
       ```
    
    #### Приложения по умолчанию
    
    ufw поставляется с некоторыми приложениями по умолчанию. Вы можете их увидеть с помощью:``` bash
    sudo ufw app list
    ```
    ```
    > ```
    > Available applications:
    >   AIM
    >   Bonjour
    >   CIFS
    >   DNS
    >   Deluge
    >   IMAP
    >   IMAPS
    >   IPP
    >   KTorrent
    >   Kerberos Admin
    >   Kerberos Full
    >   Kerberos KDC
    >   Kerberos Password
    >   LDAP
    >   LDAPS
    >   LPD
    >   MSN
    >   MSN SSL
    >   Mail submission
    >   NFS
    >   OpenSSH
    >   POP3
    >   POP3S
    >   PeopleNearby
    >   SMTP
    >   SSH
    >   Socks
    >   Telnet
    >   Transmission
    >   Transparent Proxy
    >   VNC
    >   WWW
    >   WWW Cache
    >   WWW Full
    >   WWW Secure
    >   XMPP
    >   Yahoo
    >   qBittorrent
    >   svnserve
    > ```
    
    Чтобы получить подробную информацию о приложении, например, какие порты оно включает, введите:``` bash
    sudo ufw app info [app name]
    ```
    > ``` bash
    > sudo ufw app info DNS
    > ```
    > 
    > ```
    > Profile: DNS
    > Title: Internet Domain Name Server
    > Description: Internet Domain Name Server
    > 
    > Port:
    >   53
    > ```
    
    #### Пользовательское приложение
    
    Если вы не хотите создавать правила, явно указывая номера портов, вы можете создать свои собственные конфигурации приложений. Для этого создайте файл в `/etc/ufw/applications.d`.
    
    Например, вот что вы бы использовали для [Plex](https://support.plex.tv/articles/201543147-what-network-ports-do-i-need-to-allow-through-my-firewall/):``` bash
    cat /etc/ufw/applications.d/plexmediaserver
    ```
    > ```
    > [PlexMediaServer]
    > title=Plex Media Server
    > description=This opens up PlexMediaServer for http (32400), upnp, and autodiscovery.
    > ports=32469/tcp|32413/udp|1900/udp|32400/tcp|32412/udp|32410/udp|32414/udp|32400/udp
    > ```
    
    Затем вы можете включить его, как и любое другое приложение:```bash
    sudo ufw allow plexmediaserver
    ```
    ([Содержание](#table-of-contents))
    
    ### Обнаружение и предотвращение вторжений iptables с помощью PSAD
    
    #### Зачем
    
    Даже если у вас есть брандмауэр, охраняющий ваши двери, всё равно возможны попытки грубой силы проникнуть через охраняемые двери. Мы хотим отслеживать всю сетевую активность, чтобы обнаруживать потенциальные попытки вторжения, такие как повторные попытки войти, и блокировать их.
    
    #### Как это работает
    
    Я не смогу объяснить это лучше, чем пользователь [FINESEC](https://serverfault.com/users/143961/finesec) с https://serverfault.com/ сделал на: https://serverfault.com/a/447604/289829.
    
    > Fail2BAN просматривает файлы журналов различных приложений, таких как apache, ssh или ftp, и автоматически блокирует IP-адреса, проявляющие признаки вредоносной активности, например автоматические попытки входа. PSAD, с другой стороны, сканирует сообщения журнала iptables и ip6tables (обычно /var/log/messages), чтобы обнаруживать и при необходимости блокировать сканирование и другие виды подозрительного трафика, такие как DDoS или попытки определения отпечатков ОС. Использование обеих программ одновременно допустимо, так как они работают на разных уровнях.
    
    И, поскольку мы уже используем [UFW](#ufw-uncomplicated-firewall), мы последуем отличным инструкциям от [netson](https://gist.github.com/netson) на https://gist.github.com/netson/c45b2dc4e835761fbccc, чтобы заставить PSAD работать с UFW.
    
    #### Ссылки
    
    - http://www.cipherdyne.org/psad/
    - http://www.cipherdyne.org/psad/docs/config.html
    - https://www.thefanclub.co.za/how-to/how-install-psad-intrusion-detection-ubuntu-1204-lts-server
    - https://serverfault.com/a/447604/289829
    - https://serverfault.com/a/770424/289829
    - https://gist.github.com/netson/c45b2dc4e835761fbccc
    - Спасибо [moltenbit](https://github.com/moltenbit) за обнаружение проблемы ([#61](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/61)) с `psadwatchd`.
    
    #### Шаги
    
    1. Установите psad.
    
       В системах на основе Debian:
    
       ``` bash
       sudo apt install psad
       ```
    
    1. Сделайте резервную копию конфигурационного файла psad `/etc/psad/psad.conf`:
    
       ``` bash
       sudo cp --archive /etc/psad/psad.conf /etc/psad/psad.conf-COPY-$(date +"%Y%m%d%H%M%S")
       ```
    
    1. Просмотрите и обновите параметры конфигурации в `/etc/psad/psad.conf`. Обратите особое внимание на следующие:
    
      |Настройка|Установить как
      |--|--|
      |[`EMAIL_ADDRESSES`](http://www.cipherdyne.org/psad/docs/config.html#EMAIL_ADDRESSES)|ваш(и) адрес(а) электронной почты|
      |`HOSTNAME`|имя хоста вашего сервера|
      |`EXPECT_TCP_OPTIONS`|`EXPECT_TCP_OPTIONS Y;`|
      |`ENABLE_PSADWATCHD`|`ENABLE_PSADWATCHD Y;`|
      |[`ENABLE_AUTO_IDS`](http://www.cipherdyne.org/psad/docs/config.html#ENABLE_AUTO_IDS)|`ENABLE_AUTO_IDS Y;`|
      |`ENABLE_AUTO_IDS_EMAILS`|`ENABLE_AUTO_IDS_EMAILS Y;`|
    
      Проверьте конфигурационный файл и документацию psad по адресу http://www.cipherdyne.org/psad/docs/config.html для получения дополнительных сведений.
    
    1. <a name="psad_step4"></a>Теперь нам нужно внести некоторые изменения в ufw, чтобы он работал с psad: сообщить ufw, чтобы он регистрировал весь трафик, чтобы psad мог его анализировать. Для этого отредактируйте **два файла** и добавьте эти строки **в конце, но перед строкой COMMIT**.
    
       Сделайте резервные копии:
    
       ``` bash
       sudo cp --archive /etc/ufw/before.rules /etc/ufw/before.rules-COPY-$(date +"%Y%m%d%H%M%S")
       sudo cp --archive /etc/ufw/before6.rules /etc/ufw/before6.rules-COPY-$(date +"%Y%m%d%H%M%S")
       ```
    
       Отредактируйте файлы:
    
       - `/etc/ufw/before.rules`
       - `/etc/ufw/before6.rules`
    
       И добавьте это **в конце, но перед строкой COMMIT**:
    
       ```
       # log all traffic so psad can analyze
       -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       ```
    
       **Примечание**: Мы добавляем префикс журнала ко всем записям iptables. Это понадобится нам для [выделения журналов iptables в отдельный файл](#separate-iptables-log-file).
    
       Например:
    
       > ```
       > ...
       > 
       > # log all traffic so psad can analyze
       > -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       > -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
       > 
       > # don't delete the 'COMMIT' line or these rules won't be processed
       > COMMIT
       > ```
    
    1. Теперь необходимо перезагрузить/перезапустить ufw и psad, чтобы изменения вступили в силу:
    
       ``` bash
       sudo ufw reload
    
       sudo psad -R
       sudo psad --sig-update
       sudo psad -H
       ```
    
    1. Проанализируйте правила iptables на наличие ошибок:
    
       ``` bash
       sudo psad --fw-analyze
       ```
    
       > ```
       > [+] Parsing INPUT chain rules.
       > [+] Parsing INPUT chain rules.
       > [+] Firewall config looks good.
       > [+] Completed check of firewall ruleset.
       > [+] Results in /var/log/psad/fw_check
       > [+] Exiting.
       > ```
    
       **Примечание**: Если возникли какие-либо проблемы, вы получите электронное письмо с ошибкой.
    
    1. Проверьте состояние psad:
    
       ``` bash
       sudo psad --Status
       ```
    
       > ```
       > [-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on vm
       > [+] psad_fw_read (pid: 3444)  %CPU: 0.0  %MEM: 2.2
       >     Running since: Sat Feb 16 01:03:09 2019
       > 
       > [+] psad (pid: 3435)  %CPU: 0.2  %MEM: 2.7
       >     Running since: Sat Feb 16 01:03:09 2019
       >     Command line arguments: [none specified]
       >     Alert email address(es): root@localhost
       > 
       > [+] Version: psad v2.4.3
       > 
       > [+] Top 50 signature matches:
       >         [NONE]
       > 
       > [+] Top 25 attackers:
       >         [NONE]
       > 
       > [+] Top 20 scanned ports:
       >         [NONE]
       > 
       > [+] iptables log prefix counters:
       >         [NONE]
       > 
       >     Total protocol packet counters:
       > 
       > [+] IP Status Detail:
       >         [NONE]
       > 
       >     Total scan sources: 0
       >     Total scan destinations: 0
       > 
       > [+] These results are available in: /var/log/psad/status.out
       > ```
    
    ([Содержание](#table-of-contents))
    
    ### Обнаружение и предотвращение вторжений приложений с помощью Fail2Ban
    
    #### Зачем
    

    Read more

    Скачать инструмент
    НастройкаДопустимые значенияПримерОписаниеПримечания
    AllowGroupsимя локальной группы UNIXAllowGroups sshusersгруппа, которой разрешён доступ по SSH
    ClientAliveCountMaxчислоClientAliveCountMax 3максимальное количество сообщений клиенту о поддержании активности без ответа
    ClientAliveIntervalчисло секундClientAliveInterval 15тайм-аут в секундах перед запросом ответа
    ListenAddressразделённый пробелами список локальных адресов
    • ListenAddress 0.0.0.0
    • ListenAddress 192.168.1.100
    локальные адреса, которые sshd должен прослушиватьСм. Issue #1 для важных деталей.
    LoginGraceTimeчисло секундLoginGraceTime 30время в секундах до истечения времени входа
    MaxAuthTriesчислоMaxAuthTries 2максимальное количество разрешённых попыток входа
    MaxSessionsчислоMaxSessions 2максимальное количество открытых сессий
    MaxStartupsчислоMaxStartups 2максимальное количество сессий входа
    PasswordAuthenticationyes или noPasswordAuthentication noразрешён ли вход с паролем
    Portлюбой открытый/доступный номер портаPort 22порт, который sshd должен прослушивать

    Обратитесь к man sshd_config для получения более подробной информации о значении этих настроек.