포럼
IPGUARD 모듈 베타 - 도움이 필요합니다...^^
2013.06.27 20:59
스쿨이 트래픽에 시달리면서 문제점을 해결해 보고자 .htaccess 파일을 이용해 IP를 자동으로 차단할 수 있는 모듈을 만들고 싶어졌습니다...^^ 과거의 리퍼러 모듈을 복원해 모니터링을 해 보았는데 트래픽을 유발하는 요청에는 일정한 패턴이 있었고 이점을 착안해 동적으로 .htaccess 파일을 생성하면 어떨까? 하는 동기로 일명 "IP가드"라는 모듈을 동작시키는데 성공했답니다.
원리는 다음과 같습니다.
트래픽을 요청하는 리퍼러에는 항상 아래와 같이 회원가입이나 글쓰기 액션이 포함되어 있습니다.
http://생략/xe/index.php?mid=xenote_module_book_contentwrite&act=dispMemberSignUpForm
그런데 위 미드명은 회원가입을 할 수 있는 모듈이 아닙니다.(외부페이지) 이것이 스쿨과 여러분의 사이트가 다른점인데 스쿨은 회원정보 관리를 항상 member_page 모듈에서 처리하도록 되어 있어요. 즉 정상적인 요청이라면
http://생략/xe/index.php?mid=member_page&act=dispMemberSignUpForm 가 됩니다.
XE는 항상 현재 모듈에서 회원가입이나 계정 관리 액션을 실행 할 수 있습니다. 하지만 위 미드명에 admin이 있다면 문제가 달라지겠지요...^^ 또는 페이지 모듈이나 외부 페이지에서 dispBoardWrite라는 액션이 반복적이고 지속적으로 요청된다면 즉각 해당 IP를 차단해야 불필요한 트래픽을 낭비하지 않을 수 있을 것이고 계정이 뚫리는 일을 미리 차단할 수도 있을 것입니다.
IP가드는 ipguard_post (감시초소 애드온)과 IP가드 모듈의 조합으로 동작합니다. 자칫 요청 리퍼러를 모두 수집하고 저장하는 일이 사이트에 부하를 줄 수 있기 때문에 초소에서는 지정된 액션만 선택적으로 로그에 기록하는 기능을 가지고 있고 모듈에서는 비정상적인 리퍼러에 대해 자동으로 IP를 등록하고 .htaccess 파일을 생성하여 유입 자체를 차단하는 기능을 포함하고 있습니다.(자동 차단 기능은 미완성, 베타는 수동 파일 생성 가능)
모듈에서 조건으로 생성한 필터링 액션은 초소에서도 활용할 수 있습니다.
--- 도움이 필요한 문제점 ---
호스팅 계정의 루트 권한이 모두 열려있다면, 또는 XE가 최상위 폴더에 설치되어 있다면 정상 동작하게 됩니다. 첨부된 모듈은 XE가 /root/xe/ 에 설치되었다는 가정하에 작성하였습니다. 이것은 ipguard.class.php 파일에서 수정할 수 있습니다. 만약 XE를 루트에 최상위로 풀어 설치했다면 ./.htaccess 로 수정하면 됩니다.
// .htaccess 파일 경로
var $htaccessFile = '../.htaccess';
DB의 수동, 자동으로 저장된 IP들과 기존 파일의 차단된 IP들을 모아 임시 파일(.htaccess_temp) 파일을 만들고 최종적으로 FileHandler::rename() 메소드를 이용해 /xe/ 바깥으로 .htaccess 파일을 생성합니다. 만약 XE를 최상위 폴더에 설치한 경우 XE의 .htaccess 원본 파일의 맨 하단에 IP 차단룰을 포함시킬 것입니다.
문제는 /xe/ 로 설치한 경우 XE 바깥의 루트 디렉터리의 퍼미션 권한이 755로 설정된 경우 권한문제가 발생하여 동작하지 않는다는 것입니다. 즉 파일을 생성, 복사하지 못하고 있답니다. XE의 /files 권한은 755, /xe/ 까지는 707로 XE 안에서는 얼마든지 파일을 생성할 수 있지만 바깥으로는 끄집어 내지 못하고 있습니다. (스쿨이 755)
FTP로 파일 핸들링이 가능하고 XE도 /files(755) 핸들링이 가능하다면 루트로(퍼미션이 755라고 하더라도) PHP를 이용해 생성된 파일(파일 퍼미션 644 유지)을 끄집어 낼 수 있지 않을까? 하는 의문이 풀리지 않아 며칠동안 고생만하고 있답니다.
공부가 모자란 덕이겠지요. 이 문제를 포기해야 하는 것인지, 능력자의 손길이 닿으면 해결될 수 있는 문제인지 도움을 요청합니다.
IP가드 베타는 추후 비영리적 공개를 목적으로 합니다. 1.4.5.10 버전에서 작성하고 1.5, 1.7 버전에서 동일하게 동작합니다. 호스팅 사용자의 루트 권한에서의 문제점을 해결 할 수 있는 방법을 찾고 싶습니다...^^
만약 퍼미션 문제로 동적 생성이 불가능하다면 ~~~
뭐...임시 파일에서 그때그때 수작업으로 FTP에서 복사하는 방법이나
또는 XE를 최상위로 빼오는 수밖에 없을 것 같고...^^
하지만 해결 할 수 있는 방법이 있지 않을까 하는 기대를 조금이나마 해봅니다.
댓글 9
-
라르게덴
2013.06.27 21:11
-
우진홈
2013.06.27 21:32
anti-access XE 헉!~~~
$this->ftpConn() 요것이 해답일 것 같은데요... XE에서 ftp 관련 메소드를 참고하면서 이건 일이 너무 커진다! 이렇게 가지는 말자! 했는데...ㅠㅠ;;;;;
고맙습니다...^^ 라르게덴님 프로젝트를 또 파헤쳐야 한다니...정말 공부는 끝이 없군요...^^
지금 프린트하고 있어요...
-
우진홈
2013.06.27 21:55
어쩌면 만들려는 것 휴지통에 버리고 anti-access XE를 써야 할 것 같군요...^^
-
라르게덴
2013.06.27 22:58
antiaccessXE도 반쪽짜리 입니다. ㅠㅠ
보다 완벽한 모듈을 기대할게요 +_+
-
푸시아
2013.06.27 22:00
오오.. 두 고수님들의 만남과 교류의 현장
-
KANTSOFT
2013.06.27 23:16
우진홈님 개발자가 아니시라고 햇었던거 같은데... 공부와 노력만큼은 XE 왠만한 개발자보다 더 많으신듯 ㅎ
-
우진홈
2013.06.29 10:42
@라르게덴 : ftp 함수들을 이용해 .htaccess 파일의 갱신을 성공시킬 수 있었습니다. 그런데 동적 생성을 유지하려면 ftp 비번을 별도로 저장해 두어야 하는데 위험도가 클까요? 동적 생성 기능보다 위험도가 크다면 결국 수동 갱신 쪽으로 방향을 잡아야 하는가가 궁금합니다...^^
antiaccess XE에서는 단회적으로 index.php를 갱신하지만 .htaccess 파일은 자동 갱신이 중요한 문제라서...^^
-
라르게덴
2013.06.29 20:05
antiaccessXE에서는 파일을 수정하기 위해 파일의 권한을 바꾼 후 다시 원래대로 되돌렸는데, 되돌리지 말고 0777의 상태로 유지하면 어떨까요? 비번 저장은 위험할거라는 의견입니다.
-
우진홈
2013.06.29 21:22
.htaccess 파일 퍼미션을 열어두는 것도 문제가 있어요. 예전에 스크립트가 삽입된 경험이 있었거든요. "antiaccessXE가 비번을 저장했는가?" 열심히 공부해 보았는데 않하셨더군요. 라르님이 하지 않은 일은 "나도 하지 않겠다!"고 결정했습니다...^^
결론적으로 퍼미션은 지켜져야 하고, IP 수집은 DB에 모았다가 관리자 로그인 후 비번 입력해서 갱신하는 것으로 가닥을 잡고 작업할까 합니다. 그리고 상상만 했던 로직이 antiaccess XE에 다 있었어요. 교과서를 받아든 것 같아 정말 고맙습니다...^^
http://www.xpressengine.com/index.php?mid=download&package_srl=19323693
antiaccess.class.php
antiaccess.admin.controller.php
원하시는 답이 있으니 잘 참고하여 만드시길 바랍니다. : )