skyrimse_wallpaper_1920x1200-01

dragonborn_1920x1200 skyrim_environment_1920x1200 skyrim_dragon_shout_1920x1200

 

출처 : 엘더스크롤 5 OST – Dovahkiin (Dragonborn) 가사 및 한글 번역 (영어, 라틴어 번안 추가수록)

 

오…

대단하신 분이다..

 

[가사 발음]

* h는 거의 발음되지 않고 그 부분을 장음처리한다. wah->waa 이런 느낌.

** ei는 [아이]로, w는 영어의 [v] 소리로 발음난다. z는 영어의 [z]보다 조금 세게 발음한다.

게르만-노르딕 언어 쪽의 발음 전통을 따른 것이다. (ㅈ로 표기했다.)

*** 철자로 보면 ii가 장음이어야 맞지만 이 Dovahzul에서는 이게 딱히 장음처리되는 것 같지 않다.

**** ae를 살리는 것 같기는 하나 ([아에]) 어절이 대체로 빨리 발음되니 [에]로 읽어도 무방하다.

***** f는 세게(ㅎ에 가깝게), ng는 영어처럼 [응] 소리로 내도 괜찮다.

****** 대부분의 언어와 마찬가지로 자모 뒤에 모음이 충돌하는 부분에서 연쇄가 있으니 주의.

도바킨, 도바킨,

나알 옼 진 로스 바린

바 다인 보쿨 마파에랔 아스트 발

아르크 핀 노롴 팔 그란

폳 누스트 혼 진드로 잔

도바킨, 파 힌 코간 무 드랄

후즈라 누, 쿨 도 오드, 바 안 봌 린그라 보드

아르크 핀 테이, 보지크 푼, 도 핀 가인

보 로스트 프론 바 네이 도브

아르크 핀 레이맄 도 줄

보뜨 안 술레잌 바 로니트 팔 크라인

아르크 핀 켈 로슽 프로다

도 벧 비잉(그) 코 핀 크라

톨 포드 제이마 빈 카인 메이즈 푼다인

알두인 페인 도 준

크루짘 보쿤 스탇나우

보뜨 안 발롴 바 디본 핀 라인

누즈 안 술, 펜트 알록

폳 핀 불 도바 놐

펜 코스 나롵 마파에랔 아르크 루즈

파즈 카이잘 펜 코스 스틴 놀 바인 알두인 조트

도바킨, 도바킨,

나알 옼 진 로스 바린

바 다인 보쿨 마파에랔 아스트 발

아르크 핀 노롴 팔 그란

폳 누스트 혼 진드로 잔

도바킨, 파 힌 코간 무 드랄

sqlalchemy-logo

<! 설마 위 소스를 그냥 복&붙하곤 안 된다는 사람은 없길 바람 ㄷㄷㄷㄷ !>

 

위 소스를 실행시키면 code별로 type 유형별 합계를 얻을 수 있다.

핵심 = case([(조건1, 값), (조건2, 값), … (조건n, 값)])

flask

  1. 8~10 line : error_handler 설정 필수
    (설정하지 않을 경우, 400 Bad Request 발생) – 아직 정확한 이유는 모르겠음
  2. 20 line : request.get_json()
    (request.form[‘data_key’] 로 접근할 경우 400 Bad Request 발생)

위 2가지 사항이 준수되어야 POST 방식의 Ajax 가 원활히 작동된다.

CSRF 프로텍션을 가동시킨 후 json 데이터를 Ajax POST 방식으로 넘겨서 request.form[‘data_key’]로 값을 받아오려하자 계속 브라우저에서 서버가 이해할 수 없는 요청을 보냈다며 400 Bad Request 발생되어 약 2시간가량 붙잡고 있었다.

아무리 구글에서 검색을 하고 최신 버전의 Flask Document를 찾아봐도 기본 예제들 뿐이었고(대부분이 전송 자체에만 포커스를 맞춰 작성된 글이었다.) Python 뉴비인 나는 헤매기 딱 좋은 조건이었다.

그러던 중 json 데이터를 받는 메소드(예, ajax_post())에서 모든 코드를 주석처리하고 단순히 ‘A’를 출력하는
print ‘A’
명령을 입력하자 거짓말 같이 200 Response 가 떴다.

결국 데이터를 받아오는 쪽에서 문제가 발견했다는 것을 깨닫고 좀 더 구글링하자 get_json() 메소드를 알게되어 변경했더니 유레카!

 

이와 같은 문제로 머리 아픈 다른 사람들이 있다면
부디 이 포스팅을 보고 나 같이 허무하게 시간 낭비하지 않길 바라며 글 작성한다.

  1. Python 2.7.x 소스를 다운 받아 압축을 해제한다.
  2. cd Python-2.7.x
  3. ./configure
  4. make && make altinstall
  5. python -V # 아직 2.6.x 뜰 것이다.
  6. mv /usr/bin/python /usr/bin/python_backup
  7. cp /usr/local/bin/python2.7 /usr/bin/python
  8. python -V # 이제 2.7 뜸

근데 문제는 yum 이 2.6에 맞춰져있어서 yum 도 건드려줘야 한다.. 이거 때문에 한참 헤맴..

  1. cp /usr/bin/yum /usr/bin/yum_backup
  2. nano ‘which yum’
  3. #!/usr/bin/python 에서 python 을 python_backup 으로 수정 (위 6번 참고)
  4. yum update 확인

일반적으로 서버의 SSH 접속하기 위해 사용자의 아이디와 비밀번호가 필요하다. 이 말은 즉슨 대충 ID만 알아도 Brute Force Attack 할 수 있다는 얘기가 된다. 서버 관리자 입장에서 생각해보면 여간 짜증나는 일이 아니다. 로그인이 안 된다 할지라도 해킹이 시도되는 동안 소모되는 서버 자원은 어쩔 것인가 ㄷㄷㄷㄷ

이를 방지하기 위해 Fail2Ban 과 같은 Python 기반의 스크립트를 이용하여 지정된 횟수 이상으로 로그인을 실패하면 해킹으로 판단하여 일정시간 접근을 차단시키는 방법도 있다. 하지만 이 방법도 지정된 횟수 이내로.. 예를 들면 로또보다 더한 확률로 1~2번 시도만에 로그인이 성공하면 낭패다. (그러니 유저들을 추가할 땐 비밀번호 정책을 빡세게 합시다 ㄷㄷㄷ)

하지만 OTP를 이용하게 되면 약간은 안심이 될 것 같다. 1분마다 6자리의 숫자가 갱신이 되고 그 이전의 숫자조합은 무용지물이 되어버리니 이 얼마나 짱짱한가. 몇가지 OTP 서비스들이 있긴 하지만 Google OTP(정확히 말하면 Google Authenticator) 를 이용하기로 했다. 별 거 없다. 왜냐면 구글신이니까..

말머리에서 언급한 바와 같이 SSH 접속하기 위해선 사용자의 아이디와 비밀번호가 필요하지만 Google Authenticator 를 이용하면 그 중간에 OTP 번호를 입력하는 절차가 추가된다.

예를 들면 다음과 같다.

일반적인 SSH 로그인

일반적인 SSH 로그인

 

OTP 이용한 SSH 로그인

OTP 이용한 SSH 로그인

 

세팅하는 방법을 순서대로 나열하겠다. 기존의 타 블로그들에서 작성된 대부분의 Google Authenticator 세팅 방법들은 크게 문제가 없지만 중요한 부분이 빠져있다. 이 글에선 빠지지 않고 모두 작성해놨으니 그대로 차근차근 실행만 한다면 될 것이다.

  • CentOS 6.8 & 7 기준으로 작성
  • root (최고관리자) 권한 기준으로 작성
  • 작업시작 전 모든 패키지들을 업데이트 (하지 않아도 크게 상관 없음)
  1. .ssh 디렉토리 권한 변경
    * 필수 작업 – 0700으로 맞추지 않으면 로그인이 제대로 작동하지 않는다.
  2. Google OTP 패키지 설치에 필요한 필수 패키지 설치
  3. Git 으로 Google OTP 다운로드
  4. 소스 컴파일 작업
  5. Google Authenticator 설정
  6. y 누르고 엔터 (일반적으로 2번)
  7. 스마트 폰에 Google Authenticator 앱 설치 후, 모니터에 나타나는 QR코드 촬영 또는 Secret Key 작성으로 OTP 추가
  8. PAM 설정

    8.1. %PAM-1.0 바로 밑에 다음 내용 추가 (한 줄임)

    8.2 저장
  9. SSH 설정

    9.1. 다음 설정사항들을 모두 yes로 변경

    9.2 저장
  10. SSH 재시작
  11. (옵션) 모든 유저에게 OTP 부여가 완료되었고 더이상 유저 추가 계획이 없을 경우 8.1. 에서 추가된 내용 중 nullok 를 삭제한다.
    nullok 삭제시 해당 서버 SSH에 접근하는 모두가 OTP를 거쳐야 함.

 

위 과정을 모두 마치면 Google Authenticator 를 거쳐 로그인을 할 수 있다. 이렇게 되면 어제 작성했던 Root 비밀번호 자동 변경 쉘 스크립트에서 비밀번호를 좀 더 약하게 생성시켜도 괜찮을 듯 하다.

약 2주간 적용하고 싶은 마음에 수많은 삽질을 했고 결국 성공했다. 별 거 아닌데 뿌듯하다.