NAS

자작 NAS - ownCloud SSL 보안설정

coucou3 2020. 2. 21. 00:40
반응형

ownCloud와 파일공유를 안전하게 하기 위해 SSL을 설정해보자.

ownCloud의 공식 Document 따라 Let's Encrypt를 설치한다.

 

Let's Encrypt

 

https://doc.owncloud.com/server/admin_manual/installation/letsencrypt/using_letsencrypt.html#introduction

 

Using Let’s Encrypt SSL Certificates

 

doc.owncloud.com

 

 

 

 

 Let's Encrypt 설치 

 

 

 

1) certbot 설치

 

apt로 certbot을 설치한다.

$ sudo apt-get install certbot

 

 

 

 

2) 이메일 주소 등록

 

Certbot이 설치되었다면, 긴급 복구와 보안 알림을 위한 이메일을 등록하자.

$ sudo certbot register --agree-tos --email <email주소>

...

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

 

/etc/letsencrypt 경로에 계정 인증서가 저장되었고, 이 폴더를 백업해 놓으라는 중요 안내가 나온다.

가이드에서도 따라하라고 강력하게 추천한다.

$ cp -r /etc/letsencrypt <백업경로>

 

 

 

 

3) 설정 파일 생성

 

다음 명령어를 통해 파일들을 생성한다.

<your-domain-nam>에는 도메인 주소를 넣어준다.

$ cd /etc/letsencrypt
$ sudo touch cli.ini list.sh renew.sh renew-cron.sh delete.sh <your-domain-name>.sh

 

cli.ini를 제외한 모든 스크립트 파일에는 쓰기 권한을 준다.

$ sudo chmod +x list.sh renew.sh renew-cron.sh delete.sh <your-domain-name>.sh

 

 

 

만든 파일들을 작성할 차례다.

모두 $ sudo vim을 통해 열어서 작성한다.

 

cli.ini

Certbot의 기본 설정을 담당한다.

rsa-key-size = 4096
email = <your-email-address>
agree-tos = True
authenticator = webroot
post-hook = service apache2 reload

 

 

list.sh

발행된 모든 인증서를 보여준다.

#!/bin/bash

LE_PATH="/usr/bin"
LE_CB="certbot"

"$LE_PATH/$LE_CB" certificates

 

 

renew.sh

발행된 모든 인증서를 갱신한다.

또한, cli.ini에서 post hook을 enable했다면 인증서가 갱신될 때 웹서버를 reload한다.

#!/bin/bash

LE_PATH="/usr/bin"
LE_CB="certbot"

"$LE_PATH/$LE_CB" renew

 

 

renew-cron.sh

renew.sh와 같지만 Certbot을 업그레이드하지 않는다.

Cron을 통해 사용된다.

#!/bin/bash

LE_PATH="/usr/bin"
LE_CB="certbot"

"$LE_PATH/$LE_CB" renew --no-self-upgrade --noninteractive

 

 

delete.sh

발행된 인증서를 삭제한다.

#!/bin/bash

LE_PATH="/usr/bin"
LE_CB="certbot"

##
## Retrieve and print a list of the installed Let's Encrypt SSL certificates.
##
function get_certificate_names()
{
  "$LE_PATH/$LE_CB" certificates | grep -iE "certificate name" | awk -F: '{gsub(/\s+/, "", $2); printf("- %s\n", $2)}'
}

echo "Available Certificates:"

get_certificate_names
echo

read -p "Which certificate do you want to delete: " -r -e answer
if [ -n "$answer" ]; then
  "$LE_PATH/$LE_CB" delete --cert-name "$answer"
fi

 

 

<your-domain-name>.sh

도메인에 해당하는 인증서를 만든다.

DOMAINS에는 인증서를 발행할 도메인과 하위 도메인을 적어 넣는다.

#!/bin/bash
# export makes the variable available for all subprocesses

LE_PATH="/usr/bin"
LE_CB="certbot"

# Assumes that example.com www.example.com and subomain.example.com are the domains
# that you want a certificate for
export DOMAINS="-d example.com -d www.example.com -d subdomain.example.com"

"$LE_PATH/$LE_CB" certonly --config /etc/letsencrypt/cli.ini "$DOMAINS" # --dry-run

 

 

 

 

4) SSL 증명서 생성

 

SSL 증명서를 만들기 위해 아래 명령어를 통해 방금 만든 스크립트를 실행한다.

$ sudo /etc/letsencrypt/<your-domain-name>.sh

 

 

아래와 같이 webroot를 입력하라고 나온다.

owncloud의 경로를 입력한다(예 : /var/www/owncloud)

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for <your-domain>
Input the webroot for <your-domain>: (Enter 'c' to cancel):

 

 

뭔가 진행되는 듯 하더니 실패하고 만다.

Input the webroot for <your-domain>: (Enter 'c' to cancel): /var/www/owncloud
Waiting for verification...
Cleaning up challenges
Running post-hook command: service apache2 reload
Failed authorization procedure. <your-domain> (http-01): urn:ietf:params:acme:error:caa :: CAA record for enji.ipdisk.co.kr prevents issuance

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: <your-domain>
   Type:   None
   Detail: CAA record for <your-domain> prevents issuance

 

 

 

두가지 문제가 있었다.

 

(1) ipTime 공유기의 DDNS로 생성한 도메인 *.iptime.org의 경우 Let's Encrypt를 사용할 수 없다.

해당 도메인으로 너무 많은 인증서가 발급되어 더이상 진행이 안되는 것 같다.

 

 

다행히 공유기에서 다른 도메인을 생성할 수 있다.

공유기 모델명에 NS가 붙은 모델은 공유기에 USB 포트가 있고, 이걸 NAS처럼 사용할 수 있는 기능을 제공한다.

 

'USB/서비스 관리 - 서비스 설정'에서 새로운 도메인을 설정할 수 있다.

이제 *.iptime.org 대신 *.ipdisk.co.kr 주소도 사용 가능하다.

(공유기 사양에 따라 *.ipdisk.co.kr를 제공하지 않을 경우, 다른 무료 발급 ssl 서비스가 필요하다.)

 

 

ownCloud 설정에도 새로운 주소를 추가해 준다.

$ sudo vim /var/www/owncloud/config/config.php
...
  'trusted_domains' =>
  array (
          0 => 'xxx.xxx.xxx.xxx',
          1 => '<your-domain>'
  ),
...

 

 

 

(2) 두번째 문제는 테스트 경로가 없어서인 것 같다.

ownCloud 경로 아래에 새로운 디렉토리를 만든다.

/var/www/owncloud/.well-known/acme-challenge

$ sudo mkdir /var/www/owncloud/.well-known
$ sudo mkdir /var/www/owncloud/.well-known/acme-challenge

 

 

 

<your-domain>.sh를 실행하면, 성공!

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/<your-domain>/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/<your-domain>/privkey.pem
   Your cert will expire on 2020-05-16. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 

 

 

생성된 인증서는 90일 동안 유효하며, 위에서 만들었던 list.sh를 실행하여 확인할 수 있다.

$ sudo ./list.sh 
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: <your-domain>
    Domains: <your-domain>
    Expiry Date: 2020-05-16 06:43:35+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/<your-domain>/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/<your-domain>/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

 

 

 

 

 Apache 웹서버 설정 

 

이제 생성한 인증서를 Apache 설정해 적용해야 한다.

Let's Encrypt의 Apache 설정 가이드를 따른다.

https://doc.owncloud.com/server/admin_manual/installation/letsencrypt/apache.html

 

Configure Apache with Let’s Encrypt

Learn how to configure Apache with Let's Encrypt, using Ubuntu Linux 18.04, for use with ownCloud.

doc.owncloud.com

 

 

 

 

1) Diffie-Hellman Params File 생성

 

Apache 2.4.8 이상, OpenSSL 1.0.2 이상을 사용하면 DH param 파일을 만들고 설정할 수 있다. VirtualHost 파일에 추가되어 있지 않다면, SSLOpenSSLConfCmd 명령과 새로운 인증서를 추가하여 보안을 증강하라.

라는데.. 무슨 말인지 하나도 모르겠다. 가이드를 따라하자.

 

 

 

생성한 인증서 *.pem을 원하는 위치(/etc/apache2/를 추천)에 두고, 아래 명령어를 실행하여 인식시켜주는 것 같다.

$ sudo openssl dhparam -out /etc/apache2/인증서.pem 4096
-----------------------------------------------------------------------------
---------------------------------+-------------------------------------------
----------------------------------------------+------------------------------
...

 

명령어를 입력하면 완료되는데 한참 시간(약 10분 이상)이 걸린다. 

 

 

 

완료되면 아래 내용을 common SSL 설정에 추가한다.

SSLOpenSSLConfCmd DHParameters /etc/apache2/인증서.pem

 

 

 

/etc/apache2/sites-available 아래에 ownCloud 설정파일

$ sudo vim /etc/apache2/sites-available/ownCloud.conf 
...
<VirtualHost *:443>
...
	ServerName <your-domain>
	SSLOpenSSLConfCmd DHParameters /etc/apache2/인증서.pem
...
</VirtualHost>

 

 

 

 

2) Let's Encrypt ACME-Challenge

 

Let's Encrypt에서 인증서를 받으면 구글 서버는 Chanllenge를 통해 발급받은 인증서의 유효성을 검사한다.

https://letsencrypt.org/ko/docs/challenge-types/

 

도전 유형 - Let's Encrypt - 무료 SSL/TLS 인증서

마지막 업데이트:Feb 25, 2019 | 모든 문서를 참조 Let’s Encrypt에서 인증서를 받으면 Google 서버는 ACME 표준에 정의된 대로 “도전”을 사용하여 해당 인증서의 도메인 이름을 제어하는지 확인합니다. 대부분의 경우 이 유효성 검사는 당신의 ACME 클라이언트가 자동으로 처리하지만 보다 복잡한 구성 결정이 필요한 경우 이에 대해 더 자세하게 알아두는 것이 좋습니다. 확실하지 않은 경우 클라이언트의 기본값 또는 HTTP-01을 사용하

letsencrypt.org

 

 

 

위에서 수정한 ownCloud 설정 파일을 조금만 수정하여 해당 유효검사를 활성화시킬 수 있다.

이번엔 VirtualHost 80에 아래 내용을 추가한다. (Alias와 Directory)

<virtualHost *.80>
	ServerName <서버 도메인>
	...
	Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
	<Directory "/var/www/letsencrypt/.well-known/acme-challenge/">
		Options None
		AllowOverride None
		ForceType text/plain
		RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
	</Directory>

	# ... remaining configuration
</virtualHost>

 

 

 

 

 

3) SSL VirtualHost 설정 생성

 

아래와 같이 이동하여 설정 파일을 생성한다.

$ cd /etc/apache2
$ sudo mkdir ssl_rules
$ touch ssl_rules/ssl_<your-domain>

 

그리고 해당 파일을 열어 아래처럼 설정 값을 넣어준다.

$ sudo vim /etc/apache2/ssl_rules/ssl_<your-domain>
# Eases letsencrypt initial cert issuing

SSLEngine on
SSLCertificateChainFile  /etc/letsencrypt/live/<your-domain>/fullchain.pem
SSLCertificateKeyFile    /etc/letsencrypt/live/<your-domain>/privkey.pem
SSLCertificateFile       /etc/letsencrypt/live/<your-domain>/cert.pem

 

 

/etc/letsencrypt/live 아래 <your-domain>경로와 그 아래 키들은 위에서

<your-domain>.sh 실행결과 생성된 키 파일이다.

 

 

 

 

 

4) 테스트

 

아래 명령어로 ssl 설정이 잘 되었는지 확인한다.

$ sudo apache2ctl configtest
$ sudo apache2ctl -t

 

아무런 에러가 나지 않는다면 성공.

만약 에러가 난다면 $ sudo apache2ctl graceful로 아파치 설정을 다시 로드하고 시도한다.

 

혹시나 그래도 안된다면...

더보기

$ sudo /etc/letencrypt/<your-domian>.sh 를 다시 실행하여 인증서를 새로 발급받고,

$ sudo /etc/letsencrypt/list.sh 로 새로 받은 인증서를 확인한 다음 테스트를 진행한다.

 

 

마지막으로 아파치를 리로드하면 내 도메인으로 SSL 증명서를 이용한 HTTPS 요청을 사용할 수 있다.

$ sudo service apache2 reload

 

 

 

 

 


 

 

 

이제부터 https를 통한 접속이 가능하다.

또한 보안 에러를 내며 연결이 되지 않던 iOS ownCloud 앱도 정상적으로 연결된다.

보안을 위해 80포트에 대한 포트포워딩을 끄고, 443포트만 열어두도록 하자.

반응형