最近折腾一堆事情, 都没碰到电脑, 刚好老铁找到我, 本来是解决这个yulong-hids 安装bug的, 然后聊到docker安装存在一些问题.
例如elasticsearch容器的内存太小会启动失败之类的. 必须修改docker启动的内存大小
例如server端的rpc数据传输映射, agent连接的是docker容器内网ip, 那么就导致始终连接不到server. 当然, 解决办法也有, 就是使用hosts.

0.plan

必须要解决第一个问题是内存限制, 所以虚拟机环境运行的内存大小(建议是2gb及以上),2个cpu核心
笔者实验环境是ubunut16.04 , 大家根据自己实际情况更改脚本哦
这里就不提供软件下载地址了, 大家到官网下载即可

1.elasticsearch

说几个点

  • 部署 Elasticsearch (5.x,驭龙暂不兼容6.x版本)
  • 执行bin/elasticsearch java环境变量问题
  • elasticsearch.yml

笔者之前没看到官方文档, 直接使用了Elasticsearch 6.x的版本, 导致一直接收不到agent的数据
官方给的elasticsearch.yml文件存在一下几项是需要稍作修改的

1
2
3
4
5
xpack.security.enabled: false
xpack.monitoring.enabled: false
xpack.ml.enabled: false
xpack.graph.enabled: false
xpack.watcher.enabled: false

docker-compose.yml 拉取的是 docker.elastic.co/elasticsearch/elasticsearch:5.5.1
所以下载下来的elasticsearch是存在xpack的, 而默认情况一些安全设置是存在http basic登录, 所以作者是把这个选项关闭了

所以在这里踩了一些坑, 一直以为基础环境中必须使用xpack, 但是默认情况只有一个月license, 所以折腾了一会儿破解版, 后来发现根本没用到哈哈哈嗝

bin/elasticsearch 文件中建议增加 ES_JAVA_OPTS="-Xms1g -Xmx1g", 避免内存太小问题, 当然根据报错大家可以到网上一搜一大堆解决方案

java环境我这边使用的是1.8以上的jdk (jdk-8u201-linux-x64.tar.gz), 在systemctl启动的时候是没有获取到env的, 所以我在启动脚本里面添加了source /etc/profile

部分安装代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
cd $DIRNAME
mkdir -p /usr/java/
tar zxf elasticsearch/jdk-8u201-linux-x64.tar.gz -C /usr/java/
echo -e 'export JAVA_HOME=/usr/java/jdk1.8.0_201\nexport JRE_HOME=$JAVA_HOME/jre\nCLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nexport JAVA_HOME JRE_HOME CLASS_PATH PATH' >> /etc/profile
cp -f elasticsearch/gosu-amd64 /usr/local/bin/gosu
chmod +x /usr/local/bin/gosu
rm -rf /elasticsearch
tar zxf elasticsearch/elasticsearch-5.6.13.tar.gz -C /tmp/
mv -f /tmp/elasticsearch-5.6.13 /elasticsearch
if [ -z "`cat /etc/passwd|grep elasticsearch`" ];then
	useradd elasticsearch
fi
sed -i '2a source /etc/profile'  /elasticsearch/bin/elasticsearch
chown -R elasticsearch:elasticsearch /elasticsearch
echo 'export PATH=/elasticsearch/bin:$PATH' >> /etc/profile

2.golang

安装这个应该没啥问题, 从官网下载, 然后设置个环境变量就行

1
2
3
4
5
6
7
8
9
cd $DIRNAME
tar -C /usr/local -xzf golang/go1.14.1.linux-amd64.tar.gz
echo 'export PATH="/usr/local/go/bin:$PATH"' >> /etc/profile
echo 'export GOPATH=/go' >> /etc/profile
echo 'export PATH="$GOPATH/bin:/usr/local/go/bin:$PATH"' >> /etc/profile
source /etc/profile
mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
cd $GOPATH
go version

3.MongoDB

去官网下载最新压缩包tgz(或者deb), tar解压设置环境变量即可(不兼容2.x版本, 笔者用的是4.2.3最新版)
唯一需要注意的是 server -db 连接的ip地址不能使用127.0.0.1, 又没有认证参数(有能力改server源码), 所以建议可以适当降权, 或者不要是生产的重要机器
所以在配置里面可以修改绑定host (bind_ip = 当前服务器ip或者0.0.0.0)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
cd $DIRNAME
rm -rf /usr/local/mongodb/*
tar -xf mongo/mongodb-linux-x86_64-ubuntu1604-4.2.3.tgz -C /tmp
mv -f /tmp/mongodb-linux-x86_64-ubuntu1604-4.2.3 /usr/local/mongodb
mkdir -p /usr/local/mongodb/data  /usr/local/mongodb/data/db /usr/local/mongodb/log /usr/local/mongodb/conf
echo 'export MONGODB_HOME=/usr/local/mongodb' >> /etc/profile
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile

cat>/usr/local/mongodb/conf/mongodb.conf<<EOF
dbpath = /usr/local/mongodb/data/db
logpath = /usr/local/mongodb/log/mongodb.log
bind_ip = 0.0.0.0
port = 27017
fork = true
EOF

4.agent-pcap

编译Agent需要先安装libpcap-devel
由于通信问题, 在windows2008及之前都可以使用winpcap, 在windows2008以后的建议使用npcap

即使linux安装了pcap, 也不一定毫无问题, 笔者找到提issue提供的缓解建议

1
2
3
4
cd /usr/lib
if [ ! -f "/usr/lib/libpcap.so.1" ];then
	ln -s /usr/lib/x86_64-linux-gnu/libpcap.so.1.7.4 libpcap.so.1
fi

5.agent-web

启动web程序之前, 必须确定存在几个文件,分别是conf/app.conf, https_cert/cert.pem, https_cert/private.pem, 缺少这几个文件都会导致web程序启动失败
现假设web程序目录在/web,启动程序是/web/web, 所以启动方式则是

1
2
cd /web
./web

6.error-log

invalid operator '$dateToString'。
笔者当时使用apt-get安装导致一直报这个错误, 后来确定是当前的 Mongodb 不支持 $dateToString 操作符,升级 Mongodb 版本就可以了。

7.kernel

笔者测试centos7的内核存在溢出直接死机情况, 所以生产环境一定要慎重啊

官方介绍

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
我们在bin\linux-64\data.zip中已经提供了一些编译好的对应内核版本的ko文件,直接用的话需要确认内核版本完全一致。
实际部署过程中需要 uname -r 统计下需要部署的机器linux内核版本,然后需要找到完全匹配对应版本的kernel-devel包
下下来并安装,yum安装的不一定完全匹配。虽然软链接到不一致的版本也能编译出来ko并加载,但是不知道会不会有影响,
稳妥起见还是参照上面的做法。
rpm -ivh kernel-devel-3.10.0-327.el7.x86_64.rpm

debian系的也类似 用 uname -r 的结果替换 4.9.0-3-amd64
apt-get install linux-headers-4.9.0-3-amd64

openSUSE
zypper install kernel-devel

安装好对应kernel-devel包后cd进目录就可以编译了
cd /usr/local/go/src/yulong-hids/syscall_hook
make

编译好的内核和驱动需要替换进对应系统目录下的data.zip内。

8.startup code

这里做了几个systemctl-service我就不放出来了, 毕竟写的太low

server-start.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

DIRNAME=`dirname $0`
mongohost=`/sbin/ifconfig|sed -n '/inet addr/s/^[^:]*:\([0-9.]\{7,15\}\) .*/\1/p'|grep -v 127.0.0.1|head -1`

for i in $(seq 1 10);
do
    echo "Wait for ElasticSearch Start...$i"
    curl -s http://127.0.0.1:9200> /dev/null
    if [ $? = 0 ];then
        break;
    fi
    sleep 5
    if [ $i -ge 10 ]; then
        echo "Too much retry, exit."
        exit 2
    fi
done

/server -db $mongohost:27017 -es 127.0.0.1:9200 >> server.log 2>&1 &

启动代码如下

1
2
3
4
5
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongodb.conf;
su - elasticsearch -c "/elasticsearch/bin/elasticsearch -d";
nohup /web/web >/web.log 2>&1 &;
nohup /server-start.sh >/server.log 2>&1 &;
sleep infinity;

9.web init

默认登录的账户名: yulong
默认登录的密码: All_life_is_a_game_of_luck.

需要修改的自己修改下 web/conf/app.conf, 密码是md5加密的

1.访问 https://web, 记得不要占用80,443端口, 点击初始化

Alt text

2.初始化规则直接使用官方项目根目录的rules.json, 也可以参考自己写
Alt text

3.上传对应的文件, 这里的是上传压缩包, 可以到官方release里面下载最新的, 也可以参考安装文档中自行编译
Alt text

4.最后,服务器是linux并且安装了openssl后, 直接点击生成证书,然后点击完成
Alt text

5.重启web服务使之生效

10.Monitor & ✅code

切换到主机列表, 使用代码安装就行了
Alt text

贴一张 创建一个ssh账户, 然后登录的监控记录
Alt text

最后,代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
if [ "$(id -u)" != "0" ];then
	echo 'Permission is not root!';
    exit;
fi
DIRNAME="/root/yulong-sh"
sed -i 's/mirrors.tuna.tsinghua.edu.cn/mirrors.aliyun.com/g' /etc/apt/sources.list
apt-get update && apt-get install -y --no-install-recommends \
		ca-certificates \
		curl \
		netbase \
		wget \
		gnupg \
		dirmngr \
		git \
		mercurial \
		openssh-client \
		subversion \
		procps \
		g++ \
		gcc \
		libc6-dev \
		make \
		pkg-config \
		libpcap-dev \
		tzdata \
		openssl

update-ca-certificates

cd $DIRNAME
tar -C /usr/local -xzf golang/go1.14.1.linux-amd64.tar.gz
echo 'export PATH="/usr/local/go/bin:$PATH"' >> /etc/profile
echo 'export GOPATH=/go' >> /etc/profile
echo 'export PATH="$GOPATH/bin:/usr/local/go/bin:$PATH"' >> /etc/profile
source /etc/profile
mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
cd $GOPATH
go version

cd $DIRNAME
mkdir -p /usr/java/
tar zxf elasticsearch/jdk-8u201-linux-x64.tar.gz -C /usr/java/
echo -e 'export JAVA_HOME=/usr/java/jdk1.8.0_201\nexport JRE_HOME=$JAVA_HOME/jre\nCLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nexport JAVA_HOME JRE_HOME CLASS_PATH PATH' >> /etc/profile

cd $DIRNAME
cp -f elasticsearch/gosu-amd64 /usr/local/bin/gosu
chmod +x /usr/local/bin/gosu
rm -rf /elasticsearch
tar zxf elasticsearch/elasticsearch-5.6.13.tar.gz -C /tmp/
mv -f /tmp/elasticsearch-5.6.13 /elasticsearch
if [ -z "`cat /etc/passwd|grep elasticsearch`" ];then
	useradd elasticsearch
fi
sed -i '2a source /etc/profile'  /elasticsearch/bin/elasticsearch
chown -R elasticsearch:elasticsearch /elasticsearch
echo 'export PATH=/elasticsearch/bin:$PATH' >> /etc/profile

cd /usr/lib
if [ ! -f "/usr/lib/libpcap.so.1" ];then
	ln -s /usr/lib/x86_64-linux-gnu/libpcap.so.1.7.4 libpcap.so.1
fi

cd $DIRNAME
cp -rf yulong-hids /go/src/
cd /go/src/yulong-hids
go build -o ./server/server --ldflags='-w -s -linkmode external -extldflags "-static"' ./server/server.go > /dev/null 2>&1
cp -f /go/src/yulong-hids/server/server /

mkdir -p /web/conf
go build -o ./web/web --ldflags='-w -s -linkmode external -extldflags "-static"' ./web/main.go > /dev/null  2>&1
cp -rf /go/src/yulong-hids/web /
cp -f /go/src/yulong-hids/web/web /web

cd $DIRNAME
rm -rf /usr/local/mongodb/*
tar -xf mongo/mongodb-linux-x86_64-ubuntu1604-4.2.3.tgz -C /tmp
mv -f /tmp/mongodb-linux-x86_64-ubuntu1604-4.2.3 /usr/local/mongodb
mkdir -p /usr/local/mongodb/data  /usr/local/mongodb/data/db /usr/local/mongodb/log /usr/local/mongodb/conf
echo 'export MONGODB_HOME=/usr/local/mongodb' >> /etc/profile
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile

cat>/usr/local/mongodb/conf/mongodb.conf<<EOF
dbpath = /usr/local/mongodb/data/db
logpath = /usr/local/mongodb/log/mongodb.log
bind_ip = 0.0.0.0
port = 27017
fork = true
EOF