Connecting

Apache 리버스 프록시 SSL 셋팅하기 본문

개발

Apache 리버스 프록시 SSL 셋팅하기

팬도라 2018. 10. 5. 18:47
반응형

Apache2 Reverse Proxy Setting

  • Setting Environment
    • Ubuntu Server 18.04.1 LTS
    • Apache2 2.4.29

Reverse Proxy

  • 리버스 프록시는 외부 네트워크에서 접속 요청이 들어왔을 때, 해당 요청을 내부 서버로 전달하는 중계기 역할을 담당합니다.
  • 실제 운영중인 서버가 외부에 직접 노출되지 않고 Private Network에서 동작하기 때문에 보안이 향상되며, 프록시 서버에 인증 기능을 갖추는 경우도 있습니다.
  • 로드 밸런싱의 역할을 담당함으로서, URL에 따라 서버를 분기하며, 정적 콘텐츠를 캐싱하여 웹서버에 부하를 줄이는 역할을 담당합니다.

Software

  • Squid

  • Apache

  • Lighttpd

  • Varnish Cache

  • Nginx

Install Server

  • 위와 같이 다양한 오픈소스 소프트웨어를 통해서 리버시 프록시 기능을 구현할 수 있으며, 본 연구실에서는 Apache를 활용하여 구성을 진행하도록 하겠습니다.

  • 설치환경은 ESXi 6.5 기반에 Ubuntu Server 18.04.1 LTS Version을 사용하였습니다.

  • 설치가 완료되면 SSH를 통해 서버에 접속하고 다음과 같이 기본 환경 설정을 진행합니다.

    $ sudo apt update && sudo apt upgrade -y 
    $ sudo apt install nmap git nload build-essential -y
    $ sudo dpkg-reconfigure tzdata
        Asia/Seoul
    $ sudo reboot
  • 다음 명령을 실행하여 Apache를 설치하고 리버시 프록시 사용을 위한 설정을 진행합니다.

    $ sudo apt install apache2 -y 
    $ nmap localhost 
    
    Starting Nmap 7.60 ( https://nmap.org ) at 2018-10-04 16:27 KST
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.00011s latency).
    Other addresses for localhost (not scanned): ::1
    rDNS record for 127.0.0.1: localhost.localdomain
    Not shown: 997 closed ports
    PORT    STATE SERVICE
    22/tcp  open  ssh
    80/tcp  open  http
    443/tcp open  https # SSL 미설정시 보이지 않을 수 있음.
    
    $  sudo systemctl status apache2
    ● apache2.service - The Apache HTTP Server
       Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
      Drop-In: /lib/systemd/system/apache2.service.d
               └─apache2-systemd.conf
       Active: active (running) since Thu 2018-10-04 06:09:55 KST; 10h ago
      Process: 5396 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
      Process: 6370 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
      Process: 5401 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
     Main PID: 5417 (apache2)
        Tasks: 55 (limit: 4915)
       CGroup: /system.slice/apache2.service
               ├─5417 /usr/sbin/apache2 -k start
               ├─7428 /usr/sbin/apache2 -k start
               └─7429 /usr/sbin/apache2 -k start
  • 웹 브라우저로 접속시 다음과 같은 화면이 뜨면 정상적으로 설치된 것입니다.

  • 다음은 Apache에서 Reverse Proxy 설정을 위한 모듈을 활성화 합니다.

    $ sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests rewrite deflate headers proxy_balancer proxy_connect proxy_html proxy_wstunnel proxy_balancer lbmethod_byrequests
    
    $ sudo systemctl restart apache2

Let's Encrypt - Free SSL/TLS Certificates

  • SSL 인증서를 설정하기 위하여 무료 SSL/TLS Certificates 서비스인 Let's Encrypt으로 인증서를 받아보겠습니다.

  • 서버에는 반드시 도메인 주소가 등록되어 있어야 합니다.

    • freenom
    • gandi
    • cloudflare
  • certbot을 다음과 같이 설치합니다.

    $ sudo apt update
    $ sudo apt install software-properties-common
    $ sudo add-apt-repository ppa:certbot/certbot
    $ sudo apt update && sudo apt upgrade -y 
    $ sudo apt-get install python-certbot-apache -y 
  • 와일드카드로 서브도메인을 동록하기 위해서는 다음과 같이 입력합니다.

    $ sudo certbot -a dns-plugin -i apache -d "*.example.com" -d example.com --server https://acme-v02.api.letsencrypt.org/directory
    
  • 연구실에서 사용하는 gandi 도메인의 경우 와일드카드를 아직 지원하지 않기 때문에 서브 도메인을 직접 등록합니다.

    sudo certbot --apache -d example.com -d www.example.com
    • 짧은 시간 반복적으로 키를 발급받을 경우 일시적으로 키 발급이 중지됩니다.
    • https://www.sslshopper.com/ssl-checker.html
      • 위의 사이트에서 발급받은 도메인에 SSL 인증서가 정상적으로 등록되었는지 확인합니다.

Reverse Proxy Setting

  • 디렉토리를 이동하여 리버스 프록시 셋팅을 진행합니다.

    $ cd /etc/apache2/sites-available/
    $ sudo vi 000-default.conf 
    <VirtualHost *:80>
      ServerName example.com
      ServerAlias www.example.com
      ServerAdmin contact@example.com
    
      RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    
      ErrorLog ${APACHE_LOG_DIR}/example-error.log
      CustomLog ${APACHE_LOG_DIR}/example-access.log combined
    </VirtualHost>
    
    <VirtualHost *:443>
      ServerName example.com
      ServerAlias www.example.com
      ServerAdmin contact@example.com
    
      ProxyRequests Off
      SSLProxyEngine on
    
      ProxyPreserveHost On
      AllowEncodedSlashes NoDecode
    
      <Proxy *>
        Order deny,allow
        Allow from all
      </proxy>
    
      SSLEngine on
      SSLProxyVerify none
      SSLProxyCheckPeerCN off
      SSLProxyCheckPeerName off
      SSLProxyCheckPeerExpire off
    
      SSLCertificateFile "/etc/letsencrypt/live/example.com/cert.pem"
      SSLCertificateKeyFile "/etc/letsencrypt/live/example.com/privkey.pem"
      SSLCertificateChainFile "/etc/letsencrypt/live/example.com/chain.pem"
    
      ProxyPass / http://127.0.0.1:8100/ nocanon
      ProxyPassReverse / http://127.0.0.1:8100/
    
      RequestHeader set X-Forwarded-Proto "https"
      RequestHeader set X-Forwarded-Port "443"
    
      ErrorLog ${APACHE_LOG_DIR}/example-error.log
      CustomLog ${APACHE_LOG_DIR}/example-access.log combined
    </VirtualHost>
  • 파일을 수정한 다음에는 Apache에 해당 파일을 등록하는 절차를 진행해야 합니다.

    $ sudo a2ensite 000-default.conf
    & sudo systemctl restart apache2
  • 다른 서브 도메인에 대해서도 위와 같은 방법으로 conf 파일을 생성하고 저장합니다.

  • Certbot 인증서를 삭제하고자 할 때는 다음과 같이 입력한다.

    $ sudo certbot delete --cert-name example.com

troubleshooting

  • 시스템 재시작시 오류가 발생한 경우 해당 로그를 확인하여 오타나 해당 모듈을 활성화 했는지 확인합니다.

  • 에러로그 파일은 다음에서 볼 수 있습니다.

    $ cd /var/log/apache2/
    $ cat error.log

'개발' 카테고리의 다른 글

PART 1 Build a fault tolerant system  (0) 2019.10.10
CI/CD Concept  (2) 2019.01.11
SCOUTER 간단 사용설명서  (0) 2018.06.27
운영체제 교착상태 및 메모리 관리  (0) 2018.06.07
Jersey를 활용한 RESTful 이해하기  (6) 2018.06.03
Comments