01. 가상서버 호스팅(VPS) 및 우분투(Ubuntu) 서버 준비

- 서비스 신청과 기본적인 보안 설정, 한글 등 -


이 글은 '데이터 분석 결과를 웹에 반응형으로 시각화하기 (Ubuntu Server + R + Shiny)' 의 연속 포스트입니다.

데이터 분석 결과를 웹에 반응형으로 시각화하는 과정을 정리하고 있습니다.




서버가 필요한 이유

포스팅의 최종 목표인 R과 Shiny로 반응형 시각화 결과를 웹에 올려 사람들과 공유하려면,

홈페이지를 구동하기 위한 웹호스팅 서비스가 아닌 '직접 프로그램(ex : 데몬)을 돌릴 수 있는 서버'가 필요합니다.


이런 서버 관련 서비스 중 VPS를 선택한 이유는 뭐니뭐니해도 '저렴'하고 '간편'하기 때문입니다.

고가의 장비를 구하는 비용이나 회선료를 여러 사람과 나눠 부담한다고 생각하시면 편할 것 같습니다.

기본적인 유지보수와 기술지원도 업체에서 해주니 상당히 편리합니다.



가상서버 호스팅(VPS)이란

가상서버 호스팅(Virtual Private Server Hosting, VPS)이란 이미 구축된 서버로부터 자원을 할당받아 사용하는 서비스입니다.

다시 말해, 서버에 필요한 물리적인 장비를 구매하거나 임대하지 않고도 독립적으로 서버를 관리하고 운영할 수 있는 상품입니다.


그림으로 쉽게 설명하자면 좌측(Physical World)과 같이 일반적인 서버 시스템은 하나의 물리적 서버에 하나의 OS와 App을 서비스하지만, (1:1)

VPS를 사용하면 우측(Virtual World)과 같이 하나의 물리적 서버에 여러 OS와 App이 자원을 나누되 독립적으로 운영하기에 경제적입니다. (n:1)


(이미지 출처 : 한국데이터통신, http://www.startit.co.kr/service/imagine.jsp)


단점도 존재합니다. VPS는 소수의 물리적인 서버를 여러 사람이 나눠쓰다 보니 불안정할 수 있습니다.

하지만 서버호스팅이나 코로케이션은 비용면에서 학습 목적으로 적합하지 않을 수 있습니다.


참고로 VPS와 비슷한 서비스가 요즘 대세(?)인 '클라우드'입니다.
클라우드는 가상서버와 달리 필요에 따라 자원 할당량(CPU/메모리/저장공간 등)을 유연하게 확장하거나 축소할 수 있다는 차이가 있습니다.



VPS 서비스 업체의 선택

가상서버 호스팅 서비스를 제공하는 다양한 회사들이 있고, 아래 링크처럼 일목요연하게 정리된 자료가 있습니다. (Lael님 블로그)

KOREA VPS 가상서버호스팅 목록 - https://laelbe.s3.amazonaws.com/blog/44/index.html 

필요에 따라 서비스 사양을 선택하시면 될 것 같습니다.


추후 필요하면 직접 홈 서버를 구축해서 포스팅할 생각입니다.



우분투 서버 준비

VPS 서비스를 신청하실 때, OS를 선택하게 됩니다.

보통 CentOS나 Ubuntu(우분투) 등의 선택지가 있습니다.

Shiny 패키지 정보들을 찾아보니, Ubuntu와 함께 기술된 Reference가 많아 우분투를 선택하였습니다.


#. VPS 서버 Root 접속

우선, Root란 윈도우 운영체제에서 관리자라고 보시면 됩니다. (가장 최상위 권한을 가지고 있는 계정)

서버에 아무런 세팅이 되어있지 않기 때문에, 우선 Root로 서버에 접속하셔야 됩니다.

뒤에서 다루겠지만, 나중에 보안을 위해 Root로의 로그인을 차단할 것입니다. (Brute-force Attack, 비밀번호 무작위 대입 공격에 대비)


서비스를 결제하시고, 세팅이 끝나면 해당 업체 사이트를 참고하시거나 고객센터를 통해 안내받아 'SSH'에 접속하시면 됩니다.

제가 사용하는 서비스 기준으로 접속 방법을 정리할까 했지만, 업체마다 서비스 방식이 다를 수 있음을 유의 바랍니다.


보통 우분투를 포함한 리눅스 서버는 'SSH' 프로토콜을 통해 접속해 운영, 관리합니다.

SSH는 무료 소프트웨어인 'Putty' 를 통해 접속할 수 있습니다.

일반적으로 윈도우 32bit 실행 파일을 사용하시면 됩니다 : https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe

다른 버전은 공식 사이트(http://www.putty.org)에서 받아 사용하시면 됩니다.



Putty를 실행하시고, 'Host Name' 에는 업체로부터 발급받은 서버의 IP 주소를 적으시고, 'Port' 는 SSH 접속에 사용될 값을 적으시면 됩니다.



위와 같은 화면이 나오면 '예' 버튼을 누르시면 됩니다.



login as: 


라고 떴을 때 'root'라고 입력하시면, 아래처럼 연속으로 비밀번호 입력하라고 나옵니다.


login as: root

root@[서버 아이피]'s password: [비밀번호]


비밀번호를 입력하시고 [Enter] 키를 누르시면 위 캡처 화면처럼 접속이 됩니다.

참고로, 아무리 키보드를 두드려도 화면에 ***** 같은 글자나 반응이 안 나타납니다. (처음에 당황..)


#. 우분투 버전 확인

작성일('17.03.22) 기준 16.04가 최신의 'Long Term Support version (LTS)' 버전입니다.

안정적이면서 가장 최근에 배포된 버전이므로, 앞으로의 작업은 'Ubuntu Server 16.04'에서 이뤄질 것입니다.


여기서 하나 짚고 넘어가야 할 부분이 있습니다.


대부분의 리눅스 관련 자료들은 명령어를 입력할 부분에 '#'이나 '$'를 붙입니다.

이를 통해 독자는 '아, 명령어 입력 부분이구나!' 라고 인식하게 됩니다.


'#'은 Root 권한일 때를 의미하며, '$'은 일반 사용자인 상태를 의미합니다.


[아이디]@[서버명]:~

편의상 이 부분을 생략하고 바로 '#'이나 '$'를 적는 것이 보통입니다.


그리고, 저의 모든 포스팅에서는 진한 보라색을 직접 사용자가 입력해야 하는 부분의 표식으로 사용하겠습니다.



우선 설치된 우분투 OS의 버전을 다음 명령어로 확인해봅니다.


# lsb_release -a


No LSB modules are available.

Distributor ID: Ubuntu

Description:    Ubuntu 16.04.2 LTS

Release:         16.04

Codename:     xenial


만약 Release가 16.04 미만이면, 이 포스팅처럼 진행하다 문제가 발생할 수도 있습니다.

아래 링크를 참고해서 업데이트를 먼저 진행하시길 권장해드립니다. (do-release-upgrade 명령어로 간편하게 가능한 것 같습니다)


https://www.digitalocean.com/community/tutorials/how-to-upgrade-to-ubuntu-16-04-lts

https://help.ubuntu.com/lts/serverguide/installing-upgrading.html


아마 대다수의 VPS 업체가 최신버전의 우분투(OS)를 설치해줄 겁니다.



#. 작업용 계정 생성과 기본 보안 설정

Root는 모든 권한을 가지고 있는 계정이기 때문에 이를 직접 이용하는 건 매우 위험합니다.

보안 측면에서 큰 구멍을 하나 열어둔 것이나 마찬가지고, 관리상으로도 치명적인 실수가 발생할 수 있기 때문입니다.


가령 리눅스 시스템에서는 'rm'이 삭제 명령인데, 실수로 Root가 'rm -rf /' 라는 명령어를 내리면 최고관리자의 명령이기 때문에 군소리 없이 시스템의 모든 파일과 디렉터리를 삭제하는.. 대참사가 벌어질 수도 있습니다....

(비슷한 사례로 토이 스토리 2가 'rm *' 명령어로 전부 날아갈 뻔했다가 백업본이 있어서 겨우 살렸다는... https://youtu.be/8dhp_20j0Ys ..백업의 중요성..)


먼저, 다음과 같이 계정 생성 명령어인 'adduser'를 이용해 아이디를 만듭니다.


# adduser [사용할 아이디]


-- 생략 --


새 UNIX 암호 입력: [사용할 비밀번호]

새 UNIX 암호 재입력: [사용할 비밀번호]

passwd: password updated successfully

Changing the user information for [입력된 아이디]

Enter the new value, or press ENTER for the default

Full Name []: [엔터키 입력]

Room Number []: [엔터키 입력]

Work Phone []: [엔터키 입력]

Home Phone []: [엔터키 입력]

Other []: [엔터키 입력]

정보가 올바릅니까? [Y/n] [엔터키 입력]


가능한 비밀번호는 복잡한 것이 좋겠습니다. 영문자, 숫자, 특수문자를 포함해서 말이죠.

나머지는 필수 입력 사항이 아니므로 무시하고 엔터키를 입력했습니다.


다음으로, 방금 만든 계정이 관리자로서 작업을 수행할 수 있도록 권한을 부여해줍니다. (일반 계정은 기본적으로 관리자 권한이 없습니다.)


# usermod -aG sudo [생성한 아이디]


Putty와 같은 SSH 접속 프로그램을 하나 더 켜서 서버에 재접속합니다.

이번엔 Root가 아닌 방금 생성한 계정으로 접속합니다. (만약 접속되지 않는다면 기존에 root로 접속했던 창에서 다시 작업합니다.)


그 다음, 외부에서 Root로 바로 접근을 시도하지 못하도록 하는 등의 보안 설정을 진행합니다.


$ sudo vim /etc/ssh/sshd_config 

[sudo] password for [아이디]: [비밀번호 입력]


'sudo' 명령은 Root 권한으로 이어지는 명령을 수행하라는 뜻입니다. 이런 방식으로 관리자 권한을 부여한 계정에서 서버를 관리할 수 있습니다.

'vim' 명령은 윈도우의 메모장과 같은 프로그램으로 이어지는 경로의 파일을 수정하겠다는 의미입니다.


위 명령을 수행하면 편집 창이 나타납니다. 키보드의 [Insert] 키를 눌러 수정 모드로 변경합니다. (그래야 편집이 됩니다)

그 다음, 아래에 해당하는 부분을 찾아 값을 변경합니다. 다른 문구들은 손대지 않습니다.


# 로그인을 기다리는 시간(초). 로그인 시도 중 설정한 시간이 지나면 자동으로 접속이 종료된다.

LoginGraceTime 10


# SSH를 통한 Root 접속 가능 여부 설정. 특별한 사유가 아니면 no로 설정하고 변경하지 않는다.

PermitRootLogin no


# SSH 접근을 허용할 계정 목록. 기재된 아이디 외에는 차단된다.

AllowUsers [생성한 아이디]


'#' 은 R 언어와 마찬가지로 주석의 기능을 합니다.

저의 경우 3가지 중 상위 두 옵션은 이미 적혀있어 뒤에 옵션만 수정했고, 마지막은 아예 없어서 새로 타이핑했습니다.


편집을 마친 후, ①키보드 [Esc] 키를 누른 다음 ②[:] 키를 누르고 (Shift + ;) ③[w] 키를 누른 후 ④[Enter] 키를 누르면 저장됩니다.

그다음, ①키보드 [Esc] 키를 누른 다음 ②[:] 키를 누르고 (Shift + ;) ③[q] 키를 누른 후 ④[Enter] 키를 누르면 편집기를 종료합니다.


다음 명령어를 입력해 SSH 서버를 재시작합니다.


$ sudo service ssh restart


다시, SSH 접속 프로그램을 하나 더 켜서 root 아이디로 접속을 시도해봅니다. 불가능해야 정상입니다.

그다음, 하나 더 켜서 생성한 아이디로 접속을 시도합니다. 가능해야 정상입니다. 만약 불가능하다면 맨 처음에 root로 접속한 창에서 다시 작업합니다.


이제 방화벽을 활성화해 서버의 보안을 강화합니다.


$ sudo ufw app list


사용 가능한 프로그램:

  Apache

  Apache Full

  Apache Secure

  OpenSSH


제가 사용하는 업체의 경우 Apache와 OpenSSH가 등록 가능한 규칙으로 설정돼 있네요.

우선 가장 기본적으로 서버 관리에 필요한 SSH를 허용합시다.


$ sudo ufw allow OpenSSH


그 다음으로 SSH 접속에 무작위 대입 공격(Brute-force Attack) 방어 규칙을 다음과 같이 적용합니다.


$ sudo ufw limit ssh


이제 방화벽 설정을 마쳤으니, 다음과 같이 방화벽을 활성화함으로써 허용된 서비스 외에는 차단해 보안을 강화합니다.


$ sudo ufw enable


방화벽이 제대로 동작하는지 확인합니다.


$ sudo ufw status


상태: 활성



목적                         동작          출발

--                         --          --

22                         LIMIT       Anywhere                      

22 (v6)                    LIMIT       Anywhere (v6)


SSH는 기본적으로 22번 포트를 사용합니다. 위 결과와 같이 나온다면 제대로 설정이 된 것입니다.



#. 우분투 한글 Locale 설치하기

향후에 R에서 한글 지원이 잘 되도록 우분투에 한글 Locale 을 설치하겠습니다.

먼저, 내 서버의 Locale이 어떤지 확인해 봅시다.


locale


LANG=en_US.UTF-8

LANGUAGE=en_US.UTF-8

LC_CTYPE="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=en_US.UTF-8


위처럼 영문이 기본적으로 설치, 설정되어 있음을 알 수 있습니다.

아래와 같이 한글 패키지를 설치합니다.


$ sudo apt-get install language-pack-ko


-- 생략 --

Do you want to continue? [Y/n] [Y 입력 후 Enter]


그 다음, 한글 Locale을 생성합니다.


$ sudo locale-gen ko_KR.UTF-8


Generating locales (this might take a while)...

  ko_KR.UTF-8... done

Generation complete.




마치며

기본적인 우분투 서버 세팅을 마쳤습니다.
이제 전 세계의 모든 사람이 인터넷으로 내 서버에 접근할 수 있게 된 것입니다. (아직 아무것도 없지만)

다음 과정은 여기에 R 서버를 설치해보겠습니다.

사실, SSH 접속에 Public Key Authentication을 사용하고 비밀번호를 통한 접근을 차단하는 추가적인 보안 강화 방안도 있습니다.
아래 참고 문헌 가장 첫 번째 링크를 참고하시면 설정하실 수 있습니다.


포스팅 내용에 오류가 있거나, 궁금한 사항 등이 있으시면 코멘트 주세요.

읽어주셔서 감사합니다.



참고 문헌

https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04

https://help.ubuntu.com/community/CheckingYourUbuntuVersion

https://namu.wiki/w/rm%20-rf%20/#s-4

+ Recent posts