준준의 기록일지

Tomcat SSL 적용 + HTTP METHODS제한 본문

네트워크

Tomcat SSL 적용 + HTTP METHODS제한

junjunwon 2021. 8. 23. 14:57

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."




이번에 사이트에 톰캣 ssl 적용, http methods 제한을 통한 보안 적용을 하다가 문제가 발생했다.

 

첫번째로, SSL 적용.

필요한 것.

  • 도메인이름.crt
  • 도메인이름.ca-bundle (or chain1.crt chain2.crt root.crt ...)
  • private.key (CSR 생성 시 발행)

 

도메인이름.crt + 도메인이름.ca-bundle (chain1.crt chain2.crt root.crt ... ) > 도메인이름.pem // 1개 pem 파일로 통합

 

[ crt(pem) to pfx ]

$ openssl pkcs12 -export -name 도메인이름 -in 도메인이름.pem -inkey private.key -out 도메인이름.pfx

$ Enter Export Password: 패스워드 입력 (JKS 변환 시 필요)

$ Verifying - Enter Export Password: 패스워드 한번 더 입력

$ openssl pkcs12 -export -name kkong-r.com -in kkong-r.pem -inkey kkong-r.key -out kkong-r.pfx

$ Enter Export Password: 

$ Verifying - Enter Export Password: 

 

[ pfx to jks ]

$ keytool -importkeystore -srckeystore 도메인이름.pfx -srcstoretype pkcs12 -destkeystore 도메인이름.jks -deststoretype jks

$ 키 저장소 도메인이름.pfx을(를) 도메인이름.jks(으)로 임포트하는 중...

$ 대상 키 저장소 비밀번호 입력: JKS 생성 패스워드 입력

$ 새 비밀번호 다시 입력: 위 비밀번호 다시 입력

$ 소스 키 저장소 비밀번호 입력: PFX 생성 시 입력 했던 패스워드

$ 도메인이름 별칭에 대한 항목이 성공적으로 임포트되었습니다.

$ 임포트 명령 완료: 성공적으로 임포트된 항목은 1개, 실패하거나 취소된 항목은 0개입니다.

 

$ keytool -importkeystore -srckeystore kkong-r.pfx -srcstoretype pkcs12 -destkeystore kkong-r.jks -deststoretype jks



 

SSL jks등록하는 법.

1. SSL 키, keystore정보를 받아서, server.xml에 키를 등록.

2. 기존 <Connector>를 아래와 같이 443으로 redireectPort하도록 변경.

<Connector port="80" protocol="HTTP/1.1"

           connectionTimeout="20000"

           redirectPort="443" />

 

SSL Connector 등록

<Connector port="443" 
           protocol="HTTP/1.1" 
           SSLEnabled="true"
           maxThreads="150" 
           scheme="https" 
           secure="true" 
           clientAuth="false"
           keystoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.5\{ssl_keystore name}.jks" 
         keystorePass="{password}"
           sslEnabledProtocols="TLSv1.1,TLSv1.2"
           ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
                    ,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
                    ,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
                    ,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
                    ,TLS_RSA_WITH_AES_128_CBC_SHA256
                    ,TLS_RSA_WITH_AES_128_CBC_SHA
                    ,TLS_RSA_WITH_AES_256_CBC_SHA256
                    ,TLS_RSA_WITH_AES_256_CBC_SHA" 
    />

 

 

 

3. {$tomcat경로}/conf/web.xml 에 디라이렉트 설정 추가하기.

 

아래 설정을 web.xml 파일에 추가한다. 그리고 Tomcat 을 재시작하고 http를 호출하면 https 로 바로 리다이렉트되는 것을 확인할 수 있다.

<security-constraint>

    <web-resource-collection>

        <web-resource-name>SSL Forward</web-resource-name>

        <url-pattern>/*</url-pattern>

    </web-resource-collection>

    <user-data-constraint>

        <transport-guarantee>CONFIDENTIAL</transport-guarantee>

    </user-data-constraint>

</security-constraint>

 

* 특정 리소스는 http와 https 양쪽 모두에서 처리되도록 설정하는 법

<security-constraint>

    <web-resource-collection>

        <web-resource-name>HTTPS or HTTP</web-resource-name>

        <url-pattern>/images/*</url-pattern>

        <url-pattern>/css/*</url-pattern>

    </web-resource-collection>

    <user-data-constraint>

        <transport-guarantee>NONE</transport-guarantee>

    </user-data-constraint>

</security-constraint>



두번째로, HTTP Methods 접근 제한

웹 취약점인 메소드 제한 방법!

{$tomcat경로}/conf/web.xml 에 ssl 리다이렉션 설정 위나, 아래에 아래와 같이 추가하면 메소드 제한이 된다.

 

<security-constraint> 
        <web-resource-collection> 
        <web-resource-name>Restricted methods</web-resource-name> 
            <url-pattern>/*</url-pattern> 
            <http-method>PUT</http-method> 
            <http-method>DELETE</http-method> 
            <http-method>OPTIONS</http-method> 
            <http-method>TRACE</http-method> 
        </web-resource-collection> 
        <auth-constraint /> 
    </security-constraint>

 

위 방법으로 제한을 걸 경우 PUT,DELETE 등이 기본적인 메소드는 동작하지 않았으나, 문제는 TRACE 메소드였다.

 

메소드 점검

curl -v -X Trace (도메인 or ip) 로 HTTP 메소드 점검을 할 경우, 

ALLOW목록에 POST,GET,DELETE,OPTIONS,PUT,HEAD 등 사용가능한 메소드가 표시된다. 하지만 web.xml에 이미 해당 명령어들은 수행 불가능하게 만들었기 때문에, 문제가 발생하지 않지만, 찝찝한 점이 있었다. 

다른 블로그와는 다르게 이 부분에 대한 고객의 요구사항이 있지는 않았고, TRACE할 경우 아래에 cookie부터 각종 정보가 그대로 노출되는 부분이 있어 문제 제기를 받았다. 

 

수석님한테 물어봐서 알게 된 정보는 allowTrace = "true" 

 

server.xml의 connector 에 allowTrace="true"로 하면  TRACE 메소드가 정상적으로 제한되는 것을 확인했다.

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" URIEncoding="UTF-8" allowTrace="true" />

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

21년 9월 8일 수정사항

allowTrace = "true"로 할 경우 trace 추적을 허용하는 꼴이 된다. 

-> 우리는 trace 추적을 허용하고 web.xml에서 trace method를 막아줄 방법이였는데, 고객사에서 allowTrace는 제거해달라고 했다.

우선 트레이스 허용하는 이유인 아래문제 때문인거 같다.

The third potential cause is that your seeing a false positive. False positives usually pop up for me when using custom errors or redirects and when the scanner hits a particular page and gets redirected, the 302 is not an expected response.

 

커스텀 에러페이지를 생성할 경우 발생하는 문제로 우리는 프로젝트 내부에 error_page.jsp를 컨트롤러에서 받아서 에러페이지를 출력해주는 형태이다. 컨트롤러에 태워서 넘겨줄 경우 trace가 여전히 허용되고 직접 jsp파일을 바라보게 할 경우 trace가 막힌다는데,,,302 에러가 발생할뿐 막히는걸로 보이진 않는다. 


출처: https://blog.duveen.me/32 [Developer Duveen.]

https://hulbo.tistory.com/36
출처: https://offbyone.tistory.com/262 [쉬고 싶은 개발자]

 

Tomcat SSL 적용시 https로 자동 리다이렉트 설정하기

요즘은 대부분의 사이트들이 SSL을 사용해서 https:// 로 연결을 합니다. SSL을 사용하던 초창기에는 성능 문제로 로그인, 회원가입 등 주요한 데이터가 전달되는 곳에 부분적으로 적용을 하였는데,

offbyone.tistory.com