Certbot을 이용하여 Let's Encrypt 인증서 자동 갱신하기

이 글에서는 certbot을 통해 발급받은 Let’s Encrypt 인증서를 Webroot 플러그인을 이용해 자동 갱신 방법에 대히여 알아본다.

Prerequsites

Webroot 디렉터리를 생성한다.

이미 설정되어 있는 root 디렉터리(/usr/share/nginx/html 등)에 .well-known 디렉터리를 생성해도 되지만 관리의 편의를 위하여 별도의 디렉터리를 생성한다. 디렉터리 위치는 /var/www/certbot로 한다.

sudo mkdir -p /var/www/certbot

Nginx 설정

기본 설정 파일을 열어 server섹션에 다음 내용을 추가 한다.

location /.well-known/ {
    root /var/www/certbot/;
}

다음과 같이 수정 되었다.

server {
    listen *:80 default_server;
    server_name *;

    server_tokens off;

    location /.well-known/ {
        root /var/www/certbot/;
    }
}

nginx 서버를 재시작 한다.

sudo systemctl restart nginx.service

Apache 설정

아파지 서버를 사용중이라면 아래와 같이 설정한다.

Alias /.well-known "/var/www/certbot"

<Directory "/var/www/certbot/">
    AllowOverride None
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

인증서 발급

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

인증서 갱신

renew 명령을 이용해 인증서를 갱신한다.

certbot renew

결과는 아직 갱신 기한이 아니라고 나온다.

Processing /etc/letsencrypt/renewal/www.example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

Cron을 이용한 인증서 자동갱신

 0  4 *  * * certbot renew

새벽 4시 마다 인증서를 자동 갱신한다.

Let’s Encrypt의 인증서는 90일동안 유효하고 만료일 30일 이전에 갱신하는 것을 권장한다. certbot renew 명령을 수행하면 만료일이 30일 이내일 인증서만을 갱신하기 때문에 renew명령을 메일 수행해도 된다.

만료일을 무시하고 인증서를 갱신하고 싶다면 --force-renew 옵션과 --cert-name 옵션을 사용한다.

certbot renew --force-renew --cert-name example.com

jQCloud를 이용하여 Hugo 사이트에 Tag Cloud 추가하기

이 글은 Hugo 기반 Blog에서 jQuery 기반 Word Cloud 라이브러인 jQCloud를 이용하여 Tag Cloud를 만드는 방법에 대하여 설명한다.

tag cloud

jQCloud의 js 파일을 <head> 내에 위치하도록 아래 코드를 추가한다.

head.html

jQCloud의 stylesheet 파일을 <head> 내에 위치하도록 아래 코드를 추가한다.

head.html

Tag Cloud가 위치할 자리에 다음 코드를 추가한다.

widthheight는 페이지 크기에 맞게 조절한다.

위 코드가 추가된 파일 마지막에 다음 코드를 추가한다.

Hugo 사이트에 Weighted Tag Cloud 추가하기

이 글은 Hugo 기반 Blog에서 Tag Cloud를 만드는 방법에 대하여 설명한다.

tag cloud

Tag의 사용빈도에 따라 Tag의 크기를 조절한다.

unordered list(<ul>)를 이용하였기 때문에 Tag가 한 라인에 하나씩 표시된다.

아래와 같이 스타일링 하여 여려 목록이 한 라인에 표시 되도록 한다.

style.css

그냥 두면 조금 알파벳 순으로 정렬되어 조금 심심해 보인다. Tag의 순서를 무작위로 썩자.

두가지 방법이 있다.

  1. Template에서 썩는 방법
  2. Javascript로 썩는 방법

Template으로 썩으면 Hugo 사이트를 빌드 할때 Tag의 순서가 결정됨으로 조금 심심한 감이 있다.

Javascript를 이용하여 Tag를 썩자 이러면 페이지를 새로 고칠때 마다 Tag의 순서가 바뀐다.

다음 내용을 적당한 곳에 추가하자.

Template 파일에 직접 추가해도 되지만 Tag Cloud를 여러 Template에서 사용하는 경우 <head>에서 불러 오는 custom js 파일에 추가하자.

custom.js

다음에는 jQuery 기반 Word Cloud 라이브러리인 jQCloud를 이용하는 방법에 대해 설명한다.

References

Linux환경에서 SSH Key Pair 생성하기(Generate SSH keypair for Linux)

이 글은 Linux환경에서 SSH Key Pair를 생성하는 방법을 설명한다.

  • OpenSSH가 설치 되어 있다고 가정한다.
ssh-keygen -t rsa -b 4096 -f euikook -C "[email protected]"
  • -t rsa: 생성된 Key의 Type를 RSA로 설정한다.
  • -b 4096: 생성될 Key의 길이를 4096 bit로 설정한다.
  • -f euikook: 생상될 Key의 이름은 euikook로 설정한다.(euikook.pub, euikook)
    • euikook.pub: Public Key
    • euikook: Private Key
  • -C [email protected]: Comment로 [email protected]로 설정한다.

PuTTYgen을 사용하여 Windows에서 SSH Key Pair 생성하기

이 글은 PuTTY 사이트에서 PuTTY와 같이 배포되는 puttygen프로그램을 이용하여 SSH Key Pair를 생성하는 방법을 설명한다.

아래 링크에서 puttygen.exe 파일을 다운 받는다. PuTTY Download Page

이미 설치 되어 있다면 puttygen.exe 파일을 실행한다.

puttygen - open

아래는 puttygen.exe의 실행 화면이다.

puttygen - start

  • Parameters 들 중 Type of key to generate 는 기본값인 RSA로 두자.
  • Number of buts in a generated key는 적당한 값을 변경한다.
  • Generate 버튼을 눌러 Key를 생성한다.

이때 마우스 커서가 진행바 와 Actions 사이의 빈 공간사이를 이리저리 이동해야 키가 생성이 진행된다.

puttygen - generate

Key Paire 가 만들어 졌다.

puttygen - generated

Save public key 버튼을 클릭하여 Public Key를 저장한다.

Key Comment 필드에 e-mail주소나 Comment를 적어 나중에 해당 키를 구분할 수 있게 하자.

puttygen - save public key

적당한 파일 이름을 지정하여 저장한다.

euikook.pub으로 저장하였다.

puttygen - euikook.pub

Save private key 버튼을 클릭하여 Private Key를 저장한다.

puttygen - save private key

passphrase가 비어 있다고 경고 메시지가 나온다. 예(Y) 버튼을 클릭하여 무시한다.

puttygen - ignore passphrase

적당한 파일 이름을 지정하여 저장한다.

euikook.ppk 파일로 저장하였다.

이때 저장되는 파일은 OpenSSH에서 사용되는 개인키가 아닌 Putty 전용 개인키 이다.

puttygen - export as OpenSSH key

Conversions > Export OpenSSH key를 클릭하여 OpenSSH용 개인키를 내보낸다.

puttygen - export as OpenSSH key

passphrase가 비어 있다고 경고 메시지가 나온다. 예(Y) 버튼을 클릭하여 무시한다.

puttygen - ignore passphrase

적당한 파일 이름을 지정하여 저장한다.

euikook 파일로 저장하였다.

puttygen - euikook

utterances: github issue as comment for Hugo

utterances: github issue as comment for Hugo

Simple method

thmem/<theme-name>/partials/ 디렉터리에 utterances.html 파일을 만들고 아래 와 같은 내용을 추가 한다.

thmem/<theme-name>/partials/utterances.html

<script src="https://utteranc.es/client.js"
        repo="<username>/<username>.github.io"
        issue-term="pathname" 
        theme="github-light"
        crossorigin="anon"
        async>
</script>

<username>/<username>.github.io은 자신의 github username으로 변경 한다.

Comment를 위한 별도의 저장소를 사용하고자 한다면 해당 저장소의 이름으로 변경한다.

More graceful

.Site.Params.utterances.repo 변수가 설정 되었을 경우에만 해당 코드가 로그 되게 설정하고 싶다면 utterances.html 파일을 아래와 같이 수정한다.

thmem/<theme-name>/partials/utterances.html

{{ if (not (eq .Site.Params.utterances.repo "")) }}

{{ $term := "pathname" }}
{{ $theme := "github-light" }}
{{ $crossorigin := "anonymous"}}

<script src="https://utteranc.es/client.js"
        repo="{{ .Site.Params.utterances.repo }}"
        issue-term="{{ .Site.Params.utterances.term | default $term }}" 
        theme="{{ .Site.Params.utterances.theme | default $theme }}"
        crossorigin="{{ .Site.Params.utterances.crossorigin | default $crossorigin }}"
        async>
</script>

{{ end }}

config.toml 파일에 아래과 같은 내용을 추가한다.

config.toml

[params.utterances]
    repo = "<username>/<username>.github.io"
    # term = "pathname"
    # theme = "github-light"
    # crossorigin = "anonymous"

<username>/<username>.github.io은 자신의 github username으로 변경 한다.

Comment를 위한 별도의 저장소를 사용하고자 한다면 해당 저장소의 이름으로 변경한다.

Add utterances to post

적당한 위치에 다음 라인을 추가 한다.

{{ partial "utterances" . }}

About authentication to Github

다음과 같은 메일이 왔다.

Hi @euikook,

You recently used a password to access the repository at euikook/wiki.notes with git using git/2.30.2.

Basic authentication using a password to Git is deprecated and will soon no longer work. Visit https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information around suggested workarounds and removal dates.

Thanks, The GitHub Team

Github Blog Token: Token authentication requirements for Git operations

보안 강화를 위하여 2021년 08월 13일 부터 Git 작업을 위한 인증 시 암호를 통한 인증을 지웒 하지 않는다고 한다. 2021년 08월 13일 이후에는 Git 작업을 위해서는 토큰 기반 인증을 사용하거나 SSH 키를 통한 인증을 사용해야 한다.

지금도 2 단계 인증을 활성화 한 사람은 암호를 통한 인증을 사용할 수 없다.

About authentication to Github

Github에 인증하는 방법은 다음과 같다.

  • (2 단계 인증을 통한) username, password
  • Personal access token
  • SSH Key

Github.com에 수정사항을 기여(Contribution)하지 않는 다면 크게 상관 없다.

2 단계 인증을 사용하고 있다면 지금도 계정 암호가 아니라 Personal Access Token을 통해서 인증 해야 하기 때문에 상관이 없다.

개인 PC 에서는 SSH Key를 등록하면 되니 상관 없지만 이 Personal Access Token이 왜우지 못할만큼 엄청나게 길기때문에 개인 PC가 아닌 외부에서 수정사항을 Push 하려면 일일이 github.com에 접속해서 Personal Access Token을 복사하여 사용해야 한다. 보안에는 매우 좋겠지만 여간 불편한게 아니다.

바뀌는점

Github.com repository는 HTTPS와 SSH를 통해 액세스 할 수 있다.

HTTPS 사용자

HTTPS를 이용 하여 저장소에 접근하는 경우 Personal Access Token을 이용하여 접근 하면 된다.

다른 대안은 없다.

SSH를 통해 액세스 방법으로 변경하자.

저장소 URL을 확인한다.

git remote -v 
origin https://github.com/USERNAME/REPOSITORY.git (fetch)
origin https://github.com/USERNAME/REPOSITORY.git (push)

set-url 명령을 이용하여 저장소 URL을 HTTPS에서 SSH로 변경하자.

git set-url origin [email protected]:USERNAME/REPOSITORY.git

잘 변경되었는지 확인하자.

git remote -v 
origin [email protected]:USERNAME/REPOSITORY.git (fetch)
origin [email protected]:USERNAME/REPOSITORY.git (push)

SSH 사용자

변경사항 없이 계속 사용가능하다.

아래와 같이 브라운아웃(Brownout) 이 예정되어있다.

소프트웨어 공학에서 브라운아웃(Brownout)은 응용 프로그램의 특정 기능을 비활성화 하는 기법이다. Wikipedia: Brownout (software engineering)

아래와 같이 예고된 시간에는 Account Password를 통한 인증이 비활성화 되기 때문에 Account Password를 통한 Git 작업을 할 수 없다.

당황하지 말고 SSH를 통한 접근하던지 Personal Access Token을 발급받아 접속하도록 하자.

2021년 06월 30일

  • 07:00 UTC - 10:00 UTC
  • 16:00 UTC - 19:00 UTC

2021년 07월 28일

  • 07:00 UTC - 10:00 UTC
  • 16:00 UTC - 19:00 UTC

한국 시간으로 변경하면 다음과 같다.

2021년 06월 30일

  • 16:00 KST - 19:00 KST

2021년 07월 01일

  • 01:00 KST - 04:00 KST

2021년 07월 28일

  • 16:00 KST - 19:00 KST

2021년 07월 29일

  • 01:00 KST - 04:00 KST

Continous Deployment Hugo with Github Actions

Continous Deployment Hugo with Github Actions

Github Page(이하 GH)를 사용하여 정적 사이트를 배포 하고자 한다.

jekyll 유명한 Static Site Generator가 있지만 Go를 공부할 목적으로 Hugo 를 선택했다.

Hugo는 Github Page에서 공식적으로 지원하는 jekyll과 달리 로컬에서 정적 사이트를 빌드 하여 GH 저장소에 push 해주어야 한다.

Github 에서지원하는 CI/CD 인 Github Actions을 이용하여 이를 자동화 할 수 있는데 Github Actions은 일반적은 CI/CD 와 사용법이 비슷하다.

Setting up github repository for github pages

Github Page를 생성 하기 위해서는 github 계정에 로그인 하여 <username>.github.io 저장소를 만들어야 한다.

Github Page 저장소 : `<username>.github.io`

앞서 생성한 <username>.github.io 저장소를 소스와/정적사이트 브랜치로 나누어 사용하는 방법도 있지만 관리의 효율성을 위해 아래와 같이 소스 저장소와 GH 저장소를 나누도록 한다.

RepositoryURL
Sourcesrc.euikook.github.io
Github Pageeuikook.github.io

Registration Deploy Key

src.euikook.github.io 를 수정하면 Github Action이 자동으로 실행되어 정적 사이트를 빌드하고 결과물을 euikook.github.io 저장소에 자동으로 push하기 SSH KEY를 src.euikook.github.ioeuikook.github.io에 각각 등록 해주어야 한다.

Create SSH Key

아래와 같이 명령을 수행하여 github-page-deploy 라는 Key Pair를 만든다.

ssh-keygen -t rsa -b 4096 -f github-page-deploy
TypeFile NameRespository
개인키github-page-deploysrc.euikook.github.io
공개키github-page-deploy.pubeuikook.github.io

Public Key Registration

GH 저장소의 Settings 항목에서 Deploy Key 항목을 선택하여 새로운 Deploy Key를 등록한다.

Add deploy key

FieldValue
Title적당한 이름을 추가한다. (gh-deploy)
Key공개키(github-page-deploy.pub)의 내용

Github Settings

Github Add Deploy Key

Github Add New Deploy Key

Private Key Registration

소스 저장소의 Settings 항목에서 Secret 메뉴로 이동한다.

New repository secret 버튼을 클릭하여 새로운 Secret을 생성한다.

Name: ACTIONS_DEPLOY_KEY Value: 개인키(src.euikook.github.io)의 내영을 추가한다.

Github Secrets

Add New Secrets

Install Hugo

Hugo Installaion Guide 참조

Create and Setting up Hugo Project

hugo create new project src.euikook.guthub.io

Push Hugo site to repository

git remote add origin src.euikook.guthub.io
git push -u origin master

Create Github Actions

Source 저장소에 Action을 생성한다.

.github/workflows/deployment.yml

jobs:
  build-deploy:
    runs-on: ubuntu-18.04
    steps:
    - uses: actions/checkout@v1
      with:
        submodules: true

    - name: Setup Hugo
      uses: peaceiris/actions-hugo@v2
      with:
        hugo-version: '0.80.0'

    - name: Build
      run: hugo --minify

    - name: Deploy
      uses: peaceiris/actions-gh-pages@v2
      env:
        ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
        EXTERNAL_REPOSITORY: euikook/euikook.github.io
        PUBLISH_BRANCH: master
        PUBLISH_DIR: ./public
      with:
        emptyCommits: false
        commitMessage: ${{ github.event.head_commit.message }}

Github Actions

Hugo 시작하기

Installing

ArchLinux

pacman 명령으로 설치한다.

sudo pacman -Syu hugo

Ubuntu

Ubuntu 공식 패키지로 등록 되어 있으므로 apt 명령으로 설치 한다.

sudo apt install hugo

Snap Package

with Sass/CSCC support

snap install hugo --channel=extedned

whtiout Sass/CSCC support

snap install hugo

Create New Sites

hugo new site sandbox

Add a Theme

themes.gohugo.io에서 테마를 선택한다.

본 예제에서는 ananke 테마를 사용하도록 한다.

cd sandbox
git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke

echo 'theme = "ananke"' >> config.toml

테마의 사용법은 해당 테마의 READMD.md 파일을 참고 한다.

Add Posts

hugo new posts/about.md

Start the hugo server

hugo server -D

-D include contet marked as draft

or

hugo server

기본적으로 http://localhost:1313 으로 접속하면 볼수 있다.

기본적으로 Posts 등의 파일이 변경되면 이를 인지 하여 브라우저가 자동으로 Refresh 된다.

Build Static Pages

hugo -D

-D include contet marked as draft

or

hugo

public 디렉터리가 생상되고 배포를 위해서 public 디렉터리를 github page나 Web 서버에 올리면 된다.

Virtualbox에서 사용 호스트에 연결된 USB 장치가 나타나지 않을 경우

USB 장치를를 게스트에서 직업 접근 하려고 하는데 USB 설정 화면에서 사용 가능한 디바이스 목록에 장치가 하나도 없다.

아래 명령으로 vboxusers 그룹에 사용자를 추가 한다.

sudo usermod -aG vboxusers $USER

로그아웃 후 다시 로그인 하거나 시스템을 재시작 한다.

추가 가능한 USB 장치의 장치 목록이 뜬다.

자세한 내용은 The vboxusers Group 을 참고 하자.

TMI

리눅스를 포함한 유닉스 계열 시템에서 권한을 할당을 위해 자주 사용되는 방법이다. Group에 권한을 부여한다음 해당 그룹에 속한 사용자에게 권한을 부여한다. 다른 예로는 root권한 없이 시리얼 포트에 접근하기 위해서는 RedHat 계열 및 Ubuntu를 포함한 Debian 계열 배포본에서는 dialout 그룹에 속해야 하며 Arch 리눅스 계열 배포본에서는 uucp 그룹에 속해있어야 한다.

dialoutuucp는 모두 통신을 위해 사용되던 시리얼 모뎀과 관련이 있다.