文章目录
- 华为云云耀云服务器L实例评测|华为云上试用主机安全产品Elkeid
- 一、背景:什么是主机安全
- 二、主机安全之Elkeid
- 1. Elkeid 介绍
- 2. Elkeid Server
- 3. Elkeid Server 架构
- Elkeid AgentCenter(下面简称AC)
- Elkeid Service Discovery(下面简称SD)
- Elkeid Manager
- 三、华为云上安装部署试用Elkeid
- 1. 华为云主机准备
- 2. Elkeid安装和配置
- 3. docker安装过程问题记录
- docker 报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- docker报错: No chain/target/match by that name.
- 4. Elkeid使用
- 四、参考
华为云云耀云服务器L实例评测|华为云上试用主机安全产品Elkeid
一、背景:什么是主机安全
随着云技术的发展,现在各大银行、大小企业和政府都在频繁使用云技术,在这些领域,安全显然是一个非常重要的因素。云主机作为数据存储的场所,正面临着黑客不断入侵的威胁,那么主机安全是什么?
主机安全具体是指保证主机在数据存储和处理的保密性、完整性,可用性,它包括硬件、固件、系统软件的自身安全,以及一系列附加的安全技术和安全管理措施,从而建立一个完整的主机安全保护环境。
我国的信息安全经过二十多年的建设,在防病毒、网络和边界安全方面到得了一定成果,而主机环境安全建设却相对较薄弱,主机是信息安全最重要,也是最后一门防线。
其实主机安全,从我个人理解角度出发,更多的时候是一个主机层入侵检测系统HIDS (Host-based Intrusion Detection System),主要通过收集主机层的信息来实现入侵检测/行为审计/攻击溯源/资产盘点/合规基线检测等能力。
我们今天 就是要在华为云上体验使用一下Elkeid,Elkeid: 是字节跳动的一个开源的 HIDS 项目。
二、主机安全之Elkeid
1. Elkeid 介绍
Elkeid 开源版本项目地址:https://github.com/bytedance/Elkeid
安全领域的开源项目,这个开源项目叫做 Elkeid,意思是瑶光/破军,也是北斗七星之一,它解决的问题就是主机安全。
Elkeid 是火山引擎旗下的 CWPP 产品,旨在满足现代企业在复杂技术架构下的安全需求。Elkeid 起源于字节跳动(ByteDance)内部最佳实践,原生集成了针对 服务器/容器/Serverless 等多种工作负载的反入侵能力,涵盖了 服务器与容器反入侵、容器集群反入侵、应用运行时保护 RASP(Runtime Application Self-Protection)、威胁溯源与猎捕、工作负载资产盘点、工作负载漏洞发现,暴露面分析等能力,并提供开放式策略引擎,帮助企业在一体式的解决方案下更好地保障云上、云下的工作负载安全。
Elkeid 是由字节跳动内部安全与风控团队自研的一个新的主机安全解决方案,它具备几个鲜明的特点。
- 一个就是规模大,能够支撑字节跳动内部百万级的服务器数量。当然讲到这块,也稍微剧透一下字节跳动内部的服务器规模。
- 另外一个特点,就是 Elkeid 采用了我们内核态的技术进行大多数指标和信息的收集。
- 这样一方面可以极大地提升性能,另一方面也可以去采集更多更丰富的数据,从而大大增强我们的检测能力。
目前,Elkeid完整版本部署规模已达到100万量级,其稳定性/性能/数据采集能力/检测能力/溯源能力等均得到了实战验证,均有不俗表现。
产品优势
- 百万级Agent的后台架构解决方案
- 分布式,去中心化,集群高可用
- 部署简单,依赖少,便于维护
注意:该产品未完全开源,截止目前(2023-9)其中Elkeidup 自动化部署工具和Hub没有开源,前端也没有开源~。
2. Elkeid Server
Elkeid Server 需要配合端上的数据采集层(Elkeid Driver/Agent)一起使用,实现了对大规模Agent的监控,管理和策略更新。能适配各种复杂的网络环境,可单机也可集群部署。具体部署方案,请移步Repo查看。
开源地址:https://github.com/bytedance/Elkeid/tree/main/server
3. Elkeid Server 架构
Elkeid Server 大体包含4个模块:
-
AgentCenter:负责与Agent进行通信,采集Agent数据并简单处理后汇总到消息队列集群(Kafka集群),同时也负责对Agent进行管理包括Agent的升级,配置修改,任务下发等。
-
ServiceDiscovery:后台中的各个服务模块都需要向ServiceDiscovery中心定时注册、同步服务信息,从而保证各个服务模块中的实例相互可见,便于直接通信。
-
Manager:负责对整个后台进行管理并提供相关的查询、管理接口。
-
实时/离线计算模块:消费server采集到消息队列中的数据,进行实时和离线的分析与检测。(此部分还未开源)
简单来说就是:
-
AgentCenter收集Agent数据
-
Manager管理着AgentCenter和这些计算模块
-
ServiceDiscovery把这些所有的服务、节点都串联了起来
-
实时/离线计算模块对这些数据进行分析和检测
Elkeid 后台大体包含5个模块:
-
AgentCenter(AC),负责与Agent进行通信,采集Agent数据并简单处理后汇总到消息队列集群,同时也负责对Agent进行管理包括Agent的升级,配置修改,任务下发等。同时AC也对外提供HTTP接口,Manager通过这些HTTP接口实现对AC和Agent的管理和监控。
-
ServiceDiscovery(SD),后台中的各个服务模块都需要向SD中心定时注册、同步服务信息,从而保证各个服务模块中的实例相互可见,便于直接通信。由于SD维护了各个注册服务的状态信息,所以当服务使用方在请求服务发现时,SD会进行负载均衡。比如Agent请求获取AC实例列表,SD直接返回负载压力最小的AC实例。
-
Manager,负责对整个后台进行管理并提供相关的查询、管理接口。包括管理AC集群,监控AC状态,控制AC服务相关参数,并通过AC管理所有的Agent,收集Agent运行状态,往Agent下发任务,同时manager也管理实时和离线计算集群。
-
Elkeid Console: Elkeid 前端部分。
-
Elkeid HUB :Elkeid HIDS RuleEngine。
简单来说就是AgentCenter收集Agent数据,Elkeid HUB对这些数据进行分析和检测,Manager管理着AgentCenter和这些计算模块,ServiceDiscovery把这些所有的服务、节点都串联了起来,通过Elkeid Console可查看告警和资产数据等。
Elkeid AgentCenter(下面简称AC)
AC一方面需要从Agent采集数据并进行初步处理,然后把处理后数据写入Kafka集群(供后续分析模块消费),另一方面要向Agent下发指令,这个通信是双向的。
同时AC也对外提供HTTP接口,Manager通过这些HTTP接口实现对AC和Agent的管理和监控。
相关技术介绍:
-
通信效率:在百万级Agent的情况下,如此大量级的数据对后端的压力不容小觑。而通信和处理效率主要受通信协议和编码方式的影响。对比各种通信方式,我们最终选择使用gRPC双向流的方式。
-
一方面gRPC基于HTTP2协议标准设计开发,相对于其他RPC框架,gRPC带来了更多强大功能,如双向流、头部压缩等。这些都很好的符合我们现在的需求,同时通信效率也很高。
-
另一方面我们采用Protobuf作为编码方式。Protobuf具备了标准的IDL和IDL编译器,同时序列化数据非常简洁,紧凑;另外编解码速度在众多序列化协议中也处于领先。
-
-
通信安全性:Agent是具备root权限的应用,Server具备对Agent下发指令的能力,如果通信链路被控制,将是灾难性的。这里我们使用了双向SSL校验,一方面保证了Agent/Server不会与未知的对端通信,另一方面SSL也保证了通信过程数据都是加密的。
总结: grpc双向流 + 双向SSL校验。
Elkeid Service Discovery(下面简称SD)
服务发现/负载均衡机制大致两个设计思路,一个集中代理,一个是端代理。
集中代理方式例如F5、nginx,请求先发送到集中代理点,代理再根据一定的负载均衡算法进行转发,服务的响应也会先到代理点,再转发到请求端。这个方式虽然是最常见的,但有两个问题,一个是经过代理来回转发,请求响应的时延会增加,另一个是在大规模Agent请求下,代理点的负载压力太大,因此在大规模部署的环境下不能使用这个方案。
相关技术介绍:
-
服务提供方定时向SD发送注册信息,包括服务名字,实例ip,端口,负载状态等,这样SD就维护着所有这个服务实例的状态。
-
SD这个服务中的各个节点间需要进行数据同步,例如上面1中注册信息发送到NodeA上,NodeA需要把这个信息同步给NodeB,这样如果有请求访问NodeB,NodeB也有对应的注册信息。
-
服务使用方通过服务名,请求服务发现/注册中心,获取对应服务名下能使用的实例IP、端口列表,进而可以直接访问。
-
SD各个节点间的数据同步是以广播的方式批量同步,保证了一定的性能。某个时间点节点间的数据并不是一致的,但最终能保持一致,满足分布式CAP理论中的AP,在大规模Agent,AC场景下,并没什么影响。此外也没用到任何一致性中间件(etcd,zookeeper等),部署方便,维护简单。
-
由于SD维护了各个注册服务的状态信息,所以当服务使用方在请求服务发现时,SD会进行负载均衡。比如Agent请求获取AC实例列表,SD直接返回负载压力最小的AC实例。
Elkeid Manager
Manager管理整个后台,并提供各种查询、管理接口。包括管理AC集群,监控AC状态,控制AC服务相关参数,并通过AC管理所有的Agent,收集Agent运行状态,往Agent下发任务,同时manager也管理实时和离线计算集群。
鉴于Manager管理着后台的各个集群,所以任何的管理操作都是对集群的操作,调用Manger的接口请求会通过Manager转发给目标集群所有的节点,然后再收集所有节点的响应,再进行处理。为了提升这个过程的响应速度和稳定性,Manager内部实现了一个简单的分布式任务管理系统。
三、华为云上安装部署试用Elkeid
1. 华为云主机准备
- 购买华为云主机,本次评测系统如下:
2. 创建新的安全组,开发所有端口方便测试
更改安全组,如下,选择我们的开发所有端口的这个安全组:
- 开发所有端口后,我们ssh登录上华为云主机即可~
2. Elkeid安装和配置
官方参考:http://elkeid.bytedance.com/docs/elkeidup/deploy-zh_CN.html
基本参考官方文档,即可!
由于评测环境资源有限,我这里使用官方的docker安装简单试用一下Elkeid~
0. 先安装docker
yum install docker
1、单机docker快速部署 (单机测试环境推荐)
注:宿主机请优先使用centos 7.x 或 debian 9/10,容器内的服务依赖了systemd,而systemd使用了cgroup,容器内外systemd版本相差过大会导致容器内的systemd运行异常,无法启动相应服务。
1.1、导入镜像
# 从release下载的是分卷的镜像,需要先合并镜像
wget https://github.com/bytedance/Elkeid/releases/download/v1.9.1.4/elkeidup_image_v1.9.1.tar.gz.00
wget https://github.com/bytedance/Elkeid/releases/download/v1.9.1.4/elkeidup_image_v1.9.1.tar.gz.01
wget https://github.com/bytedance/Elkeid/releases/download/v1.9.1.4/elkeidup_image_v1.9.1.tar.gz.02
wget https://github.com/bytedance/Elkeid/releases/download/v1.9.1.4/elkeidup_image_v1.9.1.tar.gz.03
cat elkeidup_image_v1.9.1.tar.gz.* > elkeidup_image_v1.9.1.tar.gz
亲测,华为云下载这个很慢,建议迅雷下载后自行上传。
#导入镜像
docker load -i elkeidup_image_v1.9.1.tar.gz
1.2、运行容器
docker run -d --name elkeid_community \--restart=unless-stopped \-v /sys/fs/cgroup:/sys/fs/cgroup:ro \-p 8071:8071 -p 8072:8072 -p 8080:8080 \-p 8081:8081 -p 8082:8082 -p 8089:8080 -p 8090:8090\--privileged \elkeid/all-in-one:v1.9.1
1.3、设置对外IP
使用本机IP,不能使用127.0.0.1。
docker exec -it elkeid_community bashcd /root/.elkeidup/# 命令为交互式
./elkeidup public {ip}./elkeidup agent init
./elkeidup agent build
./elkeidup agent policy createcat ~/.elkeidup/elkeid_passwd
经过测试 2C2G安装 elkeid,报错如下,估计是内存太小了~
我们再次以2C4G机器做验证,还是报同样的冲突,因为字节elkeipdup没有开源,所以原因未知(大概率还是资源大小问题,我本地安装测试无问题)~
本次评测暂时处理到这里~~
3. docker安装过程问题记录
docker 报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
这个错误表示无法连接到 Docker daemon,常见的原因包括:
- Docker daemon 没有运行
可以使用sudo systemctl status docker
来检查docker服务是否运行,如果未运行可以使用sudo systemctl start docker
来启动
sudo systemctl start docker
sudo systemctl enable docker
docker报错: No chain/target/match by that name.
报错完整信息:
[root@dev elkeid]# docker run -d --name elkeid_community \
> --restart=unless-stopped \
> -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
> -p 8071:8071 -p 8072:8072 -p 8080:8080 \
> -p 8081:8081 -p 8082:8082 -p 8089:8080 -p 8090:8090\
> --privileged \
> elkeid/all-in-one:v1.9.1
5f24d42cfccf965d9a3ce6b7e5323049ff4fb9ef09d3ad1541b2391b28e3385b
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint elkeid_community (fd39db5e047de94bbba8f65474cf54ea9605062b36e630e4c46de56fe782c3e9): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8090 -j DNAT --to-destination 172.17.0.2:8090 ! -i docker0: iptables: No chain/target/match by that name.(exit status 1)).
问题分析:这个问题是在使用 docker run 命令启动容器时,Docker 在设置容器的端口映射规则时失败了。
具体是在使用 iptables 添加 DNAT 规则失败,提示 iptables 没有指定的链、目标或匹配项。
这个问题常见于一些最小化的 Linux 发行版,默认没有安装 iptables 或 iptables 的 nat 模块。
问题解决:
- 确保主机上已经安装了 iptables 和 iptables 的 nat 模块
yum install iptables-services -y
- 启用 iptables 的 nat 功能
modprobe iptable_nat
- 重启 docker 服务
systemctl restart docker
4. Elkeid使用
顺利安装完成后,容器的/root/.elkeidup/elkeid_passwd
文件记录了各组件的密码和相关的url。
访问elkeid_console,按照 安装配置 界面的命令进行Agent安装部署。
四、参考
【Elkeid 策略】抗击黑客:如何利用Elkeid构建入侵检测能力
参考URL: https://www.zhihu.com/column/c_1411384767867162624
字节跳动如何从0到1打造一个开源项目?
参考URL: https://www.51cto.com/article/711324.html