임호화된 UnRAID 서버 자동으로 시작

2022-06-22

암호화된 UnRAID 서버를 재부팅 후 자동으로 시작하는 방법을 찾는다면, 거의 대부분 이 쓰레드에 있는 절차 (경고: 영어)를 사용할 겁니다. 하지만 별다른 SMB 공유 폴더를 만들기 싫다면요? 비밀번호 파일을 계속 공유하는 서버를 운영하고 싶지 않다면 어떻게 할까요?

그렇다면 사용하실 수 있는 다른 방법이 하나 있습니다.

절차

  1. UnRAID 서버가 있는 네트워크에 다른 컴퓨터에 다음 파이썬 스크립트를 만들고 실행시킵니다:

main.py:

#!/usr/bin/env python3
from os.path import exists
import http.server

# 여기에 설정값 수정
PORT = 9999
PASSWORD_FILE_NAME = "password.txt" # 현재 경로 안에
TIMEOUT = 300   # 초 단위

# 비밀번호를 불러오거나 물어보기
if exists(PASSWORD_FILE_NAME):
    print(f"비밀번호 파일 {PASSWORD_FILE_NAME} (이)가 존재합니다. 안의 비밀번호를 사용합니다.")
    with open(PASSWORD_FILE_NAME) as password_file:
        PASSWORD_TO_SEND = password_file.readline().strip()
else:
    from getpass import getpass
    print("비밀번호 파일이 없습니다. 비밀번호를 입력하세요.")
    PASSWORD_TO_SEND = getpass()

# 웹 서버 시작
class RequestHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(s):
        s.send_response(200)
        s.send_header("Content-Type", "text/plain")
        s.end_headers()
        s.wfile.write(str.encode(PASSWORD_TO_SEND))

httpd = http.server.HTTPServer(('', PORT), RequestHandler)
httpd.timeout = TIMEOUT
httpd.handle_request()

참고:

  1. UnRAID 플래시를 수정해서 다른 컴퓨터에서 키를 가져오도록 합니다.

(UnRAID 포럼에서의 기존 스크립트를 제공하신 @bonienl께 감사의 말씀 드립니다. 아래의 스크립트는 이 절차와 호환되도록 일부 수정된 버전입니다.)

만약 다른 컴퓨터에 USB 스틱을 연결하였을 경우, 파일 경로에서 /boot/를 빼셔도 좋습니다.

/boot/config/go를 편집하고 다음 줄들을 추가/수정합니다:

# ...생략...

# emhttp 이벤트 경로에 스크립트 복사
install -D /boot/custom/keyscript/fetch_key /usr/local/emhttp/webGui/event/starting/fetch_key
install -D /boot/custom/keyscript/delete_key /usr/local/emhttp/webGui/event/started/delete_key

# 실행 권한 부여
chmod a+x /usr/local/emhttpd/webGui/event/starting/fetch_key
chmod a+x /usr/local/emhttpd/webGui/event/started/delete_key

# webGUI 시작
/usr/local/sbin/emhttp &

/boot/custom/keyscript/fetch_key를 만듭니다:

#!/bin/bash

if [[ ! -e /root/keyfile ]]; then
  curl other-computer:9999 > /root/keyfile # 포트를 변경하셨을 경우 여기에서 수정해주세요!
fi

/boot/custom/keyscript/delete_key를 만듭니다:

#!/bin/bash

rm -f /root/keyfile
  1. 이제 UnRAID 머신을 재부팅시켜야 될 때, 다른 컴퓨터로 접속해서, 파이썬 스크립트를 실행시킨 다음, 재부팅을 진행하세요. 재부팅이 완료된 UnRAID 서버가 다른 컴퓨터에서 암호화 키를 가져와서 자동으로 디스크를 잠금 해제하고 마운트시킵니다.

위의 절차를 간단하게 하는 스크립트도 아래 적어두었습니다:

#!/bin/bash

# 암호화 비밀번호 서버 스크립트 시작
python3 main.py &

# 서버에 SSH로 접속 후 재부팅 시작
# 호스트 이름을 변경하는 것을 잊지 마세요
ssh root@unraid-server-hostname reboot

문제 해결

Bonjour 문제

만약 UnRAID 서버나 다른 컴퓨터가 호스트를 찾을 수 없다는 오류를 발생시킨다면, 네트워크가 호스트 이름을 기반으로 서로를 찾는 것을 지원하지 않을 수 있습니다. 이 문제를 해결하려면, 두 머신 모두 고정 IP를 설정한 다음, 스크립트에서 호스트 이름을 고정 IP로 대체하세요.

장점

다른 방식과 비교해서 이 방식은 몇 가지 장점을 가지고 있습니다:

단점

물론, 이 방식은 몇 가지 단점과 제약사항도 가지고 있습니다:

결론

이 블로그 글을 작성하는 동안, 만약 UnRAID 서버와 같은 네트워크에 다른 컴퓨터가 있다면, 그냥 WebUI에 접속하여 비밀번호를 입력하면 되는 거 아니야? 라는 생각을 했습니다. 그럼 위의 방식은 별로 의미가 없는 거 아닌가요?

하지만 이 방식은 다른 컴퓨터에 GUI 접근 (예를 들어, VNC/RDP 접근이 없는 헤드리스 (headless) 머신)에서도 작동합니다. 재부팅하기 전 이 스크립트를 돌리면 되기 때문입니다.

보안상으로는 이 방식이 조금 취약할 수 있기에, 네트워크 보안과 개인의 위협 모델을 꼼꼼히 검토한 후 적용하시는 것을 추천합니다.