Skip to content

Commit a243f44

Browse files
ADubhlaoichohad-peretsmouraddmeiri
authored
feat: NGINX App Protect WAF 5.8 release notes (#938)
Co-authored-by: ohad-perets <[email protected]> Co-authored-by: mouraddmeiri <[email protected]>
1 parent b2cae01 commit a243f44

File tree

5 files changed

+84
-7
lines changed

5 files changed

+84
-7
lines changed

content/includes/nap-waf/policy.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3705,7 +3705,14 @@ <h2 id="policy/override-rules">override-rules</h2>
37053705
<li><strong>headers['&lt;name&gt;']</strong>: (map-type) The value of the specified header name. Example: "headers['Accept'].startsWith('application')"</li>
37063706
</ul>
37073707
</blockquote>
3708-
<p><strong>Note</strong>: The "headers['&lt;name&gt;']" attribute does not support 'Cookie' as a header name. Attribute "clientIp" supports using "ipAddressLists" in condition: "clientIp.matches(ipAddressLists['<name>'])</p></td>
3708+
<dl>
3709+
<dt><strong>Note</strong>:</dt>
3710+
<dd><ul>
3711+
<li>The "headers['&lt;name&gt;']" attribute does not support 'Cookie' as a header name.</li>
3712+
<li>Attribute "clientIp" supports using "ipAddressLists" in condition: "clientIp.matches(ipAddressLists['&lt;name&gt;'])"</li>
3713+
</ul>
3714+
</dd>
3715+
</dl></td>
37093716
<td></td>
37103717
</tr>
37113718
<tr class="odd">

content/nap-waf/v4/admin-guide/install.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1363,7 +1363,7 @@ RUN dnf config-manager --set-enabled crb \
13631363
# Install NGINX App Protect WAF:
13641364
RUN --mount=type=secret,id=nginx-crt,dst=/etc/ssl/nginx/nginx-repo.crt,mode=0644 \
13651365
--mount=type=secret,id=nginx-key,dst=/etc/ssl/nginx/nginx-repo.key,mode=0644 \
1366-
dnf install --enablerepo=codeready-builder-for-rhel-9-x86_64-rpms -y app-protect \
1366+
dnf install -y app-protect \
13671367
&& dnf clean all \
13681368
&& rm -rf /var/cache/dnf
13691369
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
title: NGINX App Protect WAF 4.16
3+
weight: 70
4+
toc: true
5+
nd-content-type: reference
6+
nd-product: NAP-WAF
7+
---
8+
9+
August 13th, 2025
10+
11+
## New features
12+
13+
- Added support for NGINX Plus R35
14+
15+
## Supported packages
16+
17+
| Distribution name | Package file |
18+
|--------------------------|----------------------------------------------------|
19+
| Alpine 3.19 | _app-protect-35.5.498.0-r1.apk_ |
20+
| Amazon Linux 2023 | _app-protect-35+5.498.0-1.amzn2023.ngx.x86_64.rpm_ |
21+
| Debian 11 | _app-protect_35+5.498.0-1\~bullseye_amd64.deb_ |
22+
| Debian 12 | _app-protect_35+5.498.0-1\~bookworm_amd64.deb_ |
23+
| Oracle Linux 8.1 | _app-protect-35+5.498.0-1.el8.ngx.x86_64.rpm_ |
24+
| Ubuntu 22.04 | _app-protect_35+5.498.0-1\~jammy_amd64.deb_ |
25+
| Ubuntu 24.04 | _app-protect_35+5.498.0-1\~noble_amd64.deb_ |
26+
| RHEL 8 and Rocky Linux 8 | _app-protect-35+5.498.0-1.el8.ngx.x86_64.rpm_ |
27+
| RHEL 9 and Rocky Linux 9 | _app-protect-35+5.498.0-1.el9.ngx.x86_64.rpm_ |
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
---
2+
title: NGINX App Protect WAF 5.8
3+
weight: 830
4+
toc: true
5+
nd-content-type: reference
6+
nd-product: NAP-WAF
7+
---
8+
9+
August 13th, 2025
10+
11+
## New features
12+
13+
- Added support for NGINX Plus R34
14+
15+
## Supported packages
16+
17+
### NGINX Open Source
18+
19+
| Distribution name | Package file |
20+
|--------------------------|-------------------------------------------------------------------|
21+
| Alpine 3.19 | _app-protect-module-oss-1.29.0+5.498.0-r1.apk_ |
22+
| Amazon Linux 2023 | _app-protect-module-oss-1.29.0+5.498.0-1.amzn2023.ngx.x86_64.rpm_ |
23+
| Debian 11 | _app-protect-module-oss_1.29.0+5.498.0-1\~bullseye_amd64.deb_ |
24+
| Debian 12 | _app-protect-module-oss_1.29.0+5.498.0-1\~bookworm_amd64.deb_ |
25+
| Oracle Linux 8.1 | _app-protect-module-oss-1.29.0+5.498.0-1.el8.ngx.x86_64.rpm_ |
26+
| Ubuntu 22.04 | _app-protect-module-oss_1.29.0+5.498.0-1\~jammy_amd64.deb_ |
27+
| Ubuntu 24.04 | _app-protect-module-oss_1.29.0+5.498.0-1\~noble_amd64.deb_ |
28+
| RHEL 8 and Rocky Linux 8 | _app-protect-module-oss-1.29.0+5.498.0-1.el8.ngx.x86_64.rpm_ |
29+
| RHEL 9 and Rocky Linux 9 | _app-protect-module-oss-1.29.0+5.498.0-1.el9.ngx.x86_64.rpm_ |
30+
31+
### NGINX Plus
32+
33+
| Distribution name | Package file |
34+
|--------------------------|----------------------------------------------------------------|
35+
| Alpine 3.19 | _app-protect-module-plus-35+5.498.0-r1.apk_ |
36+
| Amazon Linux 2023 | _app-protect-module-plus-35+5.498.0-1.amzn2023.ngx.x86_64.rpm_ |
37+
| Debian 11 | _app-protect-module-plus_35+5.498.0-1\~bullseye_amd64.deb_ |
38+
| Debian 12 | _app-protect-module-plus_35+5.498.0-1\~bookworm_amd64.deb_ |
39+
| Oracle Linux 8.1 | _app-protect-module-plus-35+5.498.0-1.el8.ngx.x86_64.rpm_ |
40+
| Ubuntu 22.04 | _app-protect-module-plus_35+5.498.0-1\~jammy_amd64.deb_ |
41+
| Ubuntu 24.04 | _app-protect-module-plus_35+5.498.0-1\~noble_amd64.deb_ |
42+
| RHEL 8 and Rocky Linux 8 | _app-protect-module-plus-35+5.498.0-1.el8.ngx.x86_64.rpm_ |
43+
| RHEL 9 and Rocky Linux 9 | _app-protect-module-plus-35+5.498.0-1.el9.ngx.x86_64.rpm_ |

data/nap-waf/schema/policy.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2368,7 +2368,7 @@
23682368
},
23692369
"blockRequests" : {
23702370
"default" : "policy-default",
2371-
"description" : "Specifies how the system responds to blocking requests sent from this IP address list.\n- **Policy Default:** Specifies that the policy enforcementMode will be used for requests from this IP address list.\n- **Never Block:** Specifies that the system does not block requests sent from this IP address list, even if your security policy is configured to block all traffic.\n- **Always Block:** Specifies that the system blocks requests sent from this IP address list.\nOptional, if absent Policy Default is used.",
2371+
"description" : "Specifies how the system responds to blocking requests sent from this IP address list.\n- **Policy Default:** Specifies that the policy enforcementMode will be used for requests from this IP address list.\n- **Never Block:** Specifies that the system does not block requests sent from this IP address list, even if your security policy is configured to block all traffic.\n- **Always Block:** Specifies that the system blocks requests sent from this IP address list.\nOptional, if absent Policy Default is used.",
23722372
"enum" : [
23732373
"always",
23742374
"never",
@@ -2397,7 +2397,7 @@
23972397
"type" : "array"
23982398
},
23992399
"matchOrder" : {
2400-
"description" : "Specifies the order matching index between different IP Address Lists. If unspecified, the order is implicitly as the lists appear in the policy. IP Address Lists with a lower matchOrder will be checked for a match prior to items with higher matchOrder.",
2400+
"description" : "Specifies the order matching index between different IP Address Lists. If unspecified, the order is implicitly as the lists appear in the policy.\nIP Address Lists with a lower matchOrder will be checked for a match prior to items with higher matchOrder.",
24012401
"type" : "integer"
24022402
},
24032403
"name" : {
@@ -2406,11 +2406,11 @@
24062406
},
24072407
"neverLogRequests" : {
24082408
"default" : false,
2409-
"description" : "Specifies when enabled that the system does not log requests or responses sent from this IP address list, even if the traffic is illegal, and even if your security policy is configured to log all traffic. Optional, if absent default value is false.",
2409+
"description" : "Specifies when enabled that the system does not log requests or responses sent from this IP address list, even if the traffic is illegal, and even if your security policy is configured to log all traffic.\nOptional, if absent default value is false.",
24102410
"type" : "boolean"
24112411
},
24122412
"setGeolocation" : {
2413-
"description" : "Specifies a geolocation to be associated for this IP address list. This will force the IP addresses in the list to be considered as though they are in that geolocation. This applies to blocking via \"disallowed-geolocations\" and to logging. Optional",
2413+
"description" : "Specifies a geolocation to be associated for this IP address list.\nThis will force the IP addresses in the list to be considered as though they are in that geolocation. This applies to blocking via \"disallowed-geolocations\" and to logging. \nOptional",
24142414
"type" : "string"
24152415
}
24162416
},
@@ -3046,7 +3046,7 @@
30463046
"type" : "string"
30473047
},
30483048
"condition" : {
3049-
"description" : "Specifies the condition under which the override rule should be applied.\n\nExample: \"clientIp != '10.0.0.5' and userAgent.lower().contains('WebRobot')\"\n\nCondition Syntax:\n\n- The condition consists of one or more clauses separated by **and** or **or**.\n\n Example: \"clientIp == '10.0.0.5' and (host.startsWith('internal') or uri.contains('api'))\"\n\n- Each clause can optionally start with **not** - to negate the expression.\n\n Example: \"not clientIp == '127.0.0.1'\"\n\n- **not** can also be used to negate a parenthesized expression.\n\n Example: \"not (method == 'GET' or method == 'PUT')\"\n\n- A clause can be a simple comparison between two value expressions, or a boolean function applied to a literal value.\n\nSupported comparison operators:\n\n - **==** - Checks for equality between two value expressions.\n - **!=** - Checks for inequality between two value expressions.\n\n Example: \"clientIp != '10.0.0.5'\" (equivalent to \"not clientIp == '10.0.0.5'\")\n\nSupported boolean functions:\n\n - **matches**: Performs an exact match of a value expression, equivalent to **==**.\n - **startsWith**: Checks if a value expression starts with a specific substring.\n - **contains**: Checks if a value expression contains a specific substring.\n\n Example: \"uri.startsWith('/api')\"\n\n**Note**: Functions \"startsWith\" and \"contains\" are not applicable to the \"clientIp\" attribute. Regular expressions are not supported.\n\n- Value expressions can be a request attribute, literal value, or a value function.\n- A literal can be a string value enclosed in single quotes, or can be the keyword \"null\" without quotes.\n\n Example: \"userAgent == null\"\n\nSupported value functions:\n\n - **lower**: Any boolean function applied on the resulting string will be **case insensitive**. Applicable to ANSI characters only.\n\n Example: \"uri.lower().contains('BaR')\" will match the URI \"/Foo/bAr\"\n\nRequest Attributes:\n\n- **clientIp**: Client IP address in canonical IPv4 or IPv6 format or ip-address-list. Use CIDR notation for subnet definition. Example: *192.168.1.2* or *fd00:1::/48*. If *trustXff* (X-Forwarded-For) is enabled in the containing policy, then the value is taken from the configured header (XFF or other). The only supported boolean function for the clientIP attribute is *matches*.\n- **host**: The value of the Host header\n- **method**: The HTTP method in the request\n- **uri**: The URI (path part) of the request\n- **userAgent**: The value of the User-Agent header, or *null* (without quotes) if not present\n- **geolocation**: The geolocation of the client IP address. The value is the ISO 3166 two-letter code of the respective country.\n- **parameters['<name>']**: (map-type) The value of the specified parameter name (limited to query string parameters). Example: \"parameters['id'] == '11'\"\n- **cookies['<name>']**: (map-type) The value of the specified cookie name. Example: \"cookies['Path'].contains('product')\"\n- **headers['<name>']**: (map-type) The value of the specified header name. Example: \"headers['Accept'].startsWith('application')\"\n\n**Note**: \n - The \"headers['<name>']\" attribute does not support 'Cookie' as a header name.\n - Attribute \"clientIp\" supports using \"ipAddressLists\" in condition: \"clientIp.matches(ipAddressLists['<name>'])\"",
3049+
"description" : "Specifies the condition under which the override rule should be applied.\n\nExample: \"clientIp != '10.0.0.5' and userAgent.lower().contains('WebRobot')\"\n\nCondition Syntax:\n\n- The condition consists of one or more clauses separated by **and** or **or**.\n\n Example: \"clientIp == '10.0.0.5' and (host.startsWith('internal') or uri.contains('api'))\"\n\n- Each clause can optionally start with **not** - to negate the expression.\n\n Example: \"not clientIp == '127.0.0.1'\"\n\n- **not** can also be used to negate a parenthesized expression.\n\n Example: \"not (method == 'GET' or method == 'PUT')\"\n\n- A clause can be a simple comparison between two value expressions, or a boolean function applied to a literal value.\n\nSupported comparison operators:\n\n - **==** - Checks for equality between two value expressions.\n - **!=** - Checks for inequality between two value expressions.\n\n Example: \"clientIp != '10.0.0.5'\" (equivalent to \"not clientIp == '10.0.0.5'\")\n\nSupported boolean functions:\n\n - **matches**: Performs an exact match of a value expression, equivalent to **==**.\n - **startsWith**: Checks if a value expression starts with a specific substring.\n - **contains**: Checks if a value expression contains a specific substring.\n\n Example: \"uri.startsWith('/api')\"\n\n**Note**: Functions \"startsWith\" and \"contains\" are not applicable to the \"clientIp\" attribute. Regular expressions are not supported.\n\n- Value expressions can be a request attribute, literal value, or a value function.\n- A literal can be a string value enclosed in single quotes, or can be the keyword \"null\" without quotes.\n\n Example: \"userAgent == null\"\n\nSupported value functions:\n\n - **lower**: Any boolean function applied on the resulting string will be **case insensitive**. Applicable to ANSI characters only.\n\n Example: \"uri.lower().contains('BaR')\" will match the URI \"/Foo/bAr\"\n\nRequest Attributes:\n\n- **clientIp**: Client IP address in canonical IPv4 or IPv6 format or ip-address-list. Use CIDR notation for subnet definition. Example: *192.168.1.2* or *fd00:1::/48*. If *trustXff* (X-Forwarded-For) is enabled in the containing policy, then the value is taken from the configured header (XFF or other). The only supported boolean function for the clientIP attribute is *matches*.\n- **host**: The value of the Host header\n- **method**: The HTTP method in the request\n- **uri**: The URI (path part) of the request\n- **userAgent**: The value of the User-Agent header, or *null* (without quotes) if not present\n- **geolocation**: The geolocation of the client IP address. The value is the ISO 3166 two-letter code of the respective country.\n- **parameters['<name>']**: (map-type) The value of the specified parameter name (limited to query string parameters). Example: \"parameters['id'] == '11'\"\n- **cookies['<name>']**: (map-type) The value of the specified cookie name. Example: \"cookies['Path'].contains('product')\"\n- **headers['<name>']**: (map-type) The value of the specified header name. Example: \"headers['Accept'].startsWith('application')\"\n\n**Note**: \n- The \"headers['<name>']\" attribute does not support 'Cookie' as a header name.\n- Attribute \"clientIp\" supports using \"ipAddressLists\" in condition: \"clientIp.matches(ipAddressLists['<name>'])\" ",
30503050
"type" : "string"
30513051
},
30523052
"name" : {

0 commit comments

Comments
 (0)