F5 WAF for NGINX JSON Format을 이용한 OWASP API3 방어
OWASP API3 취약점은 API가 객체 속성별 접근 제어를 제대로 수행하지 않아 민감한 데이터가 노출되거나 임의 수정이 가능한 문제입니다. F5 WAF for NGINX는 JSON 스키마 검증 기능을 통해 요청 본문을 사전에 정의된 구조로만 허용함으로써 이러한 위험을 효과적으로 차단할 수 있습니다.
목차
1. OWASP API3 란?
2. 환경 구성
3. F5 WAF for NGINX 구성
4. 실행 결과
5. 결론
1. OWASP API3 란?
Broken object property level authorization (OWASP API3)
API 엔드포인트가 객체 속성의 민감도를 고려하지 않고 과도한 데이터를 노출하거나, 클라이언트 입력을 적절히 필터링하지 않아 내부 객체 속성이 임의로 변경될 수 있는 대량 할당 취약점이 존재할 경우, 사용자는 불필요하거나 민감한 정보에 접근하거나 수정 권한이 없는 속성을 조작할 수 있어 심각한 보안 위험이 발생합니다.
이를 위해 F5 WAF for NGINX는 JSON Format을 지정하여 requests에 대한 지정되지 않은 JSON key를 차단 할 수 있습니다.
2. 환경 구성
- Ubuntu 22.04~jammy
- nginx/1.29.0 (nginx-plus-r35)
- F5 WAF for NGINX 5.9.0
3. F5 WAF for NGINX 구성
Backend Server
JSON Body 값을 그대로 Return 하는 Python 서버입니다.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/echo', methods=['POST'])
def echo_body():
received_data = request.json
return jsonify(received_data), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
NGINX 서버를 구성합니다.
# /etc/nginx/conf.d/default.conf
server {
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
listen 443 ssl;
location / {
app_protect_enable on;
app_protect_policy_file /etc/app_protect/conf/NGINXJSONFormat.json;
proxy_pass http://localhost:5000;
}
}
F5 WAF for NGINX를 구성합니다.
# /etc/app_protect/conf/NGINXJSONFormat.json
1 {
2 "policy": {
3 "name": "json_form_policy_external_schema",
4 "template": {
5 "name": "POLICY_TEMPLATE_NGINX_BASE"
6 },
7 "blocking-settings": {
8 "violations": [
9 { "name": "VIOL_JSON_SCHEMA", "alarm": true, "block": true }
10 ]
11 },
12 "json-validation-files": [
13 {
14 "fileName": "person_schema.json",
15 "link": "file://person_schema.json"
16 }
17 ],
18 "json-profiles": [
19 {
20 "name": "reg_form_prof",
21 "validationFiles": [
22 {
23 "jsonValidationFile": {
24 "fileName": "person_schema.json"
25 }
26 }
27 ]
28 }
29 ],
30 "urls": [
31 {
32 "name": "/echo",
33 "type": "wildcard",
34 "method": "POST",
35 "urlContentProfiles": [
36 {
37 "contentProfile": {
38 "name": "reg_form_prof"
39 },
40 "headerName": "*",
41 "headerOrder": "default",
42 "headerValue": "*",
43 "type": "json"
44 }
45 ]
46 }
47 ]
48 }
49 }
- 7~11 : VIOL_JSON_SCHEMA 정책을 알림 및 차단을 활성화합니다.
- 12~29 : JSON 스키마를 지정 할 JSON 파일을 Profile에 지정합니다.
- 30~ : JSON 유효성 검사를 진행 할 URL 및 Profile을 지정합니다.
- 40~42 : URL 요청에 대한 필수시되는 헤더를 지정합니다.(현재 구성은 모든 요청을 허용합니다.)
JSON 스키마를 지정할 JSON 파일을 생성합니다.
/etc/app_protect/conf/person_schema.json
1 {
2 "$schema": "http://json-schema.org/draft-07/schema#",
3 "title": "Person_data",
4 "type": "object",
5 "additionalProperties": false,
6 "properties": {
7 "firstName": {
8 "type": "string",
9 "description": "The person's first name."
10 },
11 "lastName": {
12 "type": "string",
13 "description": "The person's last name."
14 },
15 "age": {
16 "description": "The person's Age. min value 20",
17 "type": "integer",
18 "minimum": 20
19 }
20 }
21 }
- 2 : JSON 스키마 버전을 명시합니다. (URL)
- 4 : JSON 데이터의 최상위 타입을 명시합니다. 예제에서는 객체입니다. {}
- 5 : 해당 스키마에 명시 되지 않은 Key는 허용하지 않습니다.
- 6 ~ 20 : firstName, lastName 은 String 값 age는 최소 20이상 Integer 값이 아닐 경우 허용하지 않습니다.
4. 실행 결과
지정된 스키마를 따라 요청 시 정상적으로 요청이 Backend 서버로 전송 되는 것을 확인할 수 있습니다.

JSON Key 값이 스키마에 정의되지 않은 Key 값이 요청되게 된다면 아래와 같이 차단되게 됩니다.

숫자 값만 사용할 수 있는 age Key에 문자열 값을 입력하게 되면 아래와 같이 차단되는 것을 확인할 수 있습니다.

age의 숫자 최소 값 또한 동일하게 차단 되는 것을 확인할 수 있습니다.

Security Monitor에서는 아래와 같이 확인할 수 있습니다.

위의 요청은 age가 최소값 20을 넘기지 못했기 때문에 차단된 요청입니다.
위에서 구성했었던 json_form_policy_external_schema 정책에 의해 차단된 것을 확인할 수 있고 JSON data does not comply with JSON schema를 위반한 것을 확인할 수 있습니다.

5. 결론
F5 WAF for NGINX의 JSON Format 검증을 적용하면 OWASP API3( Broken Object Property Level Authorization ) 관련 대량 할당(mass assignment), 객체 속성 임의 조작을 효과적으로 차단할 수 있습니다. 구체적으로 타입·범위 제약을 통한 스키마 검증은 허용되지 않은 키와 잘못된 값의 유입을 차단하여 백엔드 권한 로직이 악용되는 것을 예방합니다.
F5 WAF for NGINX의 JSON Format에 대해 더 궁금하시거나 직접 사용해 보고 싶으시다면, NGINX STORE에 연락하여 자세한 정보를 확인해 보세요.
댓글을 달려면 로그인해야 합니다.