error: Content is protected !!

이 글은 Amazon Lightsail에서 Ubuntu 18.04(LTS, Long Term Support) 버전을 사용한다는 전제하에 쓰였습니다.

따라서 서버 환경이 다르면 세팅 방법이 다소 상이할 수 있습니다.

서버의 유지·보수를 위한 기록용 글이며 내용은 지속해서 수정·보완될 예정입니다.

blog.lael.be의 글을 바탕으로 작성되었습니다.

Creative Commons Zero로 자유롭게 글을 활용하게 해주신 라엘님께 감사의 인사드립니다.


 

(0) 우분투 업그레이드

현재 Amazon Lightsail에서 인스턴스 생성 시 선택 가능한 우분투 이미지는 16.04(LTS) 버전이다. Ubuntu 18.04(LTS) 버전으로 업그레이드한다.

  • OS 버전 확인
    $ lsb_release -a
  • 우분투의 모든 패키지를 최신 버전으로 업그레이드
    $ sudo apt update
    $ sudo apt upgrade

    $ sudo apt dist-upgrade
  • 업데이트 매니저 설치 후 릴리즈 업그레이드
    $ sudo apt install update-manager-core
    $ sudo do-release-upgrade -d




터미널에 재접속하면 Welcome to Ubuntu 18.04 LTS라고 상단에 나온다.

 

(1) 서버 정보 확인 및 설정

  • OS 버전 확인
    $ lsb_release -a
  • 운영체제 확인
    $ getconf LONG_BIT
  • CPU 정보 확인
    $ cat /proc/cpuinfo
    CPU 코어 수만 확인
    $ cat /proc/cpuinfo | grep processor | wc -l
  • 메모리 확인
    $ free -m
  • 저장소 용량 확인
    $ df -h

본격적인 세팅에 앞서 패키지를 최신 버전으로 업그레이드한다.

  • $sudo apt update
    $sudo apt upgrade
  • 시스템 시간 설정
    $ dpkg-reconfigure tzdata

 

(2) 루트 로그인 및 비밀번호 설정

  • 기본 계정 확인
    $ whoami
  • 루트 로그인
    $ sudo su

이제부터 별도의 언급이 없으면 루트 로그인으로 진행한다.

  • 비밀번호 설정
    $ passwd root
    $ passwd 기본계정
    Amazon Lightsail에서 우분투 기본 계정은 ubuntu다.

 

(3) vsftpd 설치 및 설정

이 글에선 쉬운 세팅을 위해 파일질라 (FileZilla) 같은 FTP 소프트웨어를 활용할 것이므로 먼저 설치해준다.
(주의) 파일 업로드나 디렉토리 생성시 접속한 계정의 권한으로 생성된다.

  • vsftpd 설치
    $ apt install vsftpd
    $ vi /etc/vsftpd.conf
    white_enable=yes 주석제거
    local_umask=022 주석제거
    chroot_local_user=YES 주석제거
    $ service vsftpd restart

Amazon Lightsail는 sftp root로그인을 위해 추가설정 필요하다.

  • Lightsail sftp 루트 로그인 설정
    $ vi /etc/ssh/sshd_config
    PermitRootLogin yes로 변경
    PasswordAuthentication yes로 변경

    $ service sshd restart

이제 sftp로 root 로그인 가능한 걸 확인할 수 있다.

 

(3) apache2 설치 및 모듈설정

  • apache2 설치
    $ apt install apache2
  • 버전 확인
    $ apache2 -v

주소창에 서버 IP를 입력해 접속되는지 확인한다.

  • 기본 파일 삭제
    $ rm /var/www/html/index.html
  • 모듈 설정
    $ a2enmod rewrite
    $ a2enmod headers
    $ a2enmod ssl
    $ a2dismod -f autoindex
    $ systemctl restart apache2
  • apache2 기본 언어셋 설정
    $ vi /etc/apache2/conf-available/charset.conf
    UTF-8 라인의 주석을 제거한다.

Ubuntu Apache 패키지 제작자가 미리 써놓은 보안설정을 주석을 제거해 적용한다.

  • apache 추가 보안 설정
    $vi /etc/apache2/conf-available/security.conf


 

(4) PHP 설치 및 설정

PHP7.2 버전이 설치된다.

  • php 설치
    $ apt install php
  • 다국어처리, 이미지처리 모듈을 설치
    $ apt install php-mbstring php-gd php-curl php-xml
  • 원격지 불러오는 모듈 설치
    $ apt install php-curl php-xml
  • 버전 확인
    $ php -v

웹 서비스 구동 시 발생할 수 있는 Nobody 퍼미션 문제를 해결하기 위한 프로그램을 설치한다. 이 세팅을 하면 shell, sftp, web의 권한이 같게 취급되며 보안이 좋아진다.

  • php 권한설정
    $ apt-cache search mpm-itk
    $ apt install libapache2-mpm-itk
    $ chmod 711 /home
    $ chmod -R 700 /home/*
  • PHP Default timezone 설정
    $ vi /etc/php/7.2/apache2/php.ini
    $ vi /etc/php/7.2/cli/php.ini
    date.timezone 값을 찾아서 주석 제거 후 Asia/Seoul 설정

 

(5) MariaDB 설치 및 기본 언어셋 설정

  • MariaDB 설치
    $ apt install mariadb-server
  • MariaDB 초기화
    $ /usr/bin/mysql_secure_installation
    비밀번호만 설정한 후 다른 항목은 엔터를 누른다.
    실수하면 명령어를 재실행하면 된다.
  • DB연동 모듈 설치
    $ apt install php-mysql
  • 버전 확인
    $ mysql -V

DB의 기본 언어셋을 utf8mb4로 설정해준다.

  • 언어셋 설정
    $ vi /etc/mysql/mariadb.conf.d/50-server.cnf
    [mysqld] 항목 아래에 두 줄 추가한다.

    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

    $ service mysqld restart

실사용의 편의를 위해 셸 기반 인증 방식에서 비밀번호 인증 방식으로 바꿔준다.

  • root의 인증 플러그인 정보 제거하기
    $ mysql
    $ use mysql;
    $ update user set plugin=” where User=’root’;
    $ flush privileges;
    $ exit;

 

(6) 보안 설정

(참고) sftp에 루트로 로그인해 파일을 다운, 수정 후 업로드한다.

  • php 실행 확장자 변경 (.php를 제외한 확장자의 접근을 차단한다)
    $ vi /etc/apache2/mods-available/php7.2.conf

    <FilesMatch ".+\.ph(p3|p4|p5|p7|t|tml)$">
        Require all denied
    </FilesMatch>

  • apache2 보안패치 (파일 및 폴더 보호, Web Access가 되어서는 안 될 파일들의 접근 제어)
    /etc/apache2/apache2.conf
    파일 <FilesMatch “^\.ht”> 구문 아래에 추가

    # deny file, folder start with dot
    <DirectoryMatch "^\.|\/\.">
        Require all denied
    </DirectoryMatch>
      
    # deny (log file, binary, certificate, shell script, sql dump file) access.
    <FilesMatch "\.(?i:log|binary|pem|enc|crt|conf|cnf|sql|sh|key|yml|lock|gitignore)$">
        Require all denied
    </FilesMatch>
      
    # deny access.
    <FilesMatch "(?i:composer\.json|contributing\.md|license\.txt|readme\.rst|readme\.md|readme\.txt|copyright|artisan|gulpfile\.js|package\.json|phpunit\.xml|access_log|error_log|gruntfile\.js|config)$">
        Require all denied
    </FilesMatch>
     
    # Allow Lets Encrypt Domain Validation Program
    <DirectoryMatch "\.well-known/acme-challenge/">
        Require all granted
    </DirectoryMatch>

 

(7) phpMyAdmin 설치

  • phpmyadmin 설치
    $ apt install phpmyadmin
    $ sudo vi  /etc/apache2/apache2.conf
    Include /etc/phpmyadmin/apache.conf

    $ service apahce2 restart

phpMyAdmin 접속해서 테이블을 불러올 때 오류가 발생하면 /usr/share/phpmyadmin 폴더를 지운 후, 최신 버전의 phpmyadmin을 내려받아 usr/share/ 경로에 phpmyadmin 폴더명으로 넣어준다. phpMyAdmin

  • phpMyAdmin 암호화 문자열 (blowfish secret) 오류 해결방법
    /usr/share/phpmyadmin/config.sample.inc.php 파일을 수정해
    $cfg[‘blowfish_secret’] = ‘쿠키값’ 적용 후
    config.inc.php로 파일명을 바꿔준다.
    쿠키값 생성

 

(8) 기타 프로그램 설치 및 재시작

  • Unzip 설치
    $ apt install unzip
  • Sendmail 설치
    $ apt install sendmail
  • 적용을 위해 서비스 재시작
    $ service apache2 restart
    $ service mysqld restart
    또는
    $ reboot

 

(9) Let’s Encrypt SSL 인증서 발급받기

  • 인증서 발급 프로그램 설치
    $ apt-get install letsencrypt

Let’s Encrypt는 HTTP(HTTPS)-based DCV를 사용하여 인증한다. 따라서 해당 도메인에 대한 HTTP 접속이 가능해야 한다.

  • 명령어 예시
    $ letsencrypt certonly --webroot --webroot-path=/var/www/html -d urdomain.com -d www.urdomain.com

  • 명령어 설명
    -d 뒤쪽에 원하는 도메인명 입력, 한 인증서가 최대 100개의 도메인 인증이 가능하다. 일반적으로는 기본도메인과 www 도메인 두 개를 지정한다. 외부 인증프로그램이 -d에 지정된 도메인 사이트에 접속한다.
    -webroot-path는 웹루트 경로다. 보통 index 페이지가 위치하는 경로다. 인증 프로그램이 이 경로에 임시로 파일을 생성하고, 외부 인증프로그램이 이 파일에 접근할 수 있다면 Domain Validation이 되는 것이다.
  • /etc/letsencrypt/live/[인증서명]/ 위치에 발급된다.
    cert.pem – 인증서 파일
    chain.pem – 인증서 발급자 파일
    fullchain.pem – cert.pem 과 chain.pen 을 하나로 합쳐놓은 파일
    privkey.pem – 인증암호를 해독하는 개인키
    Apache2 서버에서는 cert.pem, chain.pem, privkey.pem을 사용
    Nginx 서버에서는 fullchain.pem, privkey.pem을 사용

Let’s Encrypt 는 3개월짜리 인증서를 발급해준다. 즉 인증서를 3개월마다 주기적으로 갱신(renewal)해 주어야 한다. 갱신은 만료일 기준 1개월 전부터 할 수 있다.

  • 인증서 갱신하기
    $ letsencrypt renew
  • 인증서 갱신 프로그램 주기적으로 실행하기
    $ crontab -e
    만약 에디터 선택 문구가 출력된다면 3번을 누른다.
    10 5 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
    15 5 * * 1 /usr/sbin/service apache2 reload

    매주 월요일 새벽 5시 10분에 인증서 갱신, 5시 15분에 웹서버 프로그램 변경사항 적용이 설정됐다.

추후 도메인 추가 등의 이유로 인증서 교체가 필요할 경우 아래 과정을 따른다.

  • $ a2dissite 환경설정파일명(10번 참고)
    $ systemctl reload apache2
  • 사용 중인 인증서 목록 보기(인증서명 확인)
    $ cd /etc/letsencrypt/live
    $ ls
  • 인증서 삭제
    $ letsencrypt revoke –cert-path /etc/letsencrypt/archive/urdomain.com(인증서명)/cert1.pem
  • 재발급

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

자신의 사이트에 맞게 수정한 후, 원하는파일명.conf로 /etc/apache2/sites-available/ 폴더에 저장한다.

  • <VirtualHost *:80>
     
        ServerName example.com
        ServerAlias www.example.com
         
        <IfModule mod_rewrite.c>
        RewriteEngine on
     
        RewriteRule ^ - [E=protossl]
        RewriteCond %{HTTPS} on
        RewriteRule ^ - [E=protossl:s]
     
        RewriteCond %{HTTPS} !=on
        RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
     
        </IfModule>
     
    </VirtualHost>
     
     
    <VirtualHost *:443>
     
        ServerName example.com
        ServerAlias www.example.com
         
        DocumentRoot /home/user/www
     
        <Directory /home/user/www>
            Options FollowSymLinks MultiViews
            AllowOverride All
            require all granted
        </Directory>
     
        AssignUserID user user
     
        ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
        CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
     
        Header always set Strict-Transport-Security "max-age=31536000"
     
        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 "/etc/letsencrypt/live/example.com/cert.pem"
        SSLCertificateKeyFile "/etc/letsencrypt/live/example.com/privkey.pem"
        SSLCertificateChainFile "/etc/letsencrypt/live/example.com/chain.pem"
     
    </VirtualHost>

    이후 수정은 터미널로 해도 좋다.
    $ vi /etc/apache2/sites-available/원하는파일명.conf

  • 사이트 활성화 및 적용
    $ a2ensite 환경설정파일명
    (참고) 비활성화는 a2dissite
  • 아파치 설정 다시 불러오기
    $ service apache2 reload

 

(11) mysql 계정생성

  • 도메인(IP)/phpmyadmin로 접속해 계정을 만들어준다.

 

(12) php.ini 설정

/etc/php/7.2/apache2/php.ini는 Apache2 – PHP일 때 참조하는 설정파일,
/etc/php/7.2/cli/php.ini는 Console에서 PHP를 직접실행할 때 참조하는 설정파일이다.

  • php.ini 설정
    $ vi /etc/php/7.2/apache2/php.ini
    (수정예시)
    max_execution_time = 1200
    max_input_time = 1200
    max_input_vars = 10000
    memory_limit = 256M
    post_max_size = 2000M
    upload_max_filesize = 1024M
    max_file_uploads = 100
  • 아파치 재시작
    $ service apache2 restart

 

(13) SSL 테스트

웹서버를 설치했으면 SSL이 정상적용되었는지 확인해본다. 433 포트를 열어놨어야 한다.

Chain Test는 모두 Valid이어야 하고, SSL Algorithm Test는 A 이상이면 정상적인 운영이 가능

 

(14) Amazon Lightsail 추가 디스크 마운트

  • 연결된 디스크 확인
    $ lsblk

/dev/xvdf 경로의 디스크가 연결되었다 가정한다.

  • 파일 시스템이 있는지 확인
    $ file -s /dev/xvdf

/dev/xvdf: data 같은 결과가 출력되면 새로운 디스크이므로 파일시스템을 생성한다. 아닌 경우 파일시스템 생성은 건너뛴다.

  • ext4 파일시스템 생성(새로운 디스크만)
    $ mkfs -t ext4 /dev/xvdf
  • 디스크 마운트
    $ mount /dev/xvdf 마운트할위치

재부팅 시 디스크 마운트가 풀린다면 아래를 참고한다.

  • 자동으로 디스크 탑재
    $ vi /etc/fstab
    /dev/xvdf /data ext4 defaults, nofail 0 2

    재부팅 시 /dev/xvdf 경로의 디스크를 /data에 탑재하도록 설정됐다.

자세한 내용은 라이트세일 설명서 참고

 

(15) 명령어 참고

  • 계정생성
    $ adduser 계정명
  • 계정삭제
    $ userdel -r 계정명
  • 디렉터리 생성
    $ mkdir 폴더명
  • 소유자와 그룹 변경
    $ chown -R
    (예시) $ chown -R test:test /targetdirectory
  • 권한 변경
    $ chmod 옵션 모드 파일명
  • 복사
    $ cp -pr
    (예시) $ cp -pr /sourcedirectory/www /targetdirectory
    sourcedirectory에 있는 www 폴더를 targetdirectory 밑으로 복사한다.
    -p 시간과 권한을 그대로 보존하여 복사한다.
    -r 하위 디렉터리와 파일을 모두 복사한다.

자세한 내용은 명령어사전 참고

 

(16) 참고사항

  • 데이터베이스 기본경로
    /var/lib/mysql

Related Posts:

6
0
여러분의 생각을 댓글로 남겨주세요!x
()
x