- BlogTech는 소규모에서 중간 규모 웹사이트를 관리하기 위한 C 기반 툴킷으로, HTTPS, 가상 호스트, ACME 기반 자동 인증서 관리, 원격 서버 관리 클라이언트를 제공함
- 현재 테스트 단계이며, 버전
0.4.x로 ` 몇 주 동안 운영하는 데 사용됐지만 안정 릴리스로 제시되지는 않음 - 서버는 Linux와 Windows에서 실행되지만 HTTPS는 Linux만 지원하며, Windows에서는 클라이언트와 서버 모두 HTTP만 사용 가능함
- 원격 파일 관리는
--put,--get,--delete로 처리하고, 리소스를 변경하는 요청은 공유 비밀키 기반 HMAC/SHA256 서명으로 인증함 - 운영 환경에서는 포트 80의 HTTP 서버와 도메인 DNS 레코드가 필요하며, ACME를 켜면 인증서와 개인키 파일을 자동 생성하고 오류는
acme.log에 남김
BlogTech의 목적과 현재 상태
- BlogTech는 소규모에서 중간 규모 웹사이트 관리를 위한 툴킷임
- 지원 기능은 다음과 같음
-
HTTPS
-
가상 호스트
- ACME를 통한 자동 인증서 관리
- 서버 원격 관리를 위한 클라이언트
- 아직 테스트 단계임
- 버전
0.4.x로https://coz.is/를 몇 주 동안 성공적으로 서비스한 사례가 있음 - 예전 단일 파일 버전은
single_file브랜치에 있음
-
빌드와 기본 실행
- BlogTech는 Linux와 Windows에서 실행됨
- Linux 빌드에는 OpenSSL 개발 라이브러리와
gcc가 필요함 - Windows 빌드에는
clang이 필요함
- Linux 빌드에는 OpenSSL 개발 라이브러리와
- 빌드는 플랫폼별 스크립트로 수행함
- Linux:
./build.sh - Windows:
.\build.bat
- Linux:
- 빌드 결과물은 다음과 같음
- Linux:
blogtech - Windows:
blogtech.exe
- Linux:
- Linux에서는
./install.sh로 설치 가능함 - 기본 서버 실행 예시는
docroot디렉터리를 만들고--serve,--document-root=docroot,--skip-auth-check를 지정함 - 기본 HTTP 서버는
127.0.0.1:8080에서 수신하고docroot의 콘텐츠를 제공함 - 빈
docroot상태에서는http://127.0.0.1:8080/접속 시 404가 반환됨
원격 파일 관리와 인증
- BlogTech는 클라이언트 모드에서 파일을 서버에 업로드할 수 있음
--put으로 파일 업로드--get으로 원격 파일 다운로드--delete로 원격 파일 삭제
- 같은 머신에서 클라이언트와 서버를 실행해도, 원격 머신의 서버에 대해서도 같은 방식으로 동작함
- 리소스를 변경하는 요청은 HMAC/SHA256 서명으로 디지털 서명됨
- 클라이언트와 서버는 같은 비밀키를 공유해야 하며, 관례적으로
admin.pwd파일에 저장함 - 비밀번호 파일은
--auth-password-file옵션으로 지정함 - 비밀번호 파일이 없으면 인증이 필요한 모든 요청이 거부됨
- 빈 비밀번호도 거부됨
- 개발 중에는
--skip-auth-check로 모든 요청을 인증된 것으로 처리할 수 있음- 이 옵션을 쓰면
--auth-password-file은 지정돼 있어도 무시됨 - 주의해서 사용해야 함
- 이 옵션을 쓰면
-
인증 헤더와 재전송 조건
- 인증된 HTTP 요청에는
X-BlogTech-헤더가 포함됨 X-BlogTech-Nonce: 클라이언트가 무작위로 선택한 토큰X-BlogTech-Timestamp: 요청이 처음 서명된 시점의 UNIX 타임스탬프X-BlogTech-Expire: 서명 시점부터 요청이 유효한 초 단위 시간X-BlogTech-Signature: 요청 정보의 HMAC을 Base64로 인코딩한 값- 서명은 정규화된 요청 문자열을 만든 뒤 인증 비밀번호를 키로 사용해 HMAC/SHA256을 계산하고, 결과를 패딩 포함 Base64로 인코딩해 얻음
- 서버가 이미 본 nonce는 메모리에 저장됨
- 서버가 다시 로드되면 이전 nonce를 잊어버리므로, 만료되지 않은 요청은 재전송될 수 있음
- 인증된 HTTP 요청에는
가상 호스트와 디렉터리 매핑
- BlogTech는 같은 서버에서 여러 웹사이트를 호스팅할 수 있음
- 도메인은
--domain옵션을 여러 번 지정해 설정함 - BlogTech는 문서 루트 안에 도메인별 디렉터리를 생성함
defaultwebsiteA.comwebsiteB.com
- 특정 호스트로 들어온 요청은 해당 호스트와 연결된 디렉터리를 참조함
- 특정 폴더와 연결되지 않은 요청은 default 디렉터리를 참조함
- 예시에서
websiteA.com,websiteB.com,other.com에 업로드한 파일은 각각 도메인 디렉터리 또는default디렉터리에 저장됨
HTTPS와 인증서 설정
- HTTPS는 Linux에서만 지원됨
- underlying HTTP 라이브러리인 cHTTP가 OpenSSL로 HTTPS를 구현하기 때문임
- Windows에서는 클라이언트와 서버 모두 HTTP만 사용할 수 있음
- HTTPS를 켜려면 다음 옵션이 필요함
--https-enabled--cert-file--cert-key-file
- 기본 HTTPS 수신 주소는
127.0.0.1:8443임 - 수신 주소와 포트는 다음 옵션으로 변경 가능함
--https-addr=<addr>--https-port=<port>
- 개발 중에는 OpenSSL 명령으로 자가 서명 인증서를 만들 수 있음
- 브라우저는 자가 서명 인증서를 쓰는 HTTPS 서버 탐색을 허용하지 않음
- cURL은
--insecure플래그를 써야 자가 서명 인증서 서버에 접근 가능함 - 여러 인증서가 필요하면
--extra-cert를 추가로 전달할 수 있음- 기본 인증서는
--cert-file,--cert-key-file로 제공됨 - 추가 인증서는 클라이언트가 특정 도메인을 요청할 때 사용됨
- 기본 인증서는
- 긴 명령줄 옵션은 설정 파일로 옮길 수 있음
ACME 기반 자동 인증서 발급
- ACME 프로토콜은 웹 서버가 인증기관에 인증서 발급을 자동 요청할 수 있게 함
- BlogTech는 인증서 없이 HTTPS 모드로 시작한 뒤 인증서가 생성되는 흐름을 지원함
- 운영 환경에서는 다음 조건이 필요함
- HTTP 서버를 80번 포트에서 실행
- 서버가 실행되는 머신과 도메인을 연결하는 DNS 레코드 생성
- ACME는
--acme-enabled를 HTTPS 옵션과 함께 지정해 켬 - 일반 HTTPS 모드와 달리, ACME 모드에서는 인증서가 존재하지 않을 것으로 기대함
- 인증서 생성을 위해 다음 값이 필요함
--acme-domain--acme-email--acme-country--acme-organization--acme-agree-tos
- 정상 처리되면 다음 파일이 생성됨
acme_key.pem: ACME 계정과 연결된 비밀키cert.pem: 발급된 인증서 또는--cert-file로 지정한 파일key.pem: 인증서와 연결된 개인키 또는--cert-key-file로 지정한 파일
- 오류가 발생하면 메시지는
acme.log에 기록됨 --acme-domain을 여러 번 지정하면 여러 도메인을 ACME로 처리할 수 있음- 결과 인증서에는 지정한 모든 도메인이 포함됨
ACME 클라이언트 테스트
- Linux에서 ACME 클라이언트를 테스트하려면 Docker를 설치하고 Pebble ACME server를 클론해야 함
docker-compose.yml에는 테스트 도메인을host-gateway로 연결하는extra_hosts항목을 추가함/etc/hosts에는 테스트 도메인을127.0.0.1로 매핑함- Pebble은
docker compose up으로 시작함 - BlogTech는
./blogtech -s --config=misc/pebble_blogtech.conf로 테스트 인스턴스를 실행함 - ACME 서버와의 상호작용은 stdout에 출력됨
- 성공하면
acme_key.pem,cert.pem,key.pem이 생성됨 - 인증서 갱신 테스트는
pebble/test/config/pebble-config.json의validityPeriod값을 바꿔 수행할 수 있음 --acme-force-renewal-period=<maximum duration in ms>옵션을 사용하면 인증서가 만료되지 않았어도 갱신하도록 지시할 수 있음
설정 파일과 자동 로드
- BlogTech는 임의 개수의 명령줄 인자를 설정 파일로 옮길 수 있음
- 예를 들어 HTTPS와 ACME 관련 옵션을
blogtech_server.conf에 작성한 뒤--config=blogtech_server.conf로 실행할 수 있음 - 설정 파일 이름이 정확히
blogtech.conf이면 BlogTech가 자동으로 로드함 - 이 경우
./blogtech --serve처럼 실행할 수 있음 - 암묵적 설정 파일 로드를 무시하려면
--no-config를 사용함
크래시 로그와 systemd 데몬
- 서버 모드에서 BlogTech가 크래시하면
crash.bin파일이 생성됨 - 다음 서버 시작 시
crash.bin은 사람이 읽을 수 있는 스택 트레이스인crash.log로 변환됨 - 주소를 심볼 이름이나 줄 번호로 변환하는 과정은 다소 불안정할 수 있음
- BlogTech는 systemd 데몬으로 설치할 수 있음
- 예시
blogtech.service는/root/blogtech/blogtech -s를 실행하고, 실패 시 재시작하며, 작업 디렉터리를/root/blogtech/로 설정함 - 서버 옵션은
/root/blogtech/blogtech.conf에서 자동 로드됨 - 서비스 파일을
/etc/systemd/system/에 복사한 뒤 다음 명령으로 활성화하고 시작함systemctl daemon-reloadsystemctl enable blogtechsystemctl start blogtech
- 서비스 관리는
systemctl start,systemctl stop,systemctl restart,journalctl -u blogtech로 수행함