오드로이드/XU4 + OMV(펌)

오드로이드 XU4 + OMV 로 자작 NAS 구축하기 - SSL 적용하기(펌)

타카스 류지 2018. 3. 20. 13:36

* SSL 적용은 옵션입니다.

* SSL 적용 시 20~30%, 많게는 50% 이상 속도가 저하될 수 있습니다. 통신 패킷 암호화 때문인 것 같은데, FTP로 고화질 동영상 스트리밍 등 빠른 전송 속도를 위해선 SSL이 없는 상태로 접속해 사용하세요. 중요한 파일을 다루거나, 중요한 파일로 접근할 수 있는 계정을 사용할 때 카페 등 공용 인터넷이 불안하시다면 SSL을 사용하시면 되겠습니다. 대부분의 720p나 TV 예능 정도의 1080p 동영상 스트리밍에는 문제가 없을 겁니다.

SSL은 TLS(Transport Layer Security)라고도 불리는 보안 소켓 레이어입니다. 전송 계층 보안이라는 의미의 TLS가 더 받아들이기 쉬운 이름인 것 같네요.

원래 인터넷은 전부 패킷의 이동입니다. 패킷은 데이터 조각이라고 보시면 되는데, 머리부분에 출발지와 도착지의 정보를 포함한 여러 정보가, 몸통 부분에 보내고 받고자 하는 필요한 데이터들이 들어 있어요. 이런 수없이 많은 패킷이 인터넷 세상에 뿌려져 도착지까지 잘 이동하는 겁니다.

근데 몸통부분에 데이터를 넣을 때 암호화하지 않으면, 패킷의 이동 경로에 있는 누구나 그 데이터를 볼 수 있어요. 요새는 대표적으로 공유기인데, 카페나 식당 등에서 제공되는 무료 와이파이가 그래서 위험합니다. 경로상의 패킷을 잡아내는 프로그램이 있어요. 이런 프로그램과 여러 다른 툴들을 잘 섞어 쓰면 내가 어느 사이트에 어떤 계정과 비밀번호로 로그인하는 지도 알아낼 수 있습니다. 살짝 네트워크 + 웹 해킹을 조금 공부한 적이 있었는데, 거의 대부분의 웹 사이트는 사실 굉장히 취약해요.

그래서 여러 유명 웹사이트 관리자들은 이런 보안 문제를 중요하게 생각해왔습니다. 결국 SSL이 탄생했어요.

SSL은 간단하게 인증서 + 공개키 + 대칭키 암호화 방식으로 암호화를 진행하는 겁니다. 자세한 건 모르셔도 되지만(저도 잘 모르지만), 아무튼 엄청나게 암호화시키고 놉니다. 인증서도 빼고 간략하게 한 버전이 제가 예전에 다룬 Node.js 와 Android 간 RSA + AES 암호화 방식이겠네요. 이렇게 되면 중간에 누군가 패킷을 가로채더라도 복호화 키가 없어 어떤 데이터인지 알아볼 수 없어요.

참고로 SSL은 데이터 통신 그 자체에만 보안이 좋을 뿐이지, 악성 코드를 SSL 방식으로 보내거나 하는 건 가능하기 때문에 약간 다르게 보셔야 합니다.

아무튼 SSL의 중요성이 점점 높아지는 추세인 걸로 보입니다. 예전엔 인증서를 얻기도 어려웠는데, 이젠 누구나 간단하게 인증서를 얻을 수 있어요. 간단하게 얻으러 갑시다.


* Let's Encrypt를 사용하지 않더라도 자체 인증서를 생성할 수 있습니다. 하지만 이럴 경우 사이트 접속 시마다 인증서의 인증 기관이 신뢰받지 않았다는 이유로 경고창이 매번 보여집니다. 따라서 조금 어렵더라도 Let's Encrypt 사용을 권장합니다.




0. 포트포워딩

80번, 443번이 오드로이드 NAS로 포트포워딩 되어 있어야 합니다.



1. OMV Let's Encrypt 설치

OMV 플러그인 메뉴에서 Let's Encrypt 검색 후 설치합니다.




2. Let's Encrpyt 로 인증서 발급

여기선 OMV 관리자 페이지에 대한 SSL 인증서를 발급받아 사용해보겠습니다.

OMV의 Let's Encrypt 메뉴로 갑시다.

뭔가 어려워보입니다. 얘를,

이런 식으로 바꿔 넣어 줍시다. OMV 관리자 페이지에 대한 도메인 주소를 넣고, 전자우편에는 자신이 정말로 사용하는 이메일 주소를 넣습니다. 그리고 Schedule Refresh를 활성화한 후 저장/적용 합니다.

저 이메일 주소에 SSL 인증서 재발급, 만료 알림이 보내질 겁니다.

그 다음 Generate Certificate 버튼을 누르면,

이렇게 축하해줍니다.

그리고 왠지 변경된 설정을 적용하라는 알림이 뜰 텐데요, 적용 해줍시다. 그러고 나면 곳곳에 추가된 게 있을 거에요.

일단 OMV 인증 메뉴 - SSL을 가봅시다.

새롭게 발급 받은 인증서가 추가된 걸 보실 수 있습니다.

그리고 OMV 예약된 작업 메뉴로 가봅시다.

작업이 하나 생겨 있네요, 매월 수행되는 작업이고, omv-letsencrypt 명령을 실행하나 봅니다. 설명을 보니 Let's Encrypt 플러그인으로 받은 인증서를 계속 최신화 시켜주는 작업이며, 여기서 삭제하면 안 되고 플러그인을 통해 비활성화 시키라네요.



3. 적용

성공적으로 인증서를 발급받았으니 바로 적용해 봅시다. OMV 일반 설정 메뉴로 갑시다.

보안 연결 관련 설정이 있어요. 얘를 활성화시켜주고, 인증에 방금 발급받은 인증서를 선택해 줍니다.

이렇게요. 그리고 저장, 적용하시면 됩니다.

그리고 https://{도메인} 으로 가봅시다! 전 https://omv.awesometic-test.kro.kr/ 이네요. 도메인 때문에 다들 접속하실 수 있을 듯 :)


이랬던 애가,


이렇게 바뀌었습니다. 누가 봐도 안전해졌네요!

지금은 강제 SSL/TLS 옵션이 꺼져 있기 때문에 SSL이 없는 http:// 로도 접속이 가능합니다. 저 옵션을 켜주시면 SSL(https)로만 접속이 가능해져요.



* OMV의 Let's Encrypt로 발급받으려는 인증서가 2개 이상일 때

OMV 에서는 Let's Encrypt 플러그인을 통한 인증서가 최대 하나밖에 지원이 안 됩니다. 하나를 더 생성하면, 생성이 되더라도 OMV SSL 인증서 목록에 가장 최근에 생성한 하나만 떠요. 아니면 그냥 에러가 나버립니다.

그래서 만약 위의 예시처럼 내가 이미 OMV 관리자 페이지를 위한 인증서를 하나 발급받았는데, 한 개 더 Seafile에 쓰일 인증서로 발급받고 싶다! 하셔서 플러그인을 통해 발급을 받는다 해도 기존의 OMV 도메인에 대한 인증서는 없어집니다.

사실 굉장히 불편하고 이상하게 만들어졌어요.

그래서 제 나름대로 인증서는 터미널에서 발급받고, OMV SSL 인증서 목록에 직접 추가해주는 방법을 생각해냈습니다. 이렇게 해도 플러그인으로 발급받은 인증서와 함께 매월 갱신 될 것 같아요. => 실제로 갱신되는 지 확인해 봐야 합니다.

어려워 보이지만, 사실 한 두번 해보면 굉장히 쉽습니다.

0) Nginx에 새로운 서버 추가/설정

Webroot 플러그인을 이용한 SSL 인증서를 받기 위해 Nginx 서버들의 설정을 바꿔줘야 합니다. 자세한 내용은 바로 다음 단계에서 진행됩니다.

인증서를 발급해주기 전 Nginx 에 서버가 등록되어 있어야 합니다. 도메인을 사용할 경우 Nginx에서 그 도메인에 대해 필요한 서비스로 들어가게끔 해줘야 하거든요.

가이드를 처음부터 따라오셔서 도메인도 추가하신 분은 추가 옵션 맨 밑에 아래 내용만 넣어주시면 됩니다.

Nginx가 웹 사이트 소스에 직접 접근한다면 root 부분을 주석처리 해주세요. 그게 아니라면 root 부분에 해당하는 디렉토리를 만들고 진행해야 합니다. 다음 단계에서 설명됩니다.

location ^~ /.well-known/acme-challenge/ {
    root /var/www/sub.example.com;
    allow all;
    default_type "text/plain";
}
nginx

이렇게 될 겁니다.

* FTP의 경우 새로 만드셔서 추가 옵션에 저 내용만 넣으시면 될 것 같습니다만, 아직 테스트 중입니다. 기본적으로 Nginx는 HTTP 서버지 FTP서버가 아니기 때문에, HTTP 서버에 임시로 저렇게 해서 인증서를 발급받아도 FTP에 사용할 수 있는 지 테스트해보고 업데이트 하겠습니다.


1) SSH 접속 후 인증서 발급

지금까지 강좌를 잘 따라오신 분들이라면, 터미널에 Putty 프로그램을 이용해 SSH로 접속하는 건 이미 익숙해졌을 겁니다.

접속해 들어갑니다.

SSL 인증서 발급에는, OMV로 하실 때 보셨는 지 모르겠지만 Webroot 플러그인을 사용해서 발급하셨을 겁니다. OMV 에선 필수인데, 사실 필수는 아니고 플러그인 형식으로 명령어의 옵션을 통해 주입해서 사용하는 거에요. Webroot를 사용하지 않는 Standalone 방식도 있습니다.

Webroot 플러그인을 사용할 경우 인증서 갱신이나 인증서 관련 문제들을 해결할 때 서버를 멈추지 않아도 되기 때문에 요새 대부분의 서버에서 인증서를 발급받을 때 해당 플러그인을 사용한다고 합니다.

Webroot 플러그인은 서버 내에 해당 웹 사이트 소스 파일 경로가 존재하는 지 유효성을 판단합니다. Web root는 그 웹 사이트 소스의 경로라고 생각하시면 돼요. 플러그인을 사용할 때 웹 사이트 소스 경로를 지정하며, 사용할 경우 사이트 소스 파일 경로에 임시 디렉토리와 임시 파일이 생겨 인증 기관에서 도메인을 통해 직접 그 파일에 접근해 비교함으로써 유효성이 판단됩니다.

위의 설정을 한 이유도 그것 때문입니다. 임시로 디렉토리를 만들어 그 곳에 접근하는데, example.com/.well-known/acme-challenge 도메인으로 들어와 임시로 만들어진 파일을 읽습니다. 그래서 Nginx 설정에 해당 경로로 들어오는 건 모두 허용해 줘라 설정해 주는 것입니다. root는 웹 사이트 소스가 없는 페이지의 경우(Reverse proxy 서버로 사용할 경우) 해당 디렉토리를 못 찾을테니 임시로 지정해준 겁니다.

저희는 그런 Webroot 플러그인을 사용한다고 가정하겠습니다.

여기서 두 가지로 나눠집니다.

Wordpress 등 소스 파일을 받아서 열거나, 직접 웹사이트 소스를 작성해 여는 경우)

이럴 경우엔 보통 /var/www/wordpress/ 경로 아래에 index.html나 index.php 등이 있을 겁니다. Nginx가 그 index 파일을 찾아서 클라이언트한테 보내주는 거에요. 그렇기 때문에 Webroot 플러그인을 사용할 때 해당 웹 사이트 소스 파일 경로로 지정해주시면 됩니다.

아래의 명령어를 입력해줍시다. {경로} 에는 웹 사이트 소스의 절대 경로를, {도메인} 에는 자신의 해당 웹사이트에 SSL로 접근하고자 하는 도메인을 적어주세요.

WEBROOT_PATH='{경로}'
WEBROOT_DOMAIN='{도메인}'
certbot certonly --webroot -w $WEBROOT_PATH -d $WEBROOT_DOMAIN
Bash

예시입니다.

certbot certonly --webroot -w /var/www/wordpress/ -d wordpress.example.com
Bash

이러면 축하해주면서 인증서도 줄 겁니다.


Seafile이나 Transmission등을 도메인 접속을 위해 Nginx를 Reverse proxy 서버로 쓰는 경우)

이럴 경우엔 /var/www/ 아래에 해당 웹사이트에 대한 경로가 없습니다. 알아서 구축이 되어 있기 때문에, 그 웹사이트 경로를 찾기도 어렵고 찾아도 미묘해요.

그래서 일단 SSL 인증 기관에게 "그래도 얘는 내 서버에서 돌고 있다"는 걸 알려만 주면 되기 때문에 명시적으로 디렉토리를 만들어주면 됩니다.

아래의 명령어를 입력해줍시다. 역시 {경로} 에는 웹 사이트 소스의 절대 경로를, {도메인} 에는 자신의 해당 웹사이트에 SSL로 접근하고자 하는 도메인을 적어주세요.

명시적인 디렉토리를 먼저 만들고 그 디렉토리를 이용해서 인증서를 발급받겠습니다.

WEBROOT_PATH='{경로}'
WEBROOT_DOMAIN='{도메인}'
mkdir -p /var/www/$WEBROOT_DOMAIN
certbot certonly --webroot -w $WEBROOT_PATH -d $WEBROOT_DOMAIN
Bash

예시입니다.

mkdir -p /var/www/seafile.example.com
certbot certonly --webroot -w /var/www/seafile.example.com/ -d seafile.example.com
Bash

가이드를 따라오신 분들도 이 방법으로 진행하시면 됩니다. FTP, Seafile, Transmission 모두 인증서를 받아주세요.

잘 입력하시면 역시 축하해주면서 인증서를 발급해줍니다.

인증서가 잘 받급되었나 보시고 싶으시면 아래 명령어를 입력해주세요.

ls -al /etc/letsencrypt/live/
total 16
drwxrwxrwx 2 root root 4096 Jul 26 16:46 omv.awesometic-test.kro.kr
drwxr-xr-x 2 root root 4096 Jul 27 17:48 seafile.awesometic-test.kro.kr
drwxr-xr-x 2 root root 4096 Jul 27 17:48 transmission.awesometic-test.kro.kr
Bash


2) OMV에 인증서 등록

발급받은 인증서를 OMV 인증 - SSL 메뉴에 등록해주셔야 합니다.

OMV 인증 - SSL 으로 갑시다.

아직 인증서가 하나밖에 없습니다. 왼쪽 위 추가 - 불러오기 를 눌러줍시다.

불러오기 좋은 창이 하나 듭니다. 쉬워요. 복붙만 하시면 됩니다.

Putty로 연결한 터미널에서 아래 명령어를 쳐줍니다. {도메인} 부분에 자신한테 맞는 도메인만 적어주시면 됩니다.

개인 키에는 아래 명령어의 결과를 적습니다. -----BEGIN~ 부터 END CERTIFICATE----- 까지 전부 복사/붙여넣기 하셔야 합니다.

WEBROOT_DOMAIN='{도메인}'
cat /etc/letsencrypt/live/$WEBROOT_DOMAIN/privkey.pem
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDjlFCISt815m0f
...
hLCV6C3rlO1rKEF1sqLP0nRBsA==
-----END PRIVATE KEY-----
Bash

인증에는 아래 명령어의 결과를 적습니다.

cat /etc/letsencrypt/live/$WEBROOT_DOMAIN/fullchain.pem
-----BEGIN CERTIFICATE-----
MIIFHzCCBAegAwIBAgISAxT89JsCCNDJ7SvlEAYQ+6fJMA0GCSqGSIb3DQEBCwUA
...
JhXpMMZWNLytB4qjuzd6s5thHA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
...
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
Bash

설명엔 적절한 설명을 적어줍시다. 전 Let's Encrypt - example.com 이라고 적겠습니다. 물론 example.com 대신 적절한 도메인을 적어주세요.

그럼 이렇게 됩니다.

이렇게 하나씩 넣어주시면 됩니다.. :) 그리고 저장/적용 해주세요.

그리고 Seafile과 Transmission에 적용해보겠습니다.


* Seafile, Transmission에 적용

이런 식으로 인증서들이 준비되었을 겁니다. Seafile 부터 적용해봅시다.

OMV Nginx - 서버 에서 Seafile 부분을 누르신 후 편집 버튼을 눌러줍니다.

SSL 활성화 옵션이 있습니다. 활성화해준 다음 인증에서 Seafile 인증서를 클릭해주세요.

그럼 이렇게 될 겁니다. Only use SSL 을 활성화해주세요.

그리고 밑으로 내려 추가옵션 쪽으로 가 내용을 지우고 아래 내용을 복사/붙여넣기 해줍시다. 마지막에 location ^~ /.well-known... 블럭 안에 root 부분만 자신한테 맞는 경로로 설정해주세요.

proxy_set_header X-Forwarded-For $remote_addr;

location / {
    fastcgi_pass    127.0.0.1:8000;
    fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
    fastcgi_param   PATH_INFO           $fastcgi_script_name;

    fastcgi_param    SERVER_PROTOCOL        $server_protocol;
    fastcgi_param   QUERY_STRING        $query_string;
    fastcgi_param   REQUEST_METHOD      $request_method;
    fastcgi_param   CONTENT_TYPE        $content_type;
    fastcgi_param   CONTENT_LENGTH      $content_length;
    fastcgi_param    SERVER_ADDR        $server_addr;
    fastcgi_param    SERVER_PORT        $server_port;
    fastcgi_param    SERVER_NAME        $server_name;
    fastcgi_param   REMOTE_ADDR         $remote_addr;
    fastcgi_param   HTTPS               on;
    fastcgi_param   HTTP_SCHEME         https;

    access_log      /var/log/nginx/seahub.access.log;
    error_log       /var/log/nginx/seahub.error.log;
    fastcgi_read_timeout 36000;
    client_max_body_size 0;
}

location /seafhttp {
    rewrite ^/seafhttp(.*)$ $1 break;
    proxy_pass http://127.0.0.1:8082;
    client_max_body_size 0;
    proxy_connect_timeout  36000s;
    proxy_read_timeout  36000s;
    proxy_send_timeout  36000s;
    send_timeout  36000s;
}

location /media {
    root /var/www/seafile/seafile-server-latest/seahub;
}

location ^~ /.well-known/acme-challenge/ {
    root {seafile 임시 디렉토리 경로};
    allow all;
    default_type "text/plain";
}
nginx

이런 식으로 됩니다.

저장 및 적용 해줍니다.

Transmission의 경우 같은 방법으로 하시는데, 추가 옵션을 아래 내용으로 바꿔주시면 됩니다. Only use SSL도 활성화해줍니다. 마지막에 location ^~ /.well-known... 블럭 안에 root 부분만 자신한테 맞는 경로로 설정해주세요.

location / {
    return 301 https://$server_name/transmission/;
}
      
location ^~ /transmission {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_pass_header X-Transmission-Session-Id;
    add_header Front-End-Https on;
      
    location /transmission/rpc {
        proxy_pass http://127.0.0.1:9091;
    }
      
    location /transmission/web/ {
        proxy_pass http://127.0.0.1:9091;
    }
      
    location /transmission/upload {
        proxy_pass http://127.0.0.1:9091;
    }
      
    location /transmission/web/style/ {
        alias /usr/share/transmission/web/style/;
    }
      
    location /transmission/web/javascript/ {
        alias /usr/share/transmission/web/javascript/;
    }
      
    location /transmission/web/images/ {
        alias /usr/share/transmission/web/images/;
    }
          
    location /transmission/ {
        return 301 https://$server_name/transmission/web;
    }
}

location ^~ /.well-known/acme-challenge/ {
    root {transmission 임시 디렉토리 경로};
    allow all;
    default_type "text/plain";
}
nginx

그러고 저장 및 적용하시면, 아래처럼 될 겁니다.

새로운 https 도메인으로 접속해봅니다.


Seafile과 Transmission 모두 잘 되네요 :) 모바일에서도 물론 잘 들어가집니다. Seafile은 안드로이드 스마트폰에서 자동 업로드 테스트해본 결과에요.

만약 Seafile 웹사이트에 파일 업로드가 안 될 경우 관리자 설정 - 설정에 가셔서 URL들을 SSL이 적용된 https로 바꿔보세요. 아마 이미 바뀌어 있을 겁니다.


* FTP에 적용

FTP는 Nginx 를 거치는 것이 아니라 더 쉽습니다. 인증서만 임시로 받기 위해 /var/www/ 밑에 디렉토리를 생성하고 OMV Nginx에 ftp 서브도메인에 대해 해당 디렉토리를 사용하도록 서버를 추가한 뒤 발급받아 주시고, OMV SSL 메뉴에 넣고, 마우스 클릭 몇 번과 21번 포트만 오드로이드 NAS로 포트포워딩 되어 있으면 돼요. 간단한거지만 간단하기만 한 절차는 아니네요 :(

윗부분의 내용을 참고해 인증서도 받고, OMV에 불러오기도 하셨다면 OMV FTP 메뉴 - SSL/TLS 탭으로 갑니다.

이렇게 SSL/TLS 활성화 및 인증에 ftp 관련 인증서를 선택해주시고, 저장/적용 하시면 됩니다.

Filezilla로 테스트해보겠습니다.

OMV FTP에서 SSL을 설정하셨으면, 설정한 도메인을 호스트에 넣어줍니다. 그리고 계정은 OMV의 사용자 계정으로 해줍시다.

빠른 연결 버튼을 누르시게 되면,

알 수 없는 인증서라면서 겁을 줍니다. 원래 인증 기관 정보는 클라이언트 프로그램에 저장이 되어 있다더군요, 크롬 등 여러 인터넷 브라우저에선 Let's Encrypt 발급자를 이미 믿고 있는데 Filezilla FTP 클라이언트에선 얘가 믿을 만한 애인 지 모르는 모양입니다.

아무튼 확인을 눌러 넘어갑시다. 그러면,

연결이 되었네요! 파일 주고 받는 것도 잘 됩니다 :)

안드로이드 ES 파일 탐색기에서 FTP 접속하실 땐 주소에 SSL 인증서를 받은 도메인 주소를 넣어주세요. 그러면 인증이 됩니다. ES 파일 탐색기에서 새로 만들기 - FTPS 는 동작하지 않아요. 아래처럼 해주시면 됩니다.



* ipTIME DDNS

참고로 ipTIME DDNS(*.iptime.org)에 대해선 발급을 해주지 않나 봅니다. 된다는 분들도 계시는 것 같은데, 최근에 해보니까 iptime.org 에 대해 너무 많은 요청이 있다는 비슷한 메세지를 뿌리며 발급을 해주질 않네요. 다른 공유기의 DDNS 서비스에 대해선 잘 모르겠습니다. 참고하세요.


출처 : http://awesometic.tistory.com/60?category=964085