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 |
다음 내용을 수정한다. 이 내용의 출처는 다음과 같다. 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 에 등록하는 게 맞겠지만, 쉽게 가기로 했다. --;;
/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 | |