보안을 강화한 시큐어코딩 웹게시판 (windows)

추가 보안 2 (CRS규칙 활성화 , URL Rewrite 모듈 사용)

law and security 2024. 9. 19. 18:07

<CRS규칙 활성화>

 

1.   URL Rewrite 모듈 설치

 

*   IIS URL Rewrite 모듈 다운로드

 

 URL Rewrite Module 2.1 https://www.iis.net/downloads/microsoft/url-rewrite 

- 다음의 화면에서 Korean: x86 installer / x64 installer 중 x64 installer를 다운받습니다.

 

 

 

 

 

 

 

 

 

설치가 완성되면 다음과 같이 IIS 기능 보기에서 설치된 내용을 확인할 수 있습니다.

 

 

정상적으로 설치된 모습입니다.

 

< URL Rewrite 모듈을 설치하는 이유> 


1. HTTP를 HTTPS로 리디렉션 하기 위해 :  URL Rewirte를 사용하면, URL에 쿼리 매개변수를 포함하지 않고도 깔끔한 구조로 변경하여 검색 엔진에서의 가독성을 높일 수 있다. 


2. 사용자 친화적인 URL생성 :  복잡하고 긴 URL을 간단하고 의미 있는 URL로 변환할 수 있습니다. 예를 들어, example.com/products.php?id=123와 같은 URL을 example.com/products/123와 같이 간단하게 만들 수 있습니다


3.  URL 보안 : 감한 정보나 특정 파일 경로를 노출하지 않기 위해 URL을 숨기거나 복잡하게 만들 수 있다. 


->  web.config 파일에서  태그 안에 URL Rewrite 규칙을 정의하여, 웹 애플리케이션의 특정 URL 패턴을 변경하거나 리디렉션하는 작업을 설정할 수 있습니다.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

예시: 간단한  설정

Xml(web.config)

 

 

HTTP/1.1 301 Moved Permanently

  • HTTP/1.1 301 Moved Permanently는 요청한 리소스가 영구적으로 새로운 위치로 이동했음을 의미한다. 
  • 여기서 응답에 포함된 Location 헤더가 https://192.168.111.10/board2/login2.php로 되어 있으므로, HTTP 프로토콜(HTTP)에서 HTTPS 프로토콜로 리디렉션되고 있음을 나타낸다. 

 

->  요약 

사용자가 HTTP로 요청을 보내면, 서버는 301응답과 함께 HTTPS로의 새로운 URL을 안내한다. 

클라이언트는 이 새로운 URL로 자동으로 요청을 재시도해야 하며, 이 과정은 보안 통신을 위한 HTTPS로의 전환을 돕는다.  

 

-> 웹사이트는 더 안전한 연결을 제공하고, 사용자 데이터의 보안을 강화할 수 있다

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

2. OWASP Core Rule Set (CRS) 다운로드 및 설정          

 

 

CRS 다운로드 : 1.   https://github.com/coreruleset/coreruleset/releases/tag/v4.6.0

 

ㅊㅊ

 

 

C:\Program Files\ModSecurity CRS에 압축을 해제

 

 

 

 

 

 

- modsecurity.conf 파일을 열어 수정

 

CRS 규칙 포함 :  modsecurity.conf 파일에 CRS 규칙을 포함시키는 설정을 추가합니다. 다음과 같은 내용으로 파일을 수정  ( CRS 파일 경로는 CRS를 다운로드하여 압축해제한 경로에 맞게 수정)

 

 

 

 

<IIS URL Rewrite 모듈 설정> 

 

 

 

 

1.   URL Rewrite 규칙 추가:

URL Rewrite 모듈을 선택하고, 새 규칙을 추가합니다.

규칙 이름: 예를 들어, ModSecurity.

조건: 조건 없이 기본값으로 사용합니다.

동작Rewrite를 선택하고, URL에 ModSecurity의 설정 파일 경로를 지정

 

 

 

 

2. web.config 파일 수정:

웹 애플리케이션의 web.config 파일에 URL Rewrite 규칙을 추가합니다. 위의 XML 코드를 웹 애플리케이션의 web.config 파일에 포함  

 

3. IIS 재시작

 

 

 

 

-> 안 들어가진다.  (SSL이랑 TLS가 없기 때문)

 

 

OWASP ZAP을 동작시켜 로그파일이 잘 기록되는지 확인

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

PHP.ini 파일 설정 (추가적인 방법)

 

PHP의 전역 설정 파일인 php.ini 파일을 통해 쿠키에 HTTPOnly 플래그를 기본적으로 설정할 수 있습니다.

 

 

 

- 이 설정은 PHP 세션 쿠키에 기본적으로 HTTPOnly 플래그를 추가합니다. 

 HTTPS를 사용하는 경우 cookie_secure도 활성화하는 것이 좋습니다.

 

session.cookie_httponly = 1

session.cookie_secure = 1  ; HTTPS 사용 시 권장

 

 

php.ini (보안강화)-------------------------------------------------

 

 

 

session.use_strict_mode = 0 ;비활성상태
;--> 수정한 부분: PHP는 세션 ID가 유효한지 확인
;-->세션이 새로 시작될 때만 세션 ID를 허용. 세션 하이재킹 방어

session.use_strict_mode = 1
; 세션 쿠키의 유효 기간을 1시간으로 설정

session.cookie_lifetime = 3600
; 쿠키의 유효 경로를 사이트 전체로 설정

session.cookie_path = /
; 쿠키의 유효 도메인을 example.com으로 설정. 여기부분은 현재 도메인이 없으므로 설정하지 않는다.

session.cookie_domain = example.com 
; 쿠키가 HTTPS에서만 전송되도록 설정

session.cookie_secure = 1
; JavaScript에서 쿠키 접근 차단

session.cookie_httponly = 1
; SameSite 속성을 Strict로 설정
session.cookie_samesite = Strict

 

 

 

 

 

 

 

 

< IIS의 web.config 파일에서 HttpOnly 플래그와 CSP설정HTTP 응답 헤더 rewrite 규칙 추가하기 >

 

 

SSL/TLS를 설치하지 않았으므로 web.config 파일에 HTTPOnly 플래그만 적용하고 Secure는 적용하지 않기로 하고, CSP설정과 HTTP 응답 헤더 rewrite 규칙 추가를 추가하여 다음과 같이 web.config를 완성합니다. 

 

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <!-- HTTP 압축 설정 -->
        <httpCompression>
            <dynamicTypes>
                <add mimeType="text/" enabled="true"/>
            </dynamicTypes>
            <staticTypes>
                <add mimeType="text/" enabled="true"/>
            </staticTypes>
        </httpCompression>
        <!-- MIME 타입 설정 -->
        <staticContent>
            <mimeMap fileExtension=".json" mimeType="application/json"/>
        </staticContent>
        <!-- Content Security Policy (CSP) 설정 -->
        <httpProtocol>
            <customHeaders>
                <add name="Content-Security-Policy" value="default-src 'self'; script-src 'self' 
https://cdnjs.cloudflare.com https://code.getmdl.io; style-src 'self' https://cdnjs.cloudflare.com https://code.getmdl.io; img-src 'self';"/>
            </customHeaders>
        </httpProtocol>
        <!-- HTTP 헤더 리라이트 규칙 -->
        <rewrite>
            <outboundRules>
                <rule name="Add HttpOnly" enabled="true" stopProcessing="true">
                    <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)"/>
                    <action type="Rewrite" value="{R:1}; HttpOnly"/>
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

 

다음은 web.config에 HTTP 압축 활성화, MIME 타입 설정, CSP설정, HTTP 응답 헤더 rewrite헤더 규칙 추가 등이 포함된 내용입니다. 다음과 같이 작성하고 저장합니다. 

 

 

 

URL Rewrite적용 여부 확인:

rewrite가 적용되고 있는지 확인하기 위하여 해당사이트에 접속한 후 F12(개발자모드) > application 탭에서 다음의 내용을 확인합니다. 아래 그림에서 HttpOnly가 체크가 되어 있으면 반영된 것으로 확인된 것입니다.

 

 

CRS(Core Rule Set)와 URL Rewrite 모듈을 함께 사용하는 이유?

< 웹 애플리케이션 방화벽(WAF) 기능과 URL 패턴 관리 기능이 서로 밀접하게 관련되어 있기 때문>


1. URL Rewrite 모듈 -  URL 구조를 표준화/재작성 WAF가 요청을 더 효율적으로 분석

2. URL Rewrite는 들어오는 HTTP 요청에 대해 미리 전처리를 해주기  때문에 CRS가 요청을 분석하고 규칙을 적용하는 과정에서 요청의 구조가 일정하게 유지된다. 


> URL Rewrite 모듈을 먼저 설치하고 설정한 후에, CRS 규칙을 활성화하는 것이 일반적인 권장 사항


 

 

owasp zap설정하기 

 

 

 

< "Missing Anti-clickjacking Header" 오류>

 

: 웹 애플리케이션에서 클릭재킹(clickjacking) 공격을 방지하기 위한 HTTP 응답 헤더가 설정되지 않았다는 것을 의미

 

header("X-Frame-Options: DENY"); 이 설정은 브라우저가 현재 페이지를 iframe 내에 표시하지 못하도록 하여 클릭재킹 공격을 방지합니다.

 

 

 

 

 

 

< Application Error Disclosure 오류> 

: 웹 애플리케이션에서 내부 오류 정보를 사용자에게 그대로 노출하는 것을 의미

 

 

 

 

-> 사용자에게는 간단한 메시지를 제공하고, 상세한 오류 정보는 숨기는 사용자 정의 오류 페이지를 생성

 

-> 오류 메시지를 숨기고, 로그 파일에 기록하며, 사용자 정의 오류 페이지를 사용

 

 

 

<Absence of Anti-CSRF Tokens 오류>

: 웹 애플리케이션이 CSRF(Cross-Site Request Forgery) 공격에 취약

 

 

 

(login2.php)

 

-> CSRF 토큰을 생성하고, 폼에 추가

 

-> 로그인에 성공한 후, 세션을 유지하면서 새로운 CSRF 토큰을 생성

 

-> $_POST['csrf_token']과 세션에 저장된 $_SESSION['csrf_token'] 값을 비교하여 요청의 유효성을 확인

 

 

 

(register2.php)

 

CSRF 토큰 생성 및 세션 저장:  세션에 유일한 CSRF 토큰을 생성하고 저장

 

 

 

 

폼에 CSRF 토큰 추가: 폼에 숨겨진 필드로 CSRF 토큰을 포함

 

토큰 검증: CSRF 토큰이 세션에 저장된 토큰과 일치하는지 확인