Archive for the 'Unfix' Category

정태영

왠지 모르게 점점 마이너 한 것들만 사용하게 되네요. postfix 나 exim 을 사용해보니 여러가지 장점이 눈에 보이는데 막상 how to 문서같은게 그리 잘 나와있질 않다보니 사람들이 사용하기를 꺼리는 것 같아 처음으로 howto 문서를 하나 작성해려 합니다.

이 문서는 젠투에서 exim 을 사용하는 방법을 기준으로 설명하고 있습니다.

Table of Contents

  1. 기본 구성
  2. 필요한 소프트웨어 설치하기
  3. 가상호스트 설정하기
  4. 바이러스 필터 설정
  5. 스팸 필터 설정
  6. dovecot 설정하기
  7. smtp 인증 설정하기
  8. 다른 배포판을 사용할 때 유의점

기본 구성

Mail Transfer Agent 로는 exim, 스팸 필터로는 bogofilter, 바이러스 필터는 clamav, pop3/imap server 로는 dovecot 을 사용하기로 하겠습니다. dovecot 이나 exim 이나 기본 적으로 실행하는 프로세스들이 많지 않기 때문에 프로세스 리스트를 확인할 때 깔끔해서 좋더군요.

필요한 소프트웨어 설치하기

저 같은 경우는 대강 다음과 같은 USE 플래그를 이용해서 설치를 진행했습니다.

# emerge -pv exim bogofilter clamav dovecot procmail   These are the packages that would be merged, in order:   Calculating dependencies... done! [ebuild R ] mail-mta/exim-4.69 USE=”domainkeys dovecot-sasl exiscan exiscan-acl gnutls ipv6 pam perl sasl spf sqlite srs ssl syslog tcpd -X -dnsdb -ldap -lmtp -mailwrapper -mbox -mbx -mysql -nis -postgres -radius” 0 kB [ebuild R ] mail-filter/bogofilter-1.1.6 USE=”berkdb sqlite -gsl” 0 kB [ebuild R ] app-antivirus/clamav-0.92.1-r1 USE=”bzip2 crypt milter nls -mailwrapper (-selinux)” 14,927 kB [ebuild R ] net-mail/dovecot-1.0.13-r1 USE=”ipv6 pam pop3d ssl -debug -doc -kerberos -ldap -managesieve -mbox -mysql -postgres -sieve -suid -vpopmail” 0 kB [ebuild R ] mail-filter/procmail-3.22-r7 USE=”-mbox (-selinux)” 222 kB   Total: 5 packages (5 reinstalls), Size of downloads: 15,149 kB

domainkeys 는 야후나 구글에서 사용하고 있는 domain key 를 제대로 검증하기 위한 USE 플래그가 되겠구요, dovecot-sasl 은 smtp 인증에 dovecot 을 이용하기 위한 플래그입니다.

spf, srs, domainkey 같은 플래그는 해당 기능을 사용하지 않겠다면 빼주셔도 무방합니다. CentOS 등에서는 dovecot-sasl 도 기본으로 지원이 안되더라구요. 하튼 관련해서 자세한 건 뒤에서 설명하도록 하겠습니다.

살펴보니 별로 특이한 플래그를 사용하지는 않네요. -_;; 젠투 유져라면 다들 아시겠지만 실제 설치는 위의 예제에서 -pv 를 제거하고 실행시키시면 됩니다.

가상호스트 설정하기

설치가 무사히 끝났다면 가상호스트를 설정해봅시다. 젠투에서는 기본으로 설정파일을 만들어주지 않습니다. 그렇기 때문에 우선 /etc/exim/exim.conf.dist 를 복사해서 exim.conf 를 만들어줍니다.

# cp /etc/exim/exim.conf.dist /etc/exim/exim.conf

그런 다음 자신이 좋아하는 편집기를 이용해서 exim.conf 파일을 열고, 아래와 같은 부분을 찾아서 자신의 환경에 맞게 수정을 한 뒤

primary_hostname = unfix.net   domainlist local_domains = @ : localhost : dsearch;/etc/exim/virtual domainlist relay_to_domains = hostlist relay_from_hosts = 127.0.0.1

router 부분에서 system_alias 바로 아래에 다음 코드를 추가해줍니다.

virtual: driver = redirect allow_fail allow_defer domains = dsearch;/etc/exim/virtual data = ${expand:${lookup{$local_part}lsearch*@{/etc/exim/virtual/$domain}}} retry_use_local_part file_transport = address_file pipe_transport = address_pipe

주 도메인이 있는 경우 localhost 대신 unfix.net 같은 도메인을 사용해도 무방합니다. 만약 위의 예제에서 localhost 대신 unfix.net 을 설정해주면 로컬에 있는 모든 계정은 id@unfix.net 형태의 메일계정으로 사용이 가능해집니다. 주 도메인이 여러개라면 @ : localhost : mydomain1 : mydomain2 식으로 콜론(:) 을 이용해서 여러 개를 모두 적어주면 되겠습니다.

이젠 가상 호스트를 설정해봅시다. 만약 test.com 과 test.net 을 위한 가상호스트를 설정하려 한다면 다음과 같이 하면 됩니다.

# mkdir /etc/exim/virtual # vi /etc/exim/virtual/test.com # vi /etc/exim/virtual/test.net

위에서 dsearch; … 으로 설정해놓은 디렉토리 안에다가 호스트 이름을 이용해서 alias 파일을 만들어주면 되니까 간단하죠? 각 파일에 들어가는 내용은 다음과 같습니다.

# test.com
test: aqua@localhost
melong: test@gmail.com

# test.net
aqua: test@localhost

test.com 파일에 들어가 있는 test: aqua@localhosttest@test.com 으로 온 메일을 aqua@localhost 로 포워드를 시키라는 거에요. 워낙 간단하니 다른 것들은 따로 설명 안해도 될 것 같네요. 단 위에서 localhost 대신 myhost.net 을 사용했다면 aqua@myhost.net 처럼 설정해줘야 합니다.

여기까지 따라하셨다면 가상 호스트 설정은 끝! 가상 호스트 파일을 수정했을 때는 alias 를 수정했을 때와 달리 newalias 를 실행시키실 필요가 없습니다.

바이러스 필터 설정

바이러스 필터로는 clamav 를 사용할 건데, USE 플래그로 exiscan 과 exiscan-acl 을 사용해서 설치했다면 clamd 와 연동하는건 아주 간단합니다.

exim.conf 에서 다음과 같은 줄을 찾아서 주석을 해제시키세요.

av_scanner = clamd:/var/run/clamav/clamd.sock

끝! clamd.sock 위치는 배포판에 따라 다를 수 있습니다. 자세한건 /etc/clamd.conf 를 참조하세요.

스팸 필터 설정

스팸 필터로는 bogofilter 를 사용할건데 이건 예전에 써놨던 다른 글을 참고해주세요.

dovecot 설정하기

우선 /etc/dovecot.conf 파일을 열어서 서비스할 프로토콜 리스트를 적어주세요. 그 다음에 plaintext 로 로그인할 수 있도록 설정해주고, pop3 나 imaps 를 위해 ssl 을 사용할거라고 명시해주고, 마지막으로 dovecot-sasl 을 사용할 수 있도록 auth-client 를 활성화시켜주세요.

이를 종합해보면 다음과 같은 설정파일이 만들어집니다. 볼드로 표시한 부분이 제가 수정한 부분이에요. 주석을 제거하고 보니 정말 간단하네요. -_-;

protocols = imap imaps pop3 pop3s   listen = [::] disable_plaintext_auth = no   ssl_disable = no ssl_cert_file = /etc/ssl/private/unfix.net.crt ssl_key_file = /etc/ssl/private/unfix.net.key   mail_location = maildir:~/.maildir   protocol imap { }   protocol pop3 { pop3_uidl_format = %08Xu%08Xv }   protocol lda { postmaster_address = postmaster@example.com }   auth default { mechanisms = plain login passdb pam { args = “*” } userdb passwd { } user = root socket listen { client { path = /var/run/dovecot/auth-client mode = 0666 } } }

그리고 /etc/pam.d 로 가서 smtp 파일이 있는지를 체크해보시고 만약 없다면 system-login 이나 pop 등을 복사해서 smtp 파일을 만들어주세요. 이것 때문에 어제 혈압이 올랐던걸 생각하면 …!!!

여기까지 설정하셨음 90% 는 끝난겁니다.

smtp 인증 설정하기

자 다시 exim.conf 로 돌아와서 smtp 인증을 설정해봅시다. exim.conf 에서 authenticators 파트를 찾아서 아래와 같은 내용을 추가해줍시다.

plain: driver = dovecot public_name = PLAIN server_socket = /var/run/dovecot/auth-client server_set_id = $1 server_advertise_condition = 1   login: driver = dovecot public_name = LOGIN server_socket = /var/run/dovecot/auth-client server_set_id = $1 server_advertise_condition = 1

이걸로 설정은 끝! 다음엔 데몬들을 띄워서 제대로 되나 확인을 해보세요.

# /etc/init.d/dovecot start # /etc/init.d/exim start

다른 배포판을 사용할 때 유의점

제가 이것저것 확인해본 건 아니라 정확하게 알려드릴 순 없지만 CentOS 에서는 spf, srs, dovecot-sasl, domainkeys 등을 사용할 수가 없습니다. 그렇기 때문에 dovecot-auth 대신 saslauthd 를 사용해야 해요. saslauthd 를 사용할 때의 authenticator 파트는 다음과 같습니다.

PLAIN: driver = plaintext public_name = PLAIN server_condition = ${if saslauthd{{$1}{$2}{smtp}}{1}{0}} server_set_id = $1 server_advertise_condition = true   LOGIN: driver = plaintext public_name = LOGIN server_condition = ${if saslauthd{{$1}{$2}{smtp}}{1}{0}} server_set_id = $1 server_advertise_condition = true

server_condition 을 다음처럼 해서 pam 만으로도 인증을 할 수 있을지도 모르겠는데, 테스트하기가 귀찮네요. -_-; 혹시나 시도해보신분 있으면 결과를 좀 알려주세요.

server_condition = "${if pam{$2:$3}{1}{0}}"

참고로 인증을 saslauthd 를 통해서 하려는 경우 saslauthd 가 실행 중에 있어야 합니다.

정태영

어제 하드를 새로 갈았고, 전체적으로 설정을 새로 했습니다. 캬캬캭 크게 달라진 점은 다음과 같습니다.

  1. 아파치를 peruser 모드로 변경
  2. 메일 서버를 postfix 기반에서 exim 기반으로 변경
  3. 하드 디스크를 36+18GB 에서 72+36GB 로 변경
  4. tomcat 버젼을 6.x 로 업데이트

exim 에 smtp auth 를 설정하는데, /etc/pam.d/smtp 를 안만들어뒀다가 12시간 동안 고생을 했네요. -_-; 별 것도 아닌게 쀍!

하튼! 대강 업데이트 완료~! 두두두둥!

update: mpm peruser 때문에 fastcgi 들이 제대로 동작하지 않는다. ㅠ.ㅠ trac 이랑 관련해서는 apache apache 권한으로 돌리게 하는 것으로 해결이 됐지만 이거 뭔가 방법을 찾아봐야겠다.

정태영

xfs_repair 를 시도한 이후에도 파일시스템의 문제가 깨끗이 해결되지 않고 있다. 처음 설치할 때에 비해 추가로 설치한 것들이 많아졌고, 사용자들도 많아졌기 때문에 여유 공간이 1GB 가 안되는 상태로 몇 달째 버티고 있었는데, 이제는 정말 하드를 추가해야할 시기가 아닐까 싶다.

결국 오늘 히타치 73GB 10,000rpm 하드 디스크를 새로 주문했고, vmware 상에서 gentoo 를 새로 빌드하고 있다. (뭐 예전껄 그대로 복사해도 문제는 되지 않겠지만, 그냥 왠지 다시 빌드하고 싶어져서…) 이것저것 설정을 새로 하고, 이래저래 만질 걸 생각하면 벌써부터 골머리가 아프지만 신경쓸 부분이 조금 더 줄어들거라는 점에서 위안이…

한 6개월에서 1년 정도를 더 버틴 다음에 새 서버를 사고 싶었는데 결국 또 마이너 업데이트로 버티게 되는구나 ㅠ.ㅠ

정태영

Linux 2.6.17 - 2.6.24.1 사이 버젼을 사용하시는 경우라면 아주 시급한 패치가 되겠네요. vmsplice 의 버그를 이용한 exploit 으로 이 exploit 을 이용하면 로컬 유져가 root 로 권한 상승할 수 있습니다.

exploit 소스는 구글에서 linux vmsplice exploit 정도로 검색하면 쉽게 구할 수 있고, gentoo 의 경우 2.6.23-r7 에서 패치가 되었다고 합니다.

자자 다들 귀찮고 떨리더라도 –;; 커널 업데이트를!!

aqua@unfix ~/tmp $ ./a.out
———————————–
Linux vmsplice Local Root Exploit
By qaaz
———————————–
[+] mmap: 0×0 .. 0×1000
[+] page: 0×0
[+] page: 0×20
[+] mmap: 0×4000 .. 0×5000
[+] page: 0×4000
[+] page: 0×4020
[+] mmap: 0×1000 .. 0×2000
[+] page: 0×1000
[+] mmap: 0xb7da8000 .. 0xb7dda000
[-] vmsplice: Bad address

이제 언픽스는 안전해요. -_-!

정태영

현재 unfix 서버에는 apache + mod_fcgid 환경에서 fastcgi 를 지원하고 있다. 그런데 fastcgi 를 적용시킨 후 가끔 apache 가 먹통이 되는 현상이 생겨버렸다.

대부분의 apache 프로세스가 D state 를 가지게 되면서 더 이상 프로세스를 만들어내지 못하게 되서 요청을 처리하지 못하게 되는 것 같은데, D state 는 Uninterruptible sleep 을 의미하므로 fastcgi 프로세스에서 interrupt 를 disable 시킨채로 sleep 상태에 들어가서 이런 문제가 생기는 것으로 보인다.

그렇다고 하루종일 아파치가 정상적으로 동작하고 있나를 확인할 수는 없기에 스크립트를 하나 작성해봤다.

BASH:
  1. #!/bin/sh
  2.  
  3. cnt=0;
  4. for x in `ps -C apache2 -o stat|grep D`;do
  5.     let cnt++;
  6. done
  7.  
  8. if [ $cnt -ge 10 ];then
  9.     kill -HUP `cat /var/run/apache2.pid`
  10. fi

sort 와 uniq 를 이용해서 숫자를 셀 수도 있지만 정상적인 경우에 D stat 를 가지는 프로세스가 존재하지 않으므로 for 를 이용하기로 했다. 꺄아! 과연 효과는 -_-! 두둥!

정태영

spf 는 예전에 써놨던 글에서 충분히 설명해놨듯이 메일의 도메인값과 발송지 값을 이용해 스팸을 필터링해내기 위한 기술입니다. 예를 들어 From address 에 nospam@mytears.org 가 있을 경우 mytears.org 도메인의 txt 정보를 읽어오고, 거기에 적혀있는 61.109.245.78 에서 온 메일만을 정상적인 메일로 판단하게 되는데, 이렇게 spf 가 적용되어 있는 경우 .forward 나 alias 등을 이용해서 메일을 포워딩 시킬 경우 문제가 있을 수 있습니다.

.forwards 를 통해 nospam@mytears.orgnospam@gmail.com 으로 리다이렉션을 시킨 경우를 생각해봅시다.

  1. sender@somedomain 에서 nospam@mytears.org 로 메일을 보냄
  2. mytears 메일 서버에서 nospam@mytears.org 사용자에 대한 .forward 파일을 읽어서 거기 적혀있는 nospam@gmail.com 으로 메일을 포워딩 시킴
  3. gmail 메일 서버에서 from address 인 somedomain 의 txt 에서 spf 정보를 읽어옴
  4. spf 로 지정된 아이피와 메일을 포워딩시킨 서버의 아이피가 동일하지 않으므로 spf 정보가 맞지 않다고 판단함
  5. spf 정책에 따라 다르겠지만 대부분 스팸이라고 판단하게 됨
  6. 결국 제대로 메일이 전해지지 않음

이걸 해결하기 위한 방법으로 srs 라는 게 있습니다. 이걸 적극적으로 적용한 예로는 구글이 있습니다.

exim 의 경우 기본적으로 spf, srs 를 지원하기 때문에 빌드할 때 옵션을 잘 조절해주면 쉽게 적용할 수 있습니다. sendmail 의 경우 milter 를 이용하면 srs 를 적용할 수 있구요. 하지만 postfix 에서는 이를 사용할 수 없는 방법이 없습니다. (구버젼의 postfix 라면 패치를 통해 사용할 수 있지만 이 패치가 계속 유지되질 않고 있습니다.)

참고
spf: http://www.openspf.org/
srs: http://www.openspf.org/SRS

p.s) 그나저나 spf 가 나온지 꽤 오랜 시간이 흘렀음에도 대학 메일 서버들 중에 spf 를 지원하는 곳은 별로 없군요.

정태영

아시는 분은 다 알고 계실 듯 하지만 추석 연휴 동안 unfix 서버의 아파치를 1.3 tree 에서 2.3 tree 로 버젼 업 했습니다.

몇 달 전쯤부터 gentoo 의 패키지관리 시스템인 portage 에서 apache 1.3 tree 를 위한 지원이 하나 둘 빠지기 시작했고, 급기야 1.3 버젼대가 아예 제거되버리는 일이 있었습니다. 1.3 tree 는 이미 안정화가 될만큼 된 상태고 거의 버젼업이 이루어지지 않기에 큰 문제가 되지 않았으나 모든 아파치 모듈들에 대해서 1.3 버젼에 대한 지원이 없어졌기 때문에 해당되는 모듈들을 업데이트를 하려면 대규모 수작업을 통해야만 하는 문제가 생기더군요. -_-;

근데 제가 apache 를 그냥 곱게 사용하는 것도 아니고, 몇 가지 패치를 넣어서 사용하고 있었기 때문에 2.3 tree 로의 업데이트는 마음의 준비가 필요했습니다. 더 끌어봐야 좋을 것도 없고, 며칠 전 포스트에서 밝힌대로 apache2 의 mod_autoindex 를 새로 해킹한 뒤! 가볍게 버젼 업!!

사실 작업은 30분이면 충분히 이루어질 줄 알았습니다. 근데 왠걸!!! apache-1.3 버젼대에선 <virtualhost myip> 식으로 적어놓아도 별 문제가 생기질 않았는데 apache-2.3 버젼대에선 :80 이라고 포트를 정확히 명시해주지 않는 이상 ssl 설정과 부딪히더군요. -_-; 하지만 이쯤이야 후훗! 가볍게 설정을 고친 후 아파치를 재시동하니 허억;;;

dev-lang/php 를 apache2 플래그를 빼먹은 채로 빌드하는 바람에 모듈이 생성되지 않았습니다. -_-;; 그 날따라 php 를 빌드하는게 어찌나 길게 느껴지던지... 삐질;;

여기까지 해서 아파치 + 여러가지 아파치 모듈과 관련해선 문제를 해결할 수 있었습니다만, 문제는 여기서 끝이 아니더군요. 갑자기 java 관련된 것들이 무슨 incompatible version 어쩌구저쩌구 에러를 일으키며 tomcat 이 시동되는 것을 막기 시작했습니다. (이때부터 좀 마가 꼈어요.)

하나 둘 다시 빌드를 해봤지만, 문제가 해결되는 것 같다가도 다시 미궁에 빠져버리더라구요;; 결국! dev-java 카테고리에 있는 모든 패키지들을 제거했다가 다시 설치하는 것을 통해 이 문제도 해결 -_-v

뭐 그 후로도 phpmyadmin 업데이트 후에 설정파일을 예전것 그대로 썼다가 여러가지 404 페이지를 겪기도 하고 ... 하튼 제가 안쓰는 것들에 대해서도 좀 꼼꼼히 체크할 필요를 느꼈습니다. (이런거 확인하시면 혼자 알고 계시지 말고 메일로 좀 보내주세요. ㅠ_ㅠ)

하여튼 생고생 끝에! 이제는 apache, php, mysql, tomcat, ruby 등등이 다시 최신으로 업데이트됐습니다!! 키킥 언픽스 화이팅~!