apache: mod_autoindex hack!!

예전에 써놓은 글에서 구상해뒀던 것들을 전부 패치에 반영시켜버렸습니다… 예전 hack 은 정말 quick & dirty 가 무엇인지를 보여주는 진정한 HACK!! 이었는데… 요번 패치는 옵션에 크게 영향을 받지도 않고, 사용자가 설정할 건덕지가 많아졌다는 점에서 개인적으로 흐뭇합니다…

  1. CSSFile 옵션을 통해 css 파일 지정이 가능
  2. Encoding 옵션으로 meta 데이타로 charset 지정 가능
  3. html 소스를 아주 간단하게 변환
  4. XHTML 1.0 Strict!! (validation 도 통과-_-v)

뭐 이정도를 한 건데… 예전 핵은 정말 너무 지저분하길래 -_-;; 아예 첨부터 작업했습니다. 기본 mod_autoindex에서는 pre~/pre 로 열맞춤을 하고 있는데, 프레젠테이션을 CSS로 바꾸기가 쉽지 않을 것 같아서 table 기반으로 만들었습니다.
그리고 xhtml validation을 위해 모든 태그들을 소문자로 바꿔줬습니다.
패치 파일은 아래서 받을 수 있습니다…
For apache-1.x
http://mytears.org/resources/mysrc/c/patches/mod_autoindexhack-20050816.diff
For apache-2.x
http://mytears.org/resources/mysrc/c/patches/apache2-mod_autoindex-hack-20070922.diff
테스트 페이지는 여기…
http://mytears.org/resources/
ChangeLog:
2007년 9월 22일 – apache2 용 패치 생성

Sender Policy Framework

planet.findout.or.kr 이라던가 기타 여러 곳에서 spf 에 관련된 내용을 듣다가 spf filter 를 붙이면 얼마나 효과가 있을지 궁금해지길래 postfix 에 spf 패치를 해봤습니다. 정상적으로 spf 인증을 통과한 메일헤더에는 pass 했다는 표시가 붙고, 네임서버가 spf 를 지원하지 않는 곳이라면 none, 실패했을 경우엔 spf 정책에 따라 fail 이나 softfail 이라는 에러코드가 붙게 됩니다.
spf 는 Sender Policy Framework 의 약자로 메일에 붙은 return address 를 이용 메일이 인증받은 메일 서버를 통해 발송되었는지를 체크하는 방식입니다. dns(송신 측) 와 smtp server(수신 측) 모두 spf 를 지원하는 경우에 사용할 수 있습니다. (생각해보면 smtp server 대신 mta 에서 지원해도 안될 건 없을거라고 생각합니다.)

SPF makes it easy for a domain, whether it’s an ISP, a business, a school or a vanity domain, to say, “I only send mail from these machines. If any other machine claims that I’m sending mail from there, they’re lying.”

spf 의 원리를 아주 간단하게 표현해 놨길래 인용해봅니다… “난 이 메일서버를 통해서만 메일을 보내니까 만약 다른 메일 서버를 통해 이 메일주소로 메일이 온다면 그건 허위 메일이야!!” 뭐 이 정도로 이해하면 되겠습니다.
아래에 quote 된 결과와 같이, 2006년 9월 24일 현재 대부분의 이메일 서비스에서 spf 를 지원하고 있는 것을 확인할 수 있습니다. 다만 sk telecom 의 경우 이메일 고지서의 return address 가 emailadmin@emailrms.sktelecom.com 로 명시되어 있기 때문에 이메일 고지서는 spf 의 영향을 받지 않아 약간 아쉬움이 남네요. (사실 sk 에 아쉬운 부분은 그것 만이 아니죠. 괜히 ‘ass k’ 라고 부르는 게 아닙니다.)
yahoo 에서 spf 를 지원 안한다는 점 또한 무척이나 아쉬운 부분 중 하나입니다.
[spoiler ‘apblind”결과보기”결과 감추기’]

aqua@Macintosh aqua $ nslookup
> set q=txt
> unfix.net
unfix.net text = “v=spf1 a mx ptr ~all”
> dreamwiz.com
dreamwiz.com text = “v=spf1 ip4:211.39.128.0/24 ip4:211.39.129.0/24 ip4:222.122.42.0/25 ~all”
> korea.com
korea.com text = “v=spf1 mx ip4:211.49.224.0/24 ip4:211.109.1.0/24 ip4:211.49.227.32 ip4:211.49.227.33 ~all”
> hanmail.net
hanmail.net text = “v=spf1 ip4:211.43.197.0/24 ptr ~all”
> hotmail.com
hotmail.com text = “v=spf1 include:spf-a.hotmail.com include:spf-b.hotmail.com include:spf-c.hotmail.com include:spf-d.hotmail.com ~all”
> gmail.com
gmail.com text = “v=spf1 redirect=_spf.google.com”
> _spf.google.com
_spf.google.com text = “v=spf1 ip4:216.239.56.0/23 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ?all”
> nate.com
nate.com text = “v=spf1 ip4:203.226.253.0/24 ip4:203.226.255.0/24 ~all”
> naver.com
naver.com text = “v=spf1 ip4:220.95.234.208 ip4:61.74.70.0/23 ip4:222.122.16.0/24 ip4:220.73.156.0/24 ip4:211.218.150.0/24 ip4:211.218.151.0/24 ip4:211.218.152.0/24 ip4:218.145.30.0/24 ip4:220.95.237.0/24 ~all”
> msn.co.kr
*** Can’t find msn.co.kr: No answer
> msn.com
msn.com text = “v=spf1 include:spf-a.hotmail.com include:spf-b.hotmail.com include:spf-c.hotmail.com include:spf-d.hotmail.com ~all”
> yahoo.com
*** Can’t find yahoo.com: No answer
> yahoo.co.kr
*** Can’t find yahoo.co.kr: No answer
> hitel.net
hitel.net text = “v=spf1 ip4:211.41.82.0/24 a mx ptr ~all”
> sktelecom.com
sktelecom.com text = “v=spf1 ip4:203.236.1.100 -all”
> emailrms.sktelecom.com
*** Can’t find emailrms.sktelecom.com: No answer

[/spoiler]
이번엔 대학 메일 서비스의 경우를 살펴보겠습니다. 결과부터 말하자면 아주 실망스럽습니다. 제가 테스트 해본 대학들의 경우 전부 spf 를 지원하지 않네요.
[spoiler ‘apblind”결과 보기”결과 감추기’]

aqua@Macintosh aqua $ nslookup
> set q=txt
> hongik.ac.kr
*** Can’t find hongik.ac.kr: No answer
> wow.hongik.ac.kr
*** Can’t find wow.hongik.ac.kr: No answer
> korea.ac.kr
*** Can’t find korea.ac.kr: No answer
> snu.ac.kr
*** Can’t find snu.ac.kr: No answer
> yonsei.ac.kr
*** Can’t find yonsei.ac.kr: No answer
> hanyang.ac.kr
*** Can’t find hanyang.ac.kr: No answer

[/spoiler]
spf 를 지원하기 위해선 네임서버의 zone 파일에 “IN TXT “v=spf1 a mx ptr ~all” 정도의 룰을 삽입하면 되며, 룰은 아래의 링크를 이용하면 쉽게 만들 수 있습니다.
http://www.openspf.org/wizard.html?mydomain=&x=21&y=7
p.s) 국내 포털이 spf 를 지원하기 시작한 이후로 스팸의 70% 이상은 spf 로 걸러낼 수 있게 되었습니다.

언제나 내 성적은 그저 그렇다…

뭐 딱히 성적에 목숨걸지 않는 내 성격 탓이기도 했지만… 요번 학기는 이상하게 아쉬움이 많은 거 같다… 교양 과목은 언제나 내 발목을 잡고… 전공 과목은 재밌게 들었고, 제대로 이해했음에도 결과는 그다지…
50~60% 정도까지는 B를 준다는 것을 볼 때, 내가 겨우 그 정도 밖에 안되나 싶은 생각이 와르르 밀려온다.
언제나 중간고사까지는 상위 클래스에 있다가 기말고사에서 점수를 다 까먹는다. 요번엔 시험 5과목이 이틀에 걸쳐 있었으니 더 힘들었고 (전날 저녁에 한 과목을 시험보고 나서 담 날 아침부터 밤까지 세 과목을 하루에 보는 그런 일정이었으니)
오목 프로그램은 마지막 날까지 손에 잡히질 않아서 오목 프로그램 마무리를 하느라 전자기학은 공부도 별로 못해버렸고 결국 망했다…-_- 뭐 지금 이런 얘기해봐야 핑계 밖에 안되겠지만…
하튼 언제나 내 성적은 3점 초반대가 나오는 듯… 교양이야 그렇다 치지만 전공은 재미가 없었던 것도 아니고 수업을 못따라갔던 것도 아닌데다가… 지금도 배운 내용에 대해 자신있게 대답할 수 있는데… 성적은 안나오니 뭐가 문젠지도 모르겠다. 나보다 성적이 잘 나온 사람들이 나보다 그 과목에 대해 더 많이 이해했다고는 생각치 않는데…
성적이 어떻게 나왔느냐 보다 … ‘내가 얼마나 배웠느냐’ 와 ‘얼마나 많이 내 것으로 만들었느냐’ 가 중요하다는 생각은 아직 변함이 없지만… 뭐 하튼 아쉬운 건 사실인 듯

"광수 광수씨 광수놈" 중에서.. #2

내 냄비의 물이 빨리 끓는다고 좋아할 것 없다. 작은 냄비의 물이 빨리 끓는 법이다.
.
.
내가 바로 그 작은 냄비였다. 그래서 빨리 끓은 것 뿐이었다…
냄비가 끓기 시작하면 온갖 이름도 알지 못하는 세상 사람이 다 들끓는다. 그 이유야 당연히 물이 끓으면, 무엇이든 그 안에 넣고 무언가를 해 먹을 수 있기 때문이다. 당시 내게 보였던 세상 사람들의 관심은, 못난 나를 우쭐하게 만들었다. 결국 그 잘난 자만심에 물이 넘치기 시작했고, 그 넘치는 물로 인해 나 자신을 지피던 불이 꺼져 버리기에 이르렀다.
얼마 지나지 않아 내 안에서 그리 펄펄 끓던 물도 잠잠해지고, 언제 그랬냐는 듯 냄비에서는 더 이상 미온도 느껴지질 않게 되었다. 냉철한 삶의 지식. 온기 없는 냄비에는 세상 사람들이 관심을 가져 주지 않는다. 처음에는 세상 사람들의 관심 없음에 얼마나 많은 배신감을 맛보고, 좌절하고, 슬퍼하며 못 견뎌 했던가.
하지만 차츰 시간이 지나면서 나는 편안해졌다. 어떤 사람들은 내가 말하는 그 편안함을 ‘다시 끓을 수 없는 자의 변명’ 이라고 한다. 변명하지 않겠다. 지금이 편안하지만, 다시 끓을 수 있다면 예전보다 더 멋지게 끓고 싶다는 열망이 내게 있다. 하지만 달라진 것은 예전처럼 끓지 못해 안달하지 않는다는 것이다. 이제 난 모두가 음습하다고 말하는 찬장 속에서 인생을 다시 배운다. 다시 예전처럼 열기를 내뿜으며 끓을 수 없다 해도, 내 찬장 속의 인생도 찬란히 빛날 수 있음을 작지만 소중한 수많은 교훈을 통해 배웠으니까 말이다.
‘광수생각 네번째 이야기… 광수 광수씨 광수놈’ 중에서…

아침에 지하철을 타고 저 책을 읽으며 가다가… 왠지 나도 작은 냄비였을 뿐이었던게 아닐까 싶은 생각이 들었다… 박광수씨가… 이혼을 했든… 위선자이든… 그런 것까지는 알지도 못하고… 별로 관심을 가지고 싶지도 않지만… 박광수씨가 쓴 글들은… 많은 걸 생각하게 만든다…

"광수 광수씨 광수놈" 중에서.. #1

이 땅에서 진짜 술꾼이 되려거든
목숨을 걸고 술을 마셔야 한다.
이 땅에서 참된 연애를 하려거든
목숨을 걸고 연애를 해야 한다.
이 땅에서 좋은 선생이 되려거든
목숨을 걸고 교단에 서야 한다.
뭐든지 진짜가 되려거든,
목숨을 걸고 목숨을 걸고…
이광웅 님의 ‘목숨을 걸고’

과연 난 내가 가려는 길에 목숨을 걸고 가고 있는걸까? 잠시 생각을 하게 만드는 글…

이미지만으로 도배된 스팸

스팸들을 보다보면.. 내용은 하나도 없이 이미지 만으로 혹은 첨부파일 하나 딸랑 오는 메일들이 상당히 많다. 당연히 이미지 안에 내용을 전부 넣어버리기 때문에 필터링할만한 문자열이 아예 없다 -_-!! 그래서 생각인데 tag 를 깨끗이 비워버리고 trim 을 해보면 이런 메일들을 쉽게 거를 수 있지 않을까 싶다.

  1. title,style,script,object ~ /title,style,script,object 를 제거..
  2. 나머지 태그들을 깨끗이 제거!!
  3. trim

이 정도로만 해도 이미지로 도배된 스팸들은 다 거를 수 있지 않을까 싶은데… 뭐 역시나 귀차니즘이 문제 (어제 12시에 자러간 이후 지금까지 내 메일계정으로 온 스팸 중엔 스팸필터를 통과한 게 하나도 없다.. 친구껄로 온건 몇 개 있는거 같지만 -_-!!)
또한 본문을 seperator 기준으로 잘라서 토큰으로 만든 후… 영어로만 이루어진 토큰에 한해 spellcheck (aspell 같은걸 쓰면 되니까) 를 하고, spell 에 맞지 않는 것들의 수가 일정 % 이상이라면 스팸이라고 판단하는 방식도 유용하지 않을까 싶다.

스팸과의 전쟁 -_-!!

우선 게시판 스팸은 회원제로 바꿔버리면 반 이상은 해결할 수 있을거 같으니 제껴두고, procmail 룰 강화로 인해 필터링되지 않아야 할 메일이 필터링 되는 일이 있는지 체크할 겸 해서 로그를 남겨 지켜보는 중인데.. “광고” 라는 문구를 넣으면서도 필터링에서 피하기 위해 노력한 흔적들이 상당히 많이 보인다 -_-!!

  • 제목에 “(광고)” 란 단어를 넣긴 했지만.. base64 로 인코딩해서 보냄
  • 역시 제목에 “(광고)”란 단어를 넣긴 했지만.. quoted print 로 인코딩해서 보냄
  • &#unicode;&#unicode; 식의 방식을 사용.. “(광고)” 를 표현..

그 중 2번째와 세번째 같은 경우는 아예 인코딩된 글자 자체를 필터에 추가시키면 완벽하게 차단이 가능하지만, 문제는 첫번째 방식! base64 인코딩의 경우 7bit 단위로 잘라서.. 테이블을 이용 변환시켜버리기 때문에 “(광고)”라는 글자가 나오는 위치에 따라 결과가 많이 달라지기 때문에.. 필터링 못하는 경우도 생길 듯 하다.. base64 나 qprint 로 인코딩되서 오는 경우엔.. 오히려 어떤 charset 으로 표현된 글자인지를 알 수 있는 장점이 있으므로.. 저렇게 인코딩 해서 보내는게 나쁜건 아니지만.. 뭐 하튼 그렇다는 얘기…
최적의 솔루션이라면 디코딩을 한 후 유니코드로 변환해서 문자열 필터를 통과시키는 방법이겠지만.. 그럴려면 간단한 프로그램을 새로 짜야 하기 때문에, 귀찮은게지 -_-;; 또 제목이 전혀 인코딩되서 오지 않은 경우엔 어떤 언어인지 모르기 때문에 유니코드로 변환하는 도중에 예외 상황이 만들어지는 것도 문제고.. (사실 대강 끼워맞추기로 해결은 가능하지만)
[spoiler ‘simple”그동안의 성과 보기”숨기기’]

unfix skel # cat /var/log/procmail.log |grep ^[Adv|wc -l
429
unfix skel # cat /var/log/procmail.log |grep ^[Fake|wc -l
1561
unfix skel # cat /var/log/procmail.log |grep ^[Spam|wc -l
unfix skel # cat /var/log/procmail.log |grep ^[Viagra|wc -l
1
unfix skel # cat /var/log/procmail.log |grep ^[Virus|wc -l
2
unfix skel # cat /var/log/procmail.log |grep ^[Empty|wc -l
27
unfix skel # cat /var/log/procmail.log |grep ^[Bad|wc -l
127
unfix skel # cat /var/log/procmail.log |grep ^From|wc -l
493

[/spoiler]
지금까지의 작은 노력만으로도 결과는 만족스럽다는 사실 🙂

유용한 procmail 용 rule!!

procmail 관련 해서 검색을 하던 중 아래와 같은 글을 발견했다. 내 스팸 함에 들어있는 메일들과 정상적인 메일들을 대강 훑어보았더니 저 룰만 가지고도 꽤 많은 스팸을 차단 할 수 있겠다는 생각이 들었다.
http://www.itinside.net/tips/045.html
multipart/alternative 방식은 text/plain 과 text/html 이 두 가지를 모두 가지고 있는 방식인데, 스팸 메일러에서 multipart/alternative 라고 선언을 해놓고 text/plain 혹은 text/html 둘 중 한 가지 만을 가지는 요상한 메일들을 보내는 경우가 많다는 점을 이용하는 것! 정상적인 mta 를 사용해서 보낼 경우 저런 잘못된 형식의 메일은 존재하지 않을 것이기 때문에 그냥 스팸이라고 간주해도 문제가 없을 것 같다.
(둘 중 하나만 집어 넣을거면 처음부터 text/plain, text/html 로 해서 보내면 된다. 첨부파일이 있다면 multipart/alternative 가 아닌 multipart/mixed 를 사용해야 하고…)
바로 적용시켜놔봤는데 결과가 어떨지는 자고 일어나 보면 알 수 있지 않을지 😉
p.s) 원본 사이트가 없어져서 rule 을 quote 해놓습니다. 링크도 webarchive 쪽으로…

# This anti-fake method is to detect the format is incorrect.
:0 HB
* ^Content-Type: *multipart/alternative
* !^Content-Type: *text/plain
{
LOG = “[Fake] ”
:0
/dev/null
}
:0 EHB
* ^Content-Type: *multipart/alternative
* !^Content-Type: *text/html
{
LOG = “[Fake] ”
:0
/dev/null
}