Data guard – F5 WAF for NGINX를 통한 민감 데이터 마스킹, 차단
웹 애플리케이션의 응답에는 종종 사용자 정보나 결제 정보 등 민감한 데이터가 포함될 수 있습니다.
F5 WAF for NGINX는 Data Guard 기능을 제공하며 해당 기능을 통해 요청의 응답에서 민감한 데이터를 마스킹 하여 응답하거나, 민감한 데이터가 포함된 응답을 차단하도록 구성할 수 있습니다.
F5 WAF for NGINX의 Data Guard는 기본적으로 신용 카드 번호, Social Security number(미국의 사회 보장 번호)를 감지하는 옵션을 제공하며, 사용자 지정 PCRE 정규표현식을 활용하여 감지할 패턴 목록을 정의할 수도 있습니다.
목차
1. 환경 및 버전 정보
2. Data guard 정책 구성 옵션
3. Data guard 정책 구성 및 적용
4. 결론
1. 환경 및 버전 정보
| 구성 요소 | 버전 |
|---|---|
| OS | Ubuntu 24.04.3 |
| NGINX Plus | R35 |
| F5 WAF for NGINX | 5.9.0 |
| NGINX Instance Manager | 2.20.0 |
2. Data guard 정책 구성 옵션
Data guard 기능을 사용하기 위한 F5 WAF for NGINX의 정책 파일은 다음과 같이 구성할 수 있습니다.VIOL_DATA_GUARD 구성을 통해 차단 설정을, data-guard 섹션 구성을 통해 탐지할 민감 정보에 대한 설정을 구성합니다.
{
"policy": {
"name": "custom_pattern_mask_policy",
"template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
"applicationLanguage": "utf-8",
"enforcementMode": "blocking",
"blocking-settings": {
"violations": [
{
"name": "VIOL_DATA_GUARD",
"alarm": true,
"block": false # true로 설정 시 마스킹이 아닌 응답 차단
}
]
},
"data-guard": {
"enabled": true,
"maskData": true,
"creditCardNumbers": true,
"usSocialSecurityNumbers": true,
"enforcementMode": "ignore-urls-in-list",
"enforcementUrls": [],
"customPatterns": true,
"firstCustomCharactersToExpose": 2,
"lastCustomCharactersToExpose": 4,
"customPatternsList": [
"....-....-....-....",
"siteTk_[0-9]+"
]
}
}
}
- blocking-settings:
VIOL_DATA_GUARD설정을 통해 민감 데이터 처리를 설정합니다. block을 true로 설정 시 민감 데이터 포함 응답은 차단되며, 마스킹 적용 시 false 구성이 필요합니다. - maskData: 데이터 마스킹을 활성화 합니다.
- creditCardNumbers, usSocialSecurityNumbers: 각각 신용 카드 번호, Social Security number의 data guard 활성화 여부를 설정합니다.
- enforcementMode:
enforcementUrls와 함께 data guard 정책을 적용할 url의 범위 설정에 사용합니다.ignore-urls-in-list와enforce-urls-in-list를 사용할 수 있습니다.- ignore-urls-in-list:
enforcementUrls에 포함된 URL을 제외한 모든 URL에 정책을 적용합니다. - enforce-urls-in-list:
enforcementUrls에 포함된 URL만 정책을 적용하고, 다른 URL은 제외합니다.
- ignore-urls-in-list:
- enforcementUrls:
enforcementMode기반으로 정책을 적용한 URL의 리스트입니다. - customPatterns: 사용자 지정 민감한 데이터의 활성화 여부를 설정합니다.
- firstCustomCharactersToExpose: 사용자 지정 민감 데이터에서 마스킹 하지 않고 노출할 앞 글자의 수를 결정합니다.
- lastCustomCharactersToExpose: 사용자 지정 민감 데이터에서 마스킹 하지 않고 노출할 뒷 글자의 수를 결정합니다.
- customPatternsList: 사용자 지정 민감한 데이터를 지정하는 PCRE 정규식 리스트입니다.
※ F5 WAF for NGINX에서 기본 제공하는 신용 카드, SSN 번호 감지의 경우 단순 패턴 기반의 감지가 아닌 유효성 검사를 통한 감지가 이루어집니다.
3. Data guard 정책 구성 및 적용
Data guard 기능을 통해 민감한 정보가 마스킹 되는 것을 확인하기 위해 다음과 같이 정책을 구성했습니다.
data_guard_policy.json
{
"policy": {
"name": "dataguard_masking",
"template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
"applicationLanguage": "utf-8",
"enforcementMode": "blocking",
"blocking-settings": {
"violations": [
{
"name": "VIOL_DATA_GUARD",
"alarm": true,
"block": false
}
]
},
"data-guard": {
"enabled": true,
"maskData": true,
"creditCardNumbers": true,
"usSocialSecurityNumbers": true,
"enforcementMode": "ignore-urls-in-list",
"enforcementUrls": [],
"customPatterns": true,
"firstCustomCharactersToExpose": 2,
"lastCustomCharactersToExpose": 3,
"customPatternsList": [
"(?:\\d{2}|(?:19|20)\\d{2})(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])-[1-4]\\d{6}", // 주민등록번호
"\\b0\\d{1,2}[-.\\s]?\\d{3,4}[-.\\s]?\\d{4}\\b", // 전화번호
"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}", // 이메일
"\\b\\d{4}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\b", // 생년월일(YYYYMMDD)
"\\b\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\b", // 생년월일(YYMMDD)
"\\b\\d{2}-\\d{2}-\\d{6}-\\d{2}\\b", // 운전면허 번호
"[A-Z]{1,2}\\d{7,8}" // 여권 번호
]
}
}
}
마스킹 적용 확인을 위한 데이터는 아래와 같이 구성했습니다.
customer.json
[
{
"name": "Kim Minsoo",
"email": "minsoo.kim@example.com ",
"phone": "010-1234-5678 ",
"card_number": "5555-5555-5555-4444 ",
"rrn": "880101-1234567 ",
"passport": "M12345678 ",
"birth": "19880101 "
},
{
"name": "Lee Hana",
"email": "hana.lee@example.com ",
"phone": "010-5678-1234 ",
"card_number": "4111-1111-1111-1111 ",
"rrn": "900412-2345678 ",
"passport": "AA98765432 ",
"birth": "19900412 "
},
{
"name": "Park Jisoo",
"email": "jisoo.park@mydomain.kr ",
"phone": "02-123-4567 ",
"card_number": "3782-822463-10005 ",
"rrn": "940305-2123456 ",
"passport": "KZ1234567 ",
"birth": "19940305 "
},
{
"name": "Choi Hyunwoo",
"email": "hyunwoo.choi@example.net ",
"phone": "031-555-7890 ",
"card_number": "3714-4961-7300-0000 ",
"rrn": "010101-3123456 ",
"passport": "P123456789 ",
"birth": "20010101 "
},
{
"name": "Jeong Areum",
"email": "areum.jeong@example.org ",
"phone": "070-9876-5432 ",
"card_number": "3566-0020-2036-0505 ",
"rrn": "850720-1234567 ",
"passport": "L98765432 ",
"birth": "19850720 "
}
]
응답 확인을 위한 NGINX 구성은 다음과 같습니다.
앞서 구성한 정책 및 security log 설정이 구성되어 있습니다.
data-guard.conf
server {
listen 80;
server_name data.devopssong.com;
app_protect_enable on;
app_protect_policy_file /etc/app_protect/conf/data_guard_policy.json;
app_protect_security_log_enable on;
app_protect_security_log /etc/app_protect/conf/log_default.json /var/log/nginx/waf.log;
app_protect_security_log /etc/app_protect/conf/log_sm.json syslog:server=192.168.40.225:514;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api/customer {
alias /usr/share/nginx/html/customer.json;
default_type application/json;
}
}
브라우저에서 해당 엔드포인트로 요청을 전송하여 결과를 확인합니다.

사용자 지정 패턴으로 인해 마스킹 된 값들의 경우 정책에서 정의한 값에 따라 앞 두 자리, 마지막 세 자리를 제외한 값들이 마스킹 되고, 기본 기능인 신용 카드 번호의 경우 마지막 4자리를 제외한 값들이 마스킹 됩니다.
신용 카드 번호의 경우 유효성 검사로 인해 유효하지 않은 값은 마스킹이 되지 않는 것을 확인할 수 있습니다.
VIOL_DATA_GUARD의 alarm 값을 true로 설정하였기 때문에 NGINX Instance Manager 대시보드에서 security log를 확인할 수 있습니다.


구성한 정책으로 인해 Data Guard Violation이 탐지되며, alarm: true, block: false로 구성하여 해당 요청은 차단되지 않고 마스킹만 적용되며, security log에 기록됩니다.
앞서 구성한 정책의 VIOL_DATA_GUARD의 block 값을 true로 변경하여, 민감 데이터를 포함하는 응답을 차단하도록 구성하고 확인하겠습니다.
{
"policy": {
"name": "dataguard_blocking",
"template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
"applicationLanguage": "utf-8",
"enforcementMode": "blocking",
"blocking-settings": {
"violations": [
{
"name": "VIOL_DATA_GUARD",
"alarm": true,
"block": true
}
]
},
"data-guard": {
"enabled": true,
"maskData": true,
"creditCardNumbers": true,
"usSocialSecurityNumbers": true,
"enforcementMode": "ignore-urls-in-list",
"enforcementUrls": [],
"customPatterns": true,
"firstCustomCharactersToExpose": 2,
"lastCustomCharactersToExpose": 3,
"customPatternsList": [
"(?:\\d{2}|(?:19|20)\\d{2})(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])-[1-4]\\d{6}", // 주민등록번호
"\\b0\\d{1,2}[-.\\s]?\\d{3,4}[-.\\s]?\\d{4}\\b", // 전화번호
"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}", // 이메일
"\\b\\d{4}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\b", // 생년월일(YYYYMMDD)
"\\b\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\b", // 생년월일(YYMMDD)
"\\b\\d{2}-\\d{2}-\\d{6}-\\d{2}\\b", // 운전면허 번호
"[A-Z]{1,2}\\d{7,8}" // 여권 번호
]
}
}
}

동일한 요청을 전송하면 정책으로 인해 차단됨을 확인할 수 있습니다.


NGINX Instance Manager의 Security Monotoring 대시보드에서 동일한 요청이 차단된 내역을 확인할 수 있습니다.
4. 결론
F5 WAF for NGINX의 Data Guard 기능은 신용카드와 SSN 번호에 대해 단순한 패턴 탐지를 넘어, 실제 데이터 유효성 검증을 기반으로 한 민감정보 보호를 제공합니다.
또한 주민등록번호, 전화번호, 이메일 등 기타 개인정보 항목은 관리자가 직접 정의한 정규식 패턴을 통해 세밀하게 보호할 수 있습니다.
Data Guard 정책은 마스킹(masking) 과 차단(blocking) 옵션을 상황에 맞게 선택적으로 적용할 수 있어, 서비스 가용성을 유지하면서도 강력한 보안 제어가 가능합니다.
이를 통해 조직은 웹 응답 내 민감정보 노출을 효과적으로 방지하고, 개인정보보호법 및 PCI-DSS와 같은 규제 요건 준수를 손쉽게 달성할 수 있습니다.
민감한 데이터를 관리하기 위한 자동 마스킹 혹은 차단 기능이 필요하신가요? NGINX STORE를 통해 문의하여 무료로 NGINX One trial을 통해 F5 WAF for NGINX를 체험해 보세요.
댓글을 달려면 로그인해야 합니다.