aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: 4a78afb2c2fbacaa4aa7c73a55c09b773d9501cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# Минималистичный Web Application Firewall (WAF) на OpenResty

UPDATE: добавлена работа со спецификой уязвимости PHP2Shell:

1. Бан по Multipart-границам формы 
2. Глубине вложенности JSON-структур
3. Странным параметрам PHPSESSID

## Архитектура

[ Входящий запрос ]
        │
        ├──► 0. Белый список IP и Глобальный Бан-лист (L1/L2 кэш)
        │
        ├──► 1. waf.detector   (Эвристика заголовков, Smuggling и сессии)
        │
        ├──► 2. waf.limits     (Двухпороговый Token Bucket на POST-динамику)
        │
        ├──► 3. waf.analyzer   (Анализатор Query String URL на SQLi/LFI)
        │
        └──► 4. waf.filter     (Потоковый стриминг Multipart и JSON скобок)

Структура файлов в репозитории:

• example.lua — Пример реализации на фазе access_by_lua 7 уровня OSI (фаза блока http).

• waf/config.lua — Единая точка конфигурации лимитов, белых списков и штрафных матриц.

• waf/ban.lua — Двухуровневый кэш блокировок (Локальная L1 таблица воркера ➡️ L2 shared_dict).

• waf/detector.lua — Анализатор аномалий HTTP-заголовков и валидатор формата куки PHPSESSID.

• waf/limits.lua — Двухпороговый ограничитель частоты (Rate Limiter) для тяжелых POST-запросов.

• waf/analyzer.lua — Высокоскоростной чистильщик параметров URL-строки (ngx.var.args).

• waf/filter.lua — Низкоуровневый потоковый парсер сырого сокета тела запроса (Multipart и JSON).


## Примеры использования

1. На уровне location

```http {

    lua_shared_dict banned_ips 10m; 
    lua_shared_dict limits 2m; 
    
    map $http_user_agent $is_bot {
		default 0;
		~*googlebot|yandex|bingbot|baiduspider|mail.ru_bot|ia_archiver|facebot|facebookexternalhit|twitterbot|://google.com|ahrefsbot|semrushbot|telegrambot|vkshare|whatsapp 1;
	}
   
	server {
		listen 443 ssl;
		server_name test.ru;
		server_tokens off;    
			
		location ~* /(wp-content|wp-includes|wp-admin|wp-login\.php|xmlrpc\.php|\.git|\.env|vendor|phpmyadmin|adminer\.php|\.htaccess|config\.init) {
			access_log off;
			log_not_found off;
			return 444;
		}
	
		location / {
			access_log off;
			access_by_lua_file /home/example.lua;
		}
	}

}```

2. На уровне server

```
http {

    lua_shared_dict banned_ips 10m; 
    lua_shared_dict limits 2m; 
    
    map $http_user_agent $is_bot {
		default 0;
		~*googlebot|yandex|bingbot|baiduspider|mail.ru_bot|ia_archiver|facebot|facebookexternalhit|twitterbot|://google.com|ahrefsbot|semrushbot|telegrambot|vkshare|whatsapp 1;
	}
   
	server {
		listen 443 ssl;
		server_name test.ru;
		access_by_lua_file /home/example.lua;		
	}
}

```