카테고리 Archives: linux

apache 에 mod_security2 를 OWASP 룰셋으로 적용

이건 매우 상급 이니까.  아 해봐야지 하고 덤볐다가는 멘탈 붕괴가 무엇인지 느끼게 해준다 =ㅅ=a

apache web server 에 mod_security를 도입하고 OWASP 룰셋를 적용한다음에 관리하는 방법까지 이다.

먼저 mod_security 를 설치 를 위한 의존성 프로그램 을 설치한다.

그후 다운 로드 및 설치.

그다음 httpd.conf 에 불러오는 설정을 해야 겠지요 ‘ㅅ’a

물론 Include 경로를 자신이 운영하는 웹서버 경로에 바꿔야 하는걸 잊지 말자.

음 mod_security 설치는 되었다.

 

이제 룰셋 적용부분.. http://www.modsecurity.org/rules.html

공식 사이트에서는 아래와 같이 두가지 를 추천하고 있다.

무료 – OWASP ModSecurity Core Rule Set (CRS)
유료 – Commercial Rules from Trustwave SpiderLabs

물론 다른 방화벽 업체에서도 룰셋 제공을 하고 있다.

무료 – Comodo Web Application Firewall (CWAF)

여시서는 OWASP 룰셋을 적용할 예정이다.

OWASP 는 (The Open Web Application Security Project) 오픈소스 웹 애플리케이션 보안 프로젝트 이다 자세한 설명은 http://ko.wikipedia.org/wiki/OWASP 요기서 참조 ‘ㅅ’a

여기까지가 설치 완료는 아니고 사용할 룰셋을 익티베이트 룰셋 폴더에 심볼링 링크를 건다.

이후 owasp-modsecurity-crs 요 폴더를 자신의 httpd.conf 에서 불러 오도록 하면 되겠다.

 

호환성에 염두하지 않고 보안 적인 취약점을 막기 위해 제작된 룰셋이기 때문에

바로 돌리면 사이트가 안뜬다 -_-;;

먼저 php.ini 수정이 필요하다.

 

modsecurity_crs_10_setup.conf 파일에 아래부분을 추가 한다.

SecRuleEngine On -> DetectionOnly 로 설정하면 감시만 하고 실제 차단은 하지 않는다.

다만 이 디텍트모드에서 기존 사이트 운영중인것에서 걸리는 룰셋을 수정 하거나 해제 해야 한다.

httpd.conf 를 수정한다.

위와 같이  SecRuleRemoveById 으로 제거를 할수 있으며 디렉토리 혹은 파일명까지 지정하여 사용할 수 있다.

혹은 아래와 같이 가상호스트에서 특정 호스트만 룰셋(SecRuleEngine Off)적용을 끄거나 특정룰만 제거(SecRuleRemoveById)할 수도 있다.

Ajax 를 사용하는 경우 SecRequestBodyAccess On, SecResponseBodyAccess On 두개의 옵션 때문에

Ajax 가 비정상 동작을 할수 있는데 이것역시 Location 혹은 VirtualHost 에서 각기 Off 가 가능하다.

 

정리 하자면 사용할수 있는것은 아래 4가지 이며.

SecRuleEngine Off
SecRequestBodyAccess Off
SecResponseBodyAccess Off
SecRuleRemoveById 룰셋ID

이 일부 혹은 전체 끄는 옵션을을 VirtualHost 혹은 LocationMatch 안에 넣어 일부 허용만 할 수 있다.

 

아래는 이러한 룰셋을 분석하기 위해 아파치의 error_log 를 분석하기 위한 명령어 이다.

 

모드 시큐리티는 apache / nginx 에 도입이 가능하다.

다만 nginx 는 테스트 결과 룰셋에 걸리는 웹접근이 이루어 질때 메모리 및 CPU 가 과다 사용이 되고

kernel – oom – killer 에 의해 프로세스가 강제 종료되는 사례가 발생하였다.

nginx 에서의 모드시큐리티 사용은 좀더 두고 봐야 할것이라고 생각된다.

 

CVE-2015-0235 취약점 ‘ㅅ’a

□ 개요
>  미국 US-CERT는 리눅스 GNU C 라이브러리(glibc)에서 임의코드를 실행할 수 있는 취약점(CVE-2015-0235)이 발견되었다고 발표
※ CVE-2015-0235는 해당 라이브러리의 gethostbyname( ) 함수 처리 과정에서 발생하는 버퍼오버플로우 취약점
※ GNU C 라이브러리 : 리눅스 계열 운영체제에서 기본적으로 사용하는 소프트웨어

 

□ 취약점 내용
>  라이브러리에 존재하는 특정 함수(__nss_hostname_digits_dots( ))의 잘못된 메모리 사용으로 인해 오버플로우가 발생하여 프로그램의 실행 흐름 변경이 가능
※ __nss_hostname_digits_dots( ) 함수 : 도메인 주소를 IP 주소로 변환할 때 사용하는 함수인 gethostbyname( )를 호출 시 내부적으로 호출되는 함수

 

□ 해당 시스템
>  영향을 받는 시스템
– glibc 2.2~2.17버전의 모든 리눅스 시스템

 

□ 해결 방안
>  취약한 버전의 라이브러리를 사용하는 시스템은 상위 버전으로 업데이트
※ 실행파일에 취약한 버전의 라이브러리를 포함하여 컴파일 한 경우, 상위 버전의 라이브러리로 재컴파일 하여 설치 필요
>  다음 참고사이트의 내용을 참조하여 보안업데이트 수행
– CentOS [1] http://lists.centos.org/pipermail/centos/2015-January/149413.html
– Debian [2] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776391
– Redhat [3] https://access.redhat.com/articles/1332213
– Ubuntu [4] http://www.ubuntu.com/usn/usn-2485-1

 

————————————————————————-

음 뭐 그렇다고 한다. ‘ㅅ’

먼저 패치가 된 서버인지 점검..

위와같이 fix 가 되었다는 changelog 가 없다면 패치가 필요하겠다.
( if can’t see the highlight message look like. You  should be patch glibc on server. )

 

윰 만든사람들 최고 ‘ㅅ’b

발빠른 업데이트 내놓는 사람들 최고 ‘ㅅ’b

설치 후 리부팅이 필요 하니 주의 하자. ( caution : it’s necessary reboot server when updated glibc. )

 

vim 7.0 이상에서 파일 자동완성기능 끄자 -_-a

호불호가 갈리겠지만 난 별로라서 = =a

파일을 인식 해서 자동으로 주석을 넣어주는 기능이 vim 7.0 부터 추가가 되었다.

( 정확히는 그전부터 있던 기능 이지만 기본적으로 Off 였다. )

 

/etc/vimrc 파일에 설정된 옵션을 꺼주면 적용된다.

 

위와 같은 부분을 아래와 같이 주석하면 된다.

 

swap 파티션 잡는법.

발생 사유는 잘 모르겠지만.

top 명령으로 서버 자원을 보았을때.

위와 같이 Swap:        0k total,        0k used,        0k free,        0k cached 으로 스왑이

잡혀 있지 않는 경우가 발생하였다 ‘ㅅ’aaa

 

리부팅 해도 변함없이 0으로 잡혀 있을때 아래와 같이 스왑 파티션을 잡아주면 된다.

 

위의 명령으로 안된다면 파티션이 swap 으로 잡혀 있지 않거나 파티션 초기화가 안되었을 수 있다.

파티션은 fdsik 를 이용해서 잡고 swap 파티션 초기화는 아래 명령을 이용하여 재시도 한다.

 

 

옵션 을 적용하여 마운트 ‘ㅅ’a

기존의 글에서 DISK 의 IO 성능을 올리기 위해 /etc/fstab 수정하는 법에 대해서 설명했다.

 

작은 웹서버 ( 사이트 10개 미만 정도) 는 fstab 을 수정하는것으로도 충분 하지만.

대량의 웹서버 에서는 계정용 디스크를 별도 로 붙여 사용을 한다.

문제는 계정용 디스크가 커질경우 linux 에서 일정 기간동안 disk 사용시간이 넘어가는경우 부팅할때 disk 검사를 한다.

물론 디스크 검사를 해주는것도 중요하지만

원하지 않는 스케쥴링에 포람된 디스크 검사 때문에 서비스를 늦게 살리는건 말이 되지 않는다.

 

때문에 대형 웹서버 의 경우(사이트 100개 이상 서비스용도) 웹 디스크를 별도로 마운트 해서 사용한다.

부팅을 시켜두고 커널이 올라온 뒤에 root로 로그인을 해서 마운트 를 하고 서비스를 시작하기는 매우 귀찬다 ‘ㅅ’a

 

그래서 /etc/rc.d/rc.local 이란곳에 미리 등록해서 윈도우의 “시작프로그램” 처럼 부팅 후

마운트를 자동으로 하도록 설정한다.

 

1. 먼저 /etc/fstab 에 아래와 같이 웹용 디스크를 주석처리를 한다.

 

2. 이후에 /etc/rc.d/rc.local  에 아래와 같이 추가 하여 주석을 읽어들여 마운트 하는 부분을 추가한다.

주의사항 ## 마운트 체크할 디바이스를 지정한다. ( / 가 들어갈경우 \/ 와 같이 특수문자 처리를 한다. )

 

3. 마운트 이후에 httpd 를 시작해야 겠다.

근데 httpd 는 chkconfig 로 부팅 후 실행할 데몬에 추가하지 못한다. 그래서 마판가지로 /etc/rc.d/rc.local  추가한다.

이때 서버가 갑자기 다운된 경우 httpd.pid 파일이 남아 start 명령이 들어가지 않을수 있다.

pid 파일이 있는 상태에서 apache 를 시작 하면 존재 하던 pid 파일을 자동으로 지운다는 점에서 착안

아파치를 두번 시작한다. ‘ㅅ’a

(물론 두번째 시작은 ps 목록을 체크하고 이미 잘  실행중일경우  재실행 안되도록 했다.)