某容器中启动了一个shell; 某服务进程创建了一个非预期类型的子进程; /etc/shadow文件被读写; /dev目录下创建了一个非设备文件; ls之类的常规系统工具向外进行了对外网络通信。
创建了带有特权容器、挂载敏感路径或使用了宿主机网络的Pod; 向用户授予大范围权限(例如cluster-admin); 创建了带有敏感信息的configmap。
1)Falco主要依赖于底层Sysdig内核模块提供的系统调用事件流,与用户态工具通过定时采样或轮询方式实现的离散式监控不同,它提供的是一种连续式实时监控功能; 2)与工作在内核层进行系统调用捕获、过滤和监控的工具相比,Falco自身运行在用户空间,仅仅借助内核模块来获得数据,Falco的规则变更和程序起止要更为灵活; 3)与其他既工作内核层又提供用户空间接口的工具相比,Falco具有非常易学的规则语法(可以与SELinux的规法对比)和对云环境的支持。
Falco采用C++语言编写,但它提供了丰富的告警输出方式(后面会提到),因此能够非常方便地与其他工具协同工作。
Sysdig内核模块; Kubernetes审计日志。
输出到标准输出; 输出到文件; 输出到Syslog; 输出到HTTP服务; 输出到其他程序(命令行管道方式)。

紫色模块为Falco目前支持的输入事件源; 绿色模块为目前支持的输出方式; 蓝色模块即Falco用户态程序。

规则:一条规则是描述“在什么条件下生成什么样的告警”的规定; 宏:这里宏的意义与C语言中的基本相同,它是一些“判定条件片段”,能够在不同的规则甚至宏中复用; 列表:即元素集合,能够被规则、宏或者其他列表使用。
从层次上来说,基础条件表达式、列表和宏一起构成规则,规则是最直接被Falco用来判断某一行为是否异常的依赖标准。一条规则至少由以下必需项构成:规则名、条件、描述文字、输出信息和优先级。
$ helm repo add falcosecurity https://falcosecurity.github.io/charts
$ helm repo update
Hang tight while we grab the latest from your chart repositories......Successfully got an update from the "falcosecurity" chart repository...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
$ helm install falco falcosecurity/falco \
--set falco.jsonOutput=true \
--set falco.fileOutput.enabled=true,falco.fileOutput.keepAlive=true,falco.fileOutput.filename=/mnt/events.txt #这里我们安装时打开文件文件输出以及定义日志文件位置
NAME: falco
LAST DEPLOYED: Mon Nov 9 22:09:28 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Falco agents are spinning up on each node in your cluster. After a few
seconds, they are going to start monitoring your containers looking for
security issues.
No further action should be required.
$ helm ls
$ kubectl get pods
#安装nfs#
master节点作为nfs服务端,node节点作为客户端#master节点安装nfs$yum install -y nfs-utils rpcbind
#node节点安装nfs
$ yum install -y nfs-utils
$ yum install -y nfs-utils
#配置nfs
$vim /etc/exports
/nfsdata *(rw,no_root_squash,no_all_squash,sync)
#创建/nfsdata目录并赋权$mkdir /nfsdata$chmod 775 -R /nfsdata
#启动nfs和rpcbind服务
$systemctl start rpcbind$systemctl start nfs
#node节点查看master共享目录
$showmount -e {NFS服务节点ip}
Export list for {NFS服务节点ip}:
/nfsdata *
PV :PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS等,都是通过插件机制完成与共享存储的对接。
#vim pv1.yamlapiVersion: v1kind: PersistentVolumemetadata:
name: pv1
labels:
app: nfsspec:
capacity: #指定 PV 的容量为 1G
storage: 1Gi
accessModes: #指定访问模式
- ReadWriteOnce #PV 能以 read-write 模式 mount 到单个节点
persistentVolumeReclaimPolicy: Recycle #指定当 PV 的回收策略为 Recycle
storageClassName: nfs #指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV
nfs:
path: /nfsdataserver: XXX.XXX.XXX.132 #nfs服务端ip
$kubectl apply -f pv1.yaml $persistentvolume/pv1 created
查看pv$kubectl get pv
#vim pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:
name: pvc1spec:
accessModes: #指定访问模式
ReadWriteOnce #PV 能以 read-write 模式 mount 到单个节点resources:
requests:storage: 1Gi
storageClassName: nfs
$kubectl apply -f pvc.yml
persistentvolumeclaim/pvc1 created
#查看pvc$kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pv1 1Gi RWO nfs 3s
#查看pv和pvc是否绑定
kubectl get pv
$kubectl get daemonsets.apps falco -o=yaml > falco.yaml


volumeMounts:
·····
- mountPath: /mnt
name: events-volume
·····
- name: events-volume
persistentVolumeClaim:
claimName: pvc1
$kubectl delete daemonsets.apps falco$kubectl apply -f falco.yaml
$ kubectl run --generator=run-pod/v1 nginx --image=nginx
$kubectl exec -it nginx -- bash$cat /etc/shadow


本文作者:汪训琪(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




