0679-6.2.0-通过Nginx获取CDSW的登录信息-续-2

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

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

1 文档编写目的

在上一篇文章《6.2.0-通过Nginx获取CDSW的登录信息(续)》中,通过Nginx的配置进一步捕获了用户的一些操作,然后存入数据库中进行查询分析,捕获了当用户使用“Share”功能和进行Kerberos绑定时的操作信息,但是并未拿到用户进行Kerberos认证的Principal,本文档将介绍如何在用户进行Kerberos绑定时拦截到具体绑定的Principal账号。

测试环境
1.Redhat7.4
2.CDSW1.5
3.CM/CDH6.2.0

2 实现过程

基于新的拦截需求,需要对以下几个部分进行修改:

Nginx的配置不用修改,保持和之前一致,如下图:

在这里插入图片描述
1.修改脚本,用户登陆和点Share功能的部分不用修改,只对捕获Kerberos信息部分进行修改

#!/bin/bash
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" ]] && [[ $line =~ "POST" ]] && [[ $line =~ "login" ]]; 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
    occur_time=${aa:0:10}" "${aa:11:8}
    if [[ $bb = "200"  ]]; then
        login_state='1'
    elif [[ $bb = "401"  ]]; then
        login_state='0'
    else
        login_state=''
    fi
    insert_sql="insert into ${DBNAME}.${TABLENAME}(source_ip,name,referer,user_agent,login_state,occur_time) values('$source_ip','$username','$referer','$user_agent',$login_state,'$occur_time')"
    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${insert_sql}"
fi
if [[ $line =~ "sharing" ]]; 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; share_flag=$9 IFS=$OIFS
    occur_time=${aa:0:10}" "${aa:11:8}
    if [[ $share_flag = ""  ]]; then
        share_flag="clickShare"
    fi
    insert_sql="insert into ${DBNAME}.${TABLENAME}(source_ip,name,referer,user_agent,login_state,occur_time,share_flag) values('$source_ip','$username','$referer','$user_agent','1','$occur_time','$share_flag')"
    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${insert_sql}"
fi
if [[ $line =~ "kerberos-credentials" ]]; then
    OIFS=$IFS; IFS="|"; set -- $line; aa=$1;request=$2;bb=$3;cc=$4;source_ip=$5;referer=$6;user_agent=$7 IFS=$OIFS
    OIFS=$IFS; IFS='""'; set -- $cc; kerberos_principal=$5 IFS=$OIFS
    occur_time=${aa:0:10}" "${aa:11:8}
    if [[ $bb = "204"  ]] && [[ $request =~ "POST" ]]; then
        kerberos_bind_state='1'
    elif [[ $bb = "422"  ]]; then
        kerberos_bind_state='0'
    else
        kerberos_bind_state=''
    fi
    insert_sql="insert into ${DBNAME}.${TABLENAME}(source_ip,name,referer,user_agent,login_state,occur_time,request,kerberos_principal,kerberos_bind_state) values('$source_ip','$username','$referer','$user_agent','1','$occur_time','$request','$kerberos_principal','$kerberos_bind_state')"
    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${insert_sql}"
fi
done

在这里插入图片描述
2.修改存储信息的表结构,建表语句如下:

CREATE TABLE `login_info` (
  `id` int(5) primary key NOT NULL AUTO_INCREMENT,
  `source_ip` varchar(32) DEFAULT NULL,
  `name` varchar(16) DEFAULT NULL,
  `referer` varchar(64) DEFAULT NULL,
  `user_agent` varchar(256) DEFAULT NULL,
  `login_state` char(1) DEFAULT NULL,
  `occur_time` timestamp ,
  `request` varchar(256) DEFAULT NULL,
  `share_flag` varchar(16) DEFAULT NULL,
`kerberos_principal` varchar(64) DEFAULT NULL,
`kerberos_bind_state` char(1) DEFAULT NULL) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述

3 获取用户认证使用的Principal

3.1 用户使用正确的Principal以及密码进行认证

1.用户认证成功

在这里插入图片描述
2.获取用户认证成功的Principal

select kerberos_principal,kerberos_bind_state from login_info where kerberos_bind_state='1';

在这里插入图片描述

3.2 用户使用错误的Principal进行认证

1.用户认证失败

在这里插入图片描述

2.获取用户认证失败的Principal

select kerberos_principal,kerberos_bind_state from login_info where kerberos_bind_state='0';

在这里插入图片描述

4 总结

1.可以通过request属性获取到用户认证Kerberos的信息,对信息进行处理后,可以获取到用户进行Kerberos认证的Principal,保存入库可以进行后面的分析。

2.在脚本中加入一个标识kerberos_bind_state来区分此时进行认证的Principal是否成功,在查询时可以根据该标识来查询成功认证的Principal和认证失败的Principal。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值