2026년 1월 30일 금요일

[Linux] Postfix에 PostScreen 설정

 

1단계: master.cf 수정 (서비스 활성화)

/etc/postfix/master.cf 파일을 열어 기존의 smtp 서비스를 비활성화하고, postscreen을 활성화해야 합니다.

  1. 기존 smtp 주석 처리:
    기존에 25번 포트를 열고 있던 줄을 찾아 앞에 #을 붙여 비활성화합니다.

    #smtp      inet  n       -       y       -       -       smtpd
  2. Postscreen 및 관련 서비스 활성화:
    아래 내용의 주석(#)을 해제하거나 새로 추가합니다.

    • smtp: 이제 Postscreen이 25번 포트를 담당합니다.
    • smtpd: Postscreen을 통과한 접속을 처리할 내부 서비스입니다.
    • dnsblog: DNS 블랙리스트 조회를 비동기로 처리합니다.
    • tlsproxy: Postscreen 단계에서 STARTTLS 지원을 위해 필요합니다.
    # Postscreen이 25번 포트 수신
    smtp      inet  n       -       y       -       1       postscreen
    
    # Postscreen 검사를 통과한 연결을 넘겨받을 smtpd
    smtpd     pass  -       -       y       -       -       smtpd
    
    # DNS 조회 및 TLS 처리를 위한 보조 서비스
    dnsblog   unix  -       -       y       -       0       dnsblog
    tlsproxy  unix  -       -       y       -       0       tlsproxy

2단계: main.cf 수정 (정책 설정)

/etc/postfix/main.cf 파일을 열어 Postscreen이 어떤 테스트를 수행하고 어떻게 차단할지 설정합니다.

아래 설정을 파일 하단에 추가합니다.

1. 기본 설정 및 화이트리스트

# === Postscreen 설정 ===

# 내 네트워크(mynetworks)는 검사에서 제외 (즉시 통과)
postscreen_access_list = permit_mynetworks

# 캐시 유지 시간 (검증된 IP를 기억하는 시간)
postscreen_cache_map = proxymap:btree:$data_directory/postscreen_cache
postscreen_cache_cleanup_interval = 12h

2. 좀비 PC 탐지 (Pre-greet, Protocol)

스팸 봇들이 자주 하는 "인사 먼저 하기(Pre-greet)"나 "명령어 쏟아붓기(Pipelining)"를 차단합니다. enforce는 차단을 의미합니다.

# 서버 인삿말(Banner)을 보내기도 전에 떠드는 놈 차단
postscreen_greet_action = enforce

# SMTP 프로토콜 위반 검사 (Pipelining, Non-SMTP command 등)
postscreen_pipelining_enable = yes
postscreen_pipelining_action = enforce

postscreen_non_smtp_command_enable = yes
postscreen_non_smtp_command_action = drop

postscreen_bare_newline_enable = yes
postscreen_bare_newline_action = enforce

3. DNSBL (DNS 블랙리스트) 설정 (가장 중요)

접속한 IP가 스팸 리스트에 있는지 확인합니다. 점수제를 사용하여 오탐을 줄입니다.

# DNSBL 사이트 설정 (예시: Zen Spamhaus, Barracuda)
# 이름=IP주소*가중치 형식입니다.
# 주의: Spamhaus 등은 상업적 이용 시 유료일 수 있으므로 라이선스 확인 필요
postscreen_dnsbl_threshold = 2
postscreen_dnsbl_sites = 
    zen.spamhaus.org*2
    b.barracudacentral.org*1
    bl.spamcop.net*1

# 블랙리스트에 걸렸을 때 동작 (enforce: 거부 응답 보냄 / drop: 연결 끊음)
postscreen_dnsbl_action = enforce

3단계: 적용 및 확인

  1. 설정 검사:
    오타가 없는지 확인합니다.

    postfix check
  2. Postfix 재시작:

    service postfix reload
    # 또는
    systemctl reload postfix
  3. 로그 확인:
    /var/log/mail.log (또는 /var/log/maillog)를 실시간으로 확인하여 작동 여부를 봅니다.

    tail -f /var/log/mail.log
    • PASS: 검사를 통과하여 smtpd로 넘겨진 경우 (PASS OLD는 캐시된 IP, PASS NEW는 새로 검증된 IP).
    • NOQUEUE: Postscreen에 의해 차단된 경우 (예: protocol violation, DNSBL rank ...).

팁 (주의사항)

  • 초기 적용 시: 처음에는 action 값들을 enforce 대신 **ignore**로 설정하여 며칠간 로그만 모니터링하는 것이 좋습니다. 정상적인 메일 서버가 차단되는지 확인한 후 enforce로 바꾸는 것이 안전합니다.
  • DNSBL 사용: zen.spamhaus.org는 매우 강력하지만, 무료 사용량 제한이 있거나 특정 DNS 서버(Google 8.8.8.8 등)를 통해 조회하면 차단될 수 있습니다. 본인의 환경에 맞는 DNSBL을 사용하세요.

2026년 1월 14일 수요일

[ABAP]_인터널 테이블을 가변 필드로 사용하기

  FIELD-SYMBOLS<FS_TABLE> TYPE STANDARD TABLE,
                 <FS_WA>    TYPE ANY,
                 <FS_FIELD> TYPE ANY.

  DATA LO_STRUCTDESCR  TYPE REF TO CL_ABAP_STRUCTDESCR,
         LO_TABLEDESCR   TYPE REF TO CL_ABAP_TABLEDESCR,
         LT_COMP         TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE,
         LS_COMP         TYPE CL_ABAP_STRUCTDESCR=>COMPONENT,
         LT_DATA         TYPE REF TO DATA,
         LS_DATA         TYPE REF TO DATA.

  DATA BEGIN OF LT_MARA OCCURS 0,
         MATNR      LIKE MARA-MATNR,
         MAKTX      LIKE MAKT-MAKTX,
         GROES      LIKE MARA-GROES,
         MEINS      LIKE MARA-MEINS,
         END OF LT_MARA.

*  "사용될 필드를 선언
  LS_COMP-NAME 'MATNR'.
  LS_COMP-TYPE CL_ABAP_ELEMDESCR=>GET_C18 ).
  APPEND LS_COMP TO LT_COMP.

  LS_COMP-NAME 'MAKTX'.
  LS_COMP-TYPE CL_ABAP_ELEMDESCR=>GET_C18 ).
  APPEND LS_COMP TO LT_COMP.

  LS_COMP-NAME 'GROES'.
  LS_COMP-TYPE CL_ABAP_ELEMDESCR=>GET_C18 ).
  APPEND LS_COMP TO LT_COMP.

  LS_COMP-NAME 'MEINS'.
  LS_COMP-TYPE CL_ABAP_ELEMDESCR=>GET_C18 ).
  APPEND LS_COMP TO LT_COMP.

  SELECT A~MATNR A~GROES A~MEINS B~MAKTX
    INTO CORRESPONDING FIELDS OF TABLE LT_MARA
    FROM MARA AS A
    JOIN MAKT AS B
      ON A~MATNR EQ B~MATNR
     AND B~SPRAS EQ 'E'
    UP TO 200 ROWS.

" 3. 구조 타입 및 테이블 타입 생성
  LO_STRUCTDESCR CL_ABAP_STRUCTDESCR=>CREATELT_COMP ).
  LO_TABLEDESCR  CL_ABAP_TABLEDESCR=>CREATEP_LINE_TYPE LO_STRUCTDESCR ).

*"선언된 구조체를 LT_DATA에 ASSIGN 처리
  CREATE DATA LT_DATA TYPE HANDLE LO_TABLEDESCR.
  ASSIGN LT_DATA->TO <FS_TABLE>.

  LOOP AT LT_MARA.
    CREATE DATA LS_DATA TYPE HANDLE LO_STRUCTDESCR.
    ASSIGN LS_DATA->TO <FS_WA>.

*   "LT_DATA에 ASSIGN된 필드를 찾아 데이터를 입력 처리함.
    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_WA> TO <FS_FIELD>.
    <FS_FIELD> LT_MARA-MATNR.

    ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <FS_WA> TO <FS_FIELD>.
    <FS_FIELD> LT_MARA-MAKTX.

    ASSIGN COMPONENT 'GROES' OF STRUCTURE <FS_WA> TO <FS_FIELD>.
    <FS_FIELD> LT_MARA-GROES.

    ASSIGN COMPONENT 'MEINS' OF STRUCTURE <FS_WA> TO <FS_FIELD>.
    <FS_FIELD> LT_MARA-MEINS.

    APPEND <FS_WA> TO <FS_TABLE>.
  ENDLOOP.

  BREAK-POINT.
 

실행으로 생성된 인터널 테이블 구조


 

2026년 1월 12일 월요일

[AIX] sftp 자동 접속 스크립터

AIX에서 sftp 자동 접속 스크립터 

 

# cat sftp.sh
expect << EOF

set timeout 120
spawn sftp -oport=22 $2@$1

expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$3\r" }
}

    expect "sftp>" { send "cd $4\r"}
    expect "sftp>" { send "put $5$6\r"}
    expect "sftp>" { send "ls -l $6\r"}
    expect "sftp>" { send "!ls -l $5$6\r"}
    expect "sftp>" { send "bye\r"}
    expect eof

EOF