phpMyAdmin 설치

mysql로 그간 CUI로 열심히 관리해왔지만, 사실 그럴 필요는 없다. GUI로 나온 툴들도 많고 오픈소스도 있으니.. 게다가 CUI로는 DB가 조금 커졌을땐 내용 확인하기도 좀 애매해서 직관적으로 파악하기가 어려운 점도 있다.

그래서 오늘은 시놀로지 NAS에서도 쓰고 있는 phpMyAdmin을 GCP에 설치해볼까 한다.

무료이기도 하고 사용도 간단하고 꽤 많은 이들에게 검증된 애플리케이션이라 개인용으로 쓰기엔 매우 적합하다.



#cd /tmp
#sudo wget https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.zip

/tmp 폴더에 간단하게 최신 phpMyAdmin을 다운로드 해두었다. 구버전이 필요하거나 이 글을 쓰는 시점보다 미래에는 더 최신 버전이 나올테니 그때는 s.xeriars.com/QhfE 에서 다운로드 받을 수도 있다.



#sudo apt-get install zip
#unzip phpMyAdmin-5.0.4-all-languages.zip

압축을 풀려니 zip을 안받아놨네… 일단 zip부터 설치한다.



#sudo mv phpMyAdmin-5.0.4-all-languages /var/www/phpmyadmin
#sudo rm phpMyAdmin-5.0.4-all-languages.zip

압축을 풀고 /var/www/phpmyadmin 디렉터리로 파일들을 이동해주었다.

다운로드 받았던 .zip 파일은 용량도 아낄겸 삭제.

#sudo ln -s /var/www/phpmyadmin /var/www/html/xeriars

아파치 웹서버의 DocumentRoot 기본값은 /var/www/html이므로 전 단계인 /var/www에 저장을 해두면 외부에서 접근할 수가 없게 된다. 다만 구동을 하려면 무언가 있어야하니 심볼릭 링크를 생성해준다.

윈도우로 치면 단축아이콘을 만들어주는 것이므로, 외부에서 접근을 시도했을 때 원본파일에 뭘(!?) 건드리려고 해도 보안상 안전하게 된다.

이제 외부에서 접속할 수 있는 주소가 생겼다. https://자신의도메인또는IP주소/xeriars 로 접속하면 되며, 심볼릭링크는 자유롭게 설정하면 된다. 기본값을 쓰면 웹봇이나 누군가 찝적거리므로 phpmyadmin은 피하는게 좋다.



심볼릭 링크를 xeriars로 설정하였으므로 도메인 뒤에 /xeriars를 붙여서 접속.

사용자명과 암호는 mysql의 root계정을 사용하므로 사용자명에 root / 암호는 root 계정 암호를 입력하면 된다.



이렇게 루트 계정으로 접속이 안된다면, 계정을 하나 생성해서 그 계정으로 접속을 해야한다.



#sudo mysql -u root -p
#create user '아이디'@'%' identified by '비밀번호';
#grant all privileges on *.* to '아이디'@'%';
#quit;

계정을 적절히 생성해준 후 해당 계정으로 접속을 시도한다.



접속은 잘 되었으나 스크롤을 좀 내려보면 에러메시지가 떠있다.

필연적인 것이니까 걱정할 필요는 없다.



일단 빨간색 네모박스친 “여기”를 클릭.



“Create”를 클릭.



이런식으로 전부 OK가 뜨면 성공. 이제 다시 홈으로 돌아간다.



그래도 메시지가 떠있다. 다시 터미널로 돌아간다.



#sudo cp config.sample.inc.php config.inc.php
#sudo nano config.inc.php

환경설정파일이 없기 때문에 에러가 난 것이며, sample 파일을 복사해주면 된다.

다음은 config.inc.php 파일을 파일 에디터로 열어준다. 여기서는 nano를 사용하였다.



빨간색 네모 친 부분을 보면 blowfish_secret을 설정하는 부분이 있다. 이 부분에 해시코드를 넣어주면 된다.

s.xeriars.com/9h7-에 접속해서 간단하게 생성할 수 있다.



Encrypt 란에 아무 글자나 넣고 Hash! 를 클릭하면 위와 같이 해시코드가 생성된다. 이걸 복사해서 붙이면 된다.



이런식으로 ‘이 안에’ 넣어주고 저장해주면 끝. 이제 다시 웹브라우저로 돌아가서 홈으로 가려고 하면 다시 로그인을 하라고 나오므로 로그인을 해준다.



에러가 말끔히 해결되었다.

하지만 이것 말고도 에러가 뜨는 경우가 한가지 더 있다.



이런식으로 임시 디렉터리에 엑세스를 할 수 없는경우에 에러가 발생한다. 이 에러도 해결은 가능하다.

일단 터미널로 돌아가서 다음과 같이 진행한다.



sudo mkdir tmp
sudo chown www-data:www-data tmp -R
sudo chmod 774 tmp

tmp 디렉터리를 생성해주고 소유자는 www-data로, 권한은 774로 주면 끝.

이 글을 쭉 따라왔다면 왠만하면 잘 설치되겠지만 안되면 뭐.. 구글에서 찾아야 하겠지.

대부분의 외국친구들도 비슷한 문제를 겪기 때문에 찾기가 어렵진 않다.

이상 phpMyAdmin 설치법에 대해서 써보았다.

미디어 위키 파일 업로드 오류



비공개로 업로드할 수 없습니다 (UploadStashFileException): “”mwstore:local-backend/local-temp/a/ab” 디렉터리를 만들 수 없습니다.”.

관리하고 있는 개인 위키에 그간 파일업로드를 안했었기 때문에 모르고 있었는데, 오늘 좀 쓸일이 있어서 업로드를 했더니만 위 스샷처럼 오류가 발생했다.

뭔가 설정이 잘못되었겠거니 하고 찾아보니 역시 미디어위키 공식 페이지에 답이 있다. (s.xeriars.com/1Ol3 참조)

몇가지 해결방법이 있는데, 다음과 같다.

1. php.ini에 파일업로드 옵션이 켜져있는지 확인.

우분투 기준 /etc/php/php버전명/fpm 경로에 위치하고 있으며 nano 같은 편집기로 열어 확인이 가능하다.



file_uploads = On

디폴트 설정은 On 일테니 크게 문제는 없을 것 같다만 일단 확인해볼 필요는 있으니까.

php.ini 열어 본 김에, 업로드 사이즈도 확인해본다. 20MB 정도면 충분할 듯 한데, 너무 작다면 조절해준다.

2. 미디어위키 설치 디렉터리 내 images 폴더의 파일소유자를 확인한다.



<만일 스샷처럼 www-data 로 설정되어 있지 않다면 다음과 같이 설정.

sudo chown -R www-data:www-data images/

또한 images 폴더의 퍼미션도 755로 설정해준다.

sudo chmod 755 images

3. LocalSettings.php 파일을 확인한다.



$wgEnableUploads = true; 가 아니라 false; 라면 업로드가 되지 않으므로 확인.

파일을 연 김에 업로드 확장자 제한도 같이 설정해준다.

$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg', 'doc',
    'xls', 'mpp', 'pdf', 'ppt', 'tiff', 'bmp', 'docx', 'xlsx',
    'pptx', 'ps', 'odt', 'ods', 'odp', 'odg'
);

또는

$wgFileExtensions = array_merge( $wgFileExtensions,
    array( 'doc', 'xls', 'mpp', 'pdf', 'ppt', 'xlsx', 'jpg', 
        'tiff', 'odt', 'odg', 'ods', 'odp'
    )
);

또는

$wgFileExtensions[] = 'docx';
$wgFileExtensions[] = 'xls';
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'mpp';
$wgFileExtensions[] = 'odt';
$wgFileExtensions[] = 'ods';

위와 같이 설정해줄 수 있으며, 미디어위키에도 나오는 예시방법이다.

여기까지 설정했더니 일단 문제점은 해결되었다.

이정도까지 설정하면 왠만한 경우는 모두 해결 될 듯 한데, 그 이외에도 안된다면 그땐 상기 언급한 것과 같이 미디어위키 공식페이지 글을 정독해야 할 듯 싶다.

스마트폰 카메라 셔터음 비활성화 하기

내용추가 2022.08.24.

안드로이드 12 이상은 https://xeriars.com/302 를 참고. (adb 적용불가)

최근에 갤럭시 노트20 울트라를 사용하다가, 안드로이드 11 베타 테스트에 참가했다.

왠걸.. 무음모드 앱을 사용하고 있던게 죄다 먹통이다. 별로 남에게 사진 찍고 있는 것을 알리고 싶지 않은데 찰칵 하고 강제로 소리나는 것은 극혐이다. 굳이 알려야 할 이유도 없고, 사무실에서 일하다가 찰칵 소리가 나면 괜히 쳐다보게 되고.. 어떤 사람들은 동물이나 애기사진 찍을때도 많이 이용되고 있는데 이걸 굳이 왜 법적으로 규제를 해놓았는지…

피쳐폰 시절부터 우리나라에는 법적으로 셔터음을 강제하도록 규제사항이 있고, 해외에 나가면 이 기능은 자동으로 비활성화 되지만 어찌되었든 짜증나는 것도 사실.

그래서 이래저래 찾아보다가 비활성화 할 수 있는 방법을 찾았다.

준비물 : adb (인터넷에 많다.)



1. 설정 → 휴대전화 정보에 들어간 후 스크린샷의 빌드번호 부분을 연타한다.

“개발자 모드가 활성화 되었습니다” 라고 나올때까지 연타하면 되며 보통 5~6회 하면 가능하다.



2. USB 디버깅 옵션을 켠 후 스마트폰과 PC를 USB 케이블로 연결한다.

3. adb를 설치후 시작 → 실행 → cmd를 켠 후 adb를 설치해둔 경로로 이동한다.



다음의 명령어를 입력한다.

adb devices

연결된 장치를 확인하는 명령어이며, 이때 휴대전화 화면에는 “RSA 어쩌고 저쩌고 인증을 #(O*&$#” 나오면 확인을 누른다.

무작위 알파벳 과 device 라고 나오면 연결이 성공된 것이다.

이제 다음의 명령어를 입력하면 완료.

adb shell settings put system csc_pref_camera_forced_shuttersound_key 0

마지막 값은 다음과 같다

0 : 셔터음 비활성화

1 : 셔터음 활성화

명령어가 올바르게 입력되면 스크린샷처럼 아무런 응답이 없고, 오타 등등 오류가 있다면 에러메시지가 출력된다.

이제 무음모드 또는 진동모드에서는 셔터음이 울리지 않으며, 벨소리를 켜두면 셔터음이 출력된다.

갤럭시 노트20 울트라 안드로이드 11 베타버전에서 작동 확인하였으며, 대부분의 스마트폰에서 작동 할 것으로 기대된다. 다만 베타버전의 경우 추가 업데이트 되면 셔터음은 다시 활성화되므로 업데이트 후 비활성화 작업을 또 해주어야 한다.

** 2020.12.23 내용추가. 갤럭시 노트 20 울트라 안드로이드 11 정식버전 릴리즈 적용 후에도 셔터음 비활성화 적용이 가능한 것을 확인. **

GCP 이용 워드프레스 설치

현재 블로그는 티스토리를 이용하고는 있으나, 개인 홈페이지 및 개인 블로그는 설치형 워드프레스를 사용중이다. 초심자가 접근하기엔 역시 티스토리나 네이버 블로그가 편하지만, 편의성이나 자유도는 압도적으로 워드프레스가 좋다. 플러그인 지원도 그렇고 이래저래 좋은 점이 많지만 역시, 단점은 설치형이다 보니 범접하기가 힘든 것도 사실이다.

설치 시 꽤나 귀찮은 점이 많아서 오늘은 추후 재설치 시 까먹을 것을 대비해서 워드프레스 설치방법을 써보려고 한다.

무료로 제공되는 가상 서버 중에는 여러가지가 있지만, 제목에 떡하니 GCP(Google Cloud Platform)라고 적어둔건 딱히 GCP가 좋아서 그런 것 보단 현재 오라클 클라우드는 이미 다른 용도로 잘 사용중이라 남는 자리가 없어서, 남는 서버를 고르다보니 GCP가 선택되었다. (개인 홈페이지, 개인용 블로그는 오라클 클라우드를 사용중이다.)

준비물 : 구글계정, GCP 가입. 이건 인터넷에 많이 있으니 이 과정은 생략한다.

1. 먼저 GCP로 접속한다. (s.xeriars.com/U71-)



2. 메뉴버튼 → Compute Engine → VM 인스턴스 클릭



3. 만들기 클릭



3. 무료 사용을 위해서는 f1-micro 머신을 골라야 하는데, 다음의 리전만 무료로 이용가능하므로 주의.

us-west1(오리건), us-central1(아이오와) us-east1(사우스캐롤라이나)

사용조건 : 1GB 트래픽, 서버용량 월 30GB, 서버 사용시간 월 744시간 (31일 * 24시간 = 744시간/월)

인스턴스를 2개 만들게되더라도 서버시간은 합산 계산되므로 두개를 같이 돌리게 되면 744시간 / 2 = 372시간으로 줄어드므로 주의한다.



4. 원하는 부팅디스크를 고른다. 개인 취향에 맞춰 CentOS를 써도 되고 Debian을 써도 되고, 그건 자유.

인스턴스는 1개만 사용할 것이므로 처음부터 30GB로 잡아준다.



5. 나중에 포트를 열려면 메뉴버튼 → VPC 네트워크 → VM 인스턴스에 가서 열면 되지만, 귀찮으니 미리 여기서 http와 https의 트래픽을 허용으로 체크 후 만들기 클릭



6. SSH로 서버에 접근 할 수 있도록 SSH키를 생성해서 붙여준다. 메뉴버튼 → Compute Engine → 메타데이터 → SSH키



7. 인스턴스 생성이 완료되면 서버 IP(외부 IP)를 이용해서 접속한다. 고정 IP는 참고로 유료기능이다.

서버 내에서 shutdown -r 명령으로는 상관이 없지만 GCP 메뉴에서 서버를 중지했다가 재시작하는 경우에는 IP가 변경되므로 나중에 도메인과 연결하기 위해 DNS를 설정하게 되면 주의해야 한다.



8. PuTTY 등으로 SSH 접속을 진행하면 되며, 무사히 완료되면 다음의 명령을 실행한다.

$sudo apt update && sudo apt upgrade -y

9. APM (Apache, PHP, MariaDB) 패키지를 설치해준다.

$sudo apt install apache2 php7.4 php7.4-fpm mariadb-server
$sudo apt install php7.4-json libapache2-mod-php7.4 php7.4-mysql
$sudo apt install php7.4-gd php7.4-mbstring php7.4-bz2 php7.4-zip
$sudo apt install php7.4-opcache php7.4-readline php7.4-curl php7.4-xml

10. mysql (MariaDB)를 설정한다.

먼저 root계정 패스워드를 설정한다.

$sudo mysqladmin -uroot -proot password 1q2w3e4r!@

그 다음 워드프레스용 데이터베이스와 계정을 생성해준다.



$sudo mysql -u root -p
create database wordpress;
use mysql;
CREATE USER 'wordpress'@'%' IDENTIFIED BY '1q2w3e4r!@';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'; 
FLUSH PRIVILEGES;
quit;

11. 워드프레스 설치파일을 다운로드 한 뒤, 압축을 풀어 apache2 웹서버 루트로 이동시켜준다.

$cd /tmp
$wget https://wordpress.org/latest.tar.gz
$tar zxvf latest.tar.gz
$sudo mv wordpress /var/www/html

12. 웹서버 루트로 이동 후 wp-config.php를 수정해주어야 한다. nano가 없으면 설치한다.

$cd /var/www/html/wordpress
$sudo cp wp-config-sample.php wp-config.php
$sudo apt install nano
$sudo nano wp-config.php

13. wp-config.php를 다음과 같이 수정한다.


// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'wordpress' );

/** MySQL database password */
define( 'DB_PASSWORD', '1q2w3e4r!@' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

다른 부분은 위에서 설정한 DB 설정대로 해주면 되고 AUTH_KEY 부분의 ‘put your unique phrase here’ 부분은 s.xeriars.com/73yL를 방문해서 나온 정보를 입력하면 된다.

14. 파일 및 디렉터리 소요권을 부여한다.

$sudo chown www-data.www-data /var/www/html/wordpress/* -R

15. php.ini를 값을 수정한다.

$sudo nano /etc/php/7.4/fpm/php.ini

최하단에 다음의 값을 넣어준다.

file_uploads = On
max_execution_time = 300
memory_limit = 256M
post_max_size = 32M
max_input_time = 60
max_input_vars = 4440

저장 후 php를 재시작한다.

$sudo service php7.4-fpm restart

15. apache2를 재시작한다.

$sudo service apache2 restart

16. https로 접속을 원하는 경우 반드시 도메인이 필요하며, 도메인의 DNS를 설정한 후 certbot으로 인증서를 발급받으면 된다. 그 관련 절차는 xeriars.com/260 를 참조한다.

17. 웹브라우저를 열고 http://본인의서버IP주소/wordpress 로 접속한다.



만약 설치화면이 아니라 php소스가 출력된다면 다음과 같이 수정해 줄 필요가 있다.

$sudo nano /etc/apache2/apache2.conf


스크린샷과 같이 맨 밑줄에 다음의 설정을 삽입 후 저장.

AddType application/x-httpd-php .php .htm .html .inc
AddType application/x-httpd-php-source .phps

apache2를 재시작해준다.

$sudo service apache2 restart


위와 같이 나온다면 99% 완성이다.

블로그 이름, 아이디, 비밀번호를 설정해준 뒤 install WordPress를 클릭해주면 설치가 완료된다.

검색엔진에 블로그가 노출되기 원한다면 Search engine visibility에 체크해준다. 나는 개인 홈페이지를 만들때는 체크를 안하고 만들었다.



18. 아이디와 패스워드까지 생성되었으면 완료된 것이다. 이제 다시 http://본인의서버IP주소/wordpress 로 접속하면 다음과 같은 화면을 볼 수 있다.



19. 개설된 블로그가 이렇게 뜬다면 완성.

이제 관리자 페이지에 들어가 이런저런 설정을 해주면 된다.

잘 꾸미고 운영하는 일만 남았으며, 다음번 글에는 이런저런 꼼수를 조금 더 담아볼까 생각중.

블로그 도메인 변경 및 이동작업

기존에 블로그 도메인에 사용하던 llf.io는 다른 용도로 사용할 일이 생겨서 기존에 미리 보유하고 있던 xeriars.com으로 도메인을 변경하였다.

단순히 티스토리에서 도메인 변경만 하는 것이라면 상관은 없지만, SEO (Search Engine Optimization)까지 신경쓴다면 검색엔진쪽도 건드려줘야한다.

기왕 변경한 것이니 오늘은 블로그 도메인 변경 및 이동작업에 대해서 글을 써본다.

주의사항 : 블로그 주소 변경 시 당분간 방문자 감소는 피할 수 없는 리스크임을 감수하고 진행해야한다.

1. 변경 할 도메인의 DNS 설정



CNAME내용은 blog.tistory.com 또는 host.tistory.io로 설정하면 된다.

Naked domain으로 설정하는 경우 cloudflare는 CNAME Flattening 기술이 적용되어있어 www없이 그냥 입력해도 되지만, 원칙적으로는 비표준이므로 DNS 설정이 상기와 같이 안될 수 있어 이럴때는 아래와 같이 입력하여 해결한다.

Record : A / Name : @

Content : 27.0.236.139 (IP가 변경되는 경우에는 티스토리에서 별도 공지예정이라고 한다. 출처)

A레코드가 싫으면 xeriars.comwww.xeriars.com 으로 301 리디렉션 처리를 해도 된다.

다만 Naked domain이 아닌 www가 붙는게 단점이라면 단점. 크게 상관은 없어보인다.

2. 티스토리 블로그 도메인 변경작업

티스토리 블로그 관리페이지 → 관리 → 블로그 → 개인 도메인



사용중인 도메인을 무시하고 변경할 도메인을 입력하고 “변경사항 저장”을 클릭하면 되며, 티스토리는 https접속만 가능하게 변경되었으므로, 인증서 발급도 진행된다. (티스토리 도메인 연결/적용 방법 xeriars.com/240 참조)

3. 검색엔진 수정 전 301 리디렉션 처리

티스토리 자체 기능만으로는 불가능한게 있어 DNS또는 별도 서버에서 처리해줄 필요가 있다.

앞전에 남긴 글 (xeriars.com/238)을 참조하거나 하기와 같이 별도 서버에서 301 리디렉션 처리를 할 수 있다.

서버가 없다면 Google Cloud Platform 또는 Oracle Cloud에서 계정을 하나 만들어서 VM Instance로 생성하여 서버를 가지고 작업하면 된다. (계정 생성의 경우는 인터넷에 검색해보면 널렸으므로 여기서는 다루지 않는다.)



서버 IP를 A레코드로 DNS에 물려주면 DocumetRoot에 지정된 경로로 접속하게 되는데, 경로에 있는 index.html 또는 index.php를 읽게 되므로, 위 스샷처럼 간단하게 리디렉션 처리를 해주면 된다.

<?php
	header("Location: https://xeriars.com", true, 301);
	exit();
?>

다만 경로 전달을 위해서는 아래와 같이 .htaccess까지 건드려줄 필요가 있다.



RewriteEngine on
RewriteRule ^(.*)$ https://xeriars.com/$1 [R=301,L]

.htaccess까지 건드려주면 https://llf.io/111로 접속했을 때 https://xeriars.com/111 로 리다이렉트 해주므로 검색엔진에서 유입되는 케이스까지 생각한다면 설정해주는게 좋다.

4. 선호 URL (Canonical URL) 설정

<link rel="canonical" href="https://xeriars.com">

현재 나눠져 있는 도메인은 femto.me, llf.io, xeriars.tistory.com, xeriars.com 총 4가지이므로 대표적 도메인을 검색엔진에 알려 줄 필요가 있다.

이것을 설정해주지 않으면 검색엔진이 표준 URL로 선언되지 않은 URL로 판단되어 색인생성이 제대로 되지 않으므로 여러개의 도메인으로 나누어져 있는 검색결과를 병합하기 위해서는 반드시 필요한 조치 중 하나이다.

5. 검색엔진 사이트 이동조치

사이트 맵 및 robots.txt 반영에 관련해서는 티스토리에서 다음과 같이 지원하고 있으므로 필요 시 반영/제출하면 된다.

사이트 맵 : https://자신의도메인/sitemap.xml (예 : https://xeriars.com/sitemap.xml)

robots.txt : https://자신의도메인/robots.txt (예 : https://xeriars.com/robots.txt)

검색엔진에 노출되도록 Google Search Console이나 bing 웹마스터 도구 등을 수정할 수 있다.

1) Google Search Console (s.xeriars.com/fers) 에서는 다음과 같이 이동시킬 수 있다.

구글 서치콘솔 접속 → 설정 → 주소변경



이미 앞서 301 리디렉션 처리를 해둔 상태이므로 “유효성 검사 및 업데이트”를 누르면 유효성 검증이 진행 된 후 이동이 가능하다. 단, *.tistory.com에서 검색결과의 이동은 301 리디렉션 처리를 할 수 없으므로 불가능.


예전에 쓰던 femto.me도 하는김에 같이 이동시켜주었다. 이렇게 설정해주고 몇 달 기다리면 구글검색결과가 모두 xeriars.com으로 이동되므로 fork된 검색결과가 모두 병합된다. 구글에서 권장하는 301 리디렉션 유지기간은 기본 6개월이라고 명시되어 있다. 기존 도메인의 검색결과가 악용되지 않게 도메인을 최소 1년 간 유지하는 것도 권장하고 있다.

(출처 : s.xeriars.com/ZGHI)

2) bing.com (s.xeriars.com/scJs)은 새버전에서는 사이트 이전 메뉴를 찾지 못해 구버전에서 진행하였다. 사이트 주소를 둘 다 (llf.io, xeriars.com) 추가 후 다음과 같이 진행한다.

이동할 도메인(llf.io)을 선택 후 진단 및 도구 → 사이트 이동 으로 접속한다.


구글의 경우는 301 리디렉션 처리 후 유효성검증까지 마쳐야 이동할 수 있는 것에 반해, bing은 특별한 검증없이 이동이 가능하므로 크게 신경 쓸 필요는 없다.

3) 네이버 서치어드바이저(웹사이트 도구)는 s.xeriars.com/F9LV를 참조하면 되며 기본적인 절차는 다음과 같다.

먼저 기존 사이트에 robots.txt로 다음과 같이 수집이 거부되도록 한다.

User-agent: *
Disallow: /

301 리디렉션은 이미 설정되어있을테니 이 부분은 앞 내용을 건너뛰지 않았다면 크게 신경 쓸 필요는 없다.

다음으로는 이동할 사이트 (xeriars.com)을 등록한 후 사이트맵을 제출하여 주고 기다리면 해결된다.

4) 다음 검색등록(s.xeriars.com/Uzle)은 티스토리 도메인을 변경하면, 바로 변경된 주소가 다음 검색결과에 반영되나 때로는 검색엔진 내부 로직에 의해 삭제될 수 있는데, 이때는 검색등록을 별도로 신청해주어야 하며, 그래도 노출이 안된다면 검색엔진 내부에서 스팸 등으로 제외처리 된 것이므로 고객센터에 문의해서 풀어주어야 한다.



검색엔진의 검색결과까지 반영하는 몇 가지를 다루었으니, 그 외의 검색엔진에 대한 것은 이 글을 읽는다면 큰 어려움 없이 응용 할 수 있으리라 판단되며, 나중에 변동사항에 대해서는 이 글에 추가적으로 내용을 기입할 생각이다.

개인 도메인 이용 단축 URL 만들기 (YOURLS 이용)

전에 ushort.io에서 개인 도메인을 통한 단축 URL만들기에 대한 글을 썼었는데 (xeriars.com/246)

최근에 오라클 클라우드와 GCP (Google Cloud Platform) VM 인스턴스를 통한 평생무료서버가 몇 개 생겨서

뭘 설치할까 고민하다가 설치형 단축 URL 애플리케이션(오픈소스)으로 유명한 YOURLS를 설치하기로 했다.

일단 기본적으로 GCP에 VM 인스턴스 생성하는 방법은 인터넷에 널려있으니 이건 넘어가도록하고,

APM 설치 후 YOURLS(Your Own URL Shortener)를 설치해서 운영하는 방법이다.

여러가지 리눅스 배포판이 있지만 무난한 우분투 리눅스 20.04.01 LTS 기준으로 설명한다.



일단 GCP 생성 후 SSH로 접속후에는 APM부터 설치해주어야 한다. 다음의 명령을 입력한다.

$apt update && apt -y upgrade
$apt -y install software-properties-common
$add-apt-repository ppa:ondrej/php
$apt update
$apt -y install php7.4 php7.4-mysql
$apt -y install apache2
$apt -y install software-properties-common
$apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
$add-apt-repository 'deb [arch=amd64,arm64,ppc64el] https://ftp.harukasan.org/mariadb/repo/10.5/ubuntu focal main'
$apt update
$apt -y install mariadb-server
$apt -y install nano git

MariaDB 대신 mysql을 사용해도 되는데, 개량판인 MariaDB가 더 나은 것 같아 이것으로 설치했다.

다음으로는 git과 nano를 설치해준다. nano 대신 다른 편집기를 사용해도 된다만, 개인적으론 이게 더 편했다.

여기까지 설치했으면 일단 기본 준비는 끝.

이제 YOURLS를 다운로드하고 설치할 차례다.

$cd /tmp
$wget https://github.com/YOURLS/YOURLS/archive/1.7.9.tar.gz
$tar zxvf 1.7.9.tar.gz

/tmp에 YOURLS를 다운로드 받는다. git에 올라온 최신버전은 1.7.10이나 어쩐지 공지에는 이 내용이 없고 공식적인 최신버전은 여전히 1.7.9이므로 일단 저것으로 진행한다.



압축까지 풀었으면 apache2 웹서버 경로로 파일을 이동시켜 줄 차례.

$mv YOURLS-1.7.9 /var/www/html/urls
$cd /var/www/html/urls/user

YOURLS-1.7.9 폴더를 urls로 이름을 바꿔 이동하나, 이건 자유롭게 해줘도 무방하다.

이제 데이터베이스를 생성할 차례.

$mysql -u root -p

데이터 베이스에 루트계정으로 접속한다. 아직 루트계정에 암호가 설정되지 않았을테니 암호를 물어보면 엔터를 친다.

$create database yourls;
$use mysql;
$CREATE USER '아이디'@'localhost' IDENTIFIED BY '패스워드';
$GRANT ALL PRIVILEGES ON 데이터베이스.* TO '아이디'@'localhost';
$FLUSH PRIVILEGES;
$quit;

만일 MySQL 루트 계정 패스워드를 변경하고 싶다면 다음과 같이 입력한다.

$mysqladmin -u아이디 -p기존패스워드 password 신규패스워드
예시 $mysqladmin -uroot -proot password 1q2w3e4r!@

설정파일을 만들기 전에, 한글패치를 만드신 분이 있으니 한글패치를 적용한다.

$cd /var/www/html/urls/user/languages
$git clone https://github.com/at4am/YOURLS-ko_KR.git
$mv YOURLS-ko_KR/ko_KR.po ./
$mv YOURLS-ko_KR/ko_KR.mo ./

이제 YOURLS 설정파일을 만들 차례다. 다음과 같이 입력한다.

$cd /var/www/html/urls/user
$cp config-sample.php config.php
$nano config.php

자신있으면 mv로 해도 무방하긴 한데, 그래도 혹시 몰라 cp로 했다.



nano로 config.php를 열어주면 여러가지 설정파일이 나오는데, 이 글에서는 필요한 것만 세팅한다.

상세 설명은 공식홈페이지의 내용을 참조 (https://s.xeriars.com/KJIg)

/** MySQL database 아이디 */ 
define( 'YOURLS_DB_USER', 'yourls' ); 

/** MySQL database 패스워드 */ 
define( 'YOURLS_DB_PASS', '1q2w3e4r!@' );

/** YOURLS 를 적용 할 도메인명. https를 적용하려면 https라고 써준다. */
define( 'YOURLS_SITE', 'https://s.xeriars.com' );

/** 서버 타임존 설정. 우리나라는 GMT+9 이므로 아래와 같이 입력 */
define( 'YOURLS_HOURS_OFFSET', 9 );

/** YOURLS 언어설정 */
define( 'YOURLS_LANG', 'ko_KR' );

/** 랜덤 쿠키값 입력 */
/** https://api.yourls.org/services/cookiekey/1.0/ 에 접속한 후 나온 값을 입력해주면 된다. */
define( 'YOURLS_COOKIEKEY', 'Zb0ZhUp%smJj$f#~qAEv}qnM6nZbc72w]$ZDZwF{' );

/** 로그인 시 사용할 아이디 / 패스워드 입력.  */
$yourls_user_passwords = array(
        'yourls' => '1q2w3e4r!@',
        // 아이디, 패스워드를 추가하려면 아래와 같이 입력한다.
        // 'username2' => 'password2',
        // You can have one or more 'login'=>'password' lines
        );


/** 단축URL 무작위 생성방식: 36 또는 62 입력 */
define( 'YOURLS_URL_CONVERT', 62 );
/*
 * 36: 전부 소문자로 생성 (예: 13jkm)
 * 62: 숫자,대소문자로 생성 (ie: 13jKm or 13JKm)

전부 입력해준 후에는 ctrl + o 를 눌러 저장해주고 ctrl + x로 빠져나온다.

$chmod 666 config.php

위의 설정파일에서 지정한 로그인 아이디, 패스워드 중 패스워드는 나중에 암호화가 되므로 chmod를 통해 읽기, 쓰기 권한을 지정해주어야 한다.

$cd /var/www/html/urls
$nano .htaccess

이제 .htaccess를 생성해줄 차례다. 아래 내용을 넣어주고 저장해주면 끝.

# BEGIN YOURLS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /yourls-loader.php [L]
</IfModule>
# END YOURLS

(선택사항) 아까 config.php에서 https로 설정해주었으므로 SSL 인증서 발급이 필요하다.

certbot을 이용하면 간단하게 해결 가능한 부분이므로 이 부분을 같이 진행한다.



DNS에서 일단 서버 IP를 A record로 넣어주고 proxy 연결은 풀어준다. 인증서 발급 전에 proxy로 연결되면 클라우드 플레어 CDN으로 연결되어 정상적인 IP를 찾지 못하므로 발급 후 proxy로 해주면 된다.

이제 certbot을 설치한다.

$sudo snap install --classic certbot
$certbot --apache


중간에 물어보는건 메일주소, 약관동의, 메일링리스트 가입동의, 도메인 입력까지 4가지이므로

각각 입맛에 맞춰 입력해주면 된다.



이런식으로 에러가 난 상태면 DNS 설정이 제대로 안된 상태이거나, DNS 설정 후 아직 반영이 안된 상태이므로

조금 기다렸다가 다시 인증서 발급을 시도하면 된다.

인증서 발급이 완료되면 ssl, rewrite는 자동으로 활성화 되므로 a2enmod로 활성화 할 필요는 없다.

$cd /etc/apache2/sites-available
$ls -al
$nano 000-default-le-ssl.conf


인증서를 생성하면서 도메인에 맞는 설정파일이 생성, 등록되었으므로 이것을 기준으로 수정하면 된다.

기본으로 생성되는건 000-default-le-ssl.conf이므로 이 파일을 수정한다.

혹시 맘에 들지 않으면 a2dissite로 등록 해제 후 *.conf 이름을 변경해준 뒤 다시 a2ensite로 등록.



*.conf 를 nano로 열어 경로를 변경해준다. 빨간 박스처럼 수정해주면 된다.

저장 후 다시 빠져나온다.

이제 끝이 보이긴 하는데 아직 하나 더 수정해줄 파일이 남아있다.

$nano /etc/apache2/apache2.conf

우분투 기준이므로 다른 버전은 httpd.conf를 수정해주면 된다.



172번째줄 쯤 AllowOverride None을 ALL로 변경해준다.

이것이 수정되지 않으면 URL이 생성되도 접속이 안되는 문제가 생긴다.

이제 아파치를 재시작해준다.

$service apache2 restart
또는
$/etc/init.d/apache2 restart

이제 https://설정한도메인/admin/install.php 로 접속한다.



“YOURLS 설치하기” 클릭



.htaccess 파일이 에러가 나는 경우가 있는데, 미리 생성해서 그런것이므로 별 문제는 없다.

설치가 완료되었으므로 YOURLS 관리페이지(https://설정한도메인/admin)로 접속해보자.



아까 config.php에서 설정한 아이디와 비밀번호를 입력하고 로그인한다.



이 화면까지 보인다면 설치가 완료 된 것이다. 이제 테스트를 해보자.

구글에서 이 블로그의 도메인인 xeriars를 검색한 url은 다음과 같다.

www.google.com/search?newwindow=1&q=xeriars.com&nfpr=1&sa=X&ved=2ahUKEwja9sHBmofsAhWJd94KHbCkATUQvgUoAXoECAsQKg&biw=1536&bih=754

이 url을 입력후 “URL” 단축하기를 클릭.



생성된 URL은 s.xeriars.com/C8ZE 이며 Random ShortURLs Settings 플러그인을 사용하여

4자리로 생성되도록 했기 때문에 이런 형식으로 생성되었다.

(*서버 보안 강화 차원에서 해외 IP로는 접속이 안되게 막아둔 상태이다.)

생성 전 “사용자 정의 단축 URL”에 원하는 단어를 넣으면 https://도메인/xxxx 형식으로도 생성이 가능하다.

여기까지가 끝이면 좋겠지만, 현 상태에서는 https://사용자도메인 으로 접속하면 아래와 같이 나온다.



이렇게 된 이유는 index.html이나 index.php가 없기 때문인데,

아까 아파치 설정파일에서 루트경로를 수정해주어서 그렇다.

기본적으로는 /var/www/html이 루트경로이나 아까 설정해준 것은 /var/www/html/urls 였으니

저 파일 목록을 보면 index.html이나 index.php가 없는 것을 알 수 있다.

로그인 경로는 /var/www/html/urls/admin/index.php 이므로 이것을 심볼릭 링크로 걸어주면 된다.

심볼릭 링크는 윈도우로 치면 단축아이콘 정도로 생각하면 된다.

$ln -s /var/www/html/urls/admin/index.php /var/www/html/urls/index.php
$mv sample-robots.txt robots.txt
$service apache2 restart

하는김에 robots.txt 도 설정해줘서 웹 크롤러가 /admin 까지 크롤링 하는걸 막아준다.

아파치를 재시작해주고 나면 https://사용자도메인 으로 접속했을때

이제 저 보기 싫은 파일 탐색창 대신 로그인 화면이 바로 뜨게 된다.

이렇게 yourls 설치를 통한 개인도메인 사용 단축 URL글은 끝이 났다.

아무래도 설치형이다보니 전에 소개했던 ushort.io 보단 압도적으로 복잡하지만, 일단 무료인 점과

한번 고생해서 설치를 해두면, 구글에서 서비스를 종료하지 않는 한 지속적 이용이 가능한게 장점이다.

또한 광고에서 자유로운 점과 도메인도 맘대로 바꿔줄 수 있는 것도 장점으로 작용한다.

리눅스를 처음 접하거나 복잡해서 어려울 수도 있지만 차근차근 따라하다보면 그렇게 어려운건 아니니

필요한 사람들에게 도움이 되는 글이었으면 좋겠다.

HTTP/2 적용

기존 운영하고 있던 서버는 모두 HTTP/1.1을 사용하고 있었으나 이미 출시된지 오래된 프로토콜이고,

최근 대세가 HTTP/2인 관계로 5개 서버 모두 적용하였다.

필수조건인 https의 사용은 이미 certbot을 이용해서 let’s encrpyt에서 SSL 인증서를 받아오고 있으니 패스.

#sudo apt-get install php7.4-fpm
#sudo a2enmod proxy_fcgi
#sudo a2enconf php7.4-fpm
#sudo a2dismod php7.4
#sudo a2dismod mpm_prefork
#sudo a2enmod mpm_event

YOURLS 설치 시 mod php를 사용중이었으나, fpm으로 변경하였고,

HTTP/2에서는 prefork모듈이 지원되지 않아 dismod 처리 후 mpm으로 전환했다.

일부 명령어는 선행작업이 필요하므로, 가급적 명령어 처리시 순서를 맞추면 별 트러블 없이 처리 된다.

#sudo nano /etc/apache2/apache2.conf
또는
#sudo nano /etc/apache2/sites-available/개별-사이트-설정파일.conf

아파치 기준 위와 같이 설정파일에 접근 후 적절히 아래의 코드 한줄만 삽입해주면 된다.

첫번째 줄은 서버 내에서 여러사이트를 운영할 때, 두번째 줄은 사이트별 개별설정을 의미한다.

Protocols h2 https/1.1

위 코드 한줄 입력시 호환이 안되는 클라이언트에서는 HTTP/1.1 나머지는 HTTP/2를 지원한다.

최근에 이르러서는 거의 대부분의 인터넷 브라우저에서 HTTP/2를 지원하기에 큰 문제는 없다.

#sudo apachectl configtest
#sudo /etc/init.d/apache2 restart

설정을 확인 후 Syntax OK가 나오면 서버를 재시작해주고 적용한다.



사이트 로그를 확인하거나 https://s.xeriars.com/y58A에서 적용 여부를 확인 할 수 있다.

Gameboy micro 배터리 교체하기

오래전에 구매한 게임보이 미크로(마이크로라고 읽는게 맞으나, 발매 명칭이 ミクロ이므로 미크로로 칭함)

의 배터리 수명이 끝이났는지 신통찮다. 얼마 못가 꺼지길래 우리친구 알리익스프레스에서 주문했다.



대충 이런걸 구매했는데, 오늘 우체국에서 배송이 왔다.

8월 5일날 주문했는데, 8월 18일날 도착했으니 대충 2주 정도 걸린 셈.

배대지쪽에선 배터리는 대행하지 않으니 알리에서 주문해서 선편으로 오는게 제일 속편하다.



심플하게 배터리 달랑 하나 도착했다.

배송기사님이 집에 오셨는데, 내가 집에 없으니 우체통에 넣고 가시겠다고 하실 정도로 작다.

드라이버 하나만 있으면 되므로 교체하기 매우 간편하다.

동봉된 드라이버를 써도 무난하지만, 일단 나는 공구가 있으니 그걸 쓰는걸로.



일단 측면 볼트 한개를 풀어준다. 이거야 뭐.. 쉬우니까 더 이상의 설명은 생략.

적당히 풀어주고 커버를 밀어주면 배터리부가 열린다.



커버가 열린 모습. 배터리 팩이라고 써있는 저걸 교체하면 되는 것이다.

리튬이온 460mAh라니… 요즘 스마트폰이 4500mAh 정도 들어가니 엄청 적은 배터리 용량되겠다.



배터리를 슬쩍 밀면 쉽게 단자부분이 나타난다.

VCC (빨간색 전선)과 GND (검은색 전선) 위치를 잘 기억해두자. 새 배터리로 바꿔끼워야 하니..



단자를 뺐다. 어차피 배터리 버릴거니 대충 잡아당기면 빠진다.

물론 단자에 꼽힌상태로 잡아당겼다가, 전선만 쏙 빠져버리면 매우 난감해지겠다만…



기존건 빼버렸고, 이제 새 배터리로 교체해줄 차례다.

저 단자 끼우는게 제일 초고난이도 작업이다. 작아서 의외로 잘 안끼워진다.



어찌어찌 끼웠다. 내 손이 커서 그런건지 되게 안끼워진다.

금속재질로 끼우다가 잘못하면 단자부와 닿아서 쇼트날 수 있으니 주의.



커버를 다시 조립하기 전에 잘 작동하는지 전원을 켜본다. 다행히 잘 작동하는걸 확인했다.

GBA 시리즈 최고의 명작 중 하나인 악마성 드라큘라 ~ 효월의 원무곡을 구동시켰다.



이제 전선과 배터리를 잘 정리하고 커버를 덮어주면 끝.

군대에서 항상 나오던 “조립은 분해의 역순”을 지켜주면 된다. (라고 해봐야 볼트 하나만 조이면 끝…)



배터리 교체 후 게임보이 로고를 찍어보았다.

이정도 교체 난이도면 뭐… 쉬워도 너무 쉽다. 완료되었으니 이제 충전 ㄱㄱ 후 즐길일만 남았다.

배터리 수명이 다 되었는데, 분해할 엄두가 안나는 분들이 있다면 아주 쉬우니 도전하면 된다고 말하고 싶다.

요즘에 와선 너무 작은 화면이지만, 그래도 여전히 레트로 갬성을 자극하는 기기임은 틀림없다.

Authy TOTP 인증 토큰 데이터 백업하기

인터넷에서 2FA(2-Factor Authentication) 사용이 일반화 되어가면서 점점 종류가 늘어간다.

 

보통은 구글 OTP보단 백업 및 복원을 위해 Authy를 사용하는데, 이것도 단점이 하나가 있다.

 

물론 Authy가 백업, 복원이 가능한 앱이므로 큰 문제는 안되겠지만, 가끔 인증 토큰이 필요한 경우가 있다.

 

얼마전에 썼던 글 중에 bitwarden (https://xeriars.com/251) 같은 경우도 TOTP (Time-based One-time Password)를

 

자체적으로 지원하나, 이 기능을 사용하기 위해서는 인증토큰을 백업해두거나, 패스워드 데이터 생성 시

 

인증토큰도 같이 넣어 주어야 아래와 같이 작동한다.

 

 



 

 

문제는 Authy에 생각없이 등록할땐 좋았는데, Authy 자체 서버에 인증토큰이 백업되어있을뿐,

 

이걸 별도로 조회 할 방법이 없어서, bitwarden에 넣고 쓰려면 애로사항이 발생한다. 알수가 없으니….

 

이 문제뿐만 아니라 Authy 외 다른 앱을 사용하게 될 때도 마찬가지다. 이 경우 등록된 각 사이트마다

 

전부 재발급 받는 방법말곤 없어서 매우 골치가 아파진다.

 

 

그래서 인증토큰을 조회 할 수 있는 방법을 찾아봤는데, 다행히 답을 찾았고 현재는 bitwarden에서 사용중이며

 

등록된 인증토큰도 안전하게 백업해두었다.

 

 

이제 나와 같은 어려움을 겪지 않도록 많은 이들이 볼 수 있게 글로써 해법을 남겨둔다.

 

준비물 : Authy 계정, Chrome 브라우저, Authy 계정정보(전화번호)와 일치하는 스마트폰 그리고

Authy 앱 내부에서 “Allow multi-device”를 켜둘 것. (Settings → Devices)

 

 

1. Chrome 정도는 설치되있다고 간주하고, 일단 Authy 확장 프로그램을 받기 위해 아래주소로 접속.

s.xeriars.com/EmPg

 

 

 



 

2. “Chrome에 추가” 를 눌러 설치한다.

 

 



 

3. Authy를 실행하고, 인증을 거쳐 2FA 리스트가 나오도록 설정해준다.

앱 상단에 더 이상 지원되지 않는다고 기술되어있으나, 신경쓰지 않아도 된다. 지금 이 글처럼 인증토큰을

유출하는 문제 때문에 더 이상 지원되지 않는거니 일단 무시.

 

 

 



 

4. 일단 2FA 데이터 중 아무거나 하나 클릭한다.

 

 



 

5. 백업 비밀번호를 입력하라고 나온다. 이건 Authy를 재설치하고 클라우드에서 TOTP 데이터를 복원할때

입력하는 그 비밀번호이므로, 정확히 입력해준 뒤 Decrypt Account를 클릭

 

 



 

7. 인증키가 나오면 일단 이제 이것은 설정이 끝났다. 하지만 앱을 닫지 말고 아래단계를 진행한다.

 

 

 



 

8. chrome://extensions/ 에 접속하여 확장 프로그램 목록을 열고, 오른쪽 상단 “개발자 모드” 를 활성화 

 

 

 



 

9. “1개 더보기…”를 클릭한다. 아까 앱을 닫았다면 이 메뉴가 뜨지 않으므로 앱을 실행해준 후 시도한다.

 

 



 

10. 뷰 검사 메뉴에서 “main.html”을 클릭한다.

 

 

 



 

11. 개발자 도구가 열리면 “Console” 탭으로 이동한다.

 

 

12. 아래의 코드를 > 표시 된 곳에 입력해준 후 앤터

var charTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
function quintetCount (buff) {
  var quintets = Math.floor(buff.length / 5)
  return buff.length % 5 === 0 ? quintets : quintets + 1
}

const encode = function (plain) {
  var i = 0
  var j = 0
  var shiftIndex = 0
  var digit = 0
  var encoded = new Array(quintetCount(plain) * 8)
  /* byte by byte isn't as pretty as quintet by quintet but tests a bit faster. will have to revisit. */
  while (i < plain.length) {
    var current = plain[i]; if (shiftIndex > 3) {
      digit = current & (0xff >> shiftIndex)
      shiftIndex = (shiftIndex + 5) % 8
      digit = (digit << shiftIndex) | ((i + 1 < plain.length) ? plain[i + 1] : 0) >> (8 - shiftIndex)
      i++
    } else {
      digit = (current >> (8 - (shiftIndex + 5))) & 0x1f
      shiftIndex = (shiftIndex + 5) % 8
      if (shiftIndex === 0) i++
    }
    encoded[j] = charTable.charCodeAt(digit); j++
  }
  for (i = j; i < encoded.length; i++) {
    encoded[i] = 0x3d // '='.charCodeAt(0)
  }
  return encoded.join('')
}
/* base32 end */

var hexToInt = function (str) {
  var result = []
  for (var i = 0; i < str.length; i += 2) {
    result.push(parseInt(str.substr(i, 2), 16))
  }
  return result
}
function hexToB32 (str) {
  return encode(hexToInt(str))
}

const getTotps = function () {
  var totps = []
  console.warn("Here's your Authy tokens:")
  appManager.getModel().forEach(function (i) {
    var secret = (i.markedForDeletion === false || !i.secretSeed) ? i.decryptedSeed : hexToB32(i.secretSeed)
    console.group(i.name)
    console.log('TOTP Secret: ' + secret)
    totps.push({
      name: i.name,
      secret: secret
    })
    console.groupEnd()
  })
  console.log(JSON.stringify(totps))
  return totps
}
getTotps()

 

 



 

환경에 따라 코드 복사가 어려운 경우 s.xeriars.com/qOX3에 접속한 뒤 복사해서 쓰면 되며, 

무진장 복잡해보이지만 그냥 복사해서 붙여넣고 엔터만 해주면 되는 작업이다.

 

 

 



 

13. 끝났다. TOTP 인증 토큰값을 주르륵 뱉어내므로, 이걸로 백업해두거나 타 OTP앱에 활용할 수 있다.

원하는 데이터도 얻었고 더 이상 필요가 없다면 보안을 위해 앱을 삭제해주자.

 

 

 



 

14. bitwarden에서 TOTP까지 관리하고 싶으면 조금전에 뽑아낸 인증토큰을 빨간색 네모 쳐둔곳에 입력후

“저장”해주면 오른쪽에 흐리게 보이는 TOPT 인증번호가 활성화되며 잘 나온다.

 

 

Authy가 분명 편리하고 백업도 되는 건 사실이지만, 그건 Authy 서버에 되는 것 뿐 사용자가 백업 할 수

없기 때문에 여태까지 발급된 2FA 토큰은 이렇게 백업해두고, 앞으로 발급될 토큰들은

차근차근 백업하는 습관을 들이면 토큰 데이터가 날라가서 피눈물 흘릴 일은 없을 것으로 기대한다.

Synology NAS에 bitwarden 설치/운영하기

가입을 요구하는 웹사이트는 계속 늘어나는데, 패스워드는 사이트마다 각각이다보니 기억력의 한계를 느낀다.

패스워드 관리프로그램을 쓰고 있긴 하나, 이것도 불안하긴 마찬가지라 좀 알아보던 중에 bitwarden을 NAS에

설치하여 운영하는 방법을 찾았다.

 

NAS에 설치하고, 마스터계정 로그인을 통해 저장된 패스워드를 조회할 수 있게 만들 수 있으며,

자신의 NAS에 설치되는 것이므로, NAS 관리만 잘 하면 되므로, 불안하게 남의 서버에 저장되는 것 보단

훨씬 심리적인 안정감을 준다.

 

 

준비물 : 시놀로지 NAS (docker 설치상태), 개인 도메인(필요 시), 약간의 지식 (포트포워딩, DNS설정 등)

 

 

1. 제일 먼저 할 일은 NAS에 docker를 설치하는 일이다. 설치방법은 인터넷에 많으니 그것을 참조한다.

 

 

 



2. docker → 레지스트리에서 bitwarden을 검색하여 맨 위에 나온 bitwardenrs/server를 더블클릭한다.

 

 

 

 



3. 특별한게 없다면 lastest로 선택하고 “선택”을 누르면 다운로드가 시작된다. 조금 걸리니 기다리자.

다운로드가 완료되면 알림창에 별도 메시지가 뜨므로 조금만 기다리면 된다.

 

 

 

 



4. docker → 이미지로 이동 후 bitwardenrs/server를 선택하고 “실행”을 클릭하면 이미지가 실행되며 컨테이너

설정창이 열린다.

 

 

 

 



5. 컨테이너 이름은 적당히 설정해두면 되고, 사양이 낮은 NAS를 쓰는 경우 “리소스 제한 활성화”를 체크한뒤

적절히 제한사항을 설정할 수 있다. 몇가지 더 설정해야하므로 “고급설정” 클릭

 

 

 

 



 

6. 항시 사용가능해야 하므로, NAS가 재부팅 되거나 컨테이너가 오류로 종료되더라도 자동 실행될 수

있게 “자동 재시작 활성화” 체크

 

 

 



 

7. 데이터가 저장될 경로를 지정해준다. “폴더추가”를 클릭하여 적당한 폴더를 지정하고,

하위 폴더에 “/”를 포함하여 적당한 이름을 붙인 경로를 만들어주면 된다.

 

 

 



 

8. “자동”으로 되어 있긴 한데, 포트를 지정해두어야 나중에 역방향 프록시 등 여러모로 설정할때

편해지므로 포트를 적절히 지정해둔다.

 

 

 



 

9. 공유기 포트포워드 설정에서 위에서 지정했던 포트를 열어준다. 아까 포트를 지정해주지 않았다면,

이 단계서부터 막혀서 진행이 매우 골때려진다. 포트를 열어주었으니 공유기 단계서 할일은 끝났다.

 

 

 



10. 고급설정까지 다 끝났으니, “다음” 을 클릭하고 “적용”해주면 일단 50% 이상 완료다.

 

 

 



 

11. docker → 개요에서 컨테이너가 제대로 실행중인지 확인한다. 지금까지 잘 따라왔다면 큰 문제는 없다.

혹시 실행이 안되어있다면, “컨테이너”로 이동해서 실행해주면 된다.

 

 

 



12. NAS 내부 IP와 아까 열어둔 포트 (컨테이너 포트 80에 지정되었던 포트)를 이용하면 접속이 가능하다만,

여기까지다. https로 접속하지 않으면 로그인이 불가능하므로 정상작동하는 것만 참고한다.

 



13. 이제 개인 도메인 DNS을 설정해줄 차례다. CNAME을 써도 되고, A레코드를 써도 되고, 서브도메인으로 쓸

이름을 지정해주고 NAS 주소를 목적지로 지정해준다.

 

그리고 와일드카드 인증서(ex : *.xeriars.com)를 발급받은게 아니라면, 반드시 해당 서브도메인에 대한 인증서를

발급해두어야 원할히 접속가능하다.

인증서 없이 https로 접속시도하는 경우 크롬 브라우저의 경우 보안경고가 똻!

 

서브도메인으로 bitwarden이 설정되어 있기 때문에 실제 접속 주소는 bitwarden.xeriars.com 가 될 것이고,

나는 구글 DDNS를 쓰고 있기 때문에 CNAME으로 설정한 상태이다. (구글DDNS 설정법 : https://xeriars.com/243)

IP로 지정해야 하는 경우에는 A레코드를 사용한다.

 

개인도메인 없이 DDNS로만 이용하는 경우에는 보통 synology.me를 사용할테니 다음과 같이 접속하면된다.

https://ㅇㅇㅇ.synology.me:지정한 포트번호 (ex : https://ㅇㅇㅇ.synology.me:13569)

 

이 경우 역방향 프록시 설정은 건너뛴다.

 



 

14. 이제 역방향 프록시를 설정해줄 차례다. https://ㅇㅇㅇ 으로 접속하면 http://192.0.0.0 와 같은 내부 ip로

접속을 돌려줄 수 있기 때문에, 아까 설정해둔 포트로 연결해주면 https로 접속한 것과 같아진다.

“생성”을 클릭해서 신규 항목을 만든다.

 

 



15. 역방향 프록시는 아래와 같이 설정해준다.

 

소스 설정

설명 : 적당한 이름을 설정해준다.

프로토콜 : https로 설정해준다. bitwarden은 http로 로그인이 허용되지 않는다.

호스트 이름 : 설정했던 서브도메인을 넣어준다. (ex : bitwarden.xeriars.com)

포트 : https 포트 443을 넣어준다. 그리고 http로 접속해도 자동으로 https로 바꿔 주도록 “HSTS 활성화”와

“HTTP/2 활성화”를 체크해준다.

 

대상 설정

프로토콜 : http로 설정해준다.

호스트 이름 : NAS 내부 IP를 넣어준다. (ex : 192.168.1.10)

포트 : 아까 설정해주었던 포트를 넣어준다. 컨테이너 포트 80으로 지정했던 포트다.

 

 



16. 이제 거의 다 왔다. 정상적으로 설정되었다면 https로 접속되었기 때문에 주소 옆에 자물쇠가 보일거고,

로그인에 큰 문제가 없을 것이다. 이제 서비스를 이용하기 위해서는 마스터 계정을 만들어야 한다.

“계정 만들기”를 클릭한다.

 

 



17. 이건 사실 넣을 필요가 없다고 보는데.. 회원가입하듯 적당히 넘어간다.

 

 



18. 마스터 계정을 생성하고 로그인하면 완료된 것이다. 이제 패스워드를 입력하고 적당히 운영하면 끝.

설정에 따라서 2FA 설정도 가능하기 때문에 보안을 한층 더 강화 할 수 있다.

 

 



19. 혹시 다른 패스워드 관리 프로그램을 쓰고 있다면, 데이터를 옮겨올 수도 있다. 왠만한건 있으니,

적당한 파일 형식을 맞춰서 불러오면 된다. 개인적으로는 enpass를 쓰고 있다가 데이터를 옮겨와서 사용중.

 



20. 크롬이나 파폭같은 브라우저는 스토어에서 익스텐션을 설치 할 수 있고, 이 경우에는 크롬처럼 비밀번호를

자동으로 입력하도록 만들어 줄 수 있다. 안드로이드 앱도 있으니 편할때로 운영하면 된다.

 

 

lastpass가 털린 전적도 있고, 아무래도 남의 서버에 내 패스워드를 전부 보관하기엔 불안불안하고,

2FA도 지원하기 때문에, 서버 관리만 충실히 잘 해준다면 조금 더 안전하게 운영 할 수 있다.