Cnitch:一款Docker引擎运行进程权限检测工具
Cnitch
Cnitch,又名Snitch或Container Snitch,它是一款针对Docker引擎的运行进程权限检测工具。Cnitch本质上来说是一个简单的框架和命令行工具,该工具可以帮助研究人员监控Docker容器内的运行进程,如果有进程是以root权限的话,研究人员将第一时间收到Cnitch的通知。
为什么我们需要去识别Docker引擎内以root权限运行的进程呢?如果你还不知道的话,可以先看看以下这篇文章。
http://canihaznonprivilegedcontainers.info/
当时本人在开发Cnitch的过程中,我以为我遇到了一个应用程序漏洞,当时Cnitch报告自身是一个Docker容器内的root进程。当时我不确定到底发生什么了,因为根据Dockerfile内的声明,我创建的用户并不是以root权限下运行的。经过大量的调试和验证,我决定再次检查Dockerfile的内容,其内容如下:
FROM alpine
RUN adduser -h /home/cnitch -D cnitch cnitch
COPY ./cmd/cnitch /home/cnitch/
RUN chmod +x /home/cnitch/cnitch
#USER cnitch
ENTRYPOINT ["/home/cnitch/cnitch"]
当我在测试应用程序容器以了解到底发生了什么时,我必须要将USER命令注释掉。经过一系列研究之后,我便将发现的问题以及解决方案集成到了Cnitch之中。
工具运行机制
Cnitch能够通过API来跟Docker引擎连接,并查询当前正在运行的容器。接下来,该工具将会检测容器内正在运行的进程,并识别运行的进程是否是以root用户权限运行的。
当Cnitch检测到了一个root进程之后,便会将相关信息发送给Cnitch中的一个可配置报告模块,并允许研究人员对相关信息进行编辑或进行其他操作:
2020/07/29 16:04:27 Starting Cnitch: Monitoring Docker Processes at: tcp://172.16.255.128:2376
2020/07/29 16:04:27 Checking for root processes every: 10s
2020/07/29 16:05:08 Checking image: ubuntu, id: 7bd489560a310343c39186500daa680290289c27f7a730524a31355a3aaf0430
2020/07/29 16:05:08 >> WARNING: found process running as root: tail -f /dev/null pid: 365
报告模块
目前,Cnitch可以将发现的信息报告给StatsD和StdOut,报告后端允许研究人员自行扩展,以便支持任何后台服务器。除此之外,Cnitch的可扩展特性还可以帮助研究人员构建一个后台系统以支持日志存储或日志聚合,而且整个过程非常简单。
StatsD
Cnitch会利用cnitch.exception.root_process方法将检测到的信息发送给StatsD,并且每条信息都会使用Cnitch示例的host名称以及container名称进行标记。
StdOut
StdOut是一个简单的输出日志记录组件,它可以接收并记录Cnitch反馈回来的监测信息。
工具下载
广大研究人员可以使用下列命令将项目源码克隆至本地:
git clone https://github.com/nicholasjackson/cnitch.git
工具运行
我们可以在一个Docker容器内运行Cnitch,也可以直接在本地运行,但在工具运行之前需要设置服务器的URL地址、Docker API和socket路径,所有的参数都需要通过环境变量“DOCKER_HOST”来设置。
参数选项
--hostname=[hostname]:用于整合信息的名称或IP地址
--statsd-server=[hostname:port]:StatsD收集器的URI,如果忽略该参数,那么StatsD报告功能将被禁用
--check=[duration e.g. 10s (10 seconds), 1m (1 minute)]:Cnitch扫描root进程的频率
命令行
设置Docker引擎API的“DOCKER_HOST”环境变量,然后使用下列参数在命令行工具中运行Cnitch:
$ cnitch --hostname=myhost --statsd-server=127.0.0.1:8125 --check=10s
Docker
Cnitch能够在一个非特权容器中运行,如果你想要使用Docker sock来访问API,你还需要将Cnitch用户添加至docker组。这一步可以通过“—group-add”参数来实现:
--group-add=$(stat -f "%g" /var/run/docker.sock
下面的代码可以使用Docker sock文件来实现API访问:
$ docker run -i -t --rm
-v /var/run/docker.sock:/var/run/docker.sock
--group-add=$(stat -f "%g" /var/run/docker.sock)
-e "DOCKER_HOST:unix:///var/run/docker.sock"
quay.io/nicholasjackson/cnitch [options]
工具使用样例
在下面的例子中,显示了Cnitch如何将数据导出至StatsD,其中的Docker Compose栈位于该项目的./example目录中
$ cd ./example
$ docker-compose up
运行上述命令之后,在浏览器中访问“http://[docker host ip]:3000”,你将会看到如下图所示的Grafana登录界面:
使用下列凭证信息登录Grafana:
用户名:admin 密码:admin
接下来,选择Cnitch仪表盘,这个仪表盘会显示当前目标容器内正在运行的root进程:
项目地址
Cnitch:https://github.com/nicholasjackson/cnitch
- Linux基础(day57)
- 15.2/15.3 使用vsftpd搭建ftp
- JDK容器学习之Map: HashMap,TreeMap,LinkedHashMap对比小结
- 14.4 exportfs命令
- 不用那么多,每天一点点,学习React,贵在持之以恒
- Linux基础(day56)
- android classloader双亲委托模式
- 14.3 NFS配置选项
- 14.2 NFS服务端安装配置
- React Native组件之Button
- JDK容器学习之TreeMap (二) : 使用说明
- 从React和angular看技术路线的分歧
- JDK容器学习之LinkedHashMap (一):底层存储结构分析
- Linux基础(day60)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用了这么久axios,你知道它是如何封装 HTTP 请求的吗?
- 方块转换 Transformations
- 回文平方数 Palindromic Squares
- 双重回文数 Dual Palindromes
- 修理牛棚 Barn Repair
- 牛式 Prime Cryptarithm
- 解题报告(牛客OI周赛7-普及组)
- 号码锁 Combination Lock
- 数据结构回顾及展望(一)
- Spring Boot 整合 Quartz 实现 Java 定时任务的动态配置
- 数据结构回顾及展望(二)(3.22更新)
- Windows挂载CFS文件系统
- XMU oj Problem List
- Python入门笔记(安装及初步使用)
- python 入门笔记[语法基础(上)]