将来自社区的Apache Cassandra专家和DataStax聚集在一起。

想学习吗?有一个问题?想分享您的专业知识吗?你是在正确的地方!

不知道从哪里开始? 入门

 

问题

brendan.cicchi_124573头像图片
brendan.cicchi_124573 ·

如何在启用SSL的情况下审核与DSE群集的拒绝jj游戏官方下载

在本文中,我们将逐步介绍一种方法,以确定哪些进程无法jj游戏官方下载到 DataStax企业版 cluster by leveraging the auditd framework.

该帖子最初于2018年6月19日发布在 DataStax学院 Support Blog.

安全 加密 支持博客
10 | 1000 所需字符 剩余字符 超出字符

最多可以使用8个附件(包括图像),每个附件最多1.0 MiB,总共10.0 MiB。

1 回答

brendan.cicchi_124573头像图片
brendan.cicchi_124573 已回答 ·

您的DSE日志中是否曾经有过这样的消息,并且无法确定尝试jj游戏官方下载的进程?

INFO  [epollEventLoopGroup-6-2] 2018-05-10 19:10:49,142  Message.java:666 -Unexpected exception during request; channel = [id: 0xa5fa6b7c, L:/10.200.179.113:9042 ! R:/10.200.179.114:53533]
io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record

如果您想按照本文中的步骤进行操作,那么首先要做的是,设置一个启用了客户端加密的群集,此群集是非可选的。我不会在这里进行介绍,而是向您介绍有关使用SSL设置DSE的DataStax文档。

为了证明DSE拒绝了jj游戏官方下载,我们将创建一个脚本来jj游戏官方下载到DSE,而不使用SSL。为了简单起见,我们将只使用cqlsh来执行jj游戏官方下载。

#!/bin/bash
while true
do
    cqlsh 10.200.179.113 -e "DESCRIBE FULL SCHEMA"
    sleep 30
done

我将从10.200.179.114运行此脚本,并尝试jj游戏官方下载到10.200.179.113,而不在已配置为仅允许加密流量的节点上使用SSL。如果启动该脚本,我们将开始每隔30秒在日志中看到如下消息。

Unexpected exception during request; channel = [id: 0xa5fa6b7c, L:/10.200.179.113:9042 ! R:/10.200.179.114:53533]
io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record

Now let’s put ourselves in a black box and assume we had no knowledge of this script that we just started. All we know is what we can see in the system.log, which would be the above message, so let’s analyze that. We can see that the request to our DSE node, 10.200.179.113 on port 9042 is coming from 10.200.179.114 via L:/10.200.179.113:9042 ! R:/10.200.179.114:53533, so we shall need to go to that server to see what is trying to connect.

Now many will automatically think to use netstat to see what process is using the port. However, that will not work for this scenario. The problem is that we know DSE is rejecting the connection, so in essence, we are dealing with an extremely short-lived connection, rather than a persisting one. Even if we loop netstat, odds are we will not see the connection in the output.

如果还没有审核的框架,请在10.200.179.114上安装它:

Debian:

$ sudo apt-get install auditd

红色的帽子:

$ sudo yum install audit

目标是识别所有 sys_connect 系统调用 系统调用42 ,在服务器上找到尝试jj游戏官方下载的进程,在9042上。本质上,我们想知道每次尝试进行套接字jj游戏官方下载的情况。我将分配一个AUDITCONNECT的“关键字”,以便我们可以更轻松地搜索这些关键字。除了connect syscall外,我们还将监视 执行 syscall,我将在后面详细说明,标记为AUDITEXEC。每次执行文件时都会调用Execve。可以在以下位置找到系统调用的完整列表 //filippo.io/linux-syscall-table/.

在启用审核之前,请尝试确定jj游戏官方下载的模式,以便仅在一个很小的窗口中启用审核。例如,如果在每小时的顶部尝试jj游戏官方下载,则可以在该窗口附近启用审核。当然,这并非总是可以识别的。

要启用记录到/var/log/audit/audit.log的审核,请运行以下命令:

$ sudo auditctl -a exit,always -F arch=b64 -S connect -k AUDITCONNECT
$ sudo auditctl -a exit,always -F arch=b64 -S execve -k AUDITEXEC

我们需要保持运行足够长的时间以捕获jj游戏官方下载调用。我们当然可以通过节点的system.log文件来验证请求是否被拒绝。要停止审核jj游戏官方下载系统调用,我们需要删除创建的规则,因此在这种情况下运行:

$ sudo auditctl -d exit,always -F arch=b64 -S connect -k AUDITCONNECT
$ sudo auditctl -d exit,always -F arch=b64 -S execve -k AUDITEXEC

如果仅打开/var/log/audit/audit.log并在其中搜索,您将发现很难解密。

type=SOCKADDR msg=audit(1525979767.785:18): saddr=020023520AC8B3710000000000000000
type=SYSCALL msg=audit(1525979798.312:19): arch=c000003e syscall=42 success=no exit=-115 a0=5 a1=7ffd5f
2e3470 a2=10 a3=7ffd5f2e31c0 items=0 ppid=14913 pid=14926 auid=1002 uid=1002 gid=1002 euid=1002 suid=10
02 fsuid=1002 egid=1002 sgid=1002 fsgid=1002 tty=pts0 ses=70 comm="python" exe="/usr/bin/python2.7" key="AUDITCONNECT"

The saddr which is what we will use to identify the port is in hex. Luckily we can use ausearch -i to interpret these values to allow us to easily search the contents.

$ sudo ausearch -k AUDITCONNECT -i | grep -A 1 9042
type=SOCKADDR msg=audit(05/10/2018 19:16:07.785:18) : saddr=inet host:10.200.179.113 serv:9042
type=SYSCALL msg=audit(05/10/2018 19:16:07.785:18) : arch=x86_64 syscall=connect success=no exit=-115(Operation now in progress) a0=0x5 a1=0x7fff1f591780 a2=0x10 a3=0x7fff1f5914d0 items=0 ppid=14913 pid=14914 auid=automaton uid=automaton gid=automaton euid=automaton suid=automaton fsuid=automaton egid=automaton sgid=automaton fsgid=automaton tty=pts0 ses=70 comm=python exe=/usr/bin/python2.7 key=AUDITCONNECT
--
type=SOCKADDR msg=audit(05/10/2018 19:16:38.312:19) : saddr=inet host:10.200.179.113 serv:9042
type=SYSCALL msg=audit(05/10/2018 19:16:38.312:19) : arch=x86_64 syscall=connect success=no exit=-115(Operation now in progress) a0=0x5 a1=0x7ffd5f2e3470 a2=0x10 a3=0x7ffd5f2e31c0 items=0 ppid=14913 pid=14926 auid=automaton uid=automaton gid=automaton euid=automaton suid=automaton fsuid=automaton egid=automaton sgid=automaton fsgid=automaton tty=pts0 ses=70 comm=python exe=/usr/bin/python2.7 key=AUDITCONNECT

这表明发出请求的进程(pid)为14914,并且其父进程为14913(ppid)。您可以检查这些进程是否存在

$ ps -ef | grep 14913
automat+ 14913 14394  0 19:15 pts/0    00:00:00 /bin/bash ./connect_script.sh

所以我们都做对了...?错误的!不幸的是,生活很少那么简单。许多人可能想知道,如果该流程调用嵌套在许多其他流程调用中,该怎么办呢……我们不能仅使用pid或ppid来跟踪造成该调用的原因。演示此问题的最简单方法是创建另一个脚本,再次将其称为script.sh:

#!/bin/bash
cqlsh 10.200.179.113 -e "DESCRIBE FULL SCHEMA"

将该脚本添加到您的cron作业中,并将其设置为每分钟关闭:

$ crontab -e
* * * * * /path/to/script.sh

现在,在端口9042上的AUDITCONNECT键搜索中找到的ppid和pid都不会提供任何当前正在运行的进程。

这就是为什么我们还使用AUDITEXEC项下的audited框架为EXECVE系统调用创建了监视器的原因。如前所述,每次执行文件时都会调用execve。由于我们已经设置了AUDITEXEC键,因此exveve日志条目将包含已执行的调用以及关联的参数。确定有问题的程序jj游戏官方下载到DSE取决于该程序如何执行jj游戏官方下载,但是总的来说,我们将要查看从AUDITCONNECT日志中确定要在端口9042上进行jj游戏官方下载的进程所传递的参数,如a0,a1,a2等表示的...

$ sudo ausearch -k AUDITEXEC -i | grep -B 1 15562
type=EXECVE msg=audit(05/25/2018 21:09:01.260:708) : argc=2 a0=/bin/bash a1=/etc/cron.hourly/script.sh
type=SYSCALL msg=audit(05/25/2018 21:09:01.260:708) : arch=x86_64 syscall=execve success=yes exit=0 a0=0x7fa78c34cac8 a1=0x7fa78c34cb00 a2=0x7fa78c34cb10 a3=0x7fa78c33fa10 items=3 ppid=15560 pid=15562 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=script.sh exe=/bin/bash key=AUDITEXEC
--
type=EXECVE msg=audit(05/25/2018 21:09:01.260:711) : argc=5 a0=/bin/sh a1=/usr/bin/cqlsh a2=10.200.175.109 a3=-e a4=DESCRIBE FULL SCHEMA
type=SYSCALL msg=audit(05/25/2018 21:09:01.260:711) : arch=x86_64 syscall=execve success=yes exit=0 a0=0x1731e88 a1=0x1731948 a2=0x1732c08 a3=0x7ffc1093e880 items=3 ppid=15562 pid=15563 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=cqlsh exe=/bin/dash key=AUDITEXEC
--
type=EXECVE msg=audit(05/25/2018 21:09:01.288:714) : argc=5 a0=python a1=/usr/bin/dsecqlsh.py a2=10.200.175.109 a3=-e a4=DESCRIBE FULL SCHEMA
type=SYSCALL msg=audit(05/25/2018 21:09:01.288:714) : arch=x86_64 syscall=execve success=yes exit=0 a0=0x7f96ed3055f0 a1=0x7f96ed305570 a2=0x7f96ed3055a0 a3=0x2 items=2 ppid=15562 pid=15563 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=python exe=/usr/bin/python2.7 key=AUDITEXEC

As seen in the last block above, a Python client would be calling python as the exe, but would still pass in the py file being used as an argument, in this case, a1=/usr/bin/dsecqlsh.py. A java application would be running java as the executable, but passing in the jar to run as an argument.

希望利用参数信息以及已知的pid和ppid信息应有助于提供足够的信息以标识正在/正在运行的内容,然后可以采取步骤来纠正jj游戏官方下载或停止应用程序尝试jj游戏官方下载。

分享
10 | 1000 所需字符 剩余字符 超出字符

最多可以使用8个附件(包括图像),每个附件最多1.0 MiB,总共10.0 MiB。