달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

http://suite.tistory.com 2012.03

1. clamav 연동  


simscan 설치할때 인터넷  http://www.qmailwiki.org/Simscan/README 보고 설치시

configure 를 나는

$ ./configure --enable-user=simscan --enable-received=y --enable-attach=y --enable-clamav=y --enable-custom-smtp-reject=y 이렇게 주고 컴파일해서 설치 하고 나서 

clamav 잘되는지 해보니 에러 발생!~~  에러내용은


"simscan: clamdscan: /var/qmail/simscan/1332399138.49738.5987: lstat() failed: Permission denied. ERROR"


이런 디렉토리 접근 퍼미션 문제였는데 clamav 설치방법도 여러가지이고 암튼 구글링해보면

chown 등으로  simscan 폴더를 줘야한다 글이 많은데

내경우는 clamav 설정 파일 기존에 qmail-scanner와 연동 되었던 clamav의 설정파일 

/usr/local/etc/clamd.conf  파일에서 User , LocalSocketGroup 값을

simscan 설치 계정의 소유자와 그룹권한으로 변경후 lstat 오류 사라짐 (/etc/password)

ex) LocalSocketGroup qmail  .... User simscan 


2. 첨부파일만 추출해서 별도의 바이러스 체크시 simscan 에서 체크시 추가/수정해본거


2-1 . 첨부파일이 zip 압축경우 한번 풀기 (clamav 의 clamdscan 은 자동으로 해줌 ~.~)

    int run_unzip()
{
    DIR *mydir_unzip;
    struct dirent *mydirent;
    char fileNameBuf[256]={'\0',};
    int i=0;

    mydir_unzip = opendir( ATTACH_DIR );
    if ( mydir_unzip==NULL) {
        return -1;
    }
    for(i=0; (mydirent=readdir(mydir_unzip))!=NULL; i++) {
        strcpy(fileNameBuf,mydirent->d_name);
        lowerit(fileNameBuf);
        if ( str_rstr(fileNameBuf,".zip") == 0 ) {
            if ( DebugFlag > 3 ) {
                 fprintf(stderr, "Exist zip file [%s]\n",mydirent->d_name);
            }
            unzipFile(mydirent->d_name, ".");
        }
    }
    closedir(mydir_unzip);

    return 0;

}

unzipFile() 함수는 http://www.zlib.net/ 여기서받은 소스 코드에서 압축을 푸는 바이러리

/zlib-1.2.5/contrib/minizip/miniunz.c 함수에서 main() 을 unzipfile() 변경해서 호출 사용


2-2 int check_attach() 기존 함수 수정 


첨부파일은 int run_ripmime() 에서 이미 ripmime 으로  /var/qmail/simscan 디렉토리에 만들어줌

int detect_attach(char *directory)
{
    struct stat stbuf;
    DIR *mydir;
    struct dirent *mydirent;
    char paramDir[256]={'\0'};
    char bufMD5[33]={'\0',};
    char tmpFileName[256]={'\0',};
    int len=0;
    const int TEMP_FILE_LEN = strlen(OUTLOOK_TEMP_NAME) + 1; // ex) textfile0 , textfile1 ...
    char scan_sql[256]={'\0'};

    mydir = opendir(directory);
    if ( mydir==NULL){
        return -1;
    }

    while((mydirent=readdir(mydir))!=NULL) {
        /* skip . and .. */
        if (  mydirent->d_name[0] == '.' &&
            (mydirent->d_name[1] == '.' || mydirent->d_name[1] == 0) ) {
            continue;
        }
        // get subdirectory
        lstat(mydirent->d_name, &stbuf);
        if( S_ISDIR(stbuf.st_mode)) {
            sprintf(paramDir, "%s/%s", directory, mydirent->d_name);
            detect_attach(paramDir); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로 
            continue;
        }

        // skip.. simscan temp file
        if( strstr(mydirent->d_name,PREFIX_MSG) || strstr(mydirent->d_name,PREFIX_ADDR)){
            if ( DebugFlag > 5 ) {
                fprintf(stderr, "simscan: skip [%s] or [%s] file [%s]\n",PREFIX_MSG, PREFIX_ADDR, mydirent->d_name);
            }
            continue;

        }
        if ( DebugFlag > 5 ) fprintf(stderr, "simscan: checking attachment [%s/%s] \n", directory, mydirent->d_name);

 
         getMD5(mydirent->d_name, bufMD5); // 첨부파일에서 MD5 추출 

         sprintf(scan_sql,"SELECT hash FROM VIRUS_TABLE  WHERE hash='%s'",bufMD5);

          ... .... ... ... 
                if( isMalwareByDB(scan_sql) > 0 ){
                    if ( DebugFlag > 1 ){
                       fprintf(stderr, "[Malware] MailFrom:<%s>, RcptTo:<%s>, FileName %s , MD5:%s\n", MailFrom, RcptTo[0], mydirent->d_name, bufMD5);
                    }
                    strncpy(AttachName, mydirent->d_name, sizeof(AttachName)-1);
                    closedir(mydir);
                    return -1;
                }
    }
    closedir(mydir);
    return 0;
}

~~~~~~~~~~~~~~~ simscan.c ~~~~~~~~~~~~~~~~~~~~~~~~

 // extract zip (one time);
  run_unzip();
  detect_attach( ATTACH_DIR ); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

뭐 이런식으로 하면 메일내에 첨부파일을 clamav 외 다른 안티바이러스 등과 연동하기 쉽다 MD5 추출 또는 SHA1 으로 추출등 인터넷에서 구글링해서 붙이면됨!~
 

 

:
Posted by mastar

http://suite.tistory.com 2012.03

먼저 용어 정리

qmail 처음 사용해보니 여러 인터넷 글에 보면 설치 번거롭고  별별 연동 모듈이 나온다

clamav , qmail-scanner ,  ripmime, rblsmtpd  , simscan  , vpopmail ,  maildrop , knetqmail,ripmime, qmailadmin , spamassassin  ....

1. clamav ? 오픈소스 안티바이러스 제품  http://www.clamav.com    윈도우/리눅스 모두 있음
               *  2012.03 기준 110만건 (clamscan 실행하면 나옴)

2. qmail-scanner?  qmail 도식화에서 qmail-smptd -> qmail-queue  중간에서 삽입하여 clamav 를 연동 시켜주는
                     perl로 작성된 스크립트 모듈 (clamav만 연동하는건아니고 스팸어세씬등 여러가지 스팸모듈과 연동 가능)
3. rblsmtpd? RBL 을 처리해주는 데몬 rbl(real-time blocking list) 발신지 IP가 스팸 IP로 등록된경우 TCPSERVER 단에서 deny 시켜버림 (spamhaus.org,spamlist.or.kr ... 오픈해주는 곳이 있음)

4. simscan? qmail-scanner 가 perl 버전이라면 이건 C 버전임  소스도 오히려 perl 보다 간단?해 보임 그래서 이걸 사용함

5. vpopmail ? MDA에서 사용하는 모듈로 sendmail 경우 메일 생성할려면 실제 리눅스 계정을 생성?했던것 같은데 
                    vpopmail을 qmail과 연동하면  리눅스 게정 만들 필요없이 가상계정 또는 도메인을 걍 만들어 사용 가능 기타 검색해보면 여러가지 장점이 나옴

6. maildrop? 사용하지 않아서 잘모르지만 MDA단에서 스팸 처리 용도가능한것으로 보임  "실제 사용안해봄"
7. spamassassin? qmail-scanner , simscan 과 연동해서 스팸처리하는데 이건 메일 내용(스트링)을 가지고 스팸처리 하는 모듈 (ex) 메일 제목에 "광고" 등 실제 "사용안해봄"

8.qmailadmin? 웹환경에서 계정을 생성하고 관리등 해주는 모듈 인데  "실제 사용안해봄"

9.knetqmail? netqmail? kldp.net 그룹에서 QMAIL과 각종 모듈 설치가 번거로우니 잘 팩키지해준 이름 현재 1.0.6 까지인데 
    rpm버전이( http://mail.linuxstudy.pe.kr/download/) 가있어 rpm 버전으로 설치 했는데 잘됨 (qmail+vpopmail) 

* http://mail.linuxstudy.pe.kr/http://qmail.kldp.net 고맙습니다.

10.ripmime? 메일 mime을 이 바이러리를 수행하면 첨부파일이 뚝 떨어짐 http://www.pldaniels.com/ripmime/

*  첨부파일을 스팸 처리시 QMAIL에서 qmail-queue 오기전에 simscan 모듈 있음   http://www.inter7.com/?page=simscan 
    qmail 패치된버전임 : http://www.qmail.org/qmailqueue-patch  knetqmail 이라면 이미 되어있음 





* 원본 qmail architecture
 http://www.nrg4u.com/qmail/the-big-qmail-picture-103-a4.pdf

 

:
Posted by mastar