티스토리 뷰

먼저 우분투를 설치한 후


apt-get update

apt-get upgrade


명령을 사용하면, 항상 빠르고 안전한 최신버전의 소프트웨어를 사용하실 수 있습니다.


현재 배포된 Ubuntu 버전은 아래와 같습니다.





운영체제의 수명이 긴 LTS 버전을 설치하도록 합시다. 


Ubuntu OS의 자세한사항은 http://en.wikipedia.org/wiki/Ubuntu_(operating_system) 참고하세요.


설치는 Ubuntu 14.04 LTS를 기준으로 합니다.




요즘 구성가능한 서버 방식은 다음과 같습니다.


- Nginx + PHP-FPM (이 방식을 사용하여 설정을 잘 하면 가장 월등한 동접처리가 가능합니다. 다만 일부 범용 프로그램에서 호환이 안됩니다. )


nginx는 가벼운 대신 모듈이 많지 않습니다. nginx는 .htaccess 파일을 해석할 수 없습니다.


 


- Apache + PHP-FPM (apache 는 아주 많은 확장 모듈이 있습니다. 기본 내장된 mod_proxy 모듈을 사용해서 nginx와 동일한 역할을 할 수 있도록 할 수 있습니다.)


다만 기본으로 처리하는 것이 많아서 nginx 보다 약간은 느립니다. (0.01초 정도 차이) 당신의 웹프로그램이 이러한 처리모듈을 필요로 할 수 있습니다.


 


- Apache + mod_php (이 글에서는 이 방식을 설명할 것입니다.)


Apache와 PHP 프로그램을 따로 구동하지 않고 Apache가 PHP 해석 모듈을 로드하여 동작합니다



어차피 동접 3000, 4000 정도 될 때는 위 중 어느 방식으로 구성하더라고 서버가 뻗게 되 있습니다.


100명 이하의 동접이 일어날 때는 셋다 똑같으니 아무거나 쉬운 방식으로 설치하세요.


다만 nginx 환경은 여러 범용 프로그램 사용에 제약이 있을 수 있습니다. (사용하려면 삽질을 많이 해야한다는 뜻)


 


+ 비유를 하자면 Windows XP와 Windows 7 과 Windows 10 이 있는데, 웹서핑이나 문서작업 하는 입장에서는 셋다 똑같다고 느낍니다.


오히려 XP가 가장 빠를지도 모릅니다. 다만 요즘 나온 Diablo 3나 Starcraft 2 같은 게임을 구동할 때는 당연히 Windows 10 이 가장 좋은 성능을 보여줄 겁니다.



1) 리눅스 버전체크

#uname -a


2) Ubuntu 버전체크

#cat /etc/issue


3) 하드용량체크

#df -h


4) 메모리 체크

#free -m


4-1) CPU 코어수 확인

#cat /proc/cpuinfo | grep processor | wc -l



다음의 명령어를 확인해 보세요.


#cat /proc/cpuinfo | grep processor

#cat /proc/cpuinfo


5) 자잘한 업글

#apt-get update

#apt-get upgrade

 

5-1) 한글 설정

# vi /etc/default/locale

나머지 모두 주석처리 후

LANG="ko_KR.UTF-8"

# source /etc/default/locale

#apt-get install language-pack-ko

# locale

 

 


6) 시스템 시간 설정

#dpkg-reconfigure tzdata


7) Hostname 설정

#vi /etc/hostname

#hostname -F /etc/hostname


 /etc/hosts 에 해당 이름을 등록해두도록 하자.


127.0.0.1   설정한네임


추가) 메일 발송프로그램 설치하기

# apt-get install sendmail



8) Apache2 설치

#apt-get install apache2

apache2 -v


기타 주로 사용되는 모듈을 활성화, 필요없는 모듈은 비활성화 한다.

아래 모듈에 대한 자세한 설명은… 생략한다.

사용에 문제가 발생하지 않는 최상의 방식이라고 이해하면 된다.


#a2enmod rewrite

#a2enmod headers

#a2dismod autoindex




# vi /etc/apache2/apache2.conf


파일 중간에 <FilesMatch “^\.ht”> 구문 다음에 추가한다.


# deny file, folder start with dot

<DirectoryMatch "^\.|\/\.">

    Order allow,deny

    Deny from all

</DirectoryMatch>



9) PHP 5.x 설치


PHP 7.0 / 7.2 관련 -> # apt-get install php libapache2-mod-php 설정

 

apt-cache search php7.0

 

apt-get -y install php7.0-mysql php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache  php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl php7.0-mbstring php-gettext


##php7.2

apt-cache search php7.2

 

apt-get -y install php7.2-mysql php7.2-curl php7.2-gd php7.2-intl php-pear php-imagick php7.2-imap php-memcache  php7.2-pspell php7.2-recode php7.2-sqlite3 php7.2-tidy php7.2-xmlrpc php7.2-xsl php7.2-mbstring php-gettext


##php7.4
apt-cache search php7.4
apt-get -y install php7.4-mysql php7.4-curl php7.4-gd php7.4-intl php-pear php-imagick php7.4-imap php-memcache  php7.4-pspell php7.4-sqlite3 php7.4-tidy php7.4-xmlrpc php7.4-xsl php7.4-mbstring php7.4-gettext


apt-get install mcrypt 
##

 

systemctl restart apache2

 

apt-get -y install php-apcu

 

systemctl restart apache2

 

a2enmod ssl
a2ensite default-ssl

 

systemctl restart apache2

 

 


PHP제작자가 PHP에 온갖 신기능을 넣어서 PHP6 를 만들었습니다. 그런데 신기능을 너무 많이 넣고 빼는 바람에 코드가 망했습니다. 쓸 수 없는 코드가 된 것이죠.


그래서 깔끔하게 PHP6를 폐기하고 PHP7 을 개발하였습니다.


PHP7은 제거한다던 기능을 제거하고 코드 동작을 개선하였습니다.


현재 PHP7을 실서비스에 적용하는 것을 권장하지 않는데, 이게 버그 때문이 아니라 하위호환이 안되기 때문입니다.


mysql_query() 같은 제거하기로 예고되었던 함수가 깔끔히 제거되었고, 몇몇 warning 이 나던 코드가 error 로 바뀌어 응답이 중단됩니다.


PHP 표준에 맞추어 개발된 코드는 잘 동작하겠지만 그렇지 않은 코드는 동작을 안할 겁니다.


당신이 신규서비스 개발자라면 PHP7 환경에서, 그렇지 않고 기존 오픈소스 이용자시려면 PHP5의 환경을 구축하시기 바랍니다. 2016년 중순까지는 PHP5를 사용하시길 권장합니다.



#apt-get install php5


#apt-get install php5-cli


#apt-get install php5-mcrypt


#apt-get install php5-gd


#apt-get install php5-curl


#apt-get install php5-intl


#apt-get install php5-apcu


-추가로 설치하고 싶은 모듈이 있으면  #apt-cache search php5-  해서 설치가능한 패키지를 검색후 install 하도록 하자.


#service apache2 restart


#php -v



10-1) Mysql 설치 (또는 MariaDB 설치)


#apt-get install mariadb-server-5.5

#apt-get install mariadb-client-5.5


#apt-get install php5-mysql


#mysql -V

 

 

php7.0 설치시 아래참조

 

mysql_secure_installation

 

 

https://www.howtoforge.com/tutorial/install-apache-with-php-and-mysql-on-ubuntu-16-04-lamp/

 

update user set plugin='' where User='root';

flush privileges; 

mysql -u root -p mysql

 


10-2) 기본 언어셋 설정(중요)


#vi /etc/mysql/my.cnf


2015년도 부터는 아래와 같이 utf8mb4 속성을 사용하세요.

이 속성은 utf8확장입니다. 기존의 모든 utf8과 상위 호환됩니다. 


utf8mb4 속성은 스마트폰 이모티콘 문자(emoji)를 저장할 수 있습니다.


character-set-server = utf8mb4

collation-server = utf8mb4_general_ci



#service mysql restart



#mariadb 10.0  --> /etc/mysql/mariadb.conf.d# vi 50-server.cnf

                            #skip-external-locking

skip-grant-tables=1

    




11) PHP 권한 설정


#apt-get install apache2-mpm-itk   OR  #apt-get install libapache2-mpm-itk

#chmod 711 /home

#chmod -R 700 /home/*



11-1) PHP 실행확장자 변경


#vi /etc/apache2/mods-available/php5.conf


.php 를 제외한 나머지의 접근을 차단하자.


<FilesMatch ".+\.ph(p3|p4|p5|t|tml)$">

Order Deny,Allow

Deny from all

</FilesMatch>


#service apache2 restart



11-2) PHP Default timezone 설정하기


#vi /etc/php5/apache2/php.ini


[CLI Server] 구분에 date.timezone = Asian/Seoul 로 변경


#service apache2 restart



12) 계정생성 및 동작테스트


#adduser test-index

#mkdir public_html

#exit



13) 웹사이트 Apache 환경설정파일 작성


/etc/apache2/sites-available/test-index.conf 에 저장한다.


<VirtualHost *:80>

    #main domain

    ServerName indexweb.co.kr

 

    #additional domain

    ServerAlias www.indexweb.co.kr

    ServerAlias indexweb.co.kr

 

    #document Root

    DocumentRoot /home/test-index/public_html/

 

    #additional setting

    <Directory /home/test-index/public_html/>

        Options FollowSymLinks MultiViews

        AllowOverride All

        Order allow,deny

        allow from all

        # 14.04 rules

        require all granted

    </Directory>

 

    ErrorLog ${APACHE_LOG_DIR}/test-index-error.log

    CustomLog ${APACHE_LOG_DIR}/test-index-access.log combined

</VirtualHost>



만약 SSL(https) 를 적용하고자 한다면 test-index.conf 파일 하단에 다음의 코드를 추가하세요.


    SSLEngine on

 

    SSLProtocol all -SSLv2 -SSLv3

 

    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

 

    SSLHonorCipherOrder on

 

    SSLCertificateFile "/home/test-index/ssl/mysite_ssl.crt"

    SSLCertificateKeyFile "/home/test-index/ssl/mysite_ssl.key"

    SSLCertificateChainFile "/home/test-index/ssl/mysite_ssl.certchain.crt"



https://www.sslshopper.com/ssl-checker.html#hostname=indexweb.co.kr  (체인 인증서 테스트용)

https://www.ssllabs.com/ssltest/analyze.html?d=indexweb.co.kr (SSL 보안설정 테스트용)


인증서 적용 테스트는 위의 사이트를 이용하여라.

인증서 체인 파일이란 “인증서에 대한 인증서” 파일이다.

대통령이 당신을 인증할 때 직권으로 인증하는 것이 아니라, 대통령 -> 서울시장 -> 강남구청장 -> 삼성동장 -> 당신 의 단계를 거친다. 검증하려면 모든 단계의 보증 증서를 제공해야 하는 것이다.

인증서 파일에는 삼성동장 -> 당신  의 정보가 들어있고, (암호화 통신시 공개됨)

인증서 키 파일에는 암호화 통신을 위한 정보가 들어있고 (은행 보안카드 로 비유. 외부에 공개되지 않음.)

인증서 체인 파일에는 대통령 -> 서울시장 -> 강남구청장 -> 삼성동장 의 정보가 들어있다. (암호화 통신시 공개됨)

인증서 체인을 올바르게 작성하지 않으면 Firefox 브라우저와 Android Chrome 브라우저에서 “인증서 정보부족” 오류가 발생하게 된다.




14) 사이트 활성화 및 적용


#a2ensite indexweb.co.kr   참고로 사이트 비활성화는    #a2dissite indexweb.co.kr

#service apache2 restart



15) Apache 추가 보안 설정


#vi /etc/apache2/conf-available/charset.conf

기본 언어값 UTF-8 에 대해서 주석처리되어 있을 텐데 주석(#)을 제거해 준다.


#vi /etc/apache2/conf-available/security.conf

매우 권장하는 보안설정이므로 Ubuntu Apache 패키지 제작자가 미리 써두었다.

이미 다 쓰여 있으니까 주석(#) 만 제거하자.







옵션) SSH 기본 포트번호 변경


#이 작업은 무작위 대입공격(Brutu force attack)의 시도를 차단해줍니다.

보통 IP주소 : 22번 포트를 스캔해서 ssh와 연결되면 무작위 로그인 시도를 하는 프로그램이 엄청 많은데,

포트번호만 바꾸어주어도 방어가 되거든요.

!! IPTABLES 방화벽, SSH 포트번호 변경, Fail2ban 중에서 하나만 적용하세요!!

!! 허용된 IP만 서버에 접속하게 할거야 -> IPTABLES !!

!! 사용자의 IP를 특정지을 수 없는데 무차별대입 공격은 방어할거야 -> Fail2ban !!

!! 나만 아는 포트번호로 서버에 접속할 거야 -> SSH 포트변경!!

[개인 프로젝트, 회사의 서비스 -> IPTABLES]

[웹호스팅 -> Fail2ban 또는 SSH 포트변경]

SSH 기본 포트번호인 22번을 다른 번호로 바꿉니다.

기억하기 쉬운 숫자로 변경하세요.





옵션) 방화벽 적용하기.


당연한 이야기지만 Ubuntu 에도 방화벽이 있습니다.

무척 당연한 이야기지만 방화벽을 사용하면 서버 보안이 매우 많이 향상됩니다.


현재 방화벽 설정 보기. (List)


#iptables -L


INPUT (서버로 들어오는 것 관리), FORWARD (서버에서 내부망으로 연결관리;잘 안씀), OUTPUT (서버에서 나가는 것 관리)

로 이루어져 있다.


보통 FORWARD와 OUTPUT은 건들이지 않고 INPUT 만 수정한다.

policy ACCEPT 라는 뜻은 아무 조건도 해당하지 않았을 때 ACCEPT 하라는 것이다.


먼저 현재 방화벽 설정을 파일로 저장한다. 언제든 현재의 상태로 되돌릴 수 있기 위해서 이다.


#cd ~

#mkdir firewall_rules

#cd firewall_rules

#iptables-save > 160122.rules       현재 날짜 쓰세요.


이제 방화벽을 복구해 보자.


#iptables-restore < 160122.rules

#iptables -L


>>설정 시작.

규칙 : 아이피 111.222.111.222 에 대해서 destination port 가 22 이면 ACCEPT 하여라.

#iptables -A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT


아이피 바꾸지 마시고 위의 예시 (111.222.111.222) 그대로 입력하세요.

#iptables -L


이제 현재 상태에 대해서 방화벽 설정파일을 다시 생성해보도록 하자.

#iptables-save > 160122.rules


FTP나 vi, cat 으로 해당 151214.rules 를 열어보자.

열고나서 코드의 뜻을 대충 해석해보아라.

하단 *filter 부분에

-A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT


이곳에 아래의 코드를 집어넣어야 한다.


순서가 중요하다. IF-ELSE 같이 동작하기 때문에 조건에 맞으면 바로 지정된 동작을 한다.


211.105.192.168 아이피만 지정하고 싶을 때 -> -s 211.105.192.168/32


211.105.192.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.192.0/24


211.105.*.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.0.0/16


목적지 포트가 22번(ssh) 포트일 때 -> -dport 22


목적지 포트가 80번(http) 포트일 때 -> -dport 80


목적지 포트가 443번(https) 포트일 때 -> -dport 443


1. 이미 연결된 것은 허용


2. ping 허용


3. loopback 허용


4. 111.222.111.222 의 22번 포트 접근 허용


5. 123.111.123.111 의 22번 포트 접근 허용


6. 80 포트 접근 허용 (-s 옵션이 없으므로 누구나 허용)


7. 차단


8. FORWARD 차단


의 코드이다.


아까 생성한 .rules 파일을 열어서 아래의 코드를 그림과 같이 코드를 추가하여라. 이때 반드시 당신의 아이피를 추가하여라.



새로 연결창 띄워서 테스트해 보아라.


 

방화벽 설정이 머리가 아프다면  # iptables -F   로 초기화 하고 다시 시도해 보아라.



iptables-persistent 설치

#apt-get install iptables-persistent

/etc/iptables 라는 폴더가 생성되고 rules.v4, rules.v6 가 생성된다.


#iptables-save > /etc/iptables/rules.v4


ipv6 차단하기

#vi /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv6.conf.lo.disable_ipv6 = 1



설정파일 적용

#sysctl -p

#cat /proc/sys/net/ipv6/conf/all/disable_ipv6   1 이면 disable 된 상태이다.  


#reboot



 


댓글