1 个稳定版本
1.1.1 | 2024 年 5 月 14 日 |
---|
#932 在 网络编程
89KB
2K SLoC
PerimeterX Fastly Compute@Edge Rust Enforcer
目录
项目结构
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