リクエストを異なるルールでフィルタリングするリバースHTTPプロキシ。
プロダクションWebサーバとアプリケーションサーバの間で使用し、アプリケーションバックエンドの悪用を防ぐことができます。
このプログラムの本来の目的はsearxを防御することでしたが、あらゆるWebアプリケーションを保護するために使用できます。
$ go install github.com/asciimoo/filtron
$ "$GOPATH/bin/filtron" --help
ルールには必須属性が2つあります: name と actions
ルールには以下の属性を含めることができます:
limit integer - interval 秒間にアプリケーションへのアクセスを許可する一致リクエスト数を定義します。(0の場合は省略可)interval integer - ルールのカウンタをリセットする時間範囲(秒)。(limitが0の場合は省略可)filters セレクタのリストaggregations セレクタのリスト(filters指定時はフィルタが一致した場合のみ有効)subrules ルールのリスト(filters指定時はフィルタが一致した場合のみ有効)disabled bool - ルールを無効にする(デフォルトはfalse)stop bool - リクエスト検証を直ちに終了し、残りのルールをスキップする(デフォルトはfalse)ルールのJSON表現:
{
"name": "example rule",
"interval": 60,
"limit": 10,
"filters": ["GET:q", "Header:User-Agent=^curl"],
"actions": [
{"name": "log",
"params": {"destination": "stderr"}},
{"name": "block",
"params": {"message": "Not allowed"}}
]
}
説明: qがGETパラメータとして表現され、User-Agentヘッダーがcurlで始まる場合に、1分間に10リクエストのみ許可します。制限を超えた場合、リクエストはSTDERRに記録され、カスタムエラーメッセージでブロックされます。詳細な例はこちらを参照してください。
actionsルールのアクションは、リクエストがルールの制限を超えた場合に順次有効化されます。
注: カスタム応答を提供するルールの最初のアクションのみが実行されます。
logリクエストをログに記録する
blockリクエストをアプリケーションに渡す代わりにHTTP 429応答を返す
shell シェルコマンドを実行します。cmd(文字列)とargs(セレクタのリスト)は必須パラメータです。(例: {"name": "shell", "params": {"cmd": "echo %v is the IP", "args": ["IP"]}})
filtersすべてのセレクタが見つかった場合、カウンタが増加します。カウンタがlimitに達した場合、ルールはリクエストをブロックします。
aggregationsセレクタが返す値をカウントします。いずれかの値の数がlimitに達した場合、ルールはリクエストをブロックします。
subrules各ルールは任意の数のサブルールを含むことができます。親ルールのフィルタが一致した場合に有効化されます。
セレクタ式を使用して、リクエストの異なる部分を抽出できます。
セレクタは、次の構文でHTTPリクエストの任意の属性にマッチできる文字列です:
[!]RequestAttribute[:SubAttribute][=Expression]
! はセレクタを否定できますRequestAttribute (必須) リクエストの特定部分を選択 - 可能な値:
IPHostPathMethodGETPOSTParam - GETとPOSTの両方のエイリアスCookieHeaderSubAttribute が単一値でない場合、内部属性を指定できますIP はクライアントのIPアドレスを返します
GET:x は存在する場合、x GETパラメータを返します
!Header:Accept-Language はAccept-Language HTTPヘッダーがない場合にtrueを返します
Path=^/(x|y)$ はパスが/xまたは/yの場合にマッチします
IP=nslookup(example.com) はクライアントのIPアドレスがexample.comのIPアドレスのいずれかである場合にマッチします
Filtronは、デフォルトで127.0.0.1:4005で待機するREST APIを介して構成できます。
/rulesロードされたルール(JSON形式)
/rules/reload起動時に指定されたルールファイルをリロードする
API上に構築されたUI

バグや提案がありますか?issue trackerをご覧ください。
RequestAttributeExpression 可能な値:
nslookup(Hostname) - HostnameのIPアドレスで選択された属性値をフィルタリングします。Filtronはルールがロードされた時点でHostnameをそのIPアドレス(IPv4およびIPv6)に解決します。