0663-6.2.0-通过Nginx获取CDSW的登录信息

Fayson的github: https://github.com/fayson/cdhproject

推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f

1 文档编写目的

任务背景 :需要记录CDSW登录的审计信息,如用户啥时候登录,登录失败与否,用户名是什么。

难点 :目前CDSW本身不包含这些信息记录,只有简单的用户登录成功的信息,集成AD后理论可以在AD侧来实现,但企业AD team不配合,所以只能在CDSW这边来做。

任务描述 :因为源生CDSW不支持,现在考虑用Nginx首先转发CDSW的登录页面,然后用Nginx来捕获http页面的登录请求,最后分析该登录请求来完成目标。

任务分3个阶段:

1.实现Nginx配置CDSW,即访问Nginx的地址和端口可以进入CDSW页面并执行任务。

2.通过配置Nginx的配置,尝试捕获CDSW的登录信息。

3.编写Python或者Shell脚本解析登录信息,保存到MySQL或者Impala中进行查询分析。

测试环境
1.Redhat7.2
2.CDSW版本为1.5
3.Nginx的版本为1.16.0
4.使用root用户进行操作

2 安装并配置Nginx

1.下载Nginx安装包并解压,然后进行编译和安装

下载地址如下:

http://nginx.org/download/nginx-1.16.0.tar.gz

解压后:
在这里插入图片描述

编译:

./configure --with-stream

安装:

make && make install

默认Nginx的安装目录为/usr/local/nginx
在这里插入图片描述

安装完成后启动Nginx

2.配置Nginx捕获CDSW界面的HTTP请求信息

修改Nginx配置文件/usr/local/nginx/conf/nginx.conf,为CDSW页面配置转发

server {
    listen       80;
    server_name  cdsw.macro.com;

    location / {
        proxy_pass http://cdsw.macro.com;
    }
}

在这里插入图片描述

重新加载Nginx配置文件

/usr/local/nginx/sbin/nginx -s reload

修改访问CDSW服务的本地Windows机器的hosts文件

在hosts文件中 添加一行,如下:

192.168.0.177 cdsw.macro.com

Nginx服务安装在192.168.0.177这台服务器

添加完成后访问CDSW页面:
在这里插入图片描述

登录后运行session,执行示例代码成功

在这里插入图片描述

在这里插入图片描述

3 收集CDSW的登录信息

1.修改Nginx服务的配置文件/usr/local/nginx/conf/nginx.conf
在这里插入图片描述

Nginx服务的日志支持自定义的方式,修改格式获取所需的登录信息,第一个值是时间,第二个值是请求的信息,第三个值是状态码,第四个值是请求体,第五个是客户端IP地址,第六个是记录从哪个页面链接访问过来的,第七个是客户端浏览器的信息。修改完成后重新加载Nginx服务的配置文件。

2.在CDSW页面上登录,然后在Nginx的日志中查看是否有登录信息

在页面上登录一个不存在的用户

在这里插入图片描述

查看Nginx服务的日志

在这里插入图片描述
可以看到日志中能够获取到登录的时间,请求方式,登录失败的状态码401,登录的账号和密码,接下来编写脚本对日志进行处理,然后将登录信息持久化到MySQL中。

3.脚本如下:

#!/bin/bash
HOSTNAME="192.168.0.178"
PORT="3306"
USERNAME="root"
PASSWORD="123456"
DBNAME="cdsw_login_info"
TABLENAME="login_info"
log_dir=/usr/local/nginx/logs/
log_name=$(date -d "yesterday" +"%Y%m%d")

#将nginx日志中的十六进制引号转为正常显示的引号并定向到前一天日期命令的新日志文件
sed 's#\\x22#"#g' ${log_dir}access.log > ${log_dir}${log_name}.log
#将nginx日志文件清空,确保每次处理的是前一天的日志
cat /dev/null > ${log_dir}access.log
#按行读取新的日志文件进行处理
cat ${log_dir}${log_name}.log | while read line
do
if [[ $line =~ "authenticate" ]]; then
    OIFS=$IFS; IFS="|"; set -- $line; aa=$1;bb=$3;cc=$4;source_ip=$5;referer=$6;user_agent=$7 IFS=$OIFS
    OIFS=$IFS; IFS='""'; set -- $cc; username=$7 IFS=$OIFS
    login_time=${aa:0:10}" "${aa:11:8}
    if [[ $bb = "200"  ]]; then
        login_state=1
    elif [[ $bb = "401"  ]]; then
        login_state=0
    else
        login_state=-1
    fi
    insert_sql="insert into ${DBNAME}.${TABLENAME}(source_ip,name,referer,user_agent,login_state,login_time) values('$source_ip','$username','$referer','$user_agent',$login_state,'$login_time')"
    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${insert_sql}"
fi
done

在这里插入图片描述
4.执行脚本进行测试,查看MySQL中的结果

执行脚本之前,先在MySQL中创建库和表

CREATE DATABASE cdsw_login_info;

CREATE TABLE `login_info` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `source_ip` varchar(32),
  `name` varchar(16),
  `referer` varchar(32),
  `user_agent` varchar(256),
  `login_state` int(1),
  `login_time` timestamp,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

执行脚本后,查看表的信息如下:
在这里插入图片描述

如上图,用户登陆的账户、登陆是否失败、登陆时间存储到了MySQL中,可以使用SQL进一步统计用户登录的次数等等其他信息。

5.配置定时任务,每天0点执行一次脚本,将错误信息输出到错误日志

0 0 * * * /root/collect_login_info/nginx111.sh 2>> /root/collect_login_info/error.log
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值