본문 바로가기

보안 취약점/기타 보안관련 서버 설정

IIS Web.config에 설정해주어야 하는 보안 서버 설정

IIS를 사용하는 웹 서버의 경우, Web Application에 아래와 같은 설정을 추가로 해주시면 좋습니다.



1. 불필요한 소스 노출 방지

   => 커스텀 에러페이지를 사용하여 불필요한 소스 노출을 방지 할 수 있습니다.


2. https를 사용하는 사이트의 경우, 특별한 경우가 아닌이상 http로 접속 시 https로 Redirect 해주는 모듈을 적용시켜주어야 합니다.

   => 단, https가 바인딩된 사이트여야 하며, 반드시 http ReWrite 모듈이 설치되어 있어야 합니다.


3. POST, GET 요청 Method만 허용

   => DELETE, PUT 등의 Method는 허용하지 않도록 합니다.


4. 정적 리소스가 아닌 동적 리소스, 페이지 등은 캐싱 가능하지 않도록 설정해주어야 합니다.


5. 서버 정보등이 Response에 표시되지 않도록 해주어야 합니다.

   => Global.asax에 다음의 메서드를 추가하여 줍니다.

1
2
3
4
5
protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
}
cs


6. SSL을 사용하고, 폼인증인 사이트의 경우 requireSSL 속성값을 true로 주어야 한다.

  => 단, SSL을 사용하지 않을경우 해당속성을 추가하면 안됨.

1
2
3
<authentication mode="Forms">
      <forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name="formauth" protection="All" path="/" cookieless="UseDeviceProfile" slidingExpiration="true" requireSSL="true" timeout="100"/>
</authentication>
cs


7. IIS 서버에서 발행하는 쿠키는 반드시 ReadOnly 속성을 추가해주어야 한다.

   => 해당 옵션을 추가할 경우 javascript에서 document.cookies를 통하여 쿠키값 조작을 하지 못함

1
<httpCookies httpOnlyCookies="true" />
cs


+) 추가로 쿠키값을 보는 방법은, 크롬 브라우져에서 보는것이 가장 편합니다.

    F12 -> Application -> Cookies 



- 적용 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<system.webServer>
    <!--1. 커스텀에러페이지 적용 시작 -->
      <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" subStatusCode="-1"  />
      <remove statusCode="404" subStatusCode="-1"  />
      <remove statusCode="405" subStatusCode="-1"  />
      <remove statusCode="406" subStatusCode="-1"  />
      <remove statusCode="412" subStatusCode="-1"  />
      <remove statusCode="500" subStatusCode="-1"  />
      <remove statusCode="501" subStatusCode="-1"  />
      <remove statusCode="502" subStatusCode="-1"  />
      <error statusCode="403" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
      <error statusCode="404" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
      <error statusCode="405" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
      <error statusCode="406" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
      <error statusCode="412" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
      <error statusCode="500" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
      <error statusCode="501" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
      <error statusCode="502" path="/CommonErrorPage.htm" prefixLanguageFilePath="" responseMode="ExecuteURL"/>
    </httpErrors>
    <!--1. 커스텀에러페이지 적용 시작 끝-->
 
    <!--2. http 접속 시 https로 Redirect 처리하는 모듈, 단 IIS ReWriteModule이 설치되어있지 않으면 오류가 납니다. https를 지원하는 사이트에만 적용 - 시작-->
         <rewrite
             <rules
                 <rule name="HTTPS Redirefct" patternSyntax="Wildcard" stopProcessing="true"
                     <match url="*" /
                     <conditions logicalGrouping="MatchAny"
                         <add input="{HTTPS}" pattern="off" /
                     </conditions
                     <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" redirectType="Found" /
                 </rule
             </rules
         </rewrite>
    <!--2. http 접속 시 https로 Redirect 처리하는 모듈, 단 IIS ReWriteModule이 설치되어있지 않으면 오류가 납니다. https를 지원하는 사이트에만 적용 - 끝-->
 
    <!--3. POST,GET 요청 Method 이외에는 허용하지 않도록 설정    시작--> 
     <security>
      <requestFiltering allowDoubleEscaping="false">
        <requestLimits maxAllowedContentLength="4294967295" />
        <verbs>
          <add verb="HEAD" allowed="false" />
          <add verb="OPTIONS" allowed="false" />
          <add verb="PUT" allowed="false" />
          <add verb="DELETE" allowed="false" />
          <add verb="TRACE" allowed="false" />
        </verbs>
        <!-- 4GB -->
      </requestFiltering>
    </security
 
    <!--3. POST,GET 요청 Method 이외에는 허용하지 않도록 설정    끝--> 
 
    <!--4. 브라우저에서 캐시를 허용하지 않도록 하는 리스폰스 헤더값, 캐싱가능한 SSL페이지가 없도록처리하는 헤더, 단, 정적 리소스의 경우에는 해당 커스텀헤더를 Remove시켜주어야함  시작-->  
    <httpProtocol>
      <customHeaders>
        <add name="X-UA-Compatible" value="IE=Edge" />
        <add name="Cache-Control" value="no-cache,no-store" />
        <add name="Pragma" value="no-cache" />
      </customHeaders>
    </httpProtocol>
    <!--4. 브라우저에서 캐시를 허용하지 않도록 하는 리스폰스 헤더값, 캐싱가능한 SSL페이지가 없도록처리하는 헤더, 단, 정적 리소스의 경우에는 해당 커스텀헤더를 Remove시켜주어야함  끝-->  
  </system.webServer
cs