Computer Science/Security

리눅스 Sendmail 설정 / 메일서버 구축하기

정말 오랜만에 블로그에 복귀했다. 3개월 만이다. 그동안 팔로워도 늘어나고, 댓글도 종종달려서 너무 행복했다. 그래도 항상 보고계시는 분이 계시나보다. 너무 감사했다!

정보기 실기를 준비하면서 일부 정리해야될 내용은 직접 실습해볼 필요성을 느꼈다. 단골 문제로 출제되는 토픽 중 하나가 Sendmail인 것 같아서 오늘은 관련된 실습을 전체적으로 해보려고 한다.

처음에는 AWS에서 할당받은 서버를 사용하려 했으나, AWS의 EC2컨테이너에서는 SMTP 25번 포트를 사용하지 못하는 것 같다. 그래서 로컬에 해보기로 했다.

1. 서버 설정

나는 맥북에 UTM을 이용해 Centos를 설치 후 네트워크를 확인했다.
OS는 CentOS-7-x86_64-Minimal-2009.iso을 사용했다. 인터넷에 검색하면 손쉽게 구할 수 있다. Minimal 모드를 사용한 이유는 굳이 그래픽 모드까지 사용할 필요가 없기 때문에 미니멀 모드로 사용했다.

1) 서버 네트워크 확인

이상하게 맥북에 가상머신을 올리면 인터페이스가 자동으로 붙지 않는다. 따라서 사설 IP도 바로 할당되지 않는다. 따라서 IP할당을 위해 내PC에 연결시켜준다.

ip addr

위의 명령어를 입력하면, 2개의 항목이 나오는데 하나는 lo로 자기 자신을 의미하고, 아래 보이는 2번이 네트워크 인터페이스 명이다.

ifup enp0s1

명령어를 사용하면 아래와 같은 성공 메세지가 나오고,

인터페이스가 연결되어 hostname -i을 입력하면 ip가 할당된 것을 볼 수 있다.

이후에는 ssh 로 접속해서 확인했다. 조금 더 사용자에 친숙한 화면이 보기 좋다.

ssh 사용자명@192.168.64.5

2) yum 패키지 설치를 위한 설정

yum 패키지를 다운로드 받는 주소가 변경이 되었나보다. 그래서 바로 yum install을 하면 다운이 되지 않았다.

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

그 뒤로는 제대로 yum 다운이 되는지 확인한다.

yum install sendmail-cf m4

3) 서버의 Hostname 설정하기

서버의 호스트명을 설정한다. 네트워크 내에서 서버를 별칭으로써 사용하고 싶을때 사용한다. IP가 할당된 서버의 별칭이라고 볼 수 있다.

먼저 지금 설정된 hostname은 shell 라인에 표기된 계정@host명 부분을 보면 localhost로 설정된 것을 볼 수 있다.

  • hostname 변경hostname 파일을 열고 내가 설정하고싶은 호스트 명을 입력하면 된다.
  • vi /etc/hostname
  • vi /etc/hosts 변경
    hosts파일은 도메인에 해당되는 IP를 정의하는 파일이다. hostname은 PC의 이름이고 hosts는 현재 사용하는 로컬 IP주소와 매칭되는 도메인을 넣어준다.
  • vi /etc/sysconfig/network
    sysconfig/network 파일은 hostname명령어를 조회했을때 어떻게 나와야 할 지를 정의하는 파일이다.

3가지 파일이 헷갈릴 수 있다. 아래의 링크를 참고하여 잘 숙지해두자.

이후 1번 재부팅을 하였다. 그러면, hostname이 mail로 변경된 것을 확인할 수 있었다! (.은 delim으로 생략됨)

2. Sendmail 설치하기

1) sendmail 설치

앞에서 한번 확인했지만, 혹시 설치하지 않았을 경우에는 아래처럼 설치해준다.

  • sendmail 설치
  • yum install sendmail-cf m4
  • 메일서버에 사용할 도메인을 정의
    munang@도메인 에서 도메인 명을 정의하는 파일이다. 나는 호스트명과
    동일하게 저장했다.
  • vi /etc/mail/local-host-names

3. DNS 서버 설정하기

1) dns 관련 파일 추가 수정

  • dns zone 파일을 만들어야 하니 관련된 패키지를 설치해준다.
yum -y install bind bind-chroot
  • named.conf 파일 수정
    vi /etc/named.conf
    :set nu ## line 넘버 설정
    :12 ## 12번째 행으로 이동 

12번째 line으로 간다. DNS 서비스를 할 때 어떤 사용자 대역으로 받을지 결정해준다. 나는 any로 해서 전체 대역에서 DNS 응답을 받을 수 있도록 했다.

  listen-on port 53 { any; };
  listen-on-v6 port 53 { none; };

그리고 munang.com 도메인의 정보를 참조할 zone파일을 정의해준다.

:50 
zone "munang.com" IN {
     55         type master;
     56         file "munang.zone";
     57         allow-update {none;};
     58 };

이후 아래의 명령어를 사용해 오타가 없는지 체크해준다.

named-checkconf

오류 메세지가 없으면 제대로 등록 되었다.

  • zone 파일 생성
    munangs.com 도메인의 zone 정보를 조회할 파일을 생성해준다.
    cd /var/named/
    vi munang.name
    이후 아래의 내용을 입력해준다.
    $TTL    10H
    @    SOA    @    root. (2 1D 1H 1W 1H)
      IN    NS    @
      IN    A    192.168.64.5
      IN    MX 10    mail.munang.com.
    

mail IN A 192.168.64.5
www IN A 192.168.64.5

각 항목의 상세 설명은 [이 사이트](https://www.linux.co.kr/bbs/board.php?bo_table=lecture&wr_id=5745)를 참고하여 작성했고, 게시글도 많은 도움이 되었다.      
다음 아래의 명령어를 입력해 정상 적용 여부를 체크한다. 

named-checkzone munang.com munang.zone


* resolv.conf 파일 수정
dns 정보를 조회할때 사용할 dns 서버를 지정한다. 나는 로컬 서버에 dns 설정을 해주어, munangs.com에 대한 정보는 로컬 dns 에서 모두 조회할 수 있다. 따라서 그 정보를 적어주었다. 
```shell
cat /etc/resolv.conf

내용은 아래의 내용을 기재했다.

Generated by NetworkManager
search munangs.com ## 
nameserver 192.168.64.5
  • network-scripts 파일 수정
    cat /etc/sysconfig/network-scripts/ifcfg-enp0s1
    network- script는 서버가 부팅될때 설정값을 읽어와 적용한다. 여기서 IPADDR을 지정하면 고정으로 IP가 유지된다. 또한 DNS 서버 정보도 부팅 시 script파일에서 가져와 resolv.conf를 수정한다.

그래서 기존에 할당된 IP를 고정으로 지정하고, DNS서버도 로컬 IP로 지정하였다.

ONBOOT=yes
IPDAAR=192.168.64.5
DNS=192.168.64.5
  • 적용
    systemctl restart named
    systemctl enable named

2) 도메인 IP 확인

nslookup mail.munang.com

을 입력했을 때 로컬 IP가 나오면 성공이다.

4. Sendmail 설정

1) Sendmail.mc 설정하기

vi /etc/mail/sendmail.mc

# before ( dns 주석 된 상태 )
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

# after (젤 앞에 dnl 주석만 제거해주면 됨)
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

2) 설정파일 적용

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

3) hostname 설정하기

메일 발송 시, 보낸 이의 hostname을 설정해줄 수 있다.

hostnamectl set-hostname munanglight.mail.com

4) 접속 허용

vi /etc/mail/access # mail 서버에 접근 가능한 도메인 설정
# By default we allow relaying from localhost...
Connect:localhost.localdomain           RELAY
Connect:localhost                       RELAY
Connect:127.0.0.1                       RELAY
Connect:192.168                 RELAY

cd /etc/mail
makemap hash access < access

5) sendmail 재시작

systemctl restart sendmail

5. Sendmail 테스트

현재는 로컬 서버에서 수행하여 아래와 같이 메일 서버를 만들었다.
로컬에서 2명의 사용자가 서로 주고받는 설정이다.

[root@mail mail]# telnet localhost 25 ## 메일 서비스 연결
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.munangs.com ESMTP Sendmail 8.14.7/8.14.7; Thu, 8 Aug 2024 10:47:07 -0400
helo mail.munangs.com ## send 메일 서버에 helo를 보내 응답을 확인
250 mail.munangs.com Hello localhost [127.0.0.1], pleased to meet you
mail from:test@mail.munangs.com ## 보내는 사람 메일 주소 
250 2.1.0 test@mail.munangs.com... Sender ok
rcpt to:munang@mail.munangs.com ## 받는 사람 메일 주소 
250 2.1.5 munang@mail.munangs.com... Recipient ok
data ## 메일 작성 시작
354 Enter mail, end with "." on a line by itself
subejct:test ## 제목
sdmklf.
.
## 메일이 끝나면 마지막에 .으로 저장
250 2.0.0 478El7XL013943 Message accepted for delivery

메일 확인

vi /var/mail/munang ## munang의 메일함 open

그러면 아래와 같이 test@mail.munangs.com이 보낸 메일을 볼 수 있다.

끝이다!!

다음은 sendmail이 메일 서버간 어떤 역할을 하는지에 대해 개념 정리를 해보겠다.

'Computer Science > Security' 카테고리의 다른 글

웹 보안 취약점  (0) 2024.08.25
웹 쉘 Web shell  (0) 2024.08.25