首页 > 其他分享 >华为防火墙SSL_VPN异地登录报警

华为防火墙SSL_VPN异地登录报警

时间:2024-09-02 16:23:08浏览次数:12  
标签:city 登录 source ip 防火墙 SSL mode VPN logon


华为防火墙SSL_VPN异地登录报警

脚本功能

此Python脚本的主要功能是从Elasticsearch中检索登录成功的日志,检查用户的登录信息是否发生变化,并将相关信息存储到MySQL数据库中。如果检测到用户的登录IP地址或地理位置发生变化,则发送钉钉通知警告。如不知道es如何采集华为防火墙日志,可以关注我公众号私聊我。

个人博客

个人博客直达地址
网站不断完善中里面拥有大量的脚本,并且源码完全开放 欢迎纯白嫖。关注公众私信可免费写脚本

效果图

在这里插入图片描述

主要功能:

  1. 从Elasticsearch中查询日志

    • 查询最近10分钟内的LOGONSUCCESS日志。
  2. 连接MySQL数据库

    • 连接到指定的MySQL数据库,并检查/创建名为login_logs的表,用于存储用户登录记录。
  3. 解析日志信息

    • 提取用户名称、源IP地址、登录时间、登录模式和认证模式。
  4. 检查用户登录信息

    • 如果用户记录存在,比较新的IP地址和城市与数据库中的记录是否有所变化。
    • 如果发生变化,发送钉钉通知,并更新数据库中的记录。
  5. 处理新用户记录

    • 如果用户记录不存在,插入新的登录记录到数据库。

使用方法

  1. 配置环境

    • 确保已安装以下Python库:requestspymysqlipinfo
    • 替换脚本中的ipinfo.getHandler('93b3ed75decae0')中的token为你的实际token。
    • 根据实际情况配置Elasticsearch主机、MySQL数据库连接信息和钉钉Webhook地址。
  2. 运行脚本

    • 运行此脚本,脚本会自动连接到Elasticsearch和MySQL,进行数据查询和处理。

注意事项

  1. 安全性

    • 避免将敏感信息(如数据库密码、Webhook地址)硬编码在脚本中,可以使用环境变量或配置文件来存储这些信息。
  2. API调用限制

    • ipinfo API可能有调用限制,请注意不要超出API调用限制。
  3. 异常处理

    • 脚本中已包含基础的异常处理,但建议根据实际需求添加更多详细的错误处理和日志记录,以便在生产环境中更好地监控和调试。
  4. 数据库表结构

    • 确保MySQL数据库中的login_logs表结构与脚本中的定义匹配。
  5. 数据更新

    • 脚本每次运行都会查询Elasticsearch和更新数据库,确保数据库操作的事务一致性和性能。
  6. Elasticsearch查询

    • 确保Elasticsearch索引和字段名称与脚本中的查询匹配,避免查询失败。
#!/usr/bin/python3
import requests
from datetime import datetime
import pymysql
import ipinfo

# Elasticsearch主机和端口
es_host = "http://10.1.7.110:9200"

# MySQL数据库连接信息
db_host = "自己mysql的ip"
db_user = "univpn"
db_password = "自己的密码"
db_name = "univpn"

# 钉钉Webhook地址
webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=b0deef874b979eeb97d3e374e9c9867cb269d110427e9f590038bef0c40XXXX自己的webhook地址"

# 获取当前日期
current_date = datetime.now().strftime("%Y.%m.%d")
index_name = f"172_31_1_1-{current_date}"

# 构造查询语句
query = {
    "query": {
        "bool": {
            "must": [
                {"range": {"@timestamp": {"gte": f"now-10m"}}},
                {"match_phrase": {"message": "LOGONSUCCESS"}}
            ]
        }
    }
}

# 发送请求到Elasticsearch
url = f"{es_host}/{index_name}/_search?pretty"
headers = {"Content-Type": "application/json"}
response = requests.get(url, headers=headers, json=query)

# 连接数据库
conn = pymysql.connect(host=db_host, user=db_user, password=db_password, database=db_name)
cursor = conn.cursor()

# 创建表(如果不存在)
cursor.execute("""
    CREATE TABLE IF NOT EXISTS login_logs (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_name VARCHAR(255),
        source_ip VARCHAR(255),
        ip_city VARCHAR(255),
        logon_time DATETIME,
        logon_mode VARCHAR(255),
        authentication_mode VARCHAR(255)
    )
""")

def ip_city_changed(ip):
    try:
        ip_handler = ipinfo.getHandler('93b3ed75decae0')  # 替换为你的ipinfo token
        ip_info = ip_handler.getDetails(ip)
        ip_city = f"{ip_info.country} - {ip_info.city}"
        return ip_city
    except Exception as e:
        print("获取IP信息出错:", e)
        return "Unknown"

# 处理查询结果
for hit in response.json()["hits"]["hits"]:
    source = hit["_source"]
    message = source["message"]
    user_name = message.split("User Name=")[1].split(",")[0]
    source_ip = message.split("Source IP=")[1].split(",")[0]
    logon_time = message.split("Logon Time=")[1].split(",")[0]
    logon_mode = message.split("Logon Mode=")[1].split(",")[0]
    authentication_mode = message.split("Authentication Mode=")[1].split(",")[0]
    print(f"用户名: {user_name}, 源IP地址: {source_ip}, 登录时间: {logon_time}, 登录模式: {logon_mode}, 认证模式: {authentication_mode}")

    # 查询数据库中是否存在该用户
    cursor.execute("SELECT * FROM login_logs WHERE user_name = %s", (user_name,))
    result = cursor.fetchone()

    if result:
        # 用户存在,比较IP和城市是否变更
        if result[2] != source_ip or result[6] != ip_city_changed(source_ip):
            # IP或城市变更,发送异地登录通知
            last_login_time = result[3]
            last_logon_mode = result[4]
            last_authentication_mode = result[5]
            last_ip_city = result[6]
            current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

            try:
                # 获取 IP 地址信息
                ip_city = ip_city_changed(source_ip)
                print("成功获取IP信息:", ip_city)

                # 检查 IP 和城市是否同时变更
                if result[2] != source_ip and result[6] != ip_city:
                    # IP和城市都变更,发送异地登录通知
                    message = f"用户名: {user_name}\n本次登录时间: {logon_time}\n本次登录IP: {source_ip}({ip_city})\n本次登录模式: {logon_mode}\n本次认证模式: {authentication_mode}\n\n\n上次登录时间: {last_login_time}\n上次登录IP: {result[2]}({last_ip_city})\n上次登录模式: {last_logon_mode}\n上次认证模式: {last_authentication_mode}\n当前时间: {current_time}"
                    data = {
                        "msgtype": "text",
                        "text": {
                            "content": f"univpn异地登录警告通知:\n{message}"
                        }
                    }
                    requests.post(webhook_url, json=data)

                    # 更新数据库
                    cursor.execute(
                        "UPDATE login_logs SET source_ip = %s, ip_city = %s, logon_time = %s, logon_mode = %s, authentication_mode = %s WHERE user_name = %s",
                        (source_ip, ip_city, logon_time, logon_mode, authentication_mode, user_name))
            except Exception as e:
                ip_city = "Unknown"
                print("获取IP信息出错:", e)
                if result[2] != source_ip and result[6] != ip_city:
                    # IP和城市都变更,发送异地登录通知
                    message = f"用户名: {user_name}\n本次登录时间: {logon_time}\n本次登录IP: {source_ip}\n本次登录模式: {logon_mode}\n本次认证模式: {authentication_mode}\n\n\n上次登录时间: {last_login_time}\n上次登录IP: {result[2]}({last_ip_city})\n上次登录模式: {last_logon_mode}\n上次认证模式: {last_authentication_mode}\n当前时间: {current_time}"
                    data = {
                        "msgtype": "text",
                        "text": {
                            "content": f"Univpn异地登录警告通知:\n{message}"
                        }
                    }
                    requests.post(webhook_url, json=data)

                    # 更新数据库
                    cursor.execute(
                        "UPDATE login_logs SET source_ip = %s, ip_city = %s, logon_time = %s, logon_mode = %s, authentication_mode = %s WHERE user_name = %s",
                        (source_ip, ip_city, logon_time, logon_mode, authentication_mode, user_name))
    else:
        # 用户不存在,插入新记录
        try:
            # 获取 IP 地址信息
            ip_city = ip_city_changed(source_ip)
            print("成功获取IP信息:", ip_city)
        except Exception as e:
            ip_city = "Unknown"
            print("获取IP信息出错:", e)
        cursor.execute("INSERT INTO login_logs (user_name, source_ip, ip_city, logon_time, logon_mode, authentication_mode) VALUES (%s, %s, %s, %s, %s, %s)",
                       (user_name, source_ip, ip_city, logon_time, logon_mode, authentication_mode))

    conn.commit()

# 关闭数据库连接
cursor.close()
conn.close()


标签:city,登录,source,ip,防火墙,SSL,mode,VPN,logon
From: https://blog.csdn.net/zhumengkang123/article/details/141720535

相关文章

  • 获得SSH秘钥和SSL环境的可见性和控制权
    未经管理的密钥和证书如何损害分层安全防御系统多年来,由于技术的不断发展和演变,网络威胁和安全漏洞也在不断变化。企业大多都在精心研究各种解决方案和战略,以加强其安全基础设施。但是,安全问题是没有灵丹妙药的。目前,一种备受企业推崇并被广泛采用的一种技术是利用分层式信息安......
  • RHEL8.9中anywhere报错error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key
    本文写于2024年9月2日,维护有效期两年.先说解决方法,进入anywhere的keys目录,即/usr/local/lib/node_modules/anywhere/keys后,备份后生成rsa:2048位的新证书. 最近学习vite+vue,跟着这个文档做的https://segmentfault.com/a/1190000041324864可是在进入dist输出目录后,运......
  • Go基于crypto库实现AES封装加密以及协同PHP8 使用openssl AES加密使用
    前言要实现Go与PHP8之间的AES加密协同工作,我们需要确保两端使用相同的加密模式、密钥长度、以及密钥和初始化向量(IV)。下面,我将提供一个详细的教程,说明如何在Go中使用crypto/aes和crypto/cipher库来实现AES加密,并在PHP8中使用OpenSSL来解密这些数据(反之亦然)。Go基于基础......
  • 【学习笔记】SSL证书里包含的具体信息
    SSL证书的形式与内容由X.509证书标准所定义,包含3部分内容:证书数据、签名算法以及签名        当CA创建一份证书时,CA会将所有证书数据录入证书,然后通过哈希算法和CA自己的私钥加密过的摘要来生成一个签名,这个签名证明了证书数据里所有内容的有效性。        ......
  • Android开发 - ClassLoader 加载外部类解析
    ClassLoader是什么ClassLoader主要作用是将字节码文件(.class文件)加载到Java虚拟机(JVM)中,以便应用程序可以使用这些类ClassLoader的好处模块化加载:应用程序可能由多个模块组成,而这些模块可能需要按需加载插件机制:很多应用支持插件化,插件在安装或更新后需要动态加载......
  • nginx服务器如何配置ssl证书演示
    nginx服务器如何配置ssl证书,配置代码如下:server{#listen80default_server;listen443;#listen[::]:80default_serveripv6only=on;server_name你的域名;indexindex.phpindex.htmlindex.htm;root/mnt/te......
  • NSIS 脚本,安装时添加防火墙规则
    场景在Windows上运行需要访问网络或者提供网络服务的程序,需要防火墙放行。默认情况下,在首次运行程序时,可能会有如下弹窗,只有用户点击运行才能继续使用网络。部分情况,可能是直接被拦截,都没有这个提示。Windows防火墙规则|MicrosoftLearn如果出现问题,手动处理的话,可以在W......
  • 使用ClassLoader.getSystemResource更新上线后空指针异常
     目录 问题描述:原问题代码:问题原因以及解决思路:解决方法:问题描述:项目中使用到一个功能,于是在资源路径下加了点依赖包:更新上线后,发现使用ClassLoader.getSystemResource("dependencies")找不到依赖包原问题代码:URLresourceURL=ClassLoader.getSystemResource(......
  • 安全:linux禁止响应ping,不使用防火墙
    一,永久性关闭响应ping查看默认是否允许ping:[root@bloggsapi]#cat/proc/sys/net/ipv4/icmp_echo_ignore_all0 说明:(0表示允许,1表示禁止)编辑sysctl.conf[root@bloggsapi]#vi/etc/sysctl.conf增加一行:#ignorepingnet.ipv4.icmp_echo_ignore_all=1使生效:[root......
  • 华为防火墙6620E SNMP 强制使用V2C 版本
    snmp-agentsnmp-agentlocal-engineid800007DB036D8snmp-agentcommunityreadcipher%^%#wC;_!G+N[i/Q%|Ma!'`<'c,6F*k)sM4}=mPZ!$*LarV}g{7,f\Q!UthyHYdvbR/\ZN,:%^%#snmp-agentcommunitywritecipher%^%#uj2t;*3#wLEAWpZ!l~g%\:)GnIB=<SZ&......