서버 보안 WEB, WAS서버 편
얼마 전 카카오톡 개발자 채팅방에서 있었던 일입니다.
이 채팅방 인원들은 참으로 개발자스럽게 개인이 직접 관리하거나 호스팅업체로부터 임대받아 호스팅을 운영하는 사람들이 많이 있습니다.
우연찮게 어떤 분이 본인이 운영하던 서버주소를 공유한 일이 있었는데, 브라우저에 내장된 네트워크 모니터로 프로파일링을 하신분이 계셨어요.
AWS에서 임대받았으며, httpd(apache) 버전이 몇이고 php 버전이 몇이고 내용이 나타난 걸 얘기했습니다.
여기까지만 읽어보면 Front End개발자분들이나 UI/UX디자이너 입장에서는 그게 뭐 대수인가? 싶겠습니다만… 버전이 노출되는 것은 생각보다 큰 타격을 가져올 수 있습니다.
소프트웨어를 버전업을 하는 경우는 Maintenance로 크게 2가지로 나눌 수 있습니다.
Enhancement, (Bug) Fix
Enhancement는 매우 좋은 취지입니다.
소프트웨어 공학론에서 의미하는 유지보수중에서도 완전적, 적응적 유지보수에 가깝기 때문에 기능을 증진시키고 조금 더 유연한(운영체제측면, 하드웨어측면 등) 프로그램을 제공 할 수 있으니까요.
하지만 문제는 Fix.
Fix도 단순 버그에 대한 조치이면 운영적인 부분에서는 그나마 다행이지만 핵심은 취약점 조치입니다.
취약점 조치로 인한 버전업은 구버전에 보안적 취약점이 존재한다는것을 발견했으며, 조금 더 상황이 나쁘다면 공격방법이 퍼졌을 경우입니다..
대표적인 서버유형으로 DB, WEB, WAS.
뿐만 아니라 RTSP, NAS, SAN 다양한 응용서버가 존재하는데
이들 서버의 공통점은 무중단 무고장 운영이 중요하단 것이지요.
이런 환경에서 서버 재기동은 당연 고사하고 액티브–스탠바이 멀티프로세서 구조의 서버에서도 모듈 재기동은 조심스러운게 당연합니다.
그런데 응용의 새로운 stable버전이 나왔다고 소스를 갖다가 컴파일? 패키지 설치도 위험합니다.. change log를 검토하고 기존 결합되는 타 모듈들과의 충돌.. 위험관리 등(모듈간 응집도가 다르기 때문에 모든 환경에서 다양한 경우의 수가 존재)
새로운 운영환경을 구성하기가 여간 까다로운것이 아닙니다.
따라서 보통 신 버전이 나와도 구 버전을 유지하는 경우가 많습니다.
이 때 버전 정보가 노출된다면 공격에 더욱 취약해질 것입니다.
물론 그 서버를 공격하고자 마음먹은 해커라면 버전 정보가 숨겨져있다하더라도 모든 취약점을 시도해보겠지만
버전정보라도 숨겨져있으면 Brute Force로 전수조사를 하는 동안 해당 공격의 관제와 조치까지의 시간적 여유를 벌 수 있을테죠.
그래서 이번에는, 가장 대표적인 WEB 서버(Deployment Application)들의 버전 정보를 숨기는 방법을 소개해보고자 합니다.
Apache Httpd, Nginx, Tomcat, PHP 총 4가지의 보안조치를 설명하도록 하겠습니다.
Apache Httpd
# vim httpd.conf … ServerSignature Off ServerTokens Prod … // in CentOS 7 # systemctl restart httpd // less then equal CentOS 6 # service httpd restart
Nginx
# vim nginx.conf … http{ … server_tokens off; ... } … // in CentOS 7 # systemctl restart nginx // less then equal CentOS 6 # service nginx restart
서비스를 재시작하면 Request에 의한 Response Header에 server 파라미터가 “nginx”로 표시되는 것을 알 수 있습니다.
Tomcat
1 )
# vim server.xml … // 경우에 따라 </Connector> 로 끝날 수 있음 <Connector port="운영되는포트" protocol="HTTP/1.1" server="서버명 작성" /> …
2 )
# cd $TOMCAT_PATH/lib # unzip catalina.jar // 주의 주의 주의 주의 주의 Caution Caution Caution Caution # rm -rf META-INF # cd org/apache/catalina/util # vim ServerInfo.properties … server.info="서버명 작성" ... // in CentOS 7 # systemctl restart tomcat // less then equal CentOS 6 # service tomcat restart
고의적으로 tomcat의 404에러를 유발해보면 하단 footer부에 Tomcat 버전이 사라진 것을 알 수 있습니다.
뿐만 아니라 기본 에러페이지 자체가 에러 발생시 (특히 500에러시 ) 서버로부터 많은 정보를 받게된다. Exception Class, Stack Traceback 등…
이는 web.xml을 수정함으로 해결할 수 있습니다.
3 )
# vim web.xml ... <error-page> <error-code>400</error-code> <location>/error/err400.html</location> </error-page> <error-page> <error-code>404</error-code> <location>/error/err404.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/err500.html</location> </error-page> // 등등 수정 … // in CentOS 7 # systemctl restart tomcat // less then equal CentOS 6 # service tomcat restart
참고로 location에서 의미하는 /error/errxxx.html은 절대경로 /가 아니라 어플리케이션 상대경로로부터 루트입니다.
즉 WAS내 서비스하는 어플리케이션의 이름이 A라면
A/error/errxxx.html
의 경로로 존재해야 커스텀 에러 페이지 접근이 가능합니다.
PHP
# vim php.ini … expose_php = Off … // If server using the common php package. // in CentOS 7 # systemctl restart (httpd | nginx) // less then equal CentOS 6 # service (httpd | nginx) restart // If server using php-fpm // in CentOS 7 # systemctl restart php-fpm // less then equal CentOS 6 # service php-fpm restart
이제 다시 웹서버로부터 php파일을 request해보면 php관련 헤더가 보이지 않음을 알 수 있습니다.
95개의 댓글