일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 데이터베이스
- 스프링
- JS
- 보안취약점
- component
- 개발공부
- GIT
- Vue
- 자바스크립트
- mssql
- Spring
- jdk
- 컴포넌트
- crud
- 개발
- Intellij
- reactjs
- java
- 자바
- 쿼리
- table
- springboot
- sql
- restapi
- 리액트
- 스프링부트
- javascript
- React
- EXTJS
- DATABASE
- Today
- Total
준준의 기록일지
Tomcat SSL 적용 + HTTP METHODS제한 본문
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
이번에 사이트에 톰캣 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 [쉬고 싶은 개발자]
'네트워크' 카테고리의 다른 글
[SSL] 톰캣에 SSL 적용시 Cannot Recover key 에러 (0) | 2021.08.23 |
---|---|
[네트워크] request.getHeader, getRemoteAddr (0) | 2021.01.25 |
[Jmeter] 웹서버 성능 테스트 (0) | 2021.01.25 |
[네트워크] 게이트웨이(Gateway)란 무엇인가 (0) | 2021.01.08 |