Tutorial sobre detección de Python y defensa contra ataques de DOS

Desarrollado en Windows y finalmente ejecutado en Linux, necesita instalar la versión python3.0+ en Linux.

Utilice la programación Python para detectar ataques de inundación en wrk y deje que el programa active y llame a comandos de Linux para implementar la defensa:

1. Para la detección de ataques de inundación, puede considerar el uso de comandos, que pueden llamarse y analizarse a través de Python.

(1) netstat-hormiga | baño -l

(2)netstat -hormiga | grep SYN_RECV

(3)netstat -s | grep se desbordó

(4)netstat -s | agarre caído

(5)top -n 1 obtiene el uso de la CPU

(6) el tiempo de actividad obtiene la carga promedio de la CPU

(7) ss -lnt muestra el estado de la cola en el estado de escucha: ss -lnt

(8)/opt/lampp/logs/access_log Registro de acceso al servidor web

(9) enlace ifconfig o ip -s para encontrar RX: bytes recibidos, TX: bytes enviados, calcule el tamaño por segundo

Los comandos en el proceso de operación anterior permiten el uso de tecnologías como canalizaciones y AWK para extraer datos, o puede usar Python directamente para la extracción de datos.

2. Podrás optar por las siguientes medidas defensivas:

(1) Modificar los parámetros de configuración del sistema para aumentar la cantidad de conexiones TCP en el sistema

(2) Finalice directamente algunos procesos que consumen CPU o detenga el servicio Apache

(3) Encienda el firewall y bloquee la dirección IP de destino

(4) Verifique la información usted mismo y realice otras operaciones factibles

El núcleo de la implementación del código Python anterior es llamar a los comandos del sistema, luego analizarlos a través de Python, activar la ejecución de comandos, etc. Se recomienda instalar Python 3.7 y superior en Linux.

¿Cuáles son las características de los ataques DOS?

(1) Una gran cantidad de conexiones

(2) La carga de la CPU es muy alta.

(3) El consumo de ancho de banda es muy alto.

(4) Fijado en una IP específica

Los pasos básicos:

1. Asegúrese de que Python 3 pueda ejecutarse normalmente en Linux, mientras que CentOS tiene Python 2.7 integrado.

2. Realice una investigación básica para aclarar qué métodos o comandos deben usarse para la detección de intrusiones en DOS.

3. Ejecute los comandos utilizables a través de Python y depure para asegurarse de que los comandos de Python+ puedan funcionar correctamente.

Puede usar comandos directamente para extraer datos, como grep, awk u sort, o puede usar Python directamente para analizar cadenas para extraer datos.

4. Encuentre formas de encontrar la dirección IP de origen del ataque con la mayor cantidad de conexiones y controle el firewall de Linux para la prevención de intrusiones.

5. Finalmente, integre, pruebe y simule ataques para garantizar que el script en sí pueda detectarse normalmente.

1. Instale Python3 en CentOS
1. Descargue el archivo de código fuente de Python 3.10

Dirección de descarga: Versiones de código fuente de Python | Python.org

2. Ejecute el siguiente comando para completar el proceso de instalación.
[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. Confirme si la instalación fue exitosa
[root@centqiang ~]# /usr/local/python3/bin/python3 
Python 3.10.0 (predeterminado, 26 de octubre de 2021, 21:23:05) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] en Linux 
Escriba "ayuda", "copyright", "créditos" o "licencia" para obtener más información. 
>>> tiempo de importación 
>>> print(time.strftime('%Y-%m-%d %H:%M :%S'))   
2021-10-26 21:37:33 
>>> importar aleatorio 
>>> print(random.randint(100, 200)) 
192 
>>> exit() 
​Si
los aspectos anteriores parecen normales, Significa que Python3 se instaló correctamente y que el tercer directorio de la biblioteca se encuentra en: /usr/local/python3/lib/python3.10/site-packages
4. Establecer variables de entorno

Edite el archivo ~/.bash_profile en el directorio de inicio del usuario y configure la variable de entorno PATH

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

Una vez completada la edición, ejecute source ~/.bash_profile para que las variables de entorno surtan efecto y luego ejecute directamente python3 y pip3 en la línea de comando.

5. Configurar la fuente del espejo doméstico de pip

Cree ~/.pip/pip.conf ​[
global] 
index-url=http://pypi.douban.com/simpletrust-host 
= pypi.douban.com en el directorio de inicio del usuario
2. Comprender el significado de cada comando.
1, tiempo de actividad

El comando uptime se utiliza para verificar el tiempo de arranque del host, la cantidad de conexiones de usuario y la carga de la CPU en tres períodos de 1, 5 y 15 minutos.

2.netstat

El comando netstat se utiliza para imprimir la información de estado del sistema de red en Linux, lo que le permite conocer el estado de la red de todo el sistema operativo Linux. Tenga en cuenta que los parámetros en Windows y Linux serán ligeramente diferentes.

Enumere numéricamente todas las conexiones TCP: netstat -ant 
Enumere numéricamente todas las conexiones UDP: netstat -anu 
Enumere numéricamente todos los estados de escucha de TCP y UDP: netstat -anult 
Muestra estadísticas para todos los puertos: netstat -s 
muestra estadísticas de puertos TCP: netstat -st 
muestra enrutamiento central información: netstat -r 
muestra toda la información del proceso conectado: netstat -ap

Identificación de cada estado de conexión:

3 、 ss

Se utiliza para mostrar información del socket activo. El comando ss se puede utilizar para obtener estadísticas de socket, que pueden mostrar contenido similar a netstat. Pero la ventaja de ss es que puede mostrar información cada vez más detallada sobre TCP y el estado de la conexión, y es más rápido y eficiente que netstat.

Muestra el estado de la cola en el estado de escucha: ss -lnt 
Muestra los detalles de la conexión en el estado de no escucha: ss -nt 
Muestra la información resumida del socket: ss -s

Estado de ESCUCHA: Recv-Q representa el valor de la acumulación de escucha que actualmente espera que el servidor llame a aceptar para completar el protocolo de enlace de tres vías, es decir, cuando el cliente usa connect () para conectarse al servidor que está escuchando (), estas conexiones siempre estarán en este estado. En la cola hasta que el servidor las acepte(); Send-Q representa el valor máximo de la lista de espera de escucha, que es el valor de min(backlog, somaxconn) mencionado anteriormente.

Estado sin ESCUCHAR: Recv-Q representa el número de bytes en la cola de recepción; Send-Q representa el número de bytes en la cola de envío. Este valor es de poca importancia. Solo preste más atención al número y estado de las conexiones. .

4、firewall-cmd
Apague el firewall: systemctl stop firewalld 
Agregue los puertos permitidos: firewall-cmd --add-port=80/tcp 
Enumere las reglas del firewall: firewall-cmd --list-all 
Prohibir el acceso local IP al puerto 80: firewall-cmd --add -rich -rule='rule family="ipv4" source address="192.168.112.148" port port="80" protocolo="tcp" rechazar'Hacer la configuración permanente: agregar 
puertos permitidos: firewall-cmd --add-port =80 /tcp --permanent 
permite que el servicio http pase durante 1 minuto: firewall-cmd --zone=public --add-service=http --timeout=1m, esta opción de tiempo de espera es un valor en segundos (s), minutos (m) u horas (h) es el valor del tiempo en unidades.
5、sistl

El comando sysctl se utiliza para configurar los parámetros del kernel en tiempo de ejecución. Estos parámetros se encuentran en el directorio /proc/sys. La configuración de sysctl y los parámetros del kernel se muestran en el directorio /proc/sys. Puede utilizar sysctl para configurar o restablecer funciones de red, como el reenvío de IP, la eliminación de fragmentación de IP y la inspección de enrutamiento de origen. Los usuarios solo necesitan editar el archivo /etc/sysctl.conf para ejecutar manual o automáticamente funciones controladas por sysctl.

Muestra todos los parámetros del sistema: sysctl -a 
Utilice cat para ver los parámetros especificados: cat /proc/sys/net/ipv4/ip_forward. Excepto /proc/sys, las siguientes rutas son consistentes con los nombres de los parámetros. Reemplace . con / to cambiar temporalmente un determinado parámetro 
. El valor de un parámetro específico, como por ejemplo: sysctl -w net.ipv4.ip_forward=1, o: echo 1 > /proc/sys/net/ipv4/ip_forward. 
Si desea conservar la configuración permanentemente, puede modificar el archivo /etc/sysctl.conf

Modifique rápidamente algunos parámetros para optimizar el rendimiento:

net.ipv4.tcp_syncookies: si se activa la función SYN COOKIES, "1" está activado y "2" está desactivado. 
net.ipv4.tcp_max_syn_backlog: la longitud de la cola SYN. ​​Aumentar la longitud de la cola puede acomodar más conexiones de red en espera de conexiones. 
net.ipv4.tcp_synack_retries y net.ipv4.tcp_syn_retries: definen el número de reintentos SYN, el valor predeterminado es 5, la recomendación es 2 
net.ipv4.sack=0

Descripción de otros parámetros: https://www.cnblogs.com/feiyun126/p/8646989.html

Algunas soluciones de optimización: resolviendo el límite en el número máximo de conexiones de socket de alta concurrencia en Linux, tcp por defecto es 1024 conexiones_Blog-CSDN de Wang Shumin

Tres, ejemplo de código 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)

Supongo que te gusta

Origin blog.csdn.net/m0_73896875/article/details/131580781
Recomendado
Clasificación