#security #enforcer #perimeterx

perimeterx-fastly-enforcer

PerimeterX Fastly Compute@Edge Rust Enforcer

1 个稳定版本

1.1.1 2024 年 5 月 14 日

#932网络编程

MIT 许可证

89KB
2K SLoC

image

PerimeterX Fastly Compute@Edge Rust Enforcer

Crates.io License Badge

目录

项目结构

  • src 文件夹包含 Fastly Compute@Edge Rust 模块
  • example 文件夹包含一个示例 Fastly Compute@Edge Rust 应用程序
  • contrib/pxconfig.sh 脚本用于创建 Fastly 配置存储并填充默认值
  • contrib/pxbackend.sh 脚本用于创建和配置 PX 后端主机

先决条件

为了编译和部署 Fastly Compute@Edge 包,必须安装并配置 Fastly CLI: Compute@Edge 服务

配置

模块配置使用 Compute@Edge 配置存储完成。请参阅 PerimeterX 文档了解各个配置选项的说明。

这是所需的 Config 存储 (PXConfig) 项目和数据类型列表

配置名称 类型 默认值
px_app_id 字符串 必需 -
px_cookie_secret 字符串 必需 -
px_auth_token 字符串 必需 -
px_module_enabled 布尔型 可选 false
px_module_mode "active_blocking", "monitor" 可选 "monitor"
px_debug 布尔型 可选 false
px_blocking_score 数字 可选 100
px_sensitive_headers 列表 可选 []
px_sensitive_routes 列表 可选 []
px_filter_by_route 列表 可选 []
px_filter_by_user_agent 列表 可选 []
px_filter_by_ip 列表 可选 []
px_filter_by_http_method 列表 可选 []
px_custom_cookie_header 字符串 可选 ""
px_enforced_routes 列表 可选 []
px_monitored_routes 列表 可选 []
px_bypass_monitor_header 字符串 可选 ""
px_first_party_enabled 布尔型 可选 true
px_custom_logo 字符串 可选 ""
px_js_ref 字符串 可选 ""
px_css_ref 字符串 可选 ""
px_ip_headers 列表 可选 []
log_endpoint 字符串 可选 ""
px_graphql_enabled 布尔型 可选 false
px_graphql_routes 列表 可选 ["^/graphql$"]
px_sensitive_graphql_operation_names 列表 可选 []
px_sensitive_graphql_operation_types 列表 可选 []

pxconfig.sh 脚本可用于将所需值填充到配置存储中。用法

Required options:
-s, --service-id=SERVICE_ID       specify a service to deploy the Config store
-v, --version=VER                 specify a service version
-a, --appid=APPID                 specify an appid
-c, --cookie_secret=SECRET        specify a cookie_secret
-t, --auth_token=TOKEN            specify an auth_token

PerimeterX 后端

为了使PerimeterX Enforcer能够与PerimeterX Collector服务器通信,必须在Fastly UI中添加并配置一个特殊的“后端”服务器(或使用contrib/pxbackend.sh脚本)。后端参数(将${APP_ID}替换为您的PerimeterX应用程序ID)

  • 名称:PX_BACKEND_${APP_ID}
  • 主机名:sapi-${APP_ID}.perimeterx.net
  • 覆盖主机:(空值)
  • 使用SSL/TLS:是

安装

Cargo.toml中包含perimeterx-fastly-enforcer依赖项

cargo add perimeterx-fastly-enforcer

模块集成

要将PerimeterX Rust模块集成到现有的Rust代码中,可以使用以下基本代码片段(更高级的示例请参见“example”文件夹中的项目)

    let mut px: PXEnforcer = PXEnforcer::new();
    let px_result = px.enforce(&mut req)?;
    if let Some(r) = px_result {
        return Ok(r);
    };

    //... communicate with Origin server / process request and response

    px.post_enforce(&response);

Enforcer API

初始化PXEnforcer结构

pub fn new() -> Self

此函数接收请求并返回一个包含“响应”(对于“阻止”或“第一方”请求)的Result

pub fn enforce(&mut self, req: &mut Request) -> Result<Option<Response>, Error>

在请求处理结束时,必须调用以下函数以最终化PerimeterX enforcer代码

pub fn post_enforce(&self, res: &Response)

可以通过px.ctx成员以各种Enforcer变量访问PXContext结构

    // send "score" value to the Origin
    req.set_header("x-px-score", px.ctx.score.to_string());

要设置“custom_parameters”变量,可以使用以下回调函数

pub type PXEnrichCustomParamsFn = fn (req: &Request, conf: &PXConfig, params: &mut PXCustomParams);

其中:req:fastly::Request conf:PXConfig params:具有custom_param1 .. custom_param10字段的可修改的结构

要设置自定义参数回调函数,请使用以下设置器

pub fn set_enrich_custom_params_fn(&mut self, f: PXEnrichCustomParamsFn)

示例代码

这是使用PerimeterX Rust模块的最简单示例

use fastly::{Error, Request, Response};
use perimeterx_fastly_enforcer::pxenforce::PXEnforcer;

const ORIGIN_BACKEND: &str = "origin_backend";

fn send_to_origin(req: Request) -> Result<Response, Error> {
    println!("sending to Origin...");
    match req.send(ORIGIN_BACKEND) {
        Ok(r) => return Ok(r),
        Err(e) => return Err(e.into()),
    }
}

#[fastly::main]
fn main(mut req: Request) -> Result<Response, Error> {

    let mut px: PXEnforcer = PXEnforcer::new();

    // execute PX Enforcer for Request
    let px_result = px.enforce(&mut req)?;

    // return, if it's a "blocked" or "first party" response
    if let Some(r) = px_result {
        return Ok(r);
    };

    // ... process Client request ...

    // we can access "PXContext" structure.
    // as an example: send "score" value to the Origin
    req.set_header("x-px-score", px.ctx.score.to_string());

    // a client function to communicate with the Origin
    let response = send_to_origin(req)?;

    // ... process Origin response ...

    // must be called at the end
    px.post_enforce(&response);

    // we are ok to send response back to client
    return Ok(response);
}

对于完整的示例:example文件夹包含一个示例项目。

依赖关系

~13–23MB
~354K SLoC