서버 설치 · 10 min read · Oct 30, 2025

완벽한 서버 CentOS 7.6 - Apache, PHP 7.2, Postfix, Dovecot, Pure-FTPD, BIND 및 ISPConfig 3.1 설치 - 페이지 2

7 Dovecot 설치

Dovecot은 다음과 같이 설치할 수 있습니다:

yum -y install dovecot dovecot-mysql dovecot-pigeonhole

빈 dovecot-sql.conf 파일을 만들고 심볼릭 링크를 생성합니다:

touch /etc/dovecot/dovecot-sql.conf  
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf  
ln -s /etc/dovecot/dovecot.conf /etc/dovecot.conf

이제 시스템 시작 링크를 생성하고 Dovecot을 시작합니다:

systemctl enable dovecot  
systemctl start dovecot

8 Postfix 설치

Postfix는 다음과 같이 설치할 수 있습니다:

yum -y install postfix

그런 다음 Sendmail을 끄고 Postfix 및 MariaDB (MySQL)를 시작합니다:

systemctl enable mariadb.service  
systemctl start mariadb.service
systemctl stop sendmail.service  
systemctl disable sendmail.service  
systemctl enable postfix.service  
systemctl restart postfix.service

Sendmail이 서버에 설치된 경우 시작되지 않도록 비활성화합니다. 따라서 “Failed to issue method call: Unit sendmail.service not loaded.”라는 오류 메시지는 무시할 수 있습니다.

9 Getmail 설치

Getmail은 다음과 같이 설치할 수 있습니다:

yum -y install getmail

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

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

mysql_secure_installation
[root@server1 tmp]# mysql_secure_installation  
  
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB  
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
MariaDB에 로그인하여 보안을 설정하려면 현재  
루트 사용자에 대한 비밀번호가 필요합니다. MariaDB를 방금 설치했으며  
루트 비밀번호를 아직 설정하지 않았다면 비밀번호는 비어 있으므로  
여기서 그냥 Enter를 누르십시오.
Enter current password for root (enter for none):  
OK, successfully used password, moving on...
루트 비밀번호를 설정하면 적절한 권한 없이 누구도 MariaDB  
루트 사용자로 로그인할 수 없도록 보장합니다.  
  
Set root password? [Y/n] <-- ENTER  
New password: <-- yourrootsqlpassword  
Re-enter new password: <-- yourrootsqlpassword  
Password updated successfully!  
Reloading privilege tables..  
 ... Success!  
  
기본적으로 MariaDB 설치에는 익명 사용자가 있어 누구나  
사용자 계정을 생성하지 않고도 MariaDB에 로그인할 수 있습니다. 이는  
테스트 용도로만 사용되며 설치를 조금 더 원활하게 진행하기 위한 것입니다.  
생산 환경으로 이동하기 전에 이들을 제거해야 합니다.  
  
Remove anonymous users? [Y/n] <-- ENTER  
 ... Success!  
  
일반적으로 루트는 'localhost'에서만 연결할 수 있어야 합니다.  
이는 누군가가 네트워크에서 루트 비밀번호를 추측할 수 없도록 보장합니다.  
  
Disallow root login remotely? [Y/n] <-- ENTER  
 ... Success!  
  
기본적으로 MariaDB에는 누구나 접근할 수 있는 'test'라는 데이터베이스가 있습니다.  
이는 테스트 용도로만 사용되며 생산 환경으로 이동하기 전에 제거해야 합니다.  
  
Remove test database and access to it? [Y/n] <-- ENTER  
- Dropping test database...  
 ... Success!  
- Removing privileges on test database...  
 ... Success!  
  
권한 테이블을 다시 로드하면 지금까지 변경된 모든 사항이  
즉시 적용됩니다.  
  
Reload privilege tables now? [Y/n] <-- ENTER  
 ... Success!  
  
정리 중...  
  
모든 작업이 완료되었습니다! 위의 모든 단계를 완료했다면  
당신의 MariaDB 설치는 이제 안전해야 합니다.  
  
MariaDB를 사용해 주셔서 감사합니다!  
  
[root@server1 tmp]#

이제 phpMyAdmin을 구성합니다. phpMyAdmin이 localhost에서만 연결을 허용하도록 Apache 구성을 변경합니다 (빨간색으로 표시된 줄 주석 처리):

nano /etc/httpd/conf.d/phpMyAdmin.conf
# phpMyAdmin - Web based MySQL browser written in php
#
# Allows only localhost by default
#
# But allowing phpMyAdmin to anyone other than localhost should be considered
# dangerous unless properly secured by SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin


   
     # Apache 2.4
  #  
     #  Require ip 127.0.0.1
     #  Require ip ::1
  #  
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   

            

다음으로 phpMyAdmin의 인증을 쿠키에서 http로 변경합니다:

nano /etc/phpMyAdmin/config.inc.php
[...]
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'http';
[...]

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

systemctl enable  httpd.service  
systemctl restart  httpd.service

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

11 Amavisd-new, SpamAssassin, ClamAV 및 Postgrey 설치

amavisd-new, SpamAssassin 및 ClamAV를 설치하려면 다음 명령을 실행합니다:

yum -y install amavisd-new spamassassin clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd unzip bzip2 perl-DBD-mysql postgrey re2c

그런 다음 freshclam, amavisd 및 clamd.amavisd를 시작합니다:

sa-update  
freshclam  
systemctl enable amavisd.service  
systemctl start amavisd.service  
systemctl start [email protected]  
systemctl enable postgrey.service  
systemctl start postgrey.service

12 mod_php, mod_fcgi/PHP, PHP-FPM과 함께 Apache 설치

ISPConfig 3는 웹사이트별로 mod_php, mod_fcgi/PHP, cgi/PHP 및 PHP-FPM을 사용할 수 있습니다.

mod_php, mod_fcgid 및 PHP와 함께 Apache2를 다음과 같이 설치할 수 있습니다:

yum -y install php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel mod_fcgid php-cli httpd-devel php-fpm php-intl php-imagick php-pspell wget

다음으로 /etc/php.ini를 엽니다…

nano /etc/php.ini

… 그리고 오류 보고를 변경합니다 (알림이 더 이상 표시되지 않도록), 시간대를 설정하고 cgi.fix_pathinfo=1의 주석을 제거합니다:

[...]
;error_reporting = E_ALL & ~E_DEPRECATED
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PAppp.tldTH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=1  
[...]  
date.timezone = 'Europe/Berlin'
[...]

httpd 및 PHP-FPM이 부팅 시 시작되도록 활성화하고 PHP-FPM 서비스를 시작합니다.

systemctl start php-fpm.service  
systemctl enable php-fpm.service  
systemctl enable httpd.service

마지막으로 Apache를 재시작합니다:

systemctl restart httpd.service

이제 Let’s encrypt 지원을 추가합니다.

mkdir /opt/certbot  
cd /opt/certbot  
wget https://dl.eff.org/certbot-auto  
chmod a+x ./certbot-auto

이제 certbot-auto 명령을 실행하여 소프트웨어와 그 의존성을 다운로드하고 설치합니다.

./certbot-auto

명령은 “no names were found in your configuration files”라는 메시지를 표시하고 계속할 것인지 묻습니다. 여기서 “c”를 선택하여 취소합니다. 인증서는 ispconfig에 의해 생성됩니다.

CentOS에 certbot 설치

13 mod_python 설치

Apache 모듈 mod_python은 RPM 패키지로 제공되지 않으므로 소스에서 컴파일합니다. 첫 번째 단계는 python 개발 파일을 설치하고 현재 mod_python 버전을 .tar.gz 파일로 다운로드하는 것입니다.

yum -y install python-devel
cd /usr/local/src/  
wget http://dist.modpython.org/dist/mod_python-3.5.0.tgz  
tar xfz mod_python-3.5.0.tgz  
cd mod_python-3.5.0

그런 다음 모듈을 구성하고 컴파일합니다.

./configure  
make

컴파일된 모듈에 오류가 있어 설치가 “version = “fatal: Not a git repository (or any of the parent directories): .git“라는 오류로 실패합니다. 이를 수정하려면 이 sed 명령을 실행합니다 (명령은 한 줄입니다!).

sed -e 's/(git describe --always)/(git describe --always 2>\/dev\/null)/g' -e 's/`git describe --always`/`git describe --always 2>\/dev\/null`/g' -i $( find . -type f -name Makefile\* -o -name version.sh )

그런 다음 다음 명령으로 모듈을 설치합니다.

make install

그리고 Apache에서 모듈을 활성화합니다:

echo 'LoadModule python_module modules/mod_python.so' > /etc/httpd/conf.modules.d/10-python.conf  
systemctl restart httpd.service

14 PureFTPd 설치

PureFTPd는 다음 명령으로 설치할 수 있습니다:

yum -y install pure-ftpd

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

systemctl enable pure-ftpd.service  
systemctl start pure-ftpd.service

이제 PureFTPd를 구성하여 FTP 및 TLS 세션을 허용합니다. FTP는 모든 비밀번호와 모든 데이터가 일반 텍스트로 전송되기 때문에 매우 안전하지 않은 프로토콜입니다. TLS를 사용하면 전체 통신을 암호화할 수 있어 FTP를 훨씬 더 안전하게 만들 수 있습니다.

TLS에 OpenSSL이 필요합니다. OpenSSL을 설치하려면 다음과 같이 실행합니다:

yum install openssl

/etc/pure-ftpd/pure-ftpd.conf를 엽니다…

nano /etc/pure-ftpd/pure-ftpd.conf

FTP 및 TLS 세션을 허용하려면 TLS 줄 앞의 #을 제거하여 TLS를 1로 설정합니다. TLS를 활성화하는 것이 강력히 권장됩니다.

[...]
# This option can accept three values :
# 0 : disable SSL/TLS encryption layer (default).
# 1 : accept both traditional and encrypted sessions.
# 2 : refuse connections that don't use SSL/TLS security mechanisms,
#     including anonymous sessions.
# Do _not_ uncomment this blindly. Be sure that :
# 1) Your server has been compiled with SSL/TLS support (--with-tls),
# 2) A valid certificate is in place,
# 3) Only compatible clients will log in.

TLS                      1
[...]

TLS를 사용하려면 SSL 인증서를 생성해야 합니다. /etc/ssl/private/에 생성하므로 먼저 해당 디렉토리를 생성합니다:

mkdir -p /etc/ssl/private/

그런 다음 다음과 같이 SSL 인증서를 생성할 수 있습니다:

openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

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

SSL 인증서의 권한을 변경합니다:

chmod 600 /etc/ssl/private/pure-ftpd.pem

DHParam 파일을 생성합니다:

openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048

마지막으로 PureFTPd를 재시작합니다:

systemctl restart pure-ftpd.service

그게 다입니다. 이제 FTP 클라이언트를 사용하여 연결을 시도할 수 있습니다. 그러나 FTP 클라이언트를 TLS를 사용하도록 구성해야 합니다.

15 BIND 설치

BIND는 다음과 같이 설치할 수 있습니다:

yum -y install bind bind-utils haveged

기존 /etc/named.conf 파일의 백업을 만들고 다음과 같이 새 파일을 생성합니다:

cp /etc/named.conf /etc/named.conf_bak  
cat /dev/null > /etc/named.conf  
nano /etc/named.conf
// named.conf
//
// Red Hat bind 패키지가 ISC BIND named(8) DNS를 구성하기 위해 제공
// 서버를 캐싱 전용 이름 서버로 설정합니다 (로컬호스트 DNS 해 resolver 전용).
//
// 예제 named 구성 파일은 /usr/share/doc/bind*/sample/에서 확인할 수 있습니다.
//
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        allow-recursion {"none";};
        recursion no;
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
        type hint;
        file "named.ca";
};
include "/etc/named.conf.local";

/etc/named.conf의 끝에 포함된 /etc/named.conf.local 파일을 생성합니다 (ISPConfig에서 DNS 영역을 생성하면 나중에 /etc/named.conf.local이 채워집니다):

touch /etc/named.conf.local

그런 다음 시작 링크를 생성하고 BIND를 시작합니다:

systemctl enable named.service  
systemctl start named.service  
systemctl enable haveged.service  
systemctl start haveged.service

16 Webalizer 및 AWStats 설치

AWStats는 다음과 같이 설치할 수 있습니다:

yum -y install webalizer awstats perl-DateTime-Format-HTTP perl-DateTime-Format-Builder

/etc/httpd/conf.d/awstats.conf 파일을 편집합니다:

nano /etc/httpd/conf.d/awstats.conf

그리고 다음 줄을 변경합니다:

Require local

를:

Require all granted

그리고 Apache를 재시작합니다:

systemctl restart httpd.service

17 Jailkit 설치

Jailkit은 SSH 사용자와 cronjob을 chroot하는 데 사용됩니다. 다음과 같이 설치할 수 있습니다:

cd /tmp  
wget http://olivier.sessink.nl/jailkit/jailkit-2.20.tar.gz  
tar xvfz jailkit-2.20.tar.gz  
cd jailkit-2.20  
./configure  
make  
make install  
cd ..  
rm -rf jailkit-2.20*

18 Fail2Ban 설치

선택 사항이지만 권장됩니다. ISPConfig 모니터가 로그를 표시하려고 시도하기 때문입니다.

yum -y install iptables-services fail2ban fail2ban-systemd  
systemctl stop firewalld.service  
systemctl mask firewalld.service  
systemctl disable firewalld.service  
systemctl stop firewalld.service

그런 다음 /etc/fail2ban/jail.local 파일을 생성하고 ssh, email 및 ftp 서비스에 대한 모니터링을 활성화합니다.

nano /etc/fail2ban/jail.local

jail.local 파일에 다음 내용을 추가합니다:

[sshd]  
enabled = true  
action = iptables[name=sshd, port=ssh, protocol=tcp]  
  
[pure-ftpd]  
enabled = true  
action = iptables[name=FTP, port=ftp, protocol=tcp]  
maxretry = 3  
  
[dovecot]  
enabled = true  
action = iptables-multiport[name=dovecot, port="pop3,pop3s,imap,imaps", protocol=tcp]  
maxretry = 5  
  
[postfix-sasl]  
enabled = true  
action = iptables-multiport[name=postfix-sasl, port="smtp,smtps,submission", protocol=tcp]  
maxretry = 3

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

systemctl enable fail2ban.service  
systemctl start fail2ban.service

19 rkhunter 설치

rkhunter는 다음과 같이 설치할 수 있습니다:

yum -y install rkhunter

20 Mailman 설치

서버에서 Mailman으로 메일링 리스트를 관리하려면 지금 Mailman을 설치하십시오. Mailman은 ISPConfig에서 지원되므로 나중에 ISPConfig를 통해 새로운 메일링 리스트를 생성할 수 있습니다.

yum -y install mailman

Mailman을 시작하기 전에 mailman이라는 첫 번째 메일링 리스트를 생성해야 합니다:

touch /var/lib/mailman/data/aliases  
postmap /var/lib/mailman/data/aliases  
/usr/lib/mailman/bin/newlist mailman  
ln -s /usr/lib/mailman/mail/mailman /usr/bin/mailman

[root@server1 tmp]# /usr/lib/mailman/bin/newlist mailman
메일링 리스트를 운영하는 사람의 이메일 입력: <– 관리자 이메일 주소, 예: [email protected]
초기 mailman 비밀번호: <– 메일링 리스트의 관리자 비밀번호
메일링 리스트를 생성하려면 /etc/aliases (또는 동등한) 파일을 편집하여 다음 줄을 추가하고,
가능하면 newaliases 프로그램을 실행해야 합니다:

mailman 메일링 리스트

mailman: “|/usr/lib/mailman/mail/mailman post mailman”
mailman-admin: “|/usr/lib/mailman/mail/mailman admin mailman”
mailman-bounces: “|/usr/lib/mailman/mail/mailman bounces mailman”
mailman-confirm: “|/usr/lib/mailman/mail/mailman confirm mailman”
mailman-join: “|/usr/lib/mailman/mail/mailman join mailman”
mailman-leave: “|/usr/lib/mailman/mail/mailman leave mailman”
mailman-owner: “|/usr/lib/mailman/mail/mailman owner mailman”
mailman-request: “|/usr/lib/mailman/mail/mailman request mailman”
mailman-subscribe: “|/usr/lib/mailman/mail/mailman subscribe mailman”
mailman-unsubscribe: “|/usr/lib/mailman/mail/mailman unsubscribe mailman”

Enter를 눌러 mailman 소유자에게 알리십시오… <– ENTER

[root@server1 tmp]#

그런 다음 /etc/aliases를 엽니다…

nano /etc/aliases

… 그리고 다음 줄을 추가합니다:

[...]
mailman:              "|/usr/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/usr/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/usr/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/usr/lib/mailman/mail/mailman confirm mailman"
mailman-join:         "|/usr/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/usr/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/usr/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/usr/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/usr/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/usr/lib/mailman/mail/mailman unsubscribe mailman"

그런 다음

newaliases

를 실행하고 Postfix를 재시작합니다:

systemctl restart postfix.service

이제 Mailman Apache 구성 파일 /etc/httpd/conf.d/mailman.conf를 엽니다…

nano /etc/httpd/conf.d/mailman.conf

… 그리고 다음 줄을 추가합니다 ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/. Alias /pipermail/ /var/lib/mailman/archives/public/의 주석을 제거하고 다음 줄을 추가합니다 Alias /pipermail /var/lib/mailman/archives/public/:

#
#  httpd 구성 설정은 mailman과 함께 사용됩니다.
#
ScriptAlias /mailman/ /usr/lib/mailman/cgi-bin/
ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/

    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all


#Alias /pipermail/ /var/lib/mailman/archives/public/
Alias /pipermail /var/lib/mailman/archives/public/

    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    AddDefaultCharset Off


# 다음 줄의 주석을 제거하여 /mailman에 대한 쿼리를
# listinfo 페이지로 리디렉션합니다 (권장).

# RedirectMatch ^/mailman[/]*$ /mailman/listinfo

Apache를 재시작합니다:

systemctl restart httpd.service

Mailman의 시스템 시작 링크를 생성하고 시작합니다:

systemctl enable mailman.service  
systemctl start mailman.service

ISPConfig 3를 설치한 후 다음과 같이 Mailman에 접근할 수 있습니다:

모든 Apache vhosts에 대해 /cgi-bin/mailman 별칭을 사용할 수 있습니다 (Mailman에 접근하려는 모든 vhosts에서 suExec 및 CGI가 비활성화되어야 함을 유의하십시오!), 즉, http:///cgi-bin/mailman/admin/에서 메일링 리스트의 관리 인터페이스에 접근할 수 있으며, 메일링 리스트의 사용자 웹 페이지는 http:///cgi-bin/mailman/listinfo/에서 찾을 수 있습니다.

http:///pipermail/에서 메일링 리스트 아카이브를 찾을 수 있습니다.

Share: X/Twitter LinkedIn

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

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