서버 설정 · 6 min read · Nov 25, 2025

Postfix, Courier, MySQL 및 SquirrelMail을 이용한 가상 사용자 및 도메인 (Fedora 13 x86_64) - 페이지 2

6 MySQL 비밀번호 설정 및 phpMyAdmin 구성

MySQL 시작:

chkconfig --levels 235 mysqld on  
/etc/init.d/mysqld start

그런 다음 MySQL 루트 계정의 비밀번호를 설정합니다:

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation

NOTE: 이 스크립트의 모든 부분을 실행하는 것이 모든 MySQL 서버에서 권장됩니다. 프로덕션 환경에서 사용 중인 경우! 각 단계를 주의 깊게 읽어 주십시오!

MySQL에 로그인하여 보안을 설정하려면 현재 루트 사용자에 대한 비밀번호가 필요합니다. MySQL을 방금 설치했으며 루트 비밀번호를 아직 설정하지 않았다면 비밀번호는 비어 있으므로 여기서 그냥 Enter를 누르십시오.

현재 루트 비밀번호 입력 (없으면 Enter): <– ENTER
OK, 비밀번호가 성공적으로 사용되었습니다. 계속 진행합니다…

루트 비밀번호를 설정하면 적절한 권한 없이 누군가 MySQL 루트 사용자로 로그인할 수 없도록 보장합니다.

루트 비밀번호를 설정하시겠습니까? [Y/n] <– ENTER
새 비밀번호: <– yourrootsqlpassword
새 비밀번호 재입력: <– yourrootsqlpassword
비밀번호가 성공적으로 업데이트되었습니다!
권한 테이블을 다시 로드하는 중..
… 성공!

기본적으로 MySQL 설치에는 익명 사용자가 있어 누구나 사용자 계정을 생성하지 않고도 MySQL에 로그인할 수 있습니다. 이는 테스트 용도로만 의도되며 설치를 조금 더 원활하게 진행하기 위한 것입니다. 프로덕션 환경으로 이동하기 전에 이들을 제거해야 합니다.

익명 사용자를 제거하시겠습니까? [Y/n] <– ENTER
… 성공!

일반적으로 루트는 ‘localhost’에서만 연결할 수 있어야 합니다. 이는 누군가 네트워크에서 루트 비밀번호를 추측할 수 없도록 보장합니다.

원격으로 루트 로그인을 허용하지 않겠습니까? [Y/n] <– ENTER
… 성공!

기본적으로 MySQL에는 누구나 접근할 수 있는 ‘test’라는 데이터베이스가 포함되어 있습니다. 이는 테스트 용도로만 의도되며 프로덕션 환경으로 이동하기 전에 제거해야 합니다.

테스트 데이터베이스 및 접근을 제거하시겠습니까? [Y/n] <– ENTER

  • 테스트 데이터베이스 삭제 중…
    … 성공!
  • 테스트 데이터베이스에 대한 권한 제거 중…
    … 성공!

권한 테이블을 다시 로드하면 지금까지 수행된 모든 변경 사항이 즉시 적용됩니다.

지금 권한 테이블을 다시 로드하시겠습니까? [Y/n] <– ENTER
… 성공!

정리 중…

모든 작업이 완료되었습니다! 위의 모든 단계를 완료했다면 MySQL 설치가 이제 안전해야 합니다.

MySQL을 사용해 주셔서 감사합니다!

[root@server1 ~]#

이제 phpMyAdmin을 구성합니다. phpMyAdmin이 localhost에서만 연결을 허용하지 않도록 Apache 구성을 변경합니다( 구문 주석 처리):

vi /etc/httpd/conf.d/phpMyAdmin.conf

| # phpMyAdmin - php로 작성된 웹 기반 MySQL 브라우저 # # 기본적으로 localhost만 허용 # # 하지만 localhost 이외의 누구에게 phpMyAdmin을 허용하는 것은 # SSL로 적절히 보호되지 않는 한 위험하다고 간주해야 합니다. Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin # # order deny,allow # deny from all # allow from 127.0.0.1 # allow from ::1 # # 이 디렉토리는 HTTP를 통한 접근이 필요하지 않습니다 - 원래 # phpMyAdmin 업스트림 tarball에서 가져옴 # Order Deny,Allow Deny from All Allow from None # 이 구성은 phpMyAdmin 디렉토리에서 mod_security가 # SQL 등을 필터링하지 않도록 방지합니다. 이는 mod_security 구현을 깨뜨릴 수 있습니다. # # # # SecRuleInheritance Off # # |

그런 다음 Apache의 시스템 시작 링크를 생성하고 시작합니다:

chkconfig --levels 235 httpd on  
/etc/init.d/httpd start

이제 브라우저를 http://server1.example.com/phpMyAdmin/ 또는 http://192.168.0.100/phpMyAdmin/로 이동하여 사용자 이름 root와 새 루트 MySQL 비밀번호로 로그인할 수 있습니다.

7 Postfix/Courier용 MySQL 데이터베이스 생성

mail이라는 데이터베이스를 생성합니다:

mysqladmin -u root -p create mail

다음으로 MySQL 셸로 이동합니다:

mysql -u root -p

MySQL 셸에서 SELECT, INSERT, UPDATE, DELETE 권한이 있는 mail 데이터베이스의 사용자 mail_admin을 생성합니다(비밀번호는 mail_admin_password로 설정, 자신의 비밀번호로 교체). 이 사용자는 Postfix와 Courier가 메일 데이터베이스에 연결하는 데 사용됩니다:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

여전히 MySQL 셸에서 Postfix와 Courier가 필요로 하는 테이블을 생성합니다:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
TYPE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
TYPE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota bigint(20) DEFAULT '10485760',  
PRIMARY KEY (email)  
) TYPE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) TYPE=MyISAM;
quit;

quit; 명령으로 MySQL 셸을 종료하고 Linux 셸로 돌아왔습니다.

domains 테이블은 Postfix가 이메일을 수신해야 하는 각 가상 도메인을 저장합니다(예: example.com).

domain
example.com

forwardings 테이블은 하나의 이메일 주소를 다른 이메일 주소로 별칭을 지정하는 데 사용됩니다. 예를 들어 [email protected]의 이메일을 [email protected]로 전달합니다.

sourcedestination
[email protected][email protected]

users 테이블은 모든 가상 사용자(즉, 이메일 주소, 이메일 주소와 사용자 이름이 동일함)와 비밀번호( 암호화된 형태!) 및 각 메일 박스에 대한 쿼타 값을 저장합니다(이 예제에서는 기본값이 10485760 바이트로 10MB를 의미합니다).

emailpasswordquota
[email protected]No9.E4skNvGa. (암호화된 형태의 “비밀“)10485760

transport 테이블은 선택 사항이며, 고급 사용자용입니다. 단일 사용자, 전체 도메인 또는 모든 메일을 다른 서버로 전달할 수 있습니다. 예를 들어,

domaintransport
example.comsmtp:[1.2.3.4]

모든 이메일을 example.com에 대해 smtp 프로토콜을 통해 IP 주소 1.2.3.4의 서버로 전달합니다(대괄호 []는 “MX DNS 레코드를 조회하지 마십시오”를 의미합니다. 이는 IP 주소에 대해 의미가 있습니다…). 완전한 도메인 이름(FQDN)을 대신 사용하는 경우 대괄호를 사용하지 않습니다.).

8 Postfix 구성

이제 Postfix에 데이터베이스에서 모든 정보를 찾을 수 있는 위치를 알려야 합니다. 따라서 여섯 개의 텍스트 파일을 생성해야 합니다. Postfix가 localhost 대신 IP 주소 127.0.0.1에 연결하도록 지시하는 것을 알 수 있습니다. 이는 Postfix가 chroot 감옥에서 실행되고 MySQL 소켓에 접근할 수 없기 때문입니다. 만약 Postfix에 localhost를 사용하라고 지시하면 MySQL 소켓에 연결하려고 시도할 것입니다. 127.0.0.1을 사용하면 Postfix가 TCP 네트워킹을 사용하여 MySQL에 연결하므로 chroot 감옥에서도 문제가 없습니다(대안은 MySQL 소켓을 chroot 감옥으로 이동하는 것이며, 이는 다른 문제를 일으킵니다).

이제 여섯 개의 텍스트 파일을 생성해 보겠습니다.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

이제 vmail이라는 사용자 및 그룹을 생성하고 홈 디렉토리를 /home/vmail로 설정합니다. 여기서 모든 메일 박스가 저장됩니다.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

다음으로 Postfix 구성을 수행합니다. 반드시 server1.example.com을 유효한 FQDN으로 교체하십시오. 그렇지 않으면 Postfix가 제대로 작동하지 않을 수 있습니다!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "사용자가 초과한 쿼타입니다."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'

그 후 TLS에 필요한 SSL 인증서를 생성합니다:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

국가 이름 (2자리 코드) [XX]: <– 국가 이름 입력 (예: “DE”).
주 또는 지방 이름 (전체 이름) []: <– 주 또는 지방 이름 입력.
지역 이름 (예: 도시) [기본 도시]: <– 도시 입력.
조직 이름 (예: 회사) [기본 회사]: <– 조직 이름 입력 (예: 회사 이름).
조직 단위 이름 (예: 부서) []: <– 조직 단위 이름 입력 (예: “IT 부서”).
공통 이름 (예: 이름 또는 서버의 호스트 이름) []: <– 시스템의 완전한 도메인 이름 입력 (예: “server1.example.com”).
이메일 주소 []: <– 이메일 주소 입력.

그런 다음 smtpd.key의 권한을 변경합니다:

chmod o= /etc/postfix/smtpd.key
Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.