#compliance #process #plugin

app miss-demeanor

快速、并行、可插拔的过程合规性检查器

4 个版本 (2 个重大更改)

0.3.2 2022年7月31日
0.3.1 2022年6月11日
0.3.0 2019年12月22日
0.2.0 2018年12月25日
0.1.0 2018年11月27日

#compliance 中排名第 12

BSD-3-Clause

34KB
785

miss-demeanor

一个以插件接口设计的 webhook 驱动的执行器,用于审计合规性

为什么要用 miss-demeanor?

  1. 名字很聪明,Missy Elliott 也很好。
  2. miss-demeanor 高度并行化,并且由于它是用 Rust 编写的,因此类型系统为您处理了许多多线程相关的问题。它快速处理请求,无状态,并且专门设计来避免死锁。
  3. miss-demeanor 是可插拔的,因此您在这里是自己的工作流程的制作者。
  4. 插件接口灵活且简单。
  5. 看第 1 点,这仍然是最有力的理由。

构建 miss-demeanor

安装 Rust 工具链。说明可以在 这里 找到。

导航到 miss-demeanor/ 并运行 cargo build --release。您的可执行文件将位于 ./target/release/miss-demeanor

使用 miss-demeanor 中的 TLS

目前 miss-demeanor 使用的 TLS 库仅支持 PCKS12/DER 身份格式。这不是我的选择,我希望最终能够支持服务器的 PEM 身份。

要轻松生成用于测试的自签名证书,请运行

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365
openssl pkcs12 -export -out identity.pfx -inkey key.pem -in cert.pem

调用非常简单:提供您的 PKCS12 身份文件的路径,并使用环境变量 PKCS12_PASSWORD 提供密码。

配置格式

配置文件是用 TOML 编写的。

以下是一个带有一些注释说明的示例配置文件

trigger_type = "c_abi" # Can also be "interpreted"

[server]
server_type = "webhook" # Can also be "unix_socket"
listen_addr = "127.0.0.1:8080" # Must be in the format IP:PORT
use_tls = false # You probably want this on unless you are running it over localhost - must pass -f on CLI when this is enabled

# One server endpoint
[[server.endpoints]]
path = "/pr" # URL path
trigger_name = "github-pr" # Unique name

# Another server endpoint
[[server.endpoints]]
path = "/merged"
trigger_name = "github-merged"

# Plugins
[[triggers]]
name = "github-merged" # Unique name
plugin_path = "./example-plugins/golang/github-merged.so" # Path to C ABI compatible shared object (.so)

目标是声明性地公开服务器配置。配置文件控制有关服务器的一切 - 端点、监听地址、传输层、与每个端点关联的插件等。

编写插件

您如何实际上编写 miss-demeanor 的插件?首先查看 miss-demeanor/example-plugins/ 以获取代码示例。

更长的答案是:插件可以是两种格式之一。

  • 它可以是定义为任何动态库 (.so 文件在 Linux 上为例) 导出与 C ABI 兼容的函数符号(C ABI 兼容意味着它遵循 C 调用约定等 - 在二进制级别它与 C 二进制文件不可区分)名为 trigger。要使用此功能,请将触发器类型设置为 c_abi

C 函数签名

int trigger(void *http_request);

Rust 函数签名

fn trigger(http_request: *const libc::c_void) -> libc::c_int;

C 示例

#include "trigger.h"
#include <stdio.h>

int trigger(void *http_request) {
  printf("%s\n", request_get_method(http_request));
  return 0;
}

Golang 示例

// #include "trigger.h"
// #cgo LDFLAGS: -lmissdemeanor -ldl
import "C"
import "unsafe"

import "fmt"

//export trigger
func trigger(http_request unsafe.Pointer) C.int {
  fmt.Println(C.GoString(C.request_get_method(http_request)))
}

func main {}

Rust 示例

use missdemeanor::CRequest;

#[no_mangle]
pub fn trigger(http_request: *const CRequest) -> libc::c_int {
    let method = match unsafe { request.as_ref() }.get_method() {
        Ok(b) => b,
        Err(e) => {
            println!("{}", e);
            return 1;
        },
    };
    println!("{}", method);
}
  • 它可以是定义为具有开头 shebang 的解释脚本。要使用此功能,请将触发器类型设置为 interpreted

Python 示例

#!/usr/bin/python

import sys

method = sys.argv[1]

print(method)

依赖项

~10–23MB
~333K SLoC