All posts by Enteroa

쉘 스크립트의 중복실행 방지를 위해 PID 를 생성.

쉘을 단순 명령어 실행 코드로 짤수 있어서 나같은 초보자들도 쉽게 짤수 있는 프로그래밍

언어이도. 또한 서버 관리를 위해 필수 적으로 익혀야 하기도 하고..

 

그러다보니 양산되는 문제가 짜버린 쉘스크립트 코드가 너무 쉽게 만들어져 버리다 보니까.

중복실행이 되면 안되는 쉘스크립트가 중복실행이 되버릴 경우 심하면 서버 다운까지 간다.

예를 들면 백업이라던가.. awstat 체크 로직이라던가. 등등..

그렇다고 while 로 loop 로 너무 많은 쉘을 돌리는것도 문제이긴 하다.

 

그래서 쉘 스크립트를 싱행하기 전에 PID 파일을 생성하고 실행이 되도록 하고.

pid 파일이 있고 현재 프로세스가 실행중이라면 “이미 실행중’ 메세지가 나오도록 하고

pid만 덩그러니 존재 할경우 기존 pid를 삭제하고 실행 되도록 코드를 짜 보았다.

pid 파일은 해당 쉘의 위치와 동일 선상에 생성 되고 삭제되도록 되어 있다 ‘ㅅ’a

 

ps. 2016-07-21 실행된 pid가 너무 짧을 경우 프로세스 exist 체크에서 다른 프로세스를 검출 하는 경우가 나와서 살짝 업데이트를 했습니다.(4째줄..)


ps2. 2020-02-13 기존 스크립트 코드를 단순화 하고 trap 설정을 통해 상단 선언만 되도록 변경 했습니다.(아래)

 

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 파티션 초기화는 아래 명령을 이용하여 재시도 한다.