IT보안 학습

Sendmail 보안 총정리

김구티2 2023. 12. 19. 22:03

1. Sendmail의 개념

대표적인 Mail Transport Agent로, 기업이 SMTP를 사용하여 이메일을 보내는 방법을 제공하는 서버 응용 프로그램이다. 그런데 이메일만 보내고 POP3이나 IMAP을 사용하지 않으므로, 사용자의 받은 편지함 구성을 활성화하는 추가 응용 프로그램과 함께 설치하는 것이 일반적이다. Sendmail은 현재 시중에서 사용되는 유닉스에 기본적으로 포함되어 있는 대중적인 프로그램 중 하나라고도 말할 수 있다. 그러나 많은 버그가 끊임없이 보고되는 프로그램이고, 대부분의 버그가 보안 문제와 직결되는 부분이기 때문에 시스템 관리자들은 새로운 버전이 나올 때마다 그에 따른 업그레이드가 필수다. 사실 갈수록 Sendmail의 사용빈도는 낮아지고 있으나, 그래도 여전히 사용되고 있는 개념이기에 이해가 필요하다.

 

1.1 Sendmail 사용

Sendmail은 윈도우나 리눅스 환경에서도 분명 실행이 가능하다. 그러나 SMTP가 포함된 Sendmail 패키지는 리눅스 운영체제 전용으로 구축되었다. 그런데 보통 클라우드 제공업체는 애플리케이션의 자동화된 설치를 제공하고, 그래서 필요한 구성을 몰라도 발인 이메일 서버를 쉽게 설정할 수 있을 것이다. 그리고 GUI를 사용하게 되면, 사용자는 이메일을 보내기 위한 명령줄을 사용할 필요가 없어진다. Snemail이 설치된 서버는 웹 애플리케이션에서 보내는 이메일 메시지도 처리할 수 있다. 

 

2. Sendmail 작동 방식

Sendmail은 SMTP의 기능과 구성을 포함하는 응용 프로그램으로, Sendmail의 SMTP는 SSL과 함께 사용되여 MitM 공격으로부터 메시지를 안전하게 보호한다. 사실 이 메일 프로토콜이라는 것 자체가 본질적으로 안전과는 거리가 먼데, 그래서 SSL과 인증을 사용하여 공격자가 메시지를 읽지 못하게 하고, 스팸 메시지를 위해 이메일 서버를 사용하는 것을 방지할 수 있는 것이다.

 

Sendmail을 사용하는 SMTP 서버는 아웃바운드 메시지를 받으면 2가지 작업을 수행하고, 각각에 대해 2개의 파일을 생성한다. 그중 첫번째 작업은, 수신자 이메일 주소를 식별하고 이를 헤더로 패키징하는 일이다. 헤더 파일에는 별칭 및 메일링 목록을 포함한 수신자 목록이 포함되어 있다. 또한, 보내는 메시지의 구문을 검사한다. 그리하여 메시지가 올바르게 전송되었는지 확인할 수 있는 것이다. 다음으로, 두번째 작업은 메시지 본문이 포함된 파일을 생성하는 일이다. Sendmail은 각 수신자 주소를 가져와서 본문과 헤더 파일에 첨부한 다음 지정된 수신자에게 메시지를 보낸다. 발송하는 메일 서버는 수신자의 존재를 인식하지 못하는데, 그래서 잘못된 이메일 계정을 비롯한 문제로 인해 메시지가 반송될 수 있다. 이메일 헤더는 메시지 전송에 필수적이라 할 수 있다. 헤더는 수신자에게 경로와 신뢰성에 대한 정보를 제공하기 때문이다.

 

한편, Sendmail에는 몇 가지 오류 처리 기능이 있다. 예를 들어, 종료 상태가 '일시적 실패'로 반환하는 경우, 애플리케이션은 나중에 다시 시도하기 위해 메시지를 대기열에 넣는다.애플리케이션이 메시지를 보낼 수 없으면, 메시지가 전소오디지 않았음을 알리는 실패 메시지가 발송자에게 돌아오는 것이다.

이메일 헤더의 특정 섹션은 이용자가 추가한 고유 정보이지만 Sendmail을 사용할 때 다른 부분은 항상 포함된다. 메시지가 수신자 서버에 도달하는 데 걸리는 경로는 항상 메시지 헤더에 포함되지만, 이용자는 올바른 구문에 한해 자체 헤더 값을 추가하도록 선택할 수 있다. 필드 명칭-값 쌍이 자체 라인에 있어야 하는데, 그렇지 않으면 구문 유효성 검사 단계가 실패하여 메시지 전송에 실패한다. 이메일을 통해 스푸핑, 피싱 같은 공격을 방어하는 몇 가지 보안 표준이 만들어 졌는데, 이러한 보안 헤더는 발신 메시지에 추가되어 이메일 주소가 스푸핑된 것이 아닌지 확인하는 역할을 수행하기도 한다.

 

3. Sendmail 접근 파일(SPAM 메일 차단)

ㄱ. /etc/mail/access 작성 규칙

- OK: 다른 룰이 거부하여도 들어오는 메일을 수신한다.

- RELAY: 릴레이를 허용하는 것으로, 다른 룰이 거부하는 경우도 지정된 특정 도메인에 있는 사용자에게 오는 메일을 수신한다.

- REJECT: 수신 빛 발신을 완전히 거부한다.

- DISCARD: 메일을 받되, 메시지를 완전히 폐기한다.

- 501: 지정된 이메일 또는 도미엔 대해 보내는 사람의 주소가 전체 또는 부분적으로 일치할 경우 메일을 거부한다.

- 550: 특정 도메인에 관련된 메일을 거부한다.

 

ㄴ. /etc/mail/access 설정 예시

gutulog@tistory.com REJECT

gutilog.com REJECT

gutijoa.com DISCARD

gutiwow.org OK

202.5.5. RELAY

222.5.5. RELAY

→ gutulog@tistory.com과 gutilog.com에서 발송되는 메일의 수신 및 발신 모두를 거부한다.

gutijoa.com으로부터 오는 메일의 수신 및 발신 모두를 폐기한다. 단, 메일 발신자에게 폐기 통보를 하지는 않는다.

→ gutiwow.org으로부터 오는 메일을 수신한다.

→ 202.5.5.0과 222.5.5.0에서 발송되는 모든 메일의 수신 및 발신을 허용한다. 이때의 RELAY는 중계 역할을 의미한다.

 

※ Sendmail의 강점

그래도 여전히 Sendmail을 쓰는 사람들이 있다는 것은 Sendmail에도 강점이 있다는 것을 의미할 것이다. Sendmail을 사용함으로써 전반적으로 얻는 이득은 내부 이메일 서버 보유와 관련이 있다. 일부 기업에서는 이메일 서버를 내부적으로 호스팅하는 보안이 요구된다. 이를 통해 그 기업은 클라우드 호스트의 자동 구성에 의존하지 않더라도 이메일 헤더와 서버 동작을 맞춤 설정할 수 있는 것이다. 자체 이메일 서버를 호스팅함으로써 얻는 이득이 하나 더 있는데, 내부 애플리케이션과 쉽게 연동할 수 있다는 것이다. 개발자들이 외부 이메일 서버가 안전한지 확인할 수고로움이 적어지고, 이메일 서버를 항상 사용할 수 있는 가용성을 보장할 수도 있다.

 

그밖에, Sendmail은 여타 메일 애플리케이션을 사용할 때 얻는 이점도 그대로 갖기도 한다. 관리자가 원격으로 관리할 수 있고, 메시지 보내기 전에 이름을 확인할 수 있고, 실패 메시지가 발생하고 등등의 일반적인 이점 말이다. 그리고 Sendmail은 특히 가벼운 서비스이기 때문에 이것을 실행하는 데에 많은 리소스가 요구되지 않는다. 다만, Sendmail은 기업에게 결국 하나의 작업을 늘리는 일이기도 하기 때문에, 해당 관리자는 이것의 유지 관리 및 모니터링을 실시해야 할 것이다. 

 

※ Sendmail 운영모드

/usr/sbin/sendmail

-bd: 데몬 모드로 실행

-bi: 앨리어스 데이터베이스 파일을 초기화

-bm: 큐에 있는 내용을 프린터

-bs: 표준 입력으로 SMTP 실행

-bt: 테스트 모드, rewrite를 테스트하기 위해 이용

-bv: 확인 모드

 

※ Makemap 명령어

makemap은 Sendmail을 비롯한 여러 MTA에서 사용되는 명령어라고 할 수 있다. 이것은 Sendmail에서 매핑 유틸리티로 사용되어, 데이터베이스 파일을 생성하고 관리하는 데 쓰인다. 그리하여 access.db, alias.db 같은 파일을 생성한다.

일반적인 구문은 makemap [map-type] [options] database-file < input-file이다. [map-type] 은 데이터베이스 매핑 유형을 나타내며, [options] 는 말 그대로 추가적인 옵션을 기입하는 란이다. database-file 은 생성할 데이터베이스 파일의 경로와 이름을 지정하는 것이고, < input-file 은 데이터베이스 파일에 쓸 데이터를 지정한다. 그렇게 생성한 데이터베이스 파일이 Sendmail에서 메일 전송의 작업에 쓰이는 것이다.

728x90

'IT보안 학습' 카테고리의 다른 글

CPU 스케줄링 기법 총정리  (1) 2023.12.21
프로세스 관리 총정리  (0) 2023.12.20
운영체제(OS) 총정리  (2) 2023.12.16
입출력 인터페이스 총정리  (0) 2023.12.15
메모리 시스템 총정리  (0) 2023.12.14