作者:余枫
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