웹 보안 · 5 min read · Jan 04, 2026

Remo 소개 - ModSecurity로 불안정한 온라인 애플리케이션을 보호하는 쉬운 방법

Remo 소개 - ModSecurity로 불안정한 온라인 애플리케이션을 보호하는 쉬운 방법

당신의 Apache 웹서버에 마케팅 부서의 어떤 사람들에 의해 설치된 끔찍한 애플리케이션이 있다고 가정해 보세요. 당신은 그것을 패치하거나 제거할 수 없습니다. 아마도 자원의 문제, 노하우 부족, 소스 코드 부족, 또는 정치적 이유 때문일 수 있습니다. 따라서, 당신은 그것을 건드리지 않고 보호해야 합니다. ModSecurity가 있지만, 이것은 전문가만을 위한 것이라고 합니다. 간단한 대안은 Remo입니다. Remo는 ModSecurity를 위한 그래픽 규칙 편집기로 화이트리스트 접근 방식을 제공합니다. 애플리케이션을 잠그는 데 필요한 모든 것을 갖추고 있습니다.

이 튜토리얼을 위해 우리는 정말 간단한 테스트 애플리케이션을 사용할 것입니다. 너무 못생겨서 마케팅 부서조차도 주변에 두고 싶어하지 않을 애플리케이션입니다. 하지만 이건 단지 튜토리얼일 뿐입니다.

';
  echo $_POST['command'];
  echo '
'; system($_POST['command'], $retval); # 'ls' 명령어에 필요 echo '
'; echo '
Return value: ' . $retval; echo '
'; echo '
'; echo ''; echo ''; echo '
'; ?>
ls.php: 당신의 사이트에서 제거하는 것이 좋을 작은 스크립트입니다.

어떤 셸 명령어를 매개변수 command의 형태로 직접 실행하는 것은 ls.php를 거의 모든 웹서버에서 원치 않는 손님으로 만들거나, 이 스크립트의 위험으로부터 보호하기 위해 Remo를 시험해 볼 완벽한 테스트 케이스입니다. 그렇다면 Remo는 무엇일까요? remo.netnea.com에서 ModSecurity를 구성하는 간단한 방법으로 설계되었다는 것을 알게 될 것입니다. 두 번째 포인트는 Remo가 화이트리스트 규칙을 작성하는 반면, 대부분의 사람들은 블랙리스트 접근 방식으로 ModSecurity를 사용한다는 것입니다. 블랙리스트는 ModSecurity에 모든 알려진 공격에 대해 알려주는 것을 의미합니다. 화이트리스트는 그 반대입니다: 애플리케이션이 실제로 받고자 하는 입력만 받도록 보장합니다. 따라서 ls.php는 command 매개변수로 ls 명령어만 받고, 매개변수 내에서 백틱과 세미콜론을 사용하여 더러운 트릭이 가능하지 않도록 보장합니다. 간단히 말해: Remo는 애플리케이션을 건드리지 않고 서버에서 입력 유효성 검사를 수행하는 데 도움을 줍니다.

설치

홈페이지의 온라인 데모에서 Remo를 시도해 볼 수 있습니다. 설치하지 않고 Remo를 시험해 보고 싶을 때 잘 작동합니다. 설치도 그리 어렵지 않으며, 배포 패키지가 준비되어 있지 않더라도 가능합니다. 다운로드하기 전에 ruby, irb 및 ruby-sqlite3 바인딩이 설치되어 있는지 확인하세요.

저는 제 Ubuntu 테스트 박스에서 다음과 같은 작업을 수행했습니다. Debian에서도 작동해야 합니다:

aptitude install ruby irb libsqlite3-ruby1.8

Remo의 경우, 릴리스를 다운로드하거나 최신 서브버전 트리의 스냅샷을 가져올 수 있습니다. Remo 다운로드 페이지에서는 모든 단위 테스트를 통과한 트리를 알려줍니다. 릴리스를 다운로드하고 설치한다고 가정해 보겠습니다. 다운로드 페이지로 가서 0.2.0 베타 릴리스를 가져옵니다. tarball을 풀고 WEBrick rails 서버를 시작합니다. 명령줄에서 이는 다음과 같이 요약됩니다:

wget http://remo.netnea.com/files/remo-0.2.0.tar.gz  
tar xvzf remo-0.2.0.tar.gz  
cd remo-0.2.0  
ruby script/server  
direct browser to http://localhost:3000/main/index

다음과 같은 화면을 보게 될 것입니다:

Remo를 처음 시작하는 모습

설치 후 Remo의 모습입니다.

우리는 이 튜토리얼이 간단히 진행되기를 원하므로, 테스트 애플리케이션을 보호하는 데 필요한 것만 보여드리겠습니다. 일종의 실습 가이드입니다. Remo를 스스로 탐색할 충분한 시간이 있습니다.

애플리케이션 보호

창에서 모든 기본 요청을 제거하고 새 요청을 만듭니다.

Remo의 새 요청

Remo에 새 요청 추가하기.

클릭하여 편집 텍스트를 클릭하고 애플리케이션의 경로를 입력합니다: /ls.php, 그런 다음 http 메서드를 POST로 변경합니다. 요청의 세부정보를 열고 post-parameters 옆의 p* 버튼을 사용하여 새 post-parameter를 추가합니다. 이름(클릭하여 편집)을 클릭하고 command로 변경합니다. 이것은 우리의 예제 애플리케이션 ls.php에 의해 제출된 매개변수입니다.

이름의 오른쪽에는 매개변수의 값 도메인이 있습니다. 이것은 Remo의 중심 부분입니다. 여기에서 매개변수에 대해 어떤 값이 허용되는지를 정의합니다. 기억하세요, 이것은 화이트리스트입니다: 우리는 정확히 무엇이 허용되는지를 정의하고 있습니다. 몇 가지 미리 정의된 값이 있지만, 이 경우에는 사용자 정의로 가야 합니다. command 매개변수의 세부정보를 열면 Custom regex라는 필드가 있습니다. 이것은 Remo가 값 도메인이 사용자 정의일 때 regex를 찾는 곳입니다. 저는 ls[0-9a-zA-Z-\x20_.]{0,64}를 사용할 것입니다. 이것은 ls 명령어 뒤에 숫자, 문자, 하이픈, 공백 문자, 밑줄 및 점으로 구성된 선택적 문자 그룹이 오는 것입니다. 세미콜론, 슬래시, 백틱, 독일어 움라우트, 유니코드 특수 문자는 없습니다: 이것은 당신의 서버이며 여기서 더러운 일이 일어나지 않기를 원합니다.

remo-article-3_550px.png

POST 매개변수 command의 정의로 ls.php에 대한 보호가 진행 중입니다.

이 조건을 충족하지 않는 요청은 실패합니다. Apache의 기본 동작은 실패한 요청에 대해 http 상태 코드 501: 메서드가 구현되지 않음 을 반환하는 것입니다. 하지만 친절하게도: 상태 코드(실패한 도메인 일치)로 http 리디렉션을 위해 302를 입력하고, 아래의 위치(실패한 도메인 일치)에는 http://www.netnea.com과 같은 회사의 URL을 입력합니다. 따라서 올바른 매개변수를 제공하지 않는 사람은 회사 웹사이트로 리디렉션됩니다. 실제로 매개변수를 필수로 만들 수 있으며, 선택적을 클릭하면 필수 조건 실패에 대한 특별한 동작을 설정할 수도 있습니다. 그러나 우리의 경우, 매개변수는 필수일 필요는 없습니다.

이 정규 표현식 매개변수가 ModSecurity 규칙으로 어떻게 변환되는지 궁금하다면, 다음 그래픽을 살펴보세요:

remo-article-4_550px.png

Remo 매개변수 구성이 ModSecurity 규칙으로 변환되는 방식입니다.

이것은 Remo 매개변수가 ModSecurity 규칙으로 변환되는 방법과 평가 중에 어떤 일이 발생하는지를 설명합니다. 요약하자면: 모든 http 요청 매개변수는 Remo에서 정의된 값 도메인과 일치하며, 일치하지 않으면 전체 요청이 접근을 거부당합니다.

실습

이제 ModSecurity 규칙 세트를 생성해 봅시다. 툴바에서 생성 버튼을 클릭하고 받을 파일을 저장합니다. 이것은 ModSecurity 규칙 언어의 규칙 파일입니다. 이 파일을 Apache가 찾을 수 있는 위치에 저장하세요. Remo가 ModSecurity를 어떻게 사용하는지 이해하는 데 도움이 될 것입니다. 그런 다음 ModSecurity가 웹서버에서 활성화되어 있는지 확인해야 합니다. Remo는 ModSecurity 2 규칙 세트를 생성합니다. 1.9와 2.0 사이에 구성 언어에 대한 주요 업데이트와 확장이 있었기 때문에 Remo는 이러한 새로운 기능이 필요합니다. 배포에서 ModSecurity 패키지를 제공하지 않는 경우, http://www.modsecurity.org에서 대부분의 패키지를 받을 수 있습니다. 그렇지 않으면 항상 직접 컴파일할 수 있습니다. 그렇게 어렵지 않습니다.

규칙 파일을 Apache 구성에 다음과 같이 포함하는 것이 가장 좋습니다:


    Include /etc/apache2/rulefile.conf

그런 다음 Apache를 다시 로드하고 시도해 보세요(데모에서는 curl 명령줄 도구를 사용하고 있지만, 브라우저도 괜찮습니다):

curl --data "command=ls -l" http://localhost/ls.php
-rw-r--r--  1 sam    staff     353 Feb  7 13:05 index.html  
-rw-r--r--  1 sam    staff     248 Apr 23 05:35 ls.php  
...

그래서 이것은 여전히 작동합니다. ls.php의 남용은 어떨까요?

curl --data "command=ls -l; cat /etc/passwd" http://localhost/ls.php
  
  
302 Found  
  

Found

문서가 여기로 이동했습니다.


Apache/2.2.3 (Debian) PHP/5.2.0-8 Server at railsmachine Port 80

공격자를 잡았습니다! 구성 파일에 감사 로그가 정의되어 있습니다. 기본적으로 이는 /var/log/apache2/modsec_audit.log에 있습니다. 우리의 경우 다음과 같이 읽힐 것입니다:

...  
--2957a220-H--  
메시지: http://www.netnea.com으로 리디렉션하여 접근 거부됨, 상태 302 (2단계).   
"rx ^(ls\x20[0-9a-zA-Z-_.]{0,64})$"가 "ARGS:command"에 대해 필요합니다. [id "1"]   
[msg "Postparameter command의 유효성 검사 실패. 값 도메인: Custom."] [severity "ERROR"]  
작업: 가로채기 (2단계)  
...

운영 모드로 전환하기 전에 이 로그가 너무 커지지 않도록 하세요. 사실, 설정이 완료되면 너무 많은 로깅을 비활성화하고 싶을 수도 있습니다. 로그 파일은 기본적으로 디버깅 목적으로 전체 요청 로깅을 수행하도록 Remo에 의해 구성됩니다. 여기에는 모든 것이 포함되며, 비밀번호도 포함됩니다. 테스트가 완료되면 규칙 파일에서 SecAuditLogParts 매개변수를 더 합리적인 값으로 설정해야 합니다. ABHZ가 옵션입니다. 그렇게 하면 http 헤더와 ModSecurity 감사 요약만 기록됩니다.

그래서 이것은 Remo에 대한 간단한 개요였습니다. Remo 웹사이트에서 더 많은 정보를 찾을 수 있습니다. ModSecurity.org에는 구성 언어에 대한 모든 것을 알려주는 훌륭한 문서가 있습니다. 또한, Remo에서 애플리케이션을 모델링할 시간이 없는 상황에서 도움이 될 수 있는 핵심 규칙 세트가 있습니다. 핵심 규칙 세트는 항상 좋은 시작점이며, 매우 적은 노력으로 90%의 공격을 잡을 수 있습니다.

Remo는 성숙하지 않았지만 사용 준비가 되어 있으며, 유용한 사용자 기반이 있다면 웹 애플리케이션을 보호하는 흥미로운 도구로 발전할 수 있습니다. 당신의 애플리케이션은 이 튜토리얼에서 사용된 것만큼 간단할 필요는 없습니다. 수십 개의 URL과 많은 매개변수를 가진 더 큰 애플리케이션도 잘 작동합니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.