Tutoriel sur la détection python et la défense contre les attaques DOS

Développé sous Windows et enfin exécuté sous Linux, vous devez installer la version python3.0+ sous Linux.

Utilisez la programmation Python pour détecter les attaques par inondation sur wrk et laissez le programme déclencher et appeler des commandes Linux pour implémenter la défense :

1. Pour la détection des attaques par inondation, vous pouvez envisager d'utiliser des commandes qui peuvent être appelées et analysées via Python.

(1)netstat -ant | toilettes -l

(2)netstat -ant | grep SYN_RECV

(3)netstat -s | grep a débordé

(4)netstat -s | prise abandonnée

(5) top -n 1 obtient l'utilisation du processeur

(6) la disponibilité obtient la charge moyenne du processeur

(7) ss -lnt affiche l'état de la file d'attente en état d'écoute : ss -lnt

(8)/opt/lampp/logs/access_log Journal d'accès au serveur Web

(9) lien ifconfig ou ip -s pour trouver RX : octets reçus, TX : octets envoyés, calculer la taille par seconde

Les commandes du processus opérationnel ci-dessus permettent d'utiliser des technologies telles que des pipelines et AWK pour extraire des données, ou vous pouvez utiliser directement Python pour l'extraction de données.

2. Vous pouvez choisir les mesures défensives suivantes :

(1) Modifier les paramètres de configuration du système pour augmenter le nombre de connexions TCP dans le système

(2) Terminez directement certains processus qui consomment du CPU ou arrêtez le service Apache

(3) Activez le pare-feu et bloquez l'adresse IP cible

(4) Vérifiez les informations par vous-même et effectuez d'autres opérations réalisables

Le cœur de l'implémentation du code Python ci-dessus est d'appeler des commandes système, puis de les analyser via Python, de déclencher l'exécution de commandes, etc. Il est recommandé d'installer Python 3.7 et supérieur sous Linux.

Quelles sont les caractéristiques des attaques DOS ?

(1) Un grand nombre de connexions

(2) La charge du processeur est très élevée

(3) La consommation de bande passante est très élevée

(4) Fixé sur une IP spécifique

Les étapes de base :

1. Assurez-vous que Python 3 peut fonctionner normalement sous Linux, tandis que CentOS intègre Python 2.7.

2. Effectuez des recherches de base pour clarifier quelles méthodes ou commandes doivent être utilisées pour la détection des intrusions DOS.

3. Exécutez les commandes utilisables via Python et déboguez pour vous assurer que les commandes Python+ peuvent fonctionner correctement.

Vous pouvez utiliser directement des commandes pour extraire des données, telles que grep, awk ou sort, ou vous pouvez directement utiliser Python pour analyser des chaînes afin d'extraire des données.

4. Trouvez des moyens de trouver l'adresse IP source de l'attaque avec le plus grand nombre de connexions et pilotez le pare-feu Linux pour la prévention des intrusions.

5. Enfin, intégrez, testez et simulez les attaques pour vous assurer que le script lui-même peut être détecté normalement.

1. Installez Python3 sur CentOS
1. Téléchargez le fichier de code source Python 3.10

Adresse de téléchargement : Python Source Releases | Python.org

2. Exécutez la commande suivante pour terminer le processus d'installation
[root@centqiang~]# mkdir /usr/local/python3 
[root@centqiang~]# tar -zxvf python-3.10.0.tgz 
[root@centqiang~]# cd python-3.10.0 
[root@centqiang~] # ./configure --prefix=/usr/local/python3 
[root@centqiang~]# make 
[root@centqiang~]# make install
3. Confirmez si l'installation est réussie
[root@centqiang ~]# /usr/local/python3/bin/python3 
Python 3.10.0 (par défaut, 26 octobre 2021, 21:23:05) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] sous Linux 
Tapez "help", "copyright", "credits" ou "license" pour plus d'informations. 
>>> import time 
>>> print(time.strftime('%Y-%m-%d %H:%M :%S'))   
2021-10-26 21:37:33 
>>> import random 
>>> print(random.randint(100, 200)) 
192 
>>> exit() 
​Si
les aspects ci-dessus semblent normaux, Cela signifie que Python3 est installé avec succès et que le troisième répertoire de la bibliothèque se trouve à l'adresse : /usr/local/python3/lib/python3.10/site-packages
4. Définir les variables d'environnement

Modifiez le fichier ~/.bash_profile dans le répertoire personnel de l'utilisateur et définissez la variable d'environnement PATH

export PYTHON_HOME=/usr/local/python3 
PATH=$PATH:$HOME/bin:$PYTHON_HOME/bin 
export PATH

Une fois l'édition terminée, exécutez source ~/.bash_profile pour que les variables d'environnement prennent effet, puis exécutez directement python3 et pip3 sur la ligne de commande.

5. Configurer la source du miroir domestique pip

Créez ~/.pip/pip.conf ​[
global] 
index-url=http://pypi.douban.com/simple 
trusted-host = pypi.douban.com dans le répertoire personnel de l'utilisateur
2. Comprendre la signification de chaque commande
1、temps de disponibilité

La commande uptime est utilisée pour vérifier le temps de démarrage de l'hôte, le nombre de connexions utilisateur et la charge du processeur en trois périodes de 1, 5 et 15 minutes.

2、netstat

La commande netstat est utilisée pour imprimer les informations d'état du système réseau sous Linux, vous permettant de connaître l'état du réseau de l'ensemble du système d'exploitation Linux. Notez que les paramètres sous Windows et Linux seront légèrement différents.

Répertorier numériquement toutes les connexions TCP : netstat -ant 
Répertorier numériquement toutes les connexions UDP : netstat -anu 
Répertorier numériquement tous les états d'écoute TCP et UDP : netstat -anult 
Afficher les statistiques de tous les ports : netstat -s 
affiche les statistiques des ports TCP : netstat -st 
affiche le routage principal informations : netstat -r 
affiche toutes les informations sur les processus connectés : netstat -ap

Identification de chaque état de connexion :

3、ss

Utilisé pour afficher les informations sur la socket active. La commande ss peut être utilisée pour obtenir des statistiques de socket, qui peuvent afficher un contenu similaire à netstat. Mais l'avantage de ss est qu'il peut afficher des informations de plus en plus détaillées sur TCP et l'état de la connexion, et qu'il est plus rapide et plus efficace que netstat.

Afficher l'état de la file d'attente en état d'écoute : ss -lnt 
Afficher les détails de la connexion en état de non-surveillance : ss -nt 
Afficher les informations récapitulatives sur le socket : ss -s

Statut LISTEN : Recv-Q représente la valeur du retard d'écoute qui attend actuellement que le serveur appelle accept pour terminer la négociation à trois. C'est-à-dire lorsque le client utilise connect() pour se connecter au serveur qui écoute(), ces connexions seront toujours dans cet état. Dans la file d'attente jusqu'à ce qu'elle soit acceptée() par le serveur ; Send-Q représente la valeur maximale du backlog d'écoute, qui est la valeur de min(backlog, somaxconn) mentionnée ci-dessus.

Statut Non-LISTEN : Recv-Q représente le nombre d'octets dans la file d'attente de réception ; Send-Q représente le nombre d'octets dans la file d'attente d'envoi. Cette valeur a peu d'importance. Faites simplement plus attention au nombre et à l'état des connexions. .

4、firewall-cmd
Désactivez le pare-feu : systemctl stop firewalld 
Ajoutez des ports autorisés : pare-feu-cmd --add-port=80/tcp 
Liste des règles de pare-feu : pare-feu-cmd --list-all 
Interdire l'accès local IP au port 80 : pare-feu-cmd --add -rich -rule='rule family="ipv4" source address="192.168.112.148" port port="80" protocol="tcp" rejeter'Rendre la configuration permanente : ajouter des ports autorisés : pare-feu-cmd --add- 
port =80 /tcp --permanent 
permet au service http de passer pendant 1 minute : firewall-cmd --zone=public --add-service=http --timeout=1m, cette option de délai d'attente est une valeur en secondes (s), minutes (m) ou heures (h) est la valeur du temps en unités.
5、sysctl

La commande sysctl est utilisée pour configurer les paramètres du noyau au moment de l'exécution. Ces paramètres se trouvent dans le répertoire /proc/sys. Configuration sysctl et paramètres du noyau affichés dans le répertoire /proc/sys. Vous pouvez utiliser sysctl pour définir ou réinitialiser les fonctions réseau, telles que le transfert IP, la suppression de la fragmentation IP et l'inspection du routage source. Les utilisateurs doivent uniquement modifier le fichier /etc/sysctl.conf pour exécuter manuellement ou automatiquement les fonctions contrôlées par sysctl.

Afficher tous les paramètres système : sysctl -a 
Utilisez cat pour afficher les paramètres spécifiés : cat /proc/sys/net/ipv4/ip_forward. À l'exception de /proc/sys, les chemins suivants sont cohérents avec les noms de paramètres. Remplacez . par / to modifier temporairement un certain paramètre 
. La valeur d'un paramètre spécifié, tel que : sysctl -w net.ipv4.ip_forward=1, ou : echo 1 > /proc/sys/net/ipv4/ip_forward. 
Si vous souhaitez conserver la configuration de façon permanente, vous pouvez modifier le fichier /etc/sysctl.conf

Modifiez rapidement certains paramètres pour optimiser les performances :

net.ipv4.tcp_syncookies : s'il faut activer la fonction SYN COOKIES, "1" est activé, "2" est désactivé. 
net.ipv4.tcp_max_syn_backlog : la longueur de la file d'attente SYN. ​​L'augmentation de la longueur de la file d'attente peut accueillir davantage de connexions réseau en attente de connexions. 
net.ipv4.tcp_synack_retries et net.ipv4.tcp_syn_retries : définissez le nombre de tentatives SYN, la valeur par défaut est 5, la recommandation est 2 
net.ipv4.sack=0

Description des autres paramètres : https://www.cnblogs.com/feiyun126/p/8646989.html

Quelques solutions d'optimisation : Résoudre la limite du nombre maximum de connexions socket à haute concurrence sous Linux, TCP par défaut est 1024 connexions_Blog de Wang Shumin-CSDN

3. Exemple de code Python
# 1、采集CPU的平均负载
def get_cpu_load():
    # 利用Python处理字符串的方式
    uptime = os.popen('uptime').read()
    uptime = uptime.replace(": ", ",")
    cpu_load = float(uptime.split(",")[-3])
​
    # 利用awk命令来提取CPU负载 或者
    cpu_load = os.popen("uptime | awk -F ': ' '{print $2}' | awk -F ',' '{print $1}'").read()
    cpu_load = float(cpu_load)
​
    return cpu_load
# 2、采集netstat -ant的连接数量
def get_conn_count():
    netstat = os.popen('netstat -ant | wc -l').read()
    return int(netstat)
​
# 3、采集队列长度
def get_queue_size():
    # ss -lnt | grep :80 | awk '{print $3}'
    sslnt = os.popen("ss -lnt | grep :80").read()
    recvq = int(sslnt.split()[1])
    sendq = int(sslnt.split()[2])
    return recvq, sendq
​
if __name__ == '__main__':
    while True:
        cpu = get_cpu_load()
        conn = get_conn_count()
        recvq, sendq = get_queue_size()
        print(f"CPU-Load: {cpu}, TCP Conn: {conn}, TCP Queue: {recvq, sendq}")
​
        # 对采集到的数据进行判断,并进行预警提醒
        if cpu > 50 and conn > 500 and recvq > sendq - 10:
            print("当前系统TCP连接负载过重,CPU使用率过高,存在DOS攻击的可能性.")
​
        time.sleep(2)

Je suppose que tu aimes

Origine blog.csdn.net/m0_73896875/article/details/131580781
conseillé
Classement