• Tor 네트워크를 사용해 익명 웹서버 구동하기

    익명 웹서버를 구동하는 목적

    이것을 설명하기 위해서는 “왜 익명 네트워크가 필요한가?” 라는 이야기를 먼저 할 필요가 있다. 분명 우리가 살고있는 이 세상은 인종이나 경제력, 문화, 태어난 곳 등에 따른 차별이나 제한 없이 누구나 원하는 정보에 접근하고 원하는 말을 온라인 공간에 나눌 수 있어야만 한다. 그런데, “국민들에게 유해한 정보를 막는다.” 라는 이유로 정상적인 정보들을 필터링하고, 하고싶은 말을 하면 뒷보복을 두려워해야 하는 국가들이 아직도 전 세계에 많이 남아있다. 대한민국도 정도는 비교적 낮지만 이런 ‘인터넷 검열’ 국가 중 하나이고, 흔히 우리가 유머거리로 삼는 Warning 사이트도 그 검열의 흔적이다. 대표적으로 이런 국가적인 검열을 피하기 위해 익명 네트워크가 사용되지만, 물론 기업의 내부고발자가 익명성을 위해 사용하거나, 보안이 필요한 단체끼리 통신 목적으로 사용하는 등 사용처는 무궁무진하게 만들 수도 있다. 우리가 사용할 도구는 좋은 의미로도 나쁜 의미로도 유명한 Tor다. Tor의 Onion 네트워크 위에 완벽한 익명성을 꿈꾸는 사람들을 위한 웹서버를 구동해 보자. 접속하는 사람도 익명, 서버를 구동하는 우리도 물론 익명이다.

    하드웨어 준비물

    물론 소프트웨어적인 준비물은 아래의 과정에서 잘 설명하겠지만, 그걸 받아들일 수 있는 하드웨어 준비물은 미리 준비해 주시길 바란다. 제대로 서버를 계속 유지할 것이 아니라면 지금 사용하는 컴퓨터로도 충분하다. 필자는 저전력과 Unix 환경 모두 확보할 수 있는 라즈베리 파이 3를 기준으로 이 글을 작성하였다. Windows 환경도 기본적인 개념은 모두 같으나, 쉽게 따라할 수 있도록 Debian 기반 가상머신을 생성한 후 따라하는 것을 강력 추천한다.

    혹시 정 Windows 환경을 고집하고 싶다면 이 글 을 참고하자. 다른 블로거분이 한국어로 잘 정리해 주셨다.

    웹서버 구성요소 준비하기

    이 포스트는 웹서버를 익명으로 굴리는 방법을 알려주는 포스트다. 익명으로 굴릴 웹서버 구성 요소들은 미리 만들어 주셔야 한다. 물론 아래의 과정을 밟고 만들어도 상관은 없으니 난 결과물을 먼저 뽑고 싶다! 하면 아래 과정 먼저 따라와도 된다. 테스트를 위해 “Hello World!”가 박힌 index.html 파일 정도만 준비하자. 서버는 어떤 소프트웨어를 사용하던 상관 없다. 필자는 이 글에서 Node.js를 사용하여 웹서버를 구동하도록 하겠다. 웹서버가 준비되었다면 가상머신 한곳에 모셔두면 된다.

    설치하고 구동하기

    아래 내용은 공식 메뉴얼을 참고해 작성되었다.

    자, 서론이 길어졌다. 당장 터미널을 열고 sudo apt-get update 명령어로 패키지 리스트를 업데이트한 뒤, 아래 명령어를 입력하자.

    sudo apt-get install Tor
    

    설치는 정말 이 한 줄로 끝난다. 정말이다. 이제 설정만 조금 잡아주면 된다. 정상적으로 설치가 되었다면 /etc/tor/torrc 파일이 존재할 것인데, 좋아하는 텍스트 에디터로 열어 보자. 조금 내리다 보면 ############### This section is just for location-hidden services ### 안내가 보일 것인데, 잘 찾아 오셨다. 안내와 같이 여기서부터 우리가 찾던 익명 서버 관련 설정을 할 수 있다. 아마 아래와 같은 값이 보일 거이다.

    #HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
    #HiddenServicePort 80 127.0.0.1:8080
    

    대충 감이 오지 않는가? 위 HiddenServiceDir은 익명으로 구동할 웹서버가 위치하는 경로, HiddenServicePort는 그 서버의 웹 포트이다. 주석(#)은 당연히 모두 지워주고 위에 웹서버가 위치하는 곳의 경로를 지정해준다. 아래는 그냥 놔두면 된다. Tor로 구동되는 서버는 localhost로 1차 구동되고 Onion 네트워크를 타고 외부로 나가는 것이라 저 설정이 맞다.

    sudo service tor restart 명령어로 Tor를 재시작했을 때 아까 지정한 HiddenServiceDirhostname이나 private_key 파일이 생성되었다면 정상적으로 설정된 것이다. 사용자 권한으로는 안 보일 수 있으니 root로 확인하길 바란다. 만약 그렇지 않다면, /var/log/tor에 들어가 로그 파일을 살펴보자.

    정상적으로 위 과정을 모두 마쳤다면, 이제 생성된 hostname 파일에 들어가보자. duskgytldkxiuqc6.onion와 같은 Onion 네트워크 도메인이 들어있을 것인데, 이게 앞으로 내 익명 웹서버의 접속 주소가 된다. 이제 웹 서버를 가동해자. 필자는 상기했듯 Node.js 기반으로 테스트 서버를 가동하니 HiddenServiceDir 경로에서 node app.js 명령어를 사용했다. 다른 종류의 CMS를 사용하는 경우 알아서 실행하시길 바란다.

    반영까지 1분여 기다린 후, 다른 컴퓨터 (가상머신 밖)에서 Tor 브라우저로 위 주소에 접속해보자. 정상적으로 웹사이트가 출력되면 성공. 당신도 이제 익명 네트워크에 기여하는 훌륭한 기여자가 됬다.

    일반 브라우저로 접속하기

    Onion 주소는 Tor 브라우저로만 접속할 수 있다. 물론 Tor 유저들끼리는 별 문제가 없겠지만, 전세계 모든 인터넷 이용자들이 Tor를 사용하지는 않지 않는가. Tor2Web이라는 서비스가 이 문제를 해결해줄 수 있다. 내 Onion 도메인 (예시:duskgytldkxiuqc6.onion)의 끝 .onion 부분을 .onion.link로 바꿔주면 끝. duskgytldkxiuqc6.onion 주소는 Tor 브라우저 전용이지만, duskgytldkxiuqc6.onion.link 주소는 일반 웹 브라우저에서도 사용할 수 있다. 다만 접속자의 익명성 확보는 Tor를 사용하는 것보다 훨씬 어려우니 주의.

  • OpenStack에 CloudKitty 연동하기

    CloudKitty?

    CloudKitty 는 OpenStack을 위한 Rating-as-a-Service 프로젝트다. 다시 말해, 기존 OpenStack에 구현되어 있지 않은 Pricing이나, Billing 같은 기능을 추가해 사용할 수 있다는 거다. OpenStack의 Ceilometer 와 연동되어 사용량에 따라 과금 정책을 잡는 등 퍼블릭 서비스를 위한 발판으로 삼을 수 있다. 아무래도 OpenStack 자체가 프라이빗 클라우드를 생각하고 디자인된 플랫폼이라 CloudKitty같은 프로젝트는 마이너한 편이고, 한국어 자료는 더더욱 기대할 수 없어 이 포스트가 도움이 될 수 있을 것이다.

    CloudKitty 설치하기

    최근 리뉴얼된 공식 설치 가이드 를 참고해 Ubuntu 16.04 LTS 기준으로 작성되었다. 아래 과정으로 진행하기 전 적당한 사양의 (1vCore에 1GB만 되어도 테스트 목적으로 충분) VM을 준비해주자.

    과거에는 git에서 직접 소스를 다운받아 인스톨하는 과정이 필요했었는데, 이제 apt-get으로 간편하게 설치가 가능해졌다. 아래 명령어로 repo를 추가해 주자. 권한 문제가 있으면 명령어 앞에 sudo를 적절히 붙혀준다.

    apt install software-properties-common
    add-apt-repository ppa:objectif-libre/cloudkitty
    

    VM의 패키지를 업데이트 해준다.

    apt update && apt dist-upgrade
    

    이제 CloudKitty를 설치할 수 있다. 뭘 망설이고 있는가? 당장 받자.

    apt-get install cloudkitty-api cloudkitty-processor cloudkitty-dashboard
    

    정말 간단하게 명령어 몇 줄로 모든 설치과정이 끝났다. 예전 git에서 소스 가져와 설치하던 때만 하더라도 각종 의존성 문제에 파이썬 오류에 별 난리가 다 났었는데 이건 참 좋아진 것 같다.

    CloudKitty 설정하기

    /etc/cloudkitty/cloudkitty.conf 에서 설정 스크립트를 건들 수 있다. 아래는 Keystone v3 기준 설정 예제다. 만약 v2.0 기준 예제가 필요하다면 위에 링크를 달아둔 CloudKitty 공식 메뉴얼에서 확인할 수 있다.

    [DEFAULT]
    verbose = True
    log_dir = /var/log/cloudkitty
    
    [oslo_messaging_rabbit]
    rabbit_userid = openstack // rabbit 서비스 userid
    rabbit_password = RABBIT_PASSWORD // rabbit 서비스 password
    rabbit_host = RABBIT_HOST // rabbit 서비스가 돌아가는 호스트 IP (OpenStack-Controller)
    rabbit_port = 5672
    
    [ks_auth]
    auth_type = v3password
    auth_protocol = http
    auth_url = http://localhost:5000/v3 // localhost 부분을 OpenStack-Controller IP 로 변경
    identity_uri = http://localhost:35357/v3 // localhost 부분을 OpenStack-Controller IP 로 변경
    username = cloudkitty
    password = CK_PASSWORD // 사용할 password
    project_name = service
    user_domain_name = default
    project_domain_name = default
    debug = True
    
    [keystone_authtoken]
    auth_section = ks_auth
    
    [database]
    connection = mysql://cloudkitty:DB 비밀번호@localhost/cloudkitty // 아래의 DB 설정 후 정보 집어넣기
    
    [keystone_fetcher]
    auth_section = ks_auth
    keystone_version = 3
    
    [tenant_fetcher]
    backend = keystone
    
    [collect]
    collector = ceilometer
    period = 3600
    services = compute, volume, network.bw.in, network.bw.out, network.floating, image // Ceilometer로 측정할 정보들
    
    [ceilometer_collector]
    auth_section = ks_auth
    

    주요 파라미터들에 주석을 달아뒀으니 설정에 참고하면 된다. 아마 스크립트를 찬찬히 살펴보다 보면 [database] 라는 항목이 있었을 건데 지금부터 MySql에 CloudKitty용 DB를 하나 판 후, 위 스크립트에 집어넣어 보겠다.

    mysql -uroot -p << EOF
    CREATE DATABASE cloudkitty;
    GRANT ALL PRIVILEGES ON cloudkitty.* TO 'cloudkitty'@'localhost' IDENTIFIED BY '사용할 비밀번호';
    EOF
    

    위 명령어로 Mysql에 DB를 만든 후, 다시 스크립트로 돌아가 [database] 칸을 방금 생성한 DB 정보로 수정한다. 저장한 후, 공식 메뉴얼과 달리 Keystone 설정 먼저 진행하도록 하겠다.

    Keystone 설정하기

    왜 공식 메뉴얼 안 따라가고 혼자 독주를 하느냐? 물어본다면 답은 간단하다. 공식 메뉴얼을 그대로 따라가면 작동이 안 되기 때문이다. 처음 CloudKitty를 설치할 때 가장 고생했던 부분이 이곳이다. 분명 나는 메뉴얼에 맞춰 따라했는데 작동이 안 되는 것이다. 하루이틀 삽질하다 찾아낸 방법은 Keystone에 역할을 먼저 지정해줘야 한다는 것이다.

    keystoneclient 로 접속해 아래 명령어로 필요한 계정을 생성해보자. OpenStack-Controller로 돌아와 RDO 설치 기준 keystonerc_admin 파일이 있는 곳에서 . keystonerc_admin 명령어로 접속할 수 있다.

    openstack user create cloudkitty --password 위에서 지정한 비밀번호 --email cloudkitty@localhost
    openstack role add --project service --user cloudkitty admin
    

    이제 rating 이라는 새로운 역할을 만들어 cloudkitty를 묶어줄 거다.

    openstack role create rating
    openstack role add --project service --user cloudkitty rating
    

    위 명령어들의 --project 는 본인의 상황에 맞게 골라주면 된다. 여기서는 service를 사용했다.

    이제 마지막으로 Rating 서비스의 API Endpoint를 만들어 줘야 한다. 아래 명령어로 쉽게 생성할 수 있다.

    openstack service create rating --name cloudkitty \
        --description "OpenStack Rating Service"
    openstack endpoint create rating --region RegionOne \
        public http://OpenStack-Controller IP주소:8889
    openstack endpoint create rating --region RegionOne \
        admin http://OpenStack-Controller IP주소:8889
    openstack endpoint create rating --region RegionOne \
        internal http://OpenStack-Controller IP주소:8889
    

    여기까지 끝났으면 다시 CloudKitty가 실행되는 VM으로 돌아와 아래 명령어들을 입력한다.

    cloudkitty-dbsync upgrade
    cloudkitty-storage-init
    

    CloudKitty 서비스 시작하기

    잘 따라오셨다. 정말 마지막으로 CloudKitty 서비스를 어떻게 끄고 키는지만 알고 가자. CloudKitty를 설치한 VM에서 다른 앱들과 같이 systemctl 명령어로 제어할 수 있다.

    systemctl start cloudkitty-api.service
    systemctl start cloudkitty-processor.service
    

    위의 모든 설정이 끝나고 CloudKitty 서비스도 정상적으로 굴러가고 있는가? 이제 OpenStack 대시보드로 접속해 보자. 로그인까지 마치면 이전에는 보지 못한 Rating 이라는 메뉴가 보일 것이다. 인스턴스 생성 창에는 가격 표시도 생긴다. 이제 이걸 자유롭게 주물러 보는 일만 남았다. 여러분의 몫이다.

    마치며

    사실 이 정보를 찾는 사람이 얼마나 될 지는 모르겠다. CloudKitty라는 프로젝트가 워낙 마이너할 뿐더러 영어도 아니고 한국어로 작성된 이 포스트에 관심을 가지는 사람은 필자밖에 없을지도 모른다. 그래도 혹시 알까, 누군가 이 포스트를 읽고 도움을 받을지.

  • 검색엔진에서 GitHub 페이지 검색 가능하게 하기

    왜 이런 일을 해야 하나요?

    안타깝게도 기본 설정의 GitHub 페이지는 일반적인 포탈사이트 블로그나 티스토리 등과는 달리 검색엔진에서 백날 검색해도 글이 나오지 않는다. 다시 말해, 아무리 좋은 글을 써놨다고 하더라도 누구 하나 볼 사람이 없다는 뜻이다. 고도로 연결된 정보화 사회의 정점을 달리는 우리들이 이런 고독감을 맛보면 되겠나? 당장 주요 검색엔진들에게 나 자신을 어필해보자.

    Google에 내 페이지 노출하기

    아무래도 전문적인 내용을 주로 다루게 되는 GitHub 페이지 특성 상, 마찬가지로 한국인들이 전문적인 내용을 주로 검색하게 되는 Google에 최우선적으로 노출시키는 편이 필자나 구독자나 모두에게 좋을 것이다. Google에서는 Search Console 이라는 검색 결과 노출 매니저를 제공한다. 이곳에 내 GitHub 페이지의 도메인을 추가시키는 것으로 시작한다. 아마 중간에 사이트의 주인임을 증명하는 과정이 있을 것인데, 이 포스트를 따라하기 전 Google Analytics를 등록해 둔 적이 있다면 그것과 연동해 바로 주인 인증이 가능하다. 만약 하지 않았다면 이 포스트를 참조하기 바란다.

    이제 내 웹사이트 안에 sitemap.xml 만들고 GitHub에 Push한 다음 Search Console에 동기화만 해주면 되는데, 고맙게도 내가 사용하는 테마는 이미 제작자가 _config.ymljekyll-sitemap을 정의해 둔 상태였다. 물론 여러분의 경우 그러지 않을 경우가 더 많기에 이 글에서는 플러그인 없이 sitemap.xml을 생성해 보겠다.

    웹사이트 폴더 최상단에 sitemap.xml이라는 이름의 파일을 만들고, 이 페이지 에 올라온 샘플 코드를 그대로 긁어 붙혀넣으면 된다.

    저장까지 끝냈다면, 한번 jekyll serve 명령어로 로컬 서버를 생성해 localhost:4000/sitemap.xml 도메인으로 접속해 봐라. xml 파일의 내용이 출력되면 잘 적용 된거다. 혹시 모르니 GitHub에 Push한 후 다시 username.github.io/sitemap.xml 주소로 들어가 제대로 출력되는지 확인해보자. 이제 남은 일은 Search Console에 들어가 sitemap 추가 메뉴에서 username.github.io/sitemap.xml 주소를 입력해 주기만 하면 된다. 자동으로 포스트를 받아올 것이다. 앞으로 새로운 포스트를 계속 작성하더라도 sitemap이 자동으로 반영할 것이니 더이상 신경쓰지 않아도 좋다.

    혹시 특정 글의 변경 주기나 우선순위 정보 등을 커스터마이징 하고 싶다면 글 속성에 lastmodsitemap.changefreq등의 태그를 추가해주면 된다.

    ---
    layout: post
    title:  "플러그인 없이 Jekyll Sitemap 만들기"
    date:   2017-03-03 17:23:40 +0900
    categories: Jekyll과 Github 페이지
    date:   2017-03-03 17:23:40 +0900
    sitemap :
      changefreq : daily
      priority : 1.0
    ---
    

    Naver에 내 페이지 노출하기

    일단 Google에 내 포스트가 검색된다면 참았던 숨을 내쉬어도 좋지만, 한국어로 작성되는 콘텐츠가 한국인이 가장 많이 사용하는 검색엔진에 노출되지 않는다면 그것도 서운해진다. 네이버에서도 Google과 비슷한 네이버 웹마스터 도구라는 웹 콘솔을 제공하고 있다. 이 글을 작성하는 시점에는 아직 Beta 딱지가 달려 있지만 뭐 어떤가. 작동만 잘 하면 되지.

    webmastertool

    사이트 추가 절차를 진행하다 보면 Google의 경우와 마찬가지로 내 사이트임을 증명하는 과정이 필요하다. html 파일을 다운로드받아 넣는 방법도 있고, <head>에 네이버에서 제공하는 메타태그를 삽입하는 방법도 있으니 원하는 것을 선택하면 된다. 적용하고 GitHub에 Push 한 후 확인 버튼을 누르면 그대로 인증이 끝나고 사이트가 추가된다. 한국 사이트에서 흔하게 볼 수 없는 깔끔함이다.

    마치며

    평소 타 블로그 서비스를 사용하며 당연하다 생각했던 검색엔진 검색 등록을 수동으로 하려 하니 짜증도 물론 나겠지만, 그만큼 GitHub에서 보장해주는 자유도를 생각하면 뭐 참을만 하기도 하다. 괜히 필자처럼 처음에 햇갈려하지 말고 도움이 되었으면 하는 바람이다. 위의 Google Sitemap 관련 내용은 이 페이지를 참고해서 작성했다. 해당 페이지의 작성자 분에게 감사의 말씀을 전한다.

  • Google Analytics로 GitHub 페이지 분석하기

    Google Analytics?

    Google에서는 Analytics 라는 강력한 무료 방문자 분석 서비스를 제공한다. 멋진 웹 그래프도 확인할 수 있고, 적용법도 JS 코드만 집어넣으면 되니 아주 간단하다. 복잡할 것 없는 포스트이니 빠르게 따라오면 될 것 같다.

    사전 준비

    위 Analytics 서비스 웹사이트로 들어가 초기 세팅을 해둔다. 누구나 하나쯤 있는 Google 계정으로 로그인한 후, 추적할 대상 (Analytics는 웹사이트 뿐만 아니라 Admob 광고나 Android 앱 등 여러가지 대상 추적을 지원한다.)을 선택하는 등 시키는대로 해주면 된다. 마지막에 JS로 작성된 추적 코드를 주는데, 그걸 복사하고 잘 가지고 있자. 물론 지금 복사하지 않아도 나중에 언제든지 Analytics 대시보드에 들어와 복사할 수 있다.

    추적 코드 집어넣기

    여기가 핵심이다. Analytics 웹사이트에는 추적할 모든 페이지에 추적 코드를 삽입하라고 겁준다. 여기서 쫄면 안된다. 정말 “모든” 웹사이트에 코드를 넣을 일은 없다. GitHub 페이지에 테마를 설치한 적이 있다면 아마 _includes라는 폴더가 존재할 것이다. 여기에 google_analytics.html이라는 파일을 하나 만들어 준다. 그리고 아래처럼 코드를 집어넣어 보자

        <!-- Google Analytics -->
        <script>
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
          })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
    
          ga('create', '내 추적 ID', 'auto');
          ga('send', 'pageview');
    
        </script>
    

    이제 같은 폴더 안의 head.html에서 호출만 하면 된다. Jekyll은 표준 Liquid 문법을 모두 지원원하니 head.html 파일의 <head> 태그 안 어디나 include google_analytics.html 블록 (코드에 블록 처리는 해줘야 한다. 원본 코드를 그대로 글에 넣으니 Markdown이 그걸 읽어버려서 죽어도 정상적인 출력이 안된다. 방법을 알아내면 수정하겠다. 당장 이해가 안된다면 여기 참조.)을 집어넣어주면 작업 끝.

    이제 GitHub에 Push하고 며칠 뒤 다시 Google Analytics를 확인해보자. 방문자 통계가 제대로 찍혀 있을 거다. 혹시 Analytics가 제대로 작동하는 것 같지 않다면 Google Tag Assistant 를 사용해보자. 간단한 Chrome 에드온인데 내 사이트에서 Analytics가 제대로 작동 중인지 실시간으로 확인할 수 있는 듯 하다.

  • 공짜 라즈베리 파이가 생겼다

    freerpi

    라즈베리 파이가 처음 세상에 발표됬을 때부터 언젠가 한번 구매해서 사용해보자는 생각은 있었지만, 명확한 사용 용도가 없었기에 정작 지갑은 열지 못하고 있었다. 임베디드나 IoT쪽에 관심은 있지만, 직접 보드를 사서까지 구현할 아이디어가 있는 것도 아니였기에 더더욱 필요가 없었다고 할까.

    그런데 어떤 제품이던 공짜가 된다면 상황이 완전히 달라진다. 어제 친한 지인에게서 “남는” 라즈베리 파이 모델 3를 얻어오자마자 필요가 생길 것만 같은 느낌이다. 파이의 하드웨어도 관심이 없던 사이 많이 발전한 것 같다. 램도 무려 1GB나 들어가고 내장 Wi-Fi와 Bluetooth 모듈도 내장하고 있다. 사실상 라이트한 작업 대부분을 처리할 수 있는 PC로 기동해도 손색이 없을 수준이라는 소리다.

    그런 점을 살려서 예전에 잠깐 구상하다 잊어버린 프로젝트를 파이를 위해 끌어올까 한다. Piranoid 라는 거창한 이름까지 생각해뒀는데, 이것 관련해서는 조금 진행이 된다면 따로 페이지를 만들어서 자세히 기록해 두겠다.