Anti-Spam 관련 대응책은 여러 가지가 있는데, SPF, DomainKey.. 또 뭐가 있더라... , 아무튼 여러 대응책이 있다.
대응 방법의 난이도는 각각 다르지만 대체로 네임서버의 TXT레코드에 정보를 실어 lookup 할 때 정보를 취해서 처리하는 방식이다.

이 중, DomainKeys는 야후에서 개발하여 공개하였고, 최근 구글이 적용한 방식이다.

설치 환경은 Fedora Core3, i686 환경이다.
openssl, sendmail-devel 패키지가 설치되어 있어야 한다.

다음 사이트에서 소스를 다운로드 받는다 : http://sourceforge.net/projects/dk-milter/
필자가 세팅할 당시의 최신 버전은 0.3.3 이었다.

설치 과정 전반에 대한 자세한 설명은 다음 사이트를 참조한다. http://www.erikberg.com/notes/milters.html
이하, 녹색 텍스트 박스는 명령행 입력이고, 주황색 텍스트 박스는 파일 수정이다.
명령 프롬프트의 $ 과 # 이 다름을 유의해야 한다.
(이 문서를 볼 정도의 유저라면 알아서 잘 하리라 생각되지만.)

$ tar zxvf dk-milter-0.3.3.tar.gz
$ cd dk-milter-0.3.3
$ vi dk-filter/Makefile.m4

이 내용의 출처는 다음과 같다. http://www.erikberg.com/notes/dkMakefilem4.html
굵은 글씨만으로 처리된 부분이 수정할 부분이다.
내용 뒤에 공백이 있는 경우 공백을 삭제하지 않도록 유의한다.

dk-filter/Makefile.m4
include(confBUILDTOOLSDIR`/M4/switch.m4')

define(`confMT', `TRUE')
define(`confREQUIRE_LIBSM', `true')

APPENDDEF(`confLIBS', `-lssl -lcrypto')
dnl Enable and edit these paths as needed:
APPENDDEF(`confINCDIRS', `-I/usr/include/openssl ')
APPENDDEF(`confLIBDIRS', `-L/usr/lib ')


dnl To use the asynchronous resolver library provided, enable this line:
bldPUSH_SMLIB(`ar')

bldPUSH_SMLIB(`dk')
APPENDDEF(`confINCDIRS', `-I../libdk/ ')

bldPUSH_SMLIB(`sm')

dnl Enable these next line if needed to specify the locations of libmilter.a
dnl and the libmilter include files:
APPENDDEF(`confINCDIRS', `-I/usr/include/libmilter')
APPENDDEF(`confLIBDIRS', `-L/usr/lib')


dnl Enable for IPv6 support:
dnl APPENDDEF(`confENVDEF', `-DNETINET6 ')

dnl Compile time options, especially FFRs:
APPENDDEF(`confENVDEF', `-D_FFR_AUTH_RESULTS ')
dnl APPENDDEF(`confENVDEF', `-D_FFR_EXTERNAL_IGNORE_LIST ')
dnl APPENDDEF(`confENVDEF', `-D_FFR_FLUSH_HEADERS ')
dnl APPENDDEF(`confENVDEF', `-D_FFR_MACRO_LIST ')
dnl APPENDDEF(`confENVDEF', `-D_FFR_MULTIPLE_KEYS ')
dnl APPENDDEF(`confENVDEF', `-D_FFR_POPAUTH ')
dnl APPENDDEF(`confENVDEF', `-D_FFR_REQUIRED_HEADERS ')
dnl APPENDDEF(`confENVDEF', `-D_FFR_SELECT_CANONICALIZATION ')

bldPRODUCT_START(`executable', `dk-filter')
define(`bldSOURCES', `dk-filter.c util.c ')
PREPENDDEF(`confLIBS', `-lmilter ')
bldPRODUCT_END

bldPRODUCT_START(`manpage', `dk-filter')
define(`bldSOURCES', `dk-filter.8')
bldPRODUCT_END

bldFINISH
$ vi libdk/Makefile.m4

다음 내용을 수정한다.
이 내용의 출처는 다음과 같다. http://www.erikberg.com/notes/libdkMakefilem4.html

libdk/Makefile.m4
include(confBUILDTOOLSDIR`/M4/switch.m4')

define(`confREQUIRE_LIBSM', `true')

dnl Enable these lines to make use of the provided asynchronous resolver:

bldPUSH_SMLIB(`ar')
APPENDDEF(`confENVDEF', `-DUSE_ARLIB ')
APPENDDEF(`confINCDIRS', `-I../libar/ ')

dnl Enable and edit this as appropriate for your system: APPENDDEF(`confINCDIRS', `-I/usr/include/openssl ')

define(`confMT', `true')
bldPRODUCT_START(`library', `libdk')
define(`bldSOURCES', `dk.c rfc2822.c util.c ')
bldPRODUCT_END bldFINISH
$ vi devtools/Site/site.config.m4

다음 내용을 작성한다.
이 내용의 출처는 다음과 같다. http://www.erikberg.com/notes/siteconfigm4.html

devtools/Site/site.config.m4
dnl # use poll() instead of select() in libmilter
APPENDDEF(`confENVDEF', `-DSM_CONF_POLL=1')dnl

dnl # devtools/OS/Linux has our MANROOT wrong and owner/group wrong
define(`confMANROOT', `/usr/share/man/man')
define(`confMANOWN', `root')
define(`confMANGRP', `root')

모두 수정하였으면 컴파일한다..

$ sh Build
$ sh -c "make install"

도메인 키 레코드 정보를 생성한다.

$ cd dk-filter
$ ./gentxt.csh fookey foo.com > fookey._domainkey.foo.com
$ cat fookey._domainkey.foo.com

정상적으로 되었으면 key 쌍을 생성한다.

$ openssl genrsa -out fookey.private 1024
$ openssl rsa -in fookey.private -out fookey.pub -pubout
$ sed -e '1i\"g=; k=rsa; t=y; p=' -e '/^----/d' fookey.pub | tr -d '\n' | sed -e 's/$/"\n/' > fookey._domainkey.foo.com
$ cat fookey._domainkey.foo.com

생성한 키를 설치한다.

$ su
# mkdir -p /etc/mail/domainkeys
# chmod 0700 /etc/mail/domainkeys
# mv fookey.private /etc/mail/domainkeys/fookey.pem

BIND를 수정한다.

fookey._domainkey.foo.com 파일의 내용을 클립보드에 복사해둔다.

# cat fookey._domainkey.foo.com
# vi /var/named/foo.com.zone

끝에 한 줄을 더 추가한다.
TXT 이후의 " " 안에 복사해둔 키를 입력한다.

/var/named/foo.com.zone
www               IN    A       192.168.0.1
fookey._domainkey IN    TXT     "g=; k=rsa; t=y; p=MIGf...."
# /etc/init.d/named restart

DNS 레코드에 정상 반영되었는지 확인한다.

$ dig +short dktest._domainkey.erikberg.com txt

원래는 위와 같이 하면 입력한 TXT 필드가 출력되어야 하나, 필자의 경우 nslookup 이나 dig의 문제인지, 혹은 BIND의 문제인지 첫 문자가 _ 로 시작하는 문제로 인해 에러가 났다. 확인해주는 사이트를 이용해 확인해볼 수 있다.

다음 사이트에 접속한다. : http://domainkeys.sourceforge.net/selectorcheck.html
입력 창에 fookey._domainkey.foo.com 을 입력하고 Submit 버튼을 누른다.
다음과 같이 필드별 테이블과 함께 This selector appears valid. 라고 나타나면 정상이다.

Tag Value Explanation
k rsa The public key algorithm used to verify the signature
p MIGfMA0GCSqGSIb3DQE... Modulus Size=1024
Exponent=65537
t y This Selector is in test mode

sendmail을 수정한다. sendmail.mc 파일의 끝부분에 다음 내용을 추가해준다.

# vi /etc/mail/sendmail.mc
/etc/mail/sendmail.mc
dnl
dnl # Setup the sendmail filters; milter
dnl
dnl INPUT_MAIL_FILTER(`filter1', `S=local:/var/run/f1.sock, F=R')
INPUT_MAIL_FILTER(`dk-filter', `S=inet:8891@localhost')

sendmail.cf 를 다시 빌드한다.

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

iptables 를 수정하여 TCP 8891 포트를 연다.

# vi /etc/sysconfig/iptables
# /etc/sysconfig/iptables
....
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8891 -j ACCEPT
....
# /etc/init.d/iptables restart

rc.local 을 수정하여 시스템 부팅시 자동으로 domainkeys 가 시작되도록 설정한다.
원칙적으로 /etc/rc.d/init.d 에 스크립트를 만들고, rc?.d 에 등록하는 게 맞겠지만, 쉽게 가기로 했다. --;;

# vi /etc/rc.d/rc.local
/etc/rc.d/rc.local
# usr/bin/dk-filter -h -l -p inet:8891@localhost -C bad=r,dns=t,int=t,no=a,miss=r -d foo.com -u domainkeys -s /etc/mail/domaink
eys/fookey.pem -S fookey

domainkeys 사용자를 생성하고 생성한 키에 대한 권한을 부여한 후 domainkeys 를 실행한다.

# useradd -r -c "DomainKeys System Account" domainkeys
# chown domainkeys /etc/mail/domainkeys -R
# usr/bin/dk-filter -h -l -p inet:8891@localhost -C bad=r,dns=t,int=t,no=a,miss=r -d foo.com -u domainkeys -s /etc/mail/domaink
eys/fookey.pem -S fookey
# ps aux | grep domainkeys
2010/12/10 01:47 2010/12/10 01:47

Trackback Address :: https://youngsam.net/trackback/1415