package infosecmodules

import (
	"rubric/utils"
)

var HardeningModule = Module{
	Key:         "hardening",
	Aliases:     []string{"h", "harden", "ужесточение"},
	Title:       "Linux Hardening",
	Description: "Усиление безопасности Linux: SSH, пакеты, аудит, CIS Benchmarks",
	Run:         showHardening,
}

func showHardening() {
	utils.Header("InfoSec — Linux Hardening")

	utils.Section("Принципы усиления безопасности")
	utils.Code(`1. Минимизация поверхности атаки — отключить всё лишнее
2. Минимальные привилегии — только нужные права
3. Принцип fail-secure — при сбое → закрытое состояние
4. Аудит и логирование — знать что происходит
5. Обновления — патчи уязвимостей

CIS Benchmarks — детальные руководства по hardening
  https://www.cisecurity.org/cis-benchmarks/
  Уровни: Level 1 (базовый), Level 2 (продвинутый)

Инструменты проверки:
  Lynis         — аудит безопасности Linux
  OpenSCAP      — соответствие стандартам (RHEL)
  CIS-CAT       — CIS Benchmarks scanner`)

	utils.Section("SSH Hardening")
	utils.Code(`# /etc/ssh/sshd_config:
# Основное:
Port 2222                           # нестандартный порт (защита от автосканов)
PermitRootLogin no                  # запретить вход root
PasswordAuthentication no          # только ключи
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# Ограничения:
AllowUsers alice bob                # белый список пользователей
AllowGroups sshusers                # или группа
MaxAuthTries 3                      # попытки аутентификации
LoginGraceTime 30                   # секунд на вход
MaxStartups 3:50:10                 # ограничить параллельные подключения
ClientAliveInterval 300             # keepalive каждые 5 минут
ClientAliveCountMax 2               # 2 попытки

# Протокол:
Protocol 2                          # только SSHv2
HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp521,rsa-sha2-512
KexAlgorithms curve25519-sha256,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com

# Дополнительно:
X11Forwarding no
AllowTcpForwarding no               # запретить туннели (если не нужны)
Banner /etc/ssh/banner.txt          # показать предупреждение при входе
LogLevel VERBOSE

# Применить:
sshd -t                             # проверить конфиг
systemctl restart sshd`)

	utils.Section("Усиление системы")
	utils.Code(`# Обновления:
apt update && apt upgrade -y && apt autoremove -y   # Debian
dnf update -y && dnf autoremove -y                  # RHEL

# Автоматические обновления безопасности:
apt install unattended-upgrades
dpkg-reconfigure unattended-upgrades

# Удалить ненужные пакеты:
apt list --installed | grep -v "essential\|required"
dnf list installed
# Удалить неиспользуемые: apt remove telnet rsh ftp ...

# Отключить ненужные сервисы:
systemctl list-units --type=service --state=active
systemctl disable --now cups avahi-daemon bluetooth

# Временная зона и NTP:
timedatectl set-timezone UTC
timedatectl set-ntp true`)

	utils.Section("Сетевое усиление")
	utils.Code(`# /etc/sysctl.d/99-hardening.conf:

# Защита от спуфинга:
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Запретить ICMP redirect:
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Запретить source routing:
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# SYN cookies (защита от SYN flood):
net.ipv4.tcp_syncookies = 1

# Не отвечать на broadcast ping:
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Игнорировать bogus ICMP:
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Логировать martian пакеты:
net.ipv4.conf.all.log_martians = 1

# Запретить IP forwarding (если не роутер):
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# Применить:
sysctl -p /etc/sysctl.d/99-hardening.conf`)

	utils.Section("Усиление паролей и аутентификации")
	utils.Code(`# PAM — Pluggable Authentication Modules
# /etc/security/pwquality.conf:
minlen = 14            # минимальная длина
minclass = 4           # классы символов (upper, lower, digit, other)
maxrepeat = 3          # не более 3 одинаковых подряд
dcredit = -1           # хотя бы 1 цифра
ucredit = -1           # хотя бы 1 заглавная
lcredit = -1           # хотя бы 1 строчная
ocredit = -1           # хотя бы 1 спецсимвол

# /etc/security/faillock.conf (блокировка после неудач):
deny = 5               # блокировать после 5 неудачных попыток
unlock_time = 900      # разблокировать через 15 минут

# /etc/login.defs:
PASS_MAX_DAYS 90       # смена пароля каждые 90 дней
PASS_MIN_DAYS 7        # не менять чаще раза в 7 дней
PASS_WARN_AGE 14       # предупреждать за 14 дней

# Применить политику к существующему пользователю:
chage -M 90 -W 14 alice
chage -l alice          # просмотр`)

	utils.Section("Аудит — auditd")
	utils.Code(`auditd — система аудита Linux ядра.
Логирует системные вызовы, доступ к файлам, изменения конфигурации.

# Установка:
apt install auditd
systemctl enable --now auditd

# /etc/audit/rules.d/audit.rules:
# Мониторинг изменений аутентификационных файлов:
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers

# Мониторинг входов в систему:
-w /var/log/faillog -p wa -k logins
-w /var/log/lastlog -p wa -k logins

# Мониторинг команд с привилегиями:
-a always,exit -F arch=b64 -S execve -F euid=0 -k root_commands

# Мониторинг сетевых соединений:
-a always,exit -F arch=b64 -S connect -k network_connect

# Применить правила без перезапуска:
augenrules --load

# Просмотр логов:
ausearch -k identity -ts recent         # события за последнее время
ausearch -k root_commands -ui 0        # команды root
aureport --auth                         # отчёт по аутентификации
aureport --summary                      # общий отчёт
aureport --failed                       # только ошибки`)

	utils.Section("Защита файловой системы")
	utils.Code(`# /etc/fstab — безопасные опции монтирования:
/dev/sda1  /       ext4  defaults                        0 1
tmpfs      /tmp    tmpfs defaults,noexec,nosuid,nodev    0 0
tmpfs      /var/tmp tmpfs defaults,noexec,nosuid,nodev  0 0
/dev/sda3  /home  ext4  defaults,noexec,nosuid,nodev    0 2
/dev/sda4  /var   ext4  defaults,nosuid,nodev            0 2

# noexec  — нельзя запускать файлы
# nosuid  — SUID биты игнорируются
# nodev   — устройства игнорируются

# Поиск файлов с SUID/SGID:
find / -perm /4000 -type f 2>/dev/null   # SUID
find / -perm /2000 -type f 2>/dev/null   # SGID
# Проверить нужны ли они, убрать ненужные:
chmod u-s /usr/bin/unnecessary

# Файлы без владельца (orphaned):
find / -nouser -o -nogroup 2>/dev/null

# Разрешения на критичные файлы:
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 440 /etc/sudoers
chmod 700 /root

# AIDE — мониторинг целостности файлов:
apt install aide
aide --init
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Проверка (запускать регулярно):
aide --check`)

	utils.Section("Lynis — аудит безопасности")
	utils.Code(`Lynis — инструмент аудита безопасности Linux.
Проверяет более 300 параметров, даёт рекомендации.

# Установка:
apt install lynis
# или из репозитория (актуальная версия):
git clone https://github.com/CISOfy/lynis
cd lynis && ./lynis audit system

# Запуск:
lynis audit system              # полный аудит системы
lynis audit system --quick      # быстрый
lynis audit system --pentest    # более агрессивные проверки
lynis show tests                # список всех тестов

# Результаты:
# /var/log/lynis.log       — детальный лог
# /var/log/lynis-report.dat — машиночитаемый отчёт
# Hardening Index: 0-100 (выше = лучше)

# OpenSCAP (RHEL):
dnf install scap-security-guide openscap-scanner
# Проверка по CIS Benchmark:
oscap xccdf eval \
  --profile xccdf_org.ssgproject.content_profile_cis \
  --results results.xml \
  /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml`)

	utils.Footer()
}
