时尚指南
此样式指南涵盖了所有插件组件的样式,包括插件的规范,代码,依赖关系和文档。
约定
以下各节文档约定在编写插件时应遵循的约定。
如果本文档中没有定义规则,请遵循PEP8.
快速指南
- 对于依赖关系,PIN操作系统包和Python包版本。
- 为安全起见,请将最低特权帐户设置为
用户无人
在Dockerfile
在可能的情况下。 - 对于大小,使用苗条的SDK的图片在可能的情况下:
komand/python-3-37-slim-plugin
和komand / python-3-37-plugin
. - 错误处理,使用pluginexception.和connectionTestException..
- 对于日志,使用自动记录器.
- 对于文档,使用变更日志样式.
- 对于Docs,验证Markdown
使生效
这是一个电话mdl
,线头help.md
.
插件名称
关于中定义的插件名称plugin.spec.yaml文件。注意,这应该是唯一被调用的键名称
在整个插件规范中(所有其他插件应该重命名为标题
.)
名称:plugin_name.
规则
- 名称应小写。
我的插件
- 尽可能使用company_product格式
- 例如
rapt7_metasploit.
- 例如
- 名称应该简洁,并表示其用途或服务名称
- e、 g.现在的服务应该是
ServiceNOW.
- e、 g.现在的服务应该是
- 如果不是公司或服务名称,请使用下划线分隔单词
- 例如
获取url
- 例如
- 如果服务和网站相同,如果域是足够独特的,则避免顶级域名
- 例如freegeoip.net应该是
免费
- 例如freegeoip.net应该是
- 如果服务和网站相同,如果域不唯一,请添加顶级域
- e、 g.ifconfig是unixtool,web服务ifconfig.co应该是unixtool
ifconfig_co.
- e、 g.ifconfig是unixtool,web服务ifconfig.co应该是unixtool
- 数字在插件名中是有效的
- 例如
geolite2
- 例如
- 不允许使用字母数字和下划线以外的字符
- 名字应该少于四个字
规格
的样式信息。plugin.spec.yaml
文件。
缩进
缩进使用两个空格:
亚马尔
1触发器:2my_trigger1:3.废话:4废话:5my_trigger2:6废话:7废话:
换行符
模式部分:元数据、触发器、操作、连接,应该用换行符分隔。此外,在文件末尾不应该有额外的换行符。
例子:
亚马尔
1...2标签:[“废话”]3.4触发器:5my_trigger1:6废话:7废话:8my_trigger2:9废话:10废话:1112行动:13我的行动1:14废话:15废话:16我的行动2:17废话:18废话:
引用
在所有类型中,只需要双引用数组类型。
好:
亚马尔
1输入:2大堆:3.描述:一系列的东西4类型:“[]字符串”
缺点:
亚马尔
1输入:2url:3.类型:“细绳”#这句话不应该引用4描述:要下载的URL5必修的:“对”#这句话不应该引用
标点
不要在句子结尾加上标点符号标题
和描述
. 它们也不应该出现在任何其他领域。规范帮助部分的正文中应使用标点符号。
标签
要求:*小写字符*允许数字*不允许下划线
亚马尔
1标签:[恶意软件,国际奥委会,老鼠,特洛伊木马,远程]
提交消息
Git提交应该是描述性的,并描述修复或更改。
规则
使用命令
- 例如
使固定
而不是固定的
或修复
- 描述的第一个字母应大写
- 使用表格:
在可能的情况下:
- 例如
操作和触发器名称
名称在中指定plugin.spec.yaml
文件使用标题
钥匙好的风格示例如下:
亚马尔
1行动:2匹配字符串:3.标题:匹配字符串4描述:从文本文件中匹配字符串5匹配号码:6标题:匹配号码7描述:匹配文本文件中的数字8提取:9标题:提取10描述:从归档文件中提取文件
规则
标题
应该不超过四个字。该描述旨在给出其余的细节。- 每一个单词
标题
首字母应大写(例如。匹配字符串
因为它是一个标题。)这条规则的例外是冠词和连词。解析一个分类
)。 - 第一个词
描述
第一个字母应该大写,而不是和标题
(例如。匹配文本文件中的字符串
)。
财产名称
这里定义了属性名,包括输入/输出变量、操作、触发器和连接名。
常见的
宿主
- 中性:当IP地址或域名可以是值时使用。地址
-仅用于IP地址值(IPv4或IPv6)。8.8.8.8
领域
-仅用于域名值,例如:www.google.com
url
- 仅用于URL值例如U.G.https://product.company.com:1234
ssl_verify
-用于决定是否验证SSL证书的布尔属性
规则
- 名称应小写。
暂停
- 名称应该简明扼要,能表达其目的,如果可能的话,不要用两个字。
国家代码
- 如果不够简洁,可以使用下划线分隔单词
metro_code.
- 除非API要求,否则不允许使用alpha和下划线以外的字符
输入示例
在Plugin.Spec.YAML和HELP.MD中需要添加输入示例。在Plugin.Spec.yaml和Help.md中的每个输入。这将帮助用户弄清楚输入值的格式。
下表列出了一些示例类型和值。
实例类型 | 示例值 |
---|---|
公司 | 例如组织 |
域名 | example.com rapid7.com |
URL | https://example.com https://rapid7.com |
IP地址 | 代码块192.0.2.0/24 (TEST-NET-1)、198.51.100.0/24 (TEST-NET-2)和203.0.113.0/24 (TEST-NET-3)在文档中提供了使用。RFC5737 |
IP网关 | 198.51.100.1 |
IP广播 | 198.51.100.255 |
IP CIDR | 198.51.100.0/24 |
IPv6地址 | 2001:DB8:1:1:1:1:1:1(RFC3849- 文档保留的地址) |
电子邮件 | user@example.com 数组:[”user1@example.com", "user2@example.com"] 区分域名:user@rapid7.com、user2@rapid7.com |
用户名 | User1. |
全名 | 示例用户 |
电话号码 | 美国电话范围是(800)555-0100到(800)555-0199。这个范围只在例子和小说中使用。 |
一般MD5哈希 | 9de5069c5afe602b2ea0a04b66beb2c0 |
一般SHA1哈希 | 02699626 f388ed830012e5b787640e71c56d42d8 |
字节的文件 | UMFWawq3ieluc2lnahrdb25uzwn0cg ==. |
恶意软件的文件名 | setup.exe. |
credential_username_password. | {"username": "user1", "password": "mypassword"} -如果password不是密码,如Jira API密钥-确保你的格式是真实的但经过消毒的密钥 |
凭证\u密钥\u密钥 | {"domain": "example.com", "token": "9de5069c5afe602b2ea0a04b66beb2c0"} -根据需要更新token以匹配供应商的密钥格式。如果key是MD5哈希(32字符无换行),则使用的内容echo "Rapid7 InsightConnect" | md5 . txt |
credential_asymmetric_key. | ----- begin rsa私钥----- miiepqibaakcaqeajgnoutfphqvx3piu6n9fkmwq3zl + noawb4ymlhudkdebj3au. +I8QdlqDKBm656UeOCh3r/i9e0ULKxkXDFfKmc3p2Wv+0LVOYGVXZFKUKH0RIAL A4imyYuL / fweOSGSnQlgYKr99HciTBIdL15SZ32TjYb + PDZBl + 6 zqsw2hynjcqmj iciC7CAj6gB9SO8x1vMsRkU + rqKuc2r8Uk + qhECw8zR4K66wFuYM17sGUMXUq / pH Wdievo3q / mdk47nnrx5i2bac7o5rxspkhyy6xer4vbnipl4dgakkanol02a + zv38q l + xy9wdmWqUIbMiqSbj / k6xxDiPQkTR + / 032 eqidaqabaoibaekpzpbutpqbrj3n 5s1rb71ul85u0oqks2dnvb89xvabb0nll1wsc39yb271phrjorrqpkmwhq08cfrae. 3oxQnh47s+OROxpmyzSidjMICR5TrzJXeYonk0G7JGC+OL3YIEONTZGQXHUQB 3 mfiz45shdv3mxc3lpfs35 xTHM8E /千瓦/ gTfvU3QboQaL1q / taRQYEHvgiutwdZ0 sEFtJ8eAwOBABXiV3QPxnAQgIpwYpbicl3AK15gs5ENK4Rngi2bI7hdmMwDWa6t/ g0CP0TityFq05JUmnaz4wekXxD5EBm776EYNSoxTCaSzTMYwZCITrqXl6Y4 / ogeT UVSM9ZECGYEA7G8CYYDKDTBYOUIYEKWUELOA2EDXMVYKL8LOPIQ1QOSH/N1 30 nn / GVcvD7QED4p / u0XaMuPm2HVhuXwxu / t9j11DVlKP7QsH9u4pJKziw6NmV5N / 9 + mcjdWAH5BqaJtmpF0uoZsWk41JVe0fA7a3FCrXp1U / GD9BKSAD00CgYEAmAio ChEh7+pD7vutF85u+FqbdjY+KmyFeTPd2717P6i5V6C6lVpcnM7voZlGy0fjoald E9NTM0VU8FZKUIHKPZW9/LSAV8BgO+vSQrN/IMEmDqol959IxxI/6yzkY5JwYRP mlwonzu0ekchzg0eu7da1uzrfv4f1nuw + qylrd0cgyeazr07ohdp1jycitd8u3n6 EWh6s6g0sVV5tdp / UszXpMgLyQFnW9ztIvRMU / jmIAzkrm9NFYaHw7DLv9jKd4y0 /59o+ro+kg+TPYSKUMJOKCNFJ9DOQWVZSYR45IDHIVTNYA1ZSYRMVYF3CZ dw8ePSukzbTRTWYZmGenOrkCgYEAhoO6MdYAweXzH0J8XsDePEzmmcvaauzDl35F ox4st8fggmomidg gIOAxc1B1381NqnRoUgSi1czZO6BP + q69LbX3PaV9WNqtDp + 5 / m5z3f4ltajivd41v9hr2i1yx4mwrmslh1acmmmqvvzsteklvez8jd8zogv69ybav. kdsXa90CgYEAk+6ghpXNku12UANf9MH8loN+35/iPeeoqf0MY5FMVRYx10ZA91Lh ieAczVhiqzxCtHWhLA4SxE962eg + / awkS4kXLCMuZIESE + jFc7ptUmJjlsOWjv 8 / dquh5yjrks2qxkbwg4hmt3nx6a8syriuyxyqvlbpg8ykngbnaypv4 = -----结束RSA私钥----- |
文件 | {“filename”:“echo“Rapid7 Insightconnect”|Base64. ) |
哈希型CRC32. | 6851CF3C. |
MD5散列类型 | 44D88612FEA8A8F36DE82E1278ABB02F. |
SHA1哈希类型 | 3395856ce81f2b7382dee72602f798b642f14140 |
哈希类型SHA224 | b42ec8b47deb2dc75edebd01132d63f8e8d4cd08e5d26d8bd366bdc5 |
哈希类型SHA256 | 275年a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f |
散列类型SHA384 | 038F2E50E33DACEF50D7E503B45C35255FCDBE89A823F9C4417D7C13E8E96A53DD6BD6D7FCC91189C5CDA7253F4455106 |
哈希类型SHA512 | CC805D5FAB1FD71A4AB352A9C533E65FB2DB5B885518F4E565E688447223B8E6B85CB48F3AFAD842726D99239C9E3650C64B0DC9A061D9E507D833277ADA36AB |
变更日志
我们在插件的帮助属性的版本部分记录更新日志历史plugin.spec.yaml.格式是x.x.x -
其中x代表语义版本和消息文档更改。
下面是一些常用的插件更改的消息约定列表。
支持web服务器模式
-支持web服务器模式,即新的父Docker映像,v2插件规范版本,和新的自我。记录器使用更新到新的凭据类型
—支持新的证书类型,如“credential_username_password”、“credential_secret_key”更新到v2 Python插件架构
-用于移植到Python v2 arch更新到新的秘密密钥凭据类型
—用于使用单个新的凭据类型,在本例中特定于credential_secret_key新建操作<操作标题>
-对于新操作,例如新操作从策略中删除新动作<动作标题>和<动作标题>
-查看两个新操作的列表新建动作<动作标题>,<动作标题>和<动作标题>
- 对于两个以上的新操作的列表新触发<触发标题>
-新的触发器新触发器
- 有关两个新触发器的列表和 新建动作<动作标题>,<动作标题>和<动作标题>
-对于包含两个以上新触发器的列表新触发器
-对于新触发器和多个操作|新动作 , 和 修复
修复错误,例如修复连接中可能导致有效凭据失败的问题更新以使用
komand/python-3-slim-plugin:2`` Docker镜像以减少插件大小-用于使用新的SDK镜像运行插件作为最低特权用户
-指示用户无人在中的设置Dockerfile
对于多个字符,同时使用|字符连接,例如:
更新到v2 Python插件体系结构|支持web服务器模式|更新到新的凭据类型
更新到新的凭据类型|新动作禁用用户
错误
见集成时出错指导
触发器
输入
为了可用性,所有触发器都应该支持调用的输入间隔
在sdk语言中传递给睡眠机制的:
亚马尔
1频率:2类型:整数3.描述:轮询频率(秒)4违约:3005必修的:错误的
连接
风格
连接遵循与属性名称相同的样式指南。
记录
不使用连接的插件应该删除默认值self.logger.info
的声明connection.py
主体,并添加经过
陈述
Python
1def连接(自己,参数):2“”3.连接配置参数以字典的形式提供4参数,也可以在self.parameters['key']中访问56下面将设置要访问的var7self.blah=self.parameters['blah']8在动作和触发文件中如下:9废话= self.connection.blah10“”11#TODO:如果不需要连接,则实现连接或“通过”12自己.记录器.信息(“连接:连接…”)
这是在遵循时看起来的样子:
Python
1def连接(自己,参数):2“”3.连接配置参数以字典的形式提供4参数,也可以在self.parameters['key']中访问56下面将设置要访问的var7self.blah=self.parameters['blah']8在动作和触发文件中如下:9废话= self.connection.blah10“”11经过
待办事项
在完成所有任务后,删除插件自动生成的TODO行。
注意到# 去做下面新生成操作的行。添加代码时应删除这些行。
Python
1进口komand2从…起.架构进口域查找输入,域查找输出3.#下面是自定义导入456班级域查找(komand.行动):78def__初始化__(自己):9超级的(自己.__班级__,自己).__初始化__(10名称='domain_lookup',11描述=“查找域名”,12输入=域查找输入(),13输出=域查找输出())1415def跑(自己,参数={}):16#TODO:实现运行函数17返回{}1819def测试(自己):20.#todo:实现测试功能21返回{}
注意到# 去做新生成的行connection.py文件如下。这条线应该拆下。
Python
1进口komand2从…起.架构进口ConnectionSchema3.#下面是自定义导入456班级联系(komand.联系):78def__初始化__(自己):9超级的(自己.__班级__,自己).__初始化__(输入=ConnectionSchema())1011def连接(自己,参数):12“”13连接配置参数以字典的形式提供14参数,也可以在self.parameters['key']中访问1516下面将设置要访问的var17self.blah=self.parameters['blah']18在动作和触发文件中如下:19废话= self.connection.blah20.“”21#TODO:如果不需要连接,则实现连接或“通过”22自己.记录器.信息(“连接:连接…”)
测验
每个插件都应该包含JSON测试文件测试
目录中。这些测试文件用于模拟用户对插件的输入,以测试插件的各种操作和触发器。
的。/ run.sh
每个插件目录中的工具可用于列出可用的样本并生成它们。
列出样本
1$ ./run.sh -c sample .sh2操作:[域\查找域\黑名单地址\黑名单url \查找地址\查找]3.触发:[poll_domain_blacklist poll_address_blacklist]4样本需要样本名称,例如“`./run.sh-c Sample”
生成domain_lookup操作的示例,并将其写入测试目录中。
$ ./run.sh -c sample domain_lookup > tests/domain_lookup.json
生成所有样本并将它们写入测试目录中。
$ ./run.sh -c样品
在这个事件中。/ run.sh不可用,执行手动生成:
docker运行komand/
金桥
用于漂亮地打印文件,使其更易于编辑。
规则
- 所有操作的成功测试
- 所有操作的故障测试
- 所有可选输入和所有操作的测试
- 失败测试的后缀应为
_坏的
例如png_下载_bad.json
- 成功测试不应加后缀,例如。
png_download.json.
例子
- 成功:
例如\ .json domain_lookup.json
,github_lookup.json
- 失败:
例如_ _bad.json nxdomain_lookup_bad.json
,private_ip_lookup_bad.json
来自csv
插入:
1测试:2├── 1r_filter.json3.├──1 r_filter_bad.json4├── 1r_filter_bad2.json5├── 1r_filter_bad3.json6├──1R_FILTER_BAD4.JSON.7├──1 r_space_filter.json8└──csv_filter_bad.json.
依赖关系
Dockerfile
所有插件都可以使用和修改Dockerfile
向插件添加依赖项。依赖项通常随运行
和/或添加
Dockerfile命令。
在下面的示例中,我们需要一个Debian包、一个在python存储库中不可用的自定义python库和一个配置文件,以便插件可以成功运行:
1来自Komand / Komand / Python-3-37 -37 -37-Slim-Plugin2#参考以下文档获取可用的SDK父映像:https://komand.github.io/python/sdk.html#version3.4标签组织= komand5标签sdk = python6标签类型=插件78在这里添加任何自定义包依赖项9#注意:将pip包添加到requirements.txt10执行apt-get update && apt-get install -y whois=5.2.7命令11执行命令pip install git+https://github.com/komand/python-whois.git@0.4.01213#结束包依赖项1415#添加Plugin Repo的配置文件16添加./whois.conf/etc/whois.conf1718#安装pip依赖项19如果[-f要求.txt]运行;然后pip安装-r要求.txt;FI.20.21#安装插件22运行Python setup.py build && python setup.py安装2324#用户运行插件代码。支持的两个用户是:root, nobody25用户无人2627EntryPoint [“/ usr / local / bin / komand_whois”]
注意皮普
默认情况下,在Docker映像中安装,但不应使用此方法安装Python包,除非使用下面描述的方法无法找到它们。上面的示例是使用其他方法无法使用的情况。
规则:
- 需要依赖项包的固定版本
- Debian软件包,
apt-get更新
必须在包装安装之前使用 - 不应该用于Python包安装,除非技术限制
让
较新的插件(v2 arch)使用让
文件以获取依赖项。如果插件不包含此文件,则旧的setup . py
使用文件。
规则:
- 中需要依赖包的固定版本
让
- 不要碰
setup . py
如。
1猫powershell /让美元2#在这里列出第三方依赖项,用换行符分隔。3.#所有依赖项必须是版本固定的,例如。请求== 1.2.04#见:https://pip.pypa.io/en/stable/user_guide/#requirements-档案5pywinrm == 0.2.26pykerberos==1.2.17requests-kerberos = = 0.12.0
setup . py
老普卢金斯(V1
arch)使用setup . py
文件获取依赖项。如果插件包含让
然后,不应修改此文件,请参见上面的部分。
规则:
- 中需要依赖包的固定版本
setup . py
的install_requires节
如。
1$ cat zeus_tracker / setup.py2从setuptools导入setup, find_packages3.4设置(name = ' zeus_tracker-komand-plugin ',5版本='0.1.1',6description='ZeuS Command&Control Server Tracking',7作者:komand,8author_email = ",9url=“”,10包= find_packages (),11install_requires=['komand','feedparser==5.2.1','lxml==4.1.1'],12脚本=(“bin / komand_zeus_tracker”)13)