Part #2 : 기본 WAF 서비스에 대한 보안을 REST/JSON 까지 확장
이전의 Part #1 에서는 IBM DataPower 에서 기본적인 WAF 서비스를 생성한 후(XSS, SQL injection 방어등의 기본 설정) 간단한 서비스가 되는 것을 살펴봤습니다. 이번 Part #2 에서는 이를 좀 더 심화하여 일반적인 Web 요청 뿐만 아니라 REST/JSON 요청에 대해서도 WAF 에서 처리가 가능하도록 추가 설정을 해보도록 하겠습니다.해당 강좌를 진행하면 아시겠지만 IBM DataPower 는 Secure Gateway 로서 들어오는 요청을 하단과 같이 matching rule 에 따라서 원하는 형태로 구분 할 수 있으며 이후에 그 요청들에 대해서 다양한 processing rule 을 추가하여 필요한 처리가 가능합니다.
이번 강좌에서 진행된 내용을 살펴보시면 아시겠지만 여기서는 REST/JSON 요청을 대상으로 작업하지만 해당 작업 내용이 숙지된다면 어떤 요청/응답도 원하시는 형태의 제어가 가능하다라는 것을 파악 가능할 것입니다.
Part #1 에서 생성한 기본 WAF 서비스의 보안 정책에 REST/JSON 을 위한 새로운 매칭 룰과 요청 프로파일을 추가합니다. 이때, 각 요청 맵에 대한 순서가 중요하며 하단에 보시는 것처럼 match_json 이 match-all 보다 먼저 오도록 합니다.
(그렇지 않다면 match-all 이 모든 URL 을 대상으로 되어있기 때문에 match_json 비교까지 내려오지 않습니다.)
참고적으로 match_json 은 하단과 같이 'Content-Type' 에 'application/json' 일 경우에만 처리되도록 되어 있는 maching rule 입니다.
새롭게 생성한 요청 프로파일의 Content-Type List 에 REST/JSON 을 처리하기 위한 application/json 추가 합니다.
이제 REST/JSON 에 대한 보안과 연관된 다양한 Processing Rule 을 추가하기 위하여 Processing 파트에서 Non-XML Processing 을 'Side-Effect Rule' 로 변경하고 새로운 Non-XML Processing Rule 을 추가합니다.
(여기서 Side-Effect Rule 은 message 의 content 의 변경없이(Input/Output context 에 접근 불가) 인증/인가나 다른 제3의 위치에 content 의 복사본을 보내는 것과 같은 역할을 수행할 수 있는 rule 입니다. )
새로 추가한 Non-XML Processing Rule 에서는 들어오는 REST/JSON 요청을 가지고만 처리하기 위하여 Rule direction 을 'Client to Server' 를 선택합니다.
다음으로 REST/JSON 에 대한 보안강화를 위한 Rule Action 을 하단과 같이 정의 (원하는 형태로 추가 작성 및 커스터마이징 가능, DataPower 의 Store 폴더에 미리 제공되는 다양한 filter 와 xslt 확인 가능) 합니다.
(하단의 내용을 보시면 아시겠지만 실제적으로 여기서 정의된 Rule Action 이 고객이 원하는 다양한 보안에 대한 내용을 수행하게 됩니다.)
① PA_convert_WAF8080 : JSON 요청에 대한 처리를 위해 JSON 을 JSONx(XML 형태)로 변환
② PA_SQL_WAF8080 : SQL Injection attack 방어를 위한 filter 처리
③ PA_XSS_WAF8080 : XSS attack 방어를 위한 프로세스 처리
> XSS-Patterns_modi201706.xml 은 store 디렉토이에 내장 제공된 XSS-Patterns.xml 에 패턴을 추가한 것이고 xssCheck.xsl 은 들어온 message 를 해당 패턴과 비교하여 XSS 관련 이슈가 없는지 살펴보는 역할을 수행합니다.
참고 : 상단에 사용된 Transform file 은 하단과 같으며 IBM DataPower 의 File Management 를 사용하여 위에서 지정된 local 디렉토리에 위치시키면 됩니다. (참고로 Store 디렉토리에 기언급한 다양한 샘플을 확인 가능합니다.)
xssCheck.xsl ----------------------------------------------------------------------------
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions" xmlns:regexp="http://exslt.org/regular-expressions"
extension-element-prefixes="dp regexp" exclude-result-prefixes="dp">
<xsl:template match="/">
<!-- Converting the payload into a string -->
<xsl:variable name="myPayload">
<dp:serialize select="."/>
</xsl:variable>
<!-- Set a context variable to flag '0' -->
<dp:set-variable name="'var://context/mycontext/xssPatternfound'" value="'0'"/>
<!-- Loop over each pattern within the XSS patterns file -->
<xsl:for-each select="document('local:///XSS-Patterns_modi201706.xml')/patterns/pattern/regex">
<xsl:variable name="pattern">
<xsl:value-of select="."/>
</xsl:variable>
<!--<pattern><xsl:value-of select="."/></pattern>-->
<xsl:if test="regexp:match($myPayload,$pattern)">
<dp:set-variable name="'var://context/mycontext/xssPatternfound'" value="'1'"/>
</xsl:if>
</xsl:for-each>
<xsl:choose>
<xsl:when test="dp:variable('var://context/mycontext/xssPatternfound') = '1'">
<xsl:message dp:priority="error">
XSS Issue Message : <xsl:value-of select="$myPayload"/>
</xsl:message>
<found>Message contains XSS signatures</found>
<dp:reject>
<errorMsg>Message contains XSS signatures</errorMsg>
</dp:reject>
</xsl:when>
<xsl:otherwise>
<found>Message free from XSS signatures</found>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
xssCheck.xsl ----------------------------------------------------------------------------
XSS-Patterns_modi201706.xml ----------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!--
XSS-Patterns.xml
Copyright 2010 IBM. All Rights Reserved.
Cross Site Scripting (XSS) patterns used by DataPower.
Add new patterns to this document to have them utilized by the XSS filter.
The format of each <pattern> element is:
<name>: The name of the pattern. Used for logging purposes
<regex>: The PCRE (Perl Compatible Regular Expression)
pattern used to detect the pattern.
-->
<patterns>
<pattern>
<name>Invalid Characters (percent sign and anything from ASCII 0x80 to 0xFF)</name>
<regex>\x25|[\x80-\xFF]</regex>
</pattern>
<pattern>
<name>look for script tags</name>
<regex><\s*[sS][cC][rR][iI][pP][tT]</regex>
</pattern>
<pattern>
<name>look for script tags</name>
<regex>&lt;\s*[sS][cC][rR][iI][pP][tT]</regex>
</pattern>
</patterns>
XSS-Patterns_modi201706.xml ----------------------------------------------------------------------------
④ PA_json_WAF8080 : JSONx 를 다시 JSON 으로 변경하여 client 로 반환
위와 같이 Processing rule 에 대한 설정이 완료되었다면 해당 내용을 저장하여 작성을 완료합니다.
설정이 문제없이 되고 WAF 가 정상적으로 서비스가 올라왔다면 간단한 REST/JSON 애플리케이션을 통해서 WAF 기능이 정상적으로 동작하는 확인합니다.
요청에 보안 위협이 포함되었을때(예: SQL Injection attack("MA' OR '1'='1"), XSS attack("<script></script>") 등)
이번 Part #2 까지 잘 따라왔다면 기 언급한 것처럼 일반적인 Web 요청이외에 REST/JSON 요청에 대한 것도 WAF 를 통해서 처리 가능하며 그 안에서 사전에 지정된 보안과 관련된 방어 Action 들을 취할 수 있습니다.
댓글