한빛출판네트워크

IT/모바일

Procmail 기본 사항

한빛미디어

|

2002-01-08

by HANBIT

저자 드루 라빈(Dru Lavigne) 만약 여러분이 하루에 한 통 이상의 이메일을 받는다면 아마도 받은 메일을 우선순위에 따라 분류해 놓거나 항목별로 구분해 놓는 일이 어렵다고 생각될 지도 모르겠다. 때로는 엄청난 양의 별로 중요하지 않은 메시지들로 인해 급한 메시지를 제때에 볼 수 없는 사태가 발생하기도 한다. 설상가상으로 여러분의 편지함이 스펨 메일이나 바이러스로 오염된 메시지, 이외의 여러 가지 유쾌하지 못한 메시지들로 꽉 차버릴 수도 있다. 하지만 여러분이 이런 엄청난 양의 이메일을 분류하는데 도움을 줄 수 있도록 설계된 프로그램이 있으니 그 프로그램의 이름은 procmail이다. 다행스럽게도 이 프로그램으로 여러분은 개인적인 요구에 맞추어진 "레서피(recipe)"을 만들어냄으로써 진짜 받아보고 싶은 메시지와 받고 싶지 않은 메시지를 분류하여 처리할 수 있다. 이 기사에서는 procmail을 구축하고 설정하는 방법을 알아본 후 몇 가지 기본적인 레서피들을 사용해 볼 것이다. 물론 다음 기사에서는 좀더 복잡한 레서피 및 procmail의 로그인 특징과 관련된 사항에 대해 살펴볼 것이다. 일단 Procmail을 설치하려면 수퍼유저로 접속하여 포트를 구축해야 한다.
su 
Password: 
cd /usr/ports/mail/procmail 
make install clean
이 포트를 구축할 때 여러분은 다음과 같은 정보가 담긴 메시지를 받게 될 것이며 여러분이 계속해서 포트를 구축해나가기 원한다면 엔터를 누르라고 요구할 것이다. 첫 번째 메시지는 잠금 테스트에 관한 것이며 디폴트 디렉토리를 수용하기위해 나는 방금 엔터키를 눌렀다.
========================================================= 
내가 의도한대로 커널-잠금 테스트를 작동하기 위해서는 가능한 한 의미론적으로 다양한 파일시스템에 대한 
잠금 파일을 테스트할 수 있어야만 한다(이것에 대한 더 자세한 정보는 설치에 있는 두 번째 문단을 읽어볼 것).
이 프롬프트를 억제하기위해 여러분은 Makefile에 LOCKINGTEST 변수를 설정할 수 있다.

리스트에 쓰기가 가능한 디렉토리를 추가하기 바란다. 여러분은 독특한 개성을 가지고 있는 파일시스템에 있는 
디렉토리를 추가만 해야 한다. 예를 들어 만약 여러분이 몇 개의 원격 NFS 파티션을 갖고있으며 독특한 
클라이언트측 한 쌍을 선택했다면 똑같은 클라이언트-머신으로부터 똑같은 서버를 두 번 선택한다는 것은 거의 
소용이 없는 일이라는 것을 알아두어라. 이럴 때에는 원격 탑재된 메일 스풀 디렉토리가 더 낫다.

나는 임시로 아래에 보이는 디렉토리 내에 있는 _locktest라 불리는 테스트디렉토리를 사용할 것이다.

/tmp .

만약 더 추가하고 싶은 사항이 있다면 아래에 그것들을 명시하고 계속하기 위해 리턴을 눌러라. 
=========================================================
이와 같은 구축과정은 여러분이 procmail을 "센드메일"과 같은 메일 전송 시스템으로 통합 할 수 있다는 사실을 상기시켜준다. 나는 단일-유저 시스템위에 procmail을 구축하고 있는 중이므로 어떠한 것도 방해하지 않을 것이다. 만약 여러분이 이와 같은 가능성에 대해 조사해보고 싶다면 일단 구축 과정을 종료한 후 /usr/local/share/examples/procmail/advanced에 있는 파일을 읽어보도록 해라.
========================================================= 
만약 여러분이 시스템 관리자라면 여러분은 procmail이 메일-전송 시스템으로 통합되도록 
고려해야 한다. - 고급 기능과 속도 그리고 보안을 위해 --. 이 주제에 대해 더 자세한 
정보를 알고싶다면 예제/고급 파일을 살펴보아야 할 것이다.
========================================================= 

===>  보안 경고:  
      이 포트는 증가된 특권과 함께 실행되는 아래와 같은 바이너리로  
      설치되었다.
1142851  132 -rwsr-xr-x    1 root             wheel               66612 
Nov 27 13:27 /usr/local/bin/procmail 
 
만약 이러한 프로그램에 취약점이 있다면 시스템에 보안상 위험이 존재할 수 있다. 
FreeBSD은 포트 컬렉션을 포함한 포트의 보안을 보장해주지는 않는다. 따라서 이러한 
사항이 염려된다면 포트를 설치하지 않기 위해 "make deinstall"을 타이핑 해야 한다 .
 
더 자세한 정보 및 이 소프트웨어의 보안 상태에 대한 세부사항에 접속하고자 한다면
아래의 웹 페이지를 보기 바란다: 
http://www.procmail.org/

=========================================================
결국 procmail이 setuid 퍼미션과 함께 설치되었기 때문에 보안 경고를 받는다. 우리는 또한 setuid때문에 procmail에 어떠한 SA가 있는지 그리고 FreeBSD-SA-01:60.procmail.asc.라는 것이 있는지를 체크해야 한다. 만약 여러분이 SA라는 글자를 본다면 3.20보다 낮은 procmail 버전은 취약성이 있다고 발표되었기 때문에 여러분은 SA라는 글자와 함께 3.20보다 낮은 버전은 실행할 수 없다는 메시지도 보게 될 것이다. 나는 내가 방금 구축한 procmail의 버전을 더블클릭할 것이다.
rehash 
procmail -v 
procmail v3.22 2001/09/10 
    Copyright (c) 1990-2001, Stephen R. van den Berg     
    Copyright (c) 1997-2001, Philip A. Guenther          

지금까지 잘 해왔다. 그렇다면 우리가 방금 구축한 이 포트로부터 우리가 기대할 수 있는 것에는 무엇이 있는지 잠시 살펴보기로 하자.
more /usr/local/share/doc/procmail/README은
메일-서버 생성, 메일링 리스트 생성, 받게 될 메일을 각각의 폴더나 파일로 정리(한 가지 이상 
정기적으로 구독하는 메일링 리스트가 있거나 메일 우선순위를 결정할 때 정말로 편리함), 
메일 처리, 메일 도착과 함께 특정 프로그램 실행(예를 들어 성격이 다른 메일이 수신되면 도착음으로
다른 소리가 나게 하는 프로그램) 또는 자동으로 누군가에게 선택적으로 특정 메일을 포워딩 
시켜주는 용도로 사용할 수 있다.

Procmail은 아래와 같이 사용될 수 있다: 
   - 특권이 없는 유저에 의해서도 설치되고 사용될 수 있다(개인 용도로만). 
   - 로컬 전송 agent /bin/mail에 대한 일시적인 대체품으로서 사용될 수 있다(biff/comsat 지원과 함께). 
   - 전체 그룹 메시지에 대한 일반적인 메일필터로 사용될 수 있다(sendmail.cf 규정내에서부터 호출될 때).

같이 있는 formail 프로그램은 여러분이 자동응답을 할 수 있도록 해주며 digests/mailboxes를 원본 메시지로 
쪼개거나 몇몇의 아주 간단한 헤더- 변경/추출을 하거나 메일을 메일-포맷으로 변경하게 한다.
----------------------
그렇다면 이제부터 한 유저만을 위한 procmail 설정을 시작해보도록 하자. 일단 여러분은 실제적인 포트 구축은 마친 상태이므로 수퍼유저 계정 없이도 작업을 진행할 수 있다. 나는 일반 유저인 "genisis"로 작업을 할 것이며 이 이름으로 procmail 설정을 할 것이다. 일단 내 홈 디렉토리로 들어가서 예제 설정 파일을 복사할 것이다.
cd
cp /usr/local/share/examples/procmail/forward ~/.forward
cp /usr/local/share/examples/procmail/1procmailrc ~/.procmailrc
그리고 이러한 파일들에 대한 퍼미션을 재설정할 것이다.
chmod 644 ~/.forward
chmod 644 ~/.procmailrc
나는 새로운 메일 수신을 체크하기위해 내 ISP 메일 서버에 정기적으로 송신하도록 만들어 놓은 fetchmail 프로그램을 사용하고 있다. 따라서 procmail 설정을 종료할 때까지 나는 fetchmail 프로세스를 죽여놓을 것이다.
killall fetchmail
procmail 유틸리티는 procmailrc라고 알려진 설정 파일을 읽을 것이다. 수퍼유저는 시스템에 있는 모든 사용자들에게 영향을 미칠 /usr/local/etc/procmail 내에 전반적인 설정파일을 생성할 수 있다. 그렇지만 각각의 유저들은 그들의 홈 디렉토리 내에 각자의 .procmailrc를 대신해서 만들 것을 추천한다. 이런 방법으로 유저들은 다른 유저들에게 영향을 미치지 않고 그들 자신의 필터링 레서피를 생성할 수 있다. .procmailrc 파일은 두 개의 섹션으로 되어있다. 첫 번째 섹션은 경로와 환경 변수를 가지고 있으며 두 번째 섹션은 필터링 레서피를 가지고 있다. 일단 디폴트 .procmailrc을 홈 디렉토리로 복사했다면 그 즉시 어떤 이메일을 다운로드 받기 전에 첫 섹션을 편집해라. 이 작업을 직접 보여주기 위해 나는 자주 사용하는 텍스트 에디터로 procmailrc을 열 것이다.
 
# PATH에 있는 모든 경로가 올바르게 연결되어 있는지 확인하기 바람. 
# 올바르게 연결되어있지 않은 경로는 제거할 것.
 
PATH=$HOME/bin:/usr/bin:/usr/ucb:/bin:/usr/local/bin:.
FreeBSD은 /usr/ucb이 없기 때문에 그 비트를 콜론과 함께 지우고 나면 라인은 다음과 같이 될 것이다.
PATH=$HOME/bin:/usr/bin:/bin:/usr/local/bin:. 
 
MAILDIR=$HOME/Mail # Mail이 확실히 있는지 확인하기 바람.
나는 이메일 판독기 pine을 사용하므로 내 메일은 mail이라고 불리는 디렉토리로 간다. 따라서 나는 위 라인에 있는 대문자 M을 소문자 m으로 변경할 것이다. 만약 pine을 사용하지 않는다면 홈 디렉토리의 ls ?F에서 실행해라. 출력된 부분 어딘가에 이메일을 저장하는 디렉토리가 있어야만 한다. 이럴 경우 디렉토리는 대개 mail 또는 Mail이라고 불린다. 만약 그 디렉토리의 ls에서 실행한다면 메일 폴더(예를 들어 sent, saved 기타 등등.)를 인지할 수 있어야만 한다. MAILDIR 라인이 현재 디렉토리를 반영한다는 사실은 매우 중요한 것이라는 것을 명심하기 바란다. 다음 세 개의 환경 변수는 원래대로 내버려 둘 수 있다. DEFAULT 변수는 procmail에 여러분이 만들어낸 레서피와 맞지 않는 모든 메시지를 저장할 mbox라고 불리는 디렉토리를 생성할 것을 명령한다. LOGFILE 변수는 procmail 로그들이 저장될 from이라고 불리는 디렉토리를 생성한다.
DEFAULT=$MAILDIR/mbox
LOGFILE=$MAILDIR/from
LOCKFILE=$HOME/.lockmail
환경 변수들 이후에 있는 것은 몇몇 예제 레서피를 포함하고있는 섹션이다.
:0                  # Anything from thf
* ^From.*thf@somewhere.someplace
todd                # will go to $MAILDIR/todd

:0                  # Anything from people at uunet
* ^From.*@uunet
uunetbox            # will go to $MAILDIR/uunetbox

:0                  # Anything from Henry
* ^From.*henry
henries             # will go to $MAILDIR/henries

# 현재까지 전송되어지지 않은 것은 
# LOCKFILE=$DEFAULT$LOCKEXT을 사용하는 $DEFAULT로 갈것이다.
일단은 경로와 환경 변수들의 편집을 마친 상태이므로 procmail 유틸리티는 정확하게 실행되기에 충분한 정보를 가지고 있다(여러분이 이러한 레서피들을 조작하지 않는 한 procmail 유틸리티는 mbox라고 불리는 폴더로 모든 이메일을 단순하게 전송만 할 것임). 지금부터 나는 샘플 레서피들을 제거할 것이다. 또한 fetchmail을 재시작하고 pine을 열어봄으로써 내가 아무것도 망가트려 놓지 않았음을 확인하는 테스트도 실시할 것이다. mbox라고 불리는 내 폴더 리스트에 새 폴더가 생긴 것을 볼 수 있으며 몇 분 후에는 그 폴더 안에 새로운 메일이 도착했음도 알 수 있을 것이다. 지금까지 작업은 성공적으로 잘 진행되어왔다. 이메일을 분류하는 레서피를 만들었기 때문에 이제부터는 아주 재미있는 파트가 시작된다. 내 이메일의 대부분은 내가 정기적으로 받아보는 메일링 리스트가 차지하고 있기 때문에 일단은 그것부터 살펴보자. 나는 freebsd questions, securityfocus.com에서 오는 몇몇 메일링 리스트 그리고 Internet drafts 리스트를 정기적으로 받아본다. 따라서 이것들을 주제별로 각각 분류할 수 있는 세 가지 레서피를 만드는 것부터 시작해 보겠다. 모든 레서피들은 똑같이 기본적인 문법을 사용하기 때문에 라인은 최소한 세 개가 필요하다. 이 레서피는 여러분이 의도하고자 하는 만큼 복잡하게 또는 아주 간단하게도 만들 수 있다. 정확한 문법을 따라서 문법에 따라 제대로 작동하기만 한다면 레서피를 만드는 올바른 방법이나 잘못된 방법이라는 것이 있을 수 없다. 그렇다면 세 라인의 문법부터 살펴보도록 하자.
:0              #first line
*               #second line
file            #third line
위에서 보듯이 #을 사용해 각 라인의 문법에 주석을 달 수 있다는 것을 알 수 있다(여러분이 왜 레서피를 만들어야 하는지 기억해 낼 수 있게 해주기 때문에 종종 이와 같은 주석 달기가 권장되기도 함). 첫 라인은 레서피의 시작을 지시하며 요리를 하려면 우선 요리사가 주방에 있어야 한다는 표현처럼 내가 무언가를 기억해내기 편리하게 해준다. 좀더 복잡한 작업을 할 경우 첫 라인에 더 많은 문자들의 조합이 있는 것을 볼 수 있을 것이다. 하지만 나중을 위해 좀더 복잡한 작업을 아껴두도록 하자.
인터넷 이메일 프로그래밍
두 번째 라인은 조건을 나타낸다. 간단한 레서피에서 두 번째 라인은 *로 시작할 것이며 거기에서부터 계속 진행할 것이다. 물론 이 라인도 여러분이 원하는 만큼 복잡하게 만들 수 있으며 레서피에서 원하는 만큼 많은 조건들을 생성해 낼 수도 있다. 세 번째 라인은 실행 라인으로 대개 procmail이 조건을 충족시키는 이메일 메시지를 놓아두는 폴더를 의미한다. 그렇다면 이제 내 메일링 리스트를 구조화하기 위해 이 모든 것을 세 개의 레서피로 번역해보자. 메일링 리스트를 분류하는 레서피들은 procmail의 내장 ^TO_ 표현을 사용할 수 있기 때문에 만들기가 가장 간단하다. 이 표현은 이메일 메시지의 헤더에 있는 To:와 Cc: 라인을 스캔할 것이다. 이것은 우리가 메일링 리스트인 "to"로 메시지를 보내든 메일링 리스트로 "cc"를 되돌려 보낼 원본에 답장을 하든 간에 메일링 리스트를 찾아내는 이상적인 방법이라고 할 수 있다. 실제적인 레서피를 만들기 전에 procmail이 레서피를 판독할 때 무엇을 하는지 알아두는 것이 좋다. 디폴트로 procmail은 내가 레서피 내에서 생성한 조건을 충족시키기 위해 앞으로 받게 될 이메일 메시지의 헤더를 스캔할 것이다. 그리고 디폴트로 procmail이 맞는 조건을 찾아내면 판독을 중단할 것이다. 이것은 명령이 두 가지 이유 때문에 중요하다는 것을 의미한다. 첫째, 레서피 섹션의 최상위에서 가장 잘 맞는 레서피를 놓아두면 procmail은 훨씬 빠르게 작동할 것이다. 예를 들어 내 이메일의 대부분은 freebsd questions에서 오는 것이기 때문에 이것을 다루는 레서피가 최상위 근처에 와야 한다. 둘째, 만약 내가 virii를 스캔하는 레서피를 원한다면 그것은 다른 레서피들보다 앞에 와야 한다. 그래야 메시지가 돌아올 때 모든 메시지를 스캔할 수 있다. 이러한 레서피를 만들기 전에 해야 할 마지막 한 가지는 다음과 같다. Procmail은 디폴트로 헤더를 스캔하고 여러분이 작성한 레서피의 대부분이 이러한 것을 반영할 것이므로 어떤 것이 이메일 헤더이고 어떤 형태의 정보를 우리가 다양한 헤더 영역에서 보게 될 것인지를 이해해 두어야 한다. 이 주제에 대한 설명이 부족하다고 생각되면 이곳을 방문해 보아라. 여러분의 궁금증을 해소해 줄 훌륭한 튜토리얼이 있다. 그렇다면 이제 이 세 개의 레서피에 대해서 살펴보기 시작하자. 내가 받는 메시지의 대부분은 freebsd questions에서 오는 것이기 때문에 이것이 첫 번째에 위치하고 그 이후가 security 리스트, 그리고 그 다음이 Internet drafts가 되어야 한다. 따라서 내 레서피는 다음과 같이 작성될 것이다.
:0                        # @freebsd.org로부터 오는 메시지는 모두
* ^TO_*questions@freebsd.org
questions                       # $MAILDIR/questions로 갈 것임.

:0                      # security 메일링 리스트로부터 오는 메시지는 모두
* ^TO_*security
security                         # $MAILDIR/security로 갈 것임
 
:0                         # Internet drafts로부터 오는 메시지는 모두
* ^TO_*ietf
drafts                             # $MAILDIR/drafts로 갈 것임.
나는 각각의 레서피에 대해 똑같은 논리를 적용했다. 약간 복잡하다고 보여지는 유일한 비트는 조건 라인에 있는 표현 문법으로 아래와 같이 보인다.
* ^TO_*
그리고 * ^TO_*은 procmail이 메시지 헤더의 To:나 Cc: 영역을 검색하게끔 만드는 표현 바로 뒤에 오게 될 것이다. 이와 같이 여러분의 요구를 충족시키는 레서피를 만들고자 한다면 이메일 메시지가 있는 이러한 영역부터 살펴보고 일상 표현이 무엇인지 부터 찾도록 해라. 예를 들어 만약 내가 "questions@freebsd.org" 대신에 "freebsd"라는 표현을 검색하도록 첫 레서피를 실행시켰다면 freebsd 메일링 리스트로에서 보내는 메시지는 모두 받아들일 것이다(예, newbies, advocacy, security 기타 등등). 나는 약간 까다로운 사람이라 freebsd.org에 있는 questions 리스트로부터 오는 메시지만을 받고 싶다고 명세했다. 내 두 번째 레서피는 좀더 일반적으로 만들어졌다. 이것은 실질적으로 내 일상적인 security 출력 사항은 물론 "securityfocus.com", "security@freebsd.org"로부터 오는 메시지들을 모두 받아들이게 작성된 것으로 이와 같이 실행되는 이유는 이상 언급했던 것들이 모두 "security"라는 표현을 공유하고 있기 때문이다. 따라서 security와 관련된 이메일은 모두 이러한 방법으로 내가 원하는 일반 폴더로 갈 것이다. 마지막으로 Internet drafts에 대해 살펴보자. 나는 이 메시지들이 항상 ietf.org에서 온다는 사실을 알고 있다. ietf라는 표현은 흔하게 사용되는 표현이 아니므로 나는 이것을 조건으로 사용했다. 이러한 레서피 각각의 실행 결과는 메시지가 전송될 폴더를 명세한다. procmail 유틸리티는 메시지가 전달되어 오면 자동적으로 questions, security, drafts에 해당하는 폴더들을 생성할 것이다. 이 세 가지 범주에 들지 않는 메시지들은 모두 mbox의 디폴트 폴더로 보내어진다. 어떤 메시지가 레서피와 맞지 않는지 그리고 그룹으로 한데 묶어서 관리할 레서피를 만들어야 하는지 알아볼 수 있기 때문에 이것은 레서피를 만들 때 아주 편리하게 사용된다. 이외에도 여러분이 포함시키기를 원하는 레서피가 몇 가지 더 있다. man procmailex은 메시지를 복사하는 것을 다루는 것으로 이것은 다른 레서피들보다 먼저 와야 한다. 다음과 같이 사용된다.
:0 Whc: msgid.lock
| formail -D 8192 msgid.cache   #메시지 복사 방지.

:0 a:
duplicates         #그러나 메시지를 삭제하지 말고 저장할 것.
이와 같은 레서피의 변형체는 복사된 모든 메시지들을 duplicates라고 불리는 폴더로 보낼 것이다. 그 맨페이지는 또한 대안적인 레서피를 제시하는데 이것은 복사된 모든 메시지를 대신해서 삭제한다. 뿐만 아니라 복잡한 레서피 내에 스크립팅 문제가 있을 경우 다른 이메일 메시지까지도 잃어버릴 수 있음을 경고한다. 여러분이 procmail을 완전히 마스터하는 경지에 이를 때까지는 아마도 위와 같은 레서피를 계속해서 사용하고 싶을 것이다. 마지막으로 언급할 비법은 바이러스-스캐닝 비법 예제이다. 내가 이 기사를 작성하고 있을 때 "Badtrans"라고 불리는 바이러스가 막 확산되기 시작했으며 급기야 약간은 성가신 존재가 되어가고 있었다. 나는 freebsd questions 메일링 리스트에서 아래와 같은 레서피를 빌려와서 duplicate 레서피 바로 아래에 옮겨 놓았다.
# Stupid BadTrans virus
:0:
* ^From: .+ ₩<_.*₩>$
garbage

:0:
* ^From: _.+ ₩(.+₩)$
garbage
이것은 더 복잡한 표현의 예를 보인 것뿐이다. 위 예제의 조건 라인에 있는 표현을 이해하지 못한다고 절망에 빠지기에는 아직 이르다. 중요한 것은 이 레서피가 효과가 있다는 것이다. 이와 같은 레서피를 처음부터 끝까지 모두 창조해낼 필요는 없다는 점을 명심해두어라. 여러분이 필요로 하는 레서피를 누군가가 이미 만들어 놓은 경우도 많기 때문이다. 이것은 새로운 virii가 출시되면 procmail 사용자들이 procmail 메일링 리스트에 이와 관련된 레서피를 올려놓는 것만 보아도 알 수 있다. 여러분은 이와 같은 레서피들을 여기서 검색할 수 있다. 만약 내가 "badtrans"를 검색해야만 한다면 나는 복잡한 레서피들을 새로 만들어내는 것보다는 이미 훌륭하게 작업을 마친 레서피들을 찾아볼 것이다. 지금까지 우리는 procmail 사용법에 대해 기초적인 부분만을 살펴보았다. 다음 기사에서는 레서피에서 사용할 수 있는 좀더 복잡한 표현에 대해 살펴볼 것이며 procmail의 로그인 통계에 대해서도 살펴볼 것이다. 드루 라빈(Dru Lavigne)는 캐나다 온타리오주 킹스턴에 있는 공과 전문대학교에서 네트워크를 가르치고 있으며 그녀의 테스트 머신에 몇 개의 운영체제를 멀티 부트로 실행시킬 수 있는지 알아보는 것으로 악명 높다.
TAG :
댓글 입력