Realm 모바일 플랫폼으로 앱을 개발했다면 서비스를 시작할 준비가 끝났습니다. 발행 버튼을 누르기 전에 최근 사용자들은 데이터가 안전하게 지켜질 것으로 기대한다는 사실을 기억하세요. 개인 정보가 누출된다면 앱에 치명타가 될 수 있습니다. 하지만 암호화하는 데 10분에서 15분 정도만 걸리므로 걱정하지 않아도 됩니다.

Let’s Encrypt는 무료 자동화 도구입니다. 이메일 알림, 인증서 복사나 비용 처리로 시달릴 필요가 없으므로 정말 편리합니다.

시작 전 준비 사항

본 설명은 Realm 오브젝트 서버를 Ubuntu 인스턴스에서 설정하는 것을 다룹니다. 본문에 대부분의 명령어를 포함하고 있지만, 다른 설정을 적용하려면 공식 문서를 참고하세요.

인증서를 얻으려면 도메인 이름을 등록해야 합니다. Let’s Encrypt에서 공개 클라우드에서 서버를 호스팅하는 경우, 클라우드 공급자의 최상의 도메인(예: myserver.something.azure.com)으로는 DNS에 대한 인증서를 등록할 수 없습니다.

이 가이드는 Linux에 대한 기본적인 지식을 가지고 있다고 가정합니다. lsvim을 종료하는 방법과 같은 기본 지식을 알고 있다면 충분합니다. (커널을 재컴파일하는 방법을 알고 있다면 아래 설명이 지루할 수도 있습니다)

Realm 오브젝트 서버 설치

서버가 클라우드 환경에서 호스팅 되는 경우 Realm이 httphttps 트래픽에 사용하는 90809443 포트를 열어야 합니다. 또한 Let’s Encrypt가 도메인 소유권을 확인하는 데 사용하는 443 포트도 열어야 합니다. 자체 호스팅하는 경우라면 기본 제공 방화벽에서 열어야 하는 경우도 있습니다.

sudo ufw allow 9080/tcp
sudo ufw allow 9443/tcp
sudo ufw allow 443/tcp
sudo ufw reload

다른 Linux 배포판에 대한 설명은 Realm 오브젝트 서버 문서를 참고하세요.

이제 Realm 오브젝트 서버를 간단하게 설정할 수 있습니다.

# Realm의 PackageCloud 저장소 설정
curl -s https://packagecloud.io/install/repositories/realm/realm/script.deb.sh | sudo bash

# 저장소 업데이트
sudo apt-get update

# Realm 오브젝트 서버 설치
sudo apt-get install realm-object-server-developer

# 서비스 활성화 및 시작
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server

Ubuntu가 아닌 배포판을 사용한다면, Realm 오브젝트 서버 문서를 참고하세요.

이제 http://ros.myserver.com:9080로 이동해서 어드민 사용자를 생성합니다.

서버가 설치됐으니 설정을 해야겠죠? vim 등의 에디터에서 /etc/realm/configuration.yml를 편집합니다. 유용한 설정 옵션이 많지만 일단 파일 중간쯤의 proxy:https를 설명하겠습니다. 설정의 주석을 풀고 인증서 경로를 설정합니다.

https:
  # 활성화
  enable: true

  # LetsEncrypt에서 받아올 키의 경로
  certificate_path: '/etc/realm/keys/fullchain.pem'
  private_key_path: '/etc/realm/keys/privkey.pem'

  # localhost를 포함한 모든 인터페이스 수신
  listen_address: '::'

  # 그대로 9443으로 유지
  # listen_port: 9443

서비스를 다시 시작하려고 하면 인증서 경로가 유효하지 않으므로 설정 오류 때문에 시작이 실패합니다. 제대로 된 경로를 넣어 보겠습니다.

인증서 받기

Let’s Encrypt를 위한 gazillion ACME 클라이언트가 있지만 Certbot을 권장합니다. 이제 Certbot을 설치하고 시작하겠습니다.

# certbot 설치
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot 

# certonly 모드로 실행
sudo certbot certonly

(다른 Linux 버전에 대한 안내는 Certbot 웹사이트를 참고하세요.)

이제 임시 서버를 가동할지, 웹 루트를 사용할지 결정해야 합니다. 이미 해당 박스에서 웹서버가 동작하고 있지 않다면 전자로 결정해도 됩니다.

다음으로 도메인 이름이 필요합니다. Let’s Encrypt가 와일드카드 인증서를 발행하지 않으므로 해당 박스에서 웹사이트를 호스팅하고 싶지 않다면 ros.myserver.com와 같은 DNS 레코드를 설정해서 서버를 가리키도록 할 수 있습니다. 모든 것이 잘 끝난다면 certbot은 Let’s Encrypt와 상호작용한 후 인증서를 /etc/letsencrypt/live/ros.myserver.com/에 넣습니다.

오브젝트 서버에 인증서 제공

이제 Realm 오브젝트 서버와 인증서를 준비했지만, 보안을 설정하려면 몇 가지 일을 더 해야 합니다. 기본적으로 certbot은 인증서 폴더를 읽을 수 있는 사용자를 엄격히 제한하므로 Realm 오브젝트 서버 역시 해당 폴더에 접근할 수 없습니다. 따라서 관련 인증서를 /etc/realm/keys 폴더로 복사합니다.

먼저 아래 폴더를 생성합니다.

sudo mkdir /etc/realm/keys
sudo chown realm:realm /etc/realm/keys
sudo chmod 500 /etc/realm/keys

위 명령어는 폴더를 생성하고 소유자를 realm(실행되는 Realm 오브젝트 서버의 사용자)로 변경하며, 읽기와 실행 권한을 설정해서 Realm 오브젝트 서버가 파일에 접근할 수 있도록 합니다.

이 시점부터 파일을 폴더에 수동으로 복사할 수 있지만, Let’s Encrypt 인증서가 90일의 짧은 수명을 지니므로 추후 갱신할 필요가 있습니다. 이런 파일 복사를 직접 해야 한다면 실수가 발생하기 쉬우므로 성공적인 갱신 이후에 실행할 certbot 갱신 훅 스크립트를 준비했습니다.

#!/bin/sh

set -e

for domain in $RENEWED_DOMAINS; do
        case $domain in
        ros.myserver.com) # <- Update this with your own server
                realm_cert_root=/etc/realm/keys

                # 인증서 및 개인 키 파일은 realm_cert_root에 복사하는 동안
                # 읽을 수 없도록 해야 합니다.
                umask 077

                cp "$RENEWED_LINEAGE/fullchain.pem" "$realm_cert_root/fullchain.pem"
                cp "$RENEWED_LINEAGE/privkey.pem" "$realm_cert_root/privkey.pem"

                # Realm이 적절한 파일 소유권과 사용 권한을 통해 인증서와 키를 읽습니다.
                chown realm:realm "$realm_cert_root/fullchain.pem" \
                        "$realm_cert_root/privkey.pem"
                chmod 400 "$realm_cert_root/fullchain.pem" \
                        "$realm_cert_root/privkey.pem"

                # Realm 오브젝트 서버 재시작
                systemctl restart realm-object-server
                ;;
        esac
done

필요한 단계는 다음과 같습니다.

  1. 관련 없는 인증서를 작업하는 것을 막기 위해 올바른 인증서(ros.myserver.com)를 복사하고 있는지 확인하세요.
  2. 새 인증서를 /etc/realm/keys로 복사합니다.
  3. 복사된 파일의 소유자를 realm 사용자로 설정합니다.
  4. 파일 사용자에게 “read” 권한을 설정하고 다른 사람들에게는 “none”을 설정합니다.
  5. Realm 오브젝트 서버를 재설정해서 새 인증서를 받도록 하세요.

/etc/realm/keys/와 같이 공개되지 않은 폴더에 이를 넣고 chmod 500 /etc/realm/keys/post-renew.sh 명령어로 실행할 수 있게 만드세요.

이제 모든 것이 예상대로 동작하는지 확인합니다.

sudo certbot renew --renew-hook /etc/realm/keys/post-renew.sh --force-renewal

강제로 갱신이 실행되며 성공한 경우 갱신 스크립트를 실행합니다. 계획대로 잘 진행된다면 새 인증서를 /etc/realm/keys 폴더에서 볼 수 있고, Realm 오브젝트 서버를 재시작해서 이를 받을 수 있습니다. 브라우저에서 https://ros.myserver.com:9443을 열 수 있는지 확인하세요.

마지막 단계는 갱신을 자동화해서 인증서가 만료되는 것을 신경 쓰지 않도록 하는 것입니다. post-renew가 잘 동작하는 것을 확인했으니 cron 작업을 설정해서 갱신 명령어를 실행할 수 있습니다.

sudo crontab -e

# 선호하는 에디터에서 파일의 아랫부분에 이 내용을 붙여넣습니다.
0 4 * * * certbot renew --renew-hook /etc/realm/keys/post-renew.sh --quiet

Certbot은 만료일이 가까운 인증서만 갱신하므로 매일 실행하는 것이 좋습니다.

마무리

이로써 모든 것을 마쳤습니다. 이제 사용자가 직접 하지 않고도 새 인증서를 갱신하고 선택하는 보안 Realm 오브젝트 서버 인스턴스를 완성했습니다. 이 작업 한 번만으로 사용자의 데이터가 통신을 통해 훼손되지 않도록 지킬 수 있으므로 꼭 적용해 보세요.