검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : http://kpweb.homelinux.org/blog/index.php?id=13
관련 글 : 가상 데스크탑을 이용한 원격 접속

  이번 포스팅에서는 데비안 계열의 리눅스(데비안, 민트, 우분투)에서 VNC와 SSH를 이용한 원격 접속을 설정하는 내용을 담고 있습니다. 정확히는 SSH 터널을 만든 뒤 그 터널을 이용해 VNC 연결을 만들어 VNC의 트래픽을 암호화하는 방법을 담고 있습니다.



1. 패스워드
  가장 우선적이고 중요한 사항은 원격에서 로그인이 가능한 모든 계정들의 암호는 추측하기 어려운 것이어야 한다는 겁니다. 8자 이상에 숫자, 대소문자를 섞는 것이 좋겠습니다.


2. SSH 포트 번호
  기본적으로 SSH의 포트는 22번이지만 다른 포트 번호를 사용할 경우 외부에서 SSH 서버를 운용하고 있는 것을 파악하기 힘들어지므로 보안상 더 좋습니다. 이 때 Well-Known 포트 번호를 피해 1024 이상의 번호를 사용하는 것이 좋겠습니다.

  만약 공유기를 사용하고 있다면 서버가 될 컴퓨터의 사설 IP를 고정으로 할당합니다. 그리고 포트 포워딩 기능을 통해 아까 정한 포트를 해당 사설 IP와 연결시킵니다. 아니면 공유기에서 사용할 SSH 포트 번호만 아까 선택한 번호로 지정하고 실제 서버 머신에서는 그냥 22번을 사용하도록 설정한 후 둘을 연결하는 것도 좋은 방법입니다. 방화벽을 사용하고 있을 경우 외부에서 해당 포트에 접근할 수 있도록 설정하는 것도 잊지 않도록 합니다.


3. root 계정으로 변경
  이후 작업에는 root 사용자의 권한이 필요합니다. 물론 직접 root 사용자로 로그인하지 않아도 sudo 명령어를 통해 필요한 작업을 할 수 있고 보안상으로도 그게 더 좋겠습니다만 root가 되는 방법을 알아둬서 나쁠 것은 없습니다.

  데비안의 경우 처음부터 root로 직접 로그인할 수 있지만 우분투나 민트의 경우 root 계정에 패스워드가 설정되어 있지 않기 때문에 로그인이 불가능합니다. root로 로그인하는 가장 쉬운 방법으로 아래의 2가지 방법이 있습니다.
  1. 'sudo passwd root' 명령어로 root의 패스워드를 설정한 후 정상적인 방법을 통해 로그인.
  2. 'sudo su -' 명령어로 편법적인 유저 변경. 단, /etc/sudoers 파일에 등록된 계정만 가능.


4.  SSH와 VNC 서버 설치
  아래의 명령어를 통해 SSH 서버와 VNC 서버를 설치합니다.
apt-get install openssh-server x11vnc
  기본적으로 SSH는 암호화를 사용하는 원격 접속 프로그램이지만 이 예제에서는 VNC를 이용한 원격 데스크탑 연결에서 데이터를 암호화하기 위해 사용합니다.

  x11vnc는 원격에서 특정 머신의 데스크탑(GUI 환경을 의미)에 접속할 수 있게 해줍니다. 이 때 원격에서 접속한 사용자와 로컬에서 데스크탑을 사용하던 사용자는 동일한 화면을 보게 됩니다. 즉, 하나의 데스크탑을 두 사용자가 동시에 공유해서 사용하게 됩니다.

  만약 별도의 데스크탑으로 로그인하고 싶다면 아래의 두 패키지를 추가로 설치해줍니다. 하나의 머신으로 여러 사용자가 각자 자신의 데스크탑을 사용할 필요가 있을 때(예를 들어 재택근무용 서버) 유용합니다.
apt-get install tightvncserver xfce4
  tightvncserver는 로컬 데스크탑과는 다른 개별적으로 독립된 가상 데스크탑들을 생성해줍니다. 이 가상 데스크탑들은 VNC로만 접근할 수 있습니다.

  xfce4는 동시에 여러 데스크탑을 만들기에 적합한 수준의 가벼운 데스크탑 환경입니다. Xfce보다 가벼는 데스크탑 환경(=윈도우 매니져)으로는 LXDE, Fluxbox 등이 있습니다.

  여러 가상 데스크탑을 띄울 때 하나의 데스크탑 환경만 사용할 수도 있지만 가상 데스크탑마다 다른 데스크탑 환경을 사용할 수도 있습니다. 자세한 내용은 원격에서 접속 가능한 가상 데스크탑에서 다루겠습니다.


5. SSH 서버 설정
  SSH 서버의 디폴트 설정에 따르면 root 계정으로 로그인이 가능하지만 이것은 보안상 권장되지 않습니다. 만약 SSH를 통해 root 계정으로 로그인하지 못하게 하려면 /etc/ssh/sshd_config 파일에서 아래와 같은 부분을 찾아 yes를 no로 바꿉니다.
PermitRootLogin yes    <- yes를 no로 변경
2014년 01월 30일 추가사항:  SSH 서버가 프록시 서버 역할을 할 수 있도록 아래 옵션을 활성화합니다. 예전에는 없어도 됐다는 것 같은데 지금은 필요하다고 합니다. 확인해보니 디폴트도 no더군요.
PermitTunnel yes
2014년 01월 30일 추가사항: 기본적으로 SSH 서버는 포워딩을 위한 연결이 들어왔을 때 포워딩 대상이 자신의 루프백 주소(localhost, 127.0.0.1)인 연결 요청만 받아들입니다. 이유는 보안 때문입니다. 데이터가 서버까지는 암호화돼서 가지만 서버에서 목적지로 보낼 때는 평문으로 가기 때문이죠. 이를 허용하려면 아래의 옵션도 추가해야 합니다. 단, 이 글의 예에서는 필요하지 않습니다.
GatewayPorts yes
  포트를 바꾸는 것도 간단합니다. 같은 파일에서 아래와 같은 부분을 찾아 포트 번호를 원하는 번호로 바꿉니다. 공유기의 경우 이걸 바꾸는 대신 이 컴퓨터의 이 포트 번호와 연결된 공유기의 외부 포트 번호를 바꾸는 것도 좋은 방법입니다.
Port 22    <- 숫자를 원하는 포트 번호로 변경
  변경을 모두 마쳤으면 /etc/init.d/ssh restart 명령어로 SSH 서버를 재가동시켜 변경사항을 적용합니다.


6. root 계정 로그아웃
  이제 root 계정이 필요 없기 때문에 exit 또는 logout 명령어로 root 계정에서 빠져나옵니다.


7. 로컬에서 SSH 테스트
  SSH 서버가 작동하는지 테스트를 해보기 위해 아래의 명령어를 실행해봅니다.
ssh username@localhost
  "username" 부분에는 테스트에 사용할 계정명을 입력합니다. 비밀번호를 물어보면 입력합니다. 로그인에 성공하면 exit 또는 logout 명령어로 빠져나옵니다.
  만약 SSH 서버의 포트 번호를 변경했다면(공유기의 외부 포트 번호만 변경한 경우라면 제외) 아래처럼 -p 옵션을 추가합니다. "port" 부분에는 SSH 서버의 포트 번호를 입력합니다.
ssh -p port username@localhost


8. 랜에서 SSH와 VNC 테스트
  만약 동일한 랜에 다른 리눅스 컴퓨터가 있다면 그 컴퓨터로 가서 아래의 명령어를 실행합니다.
ssh -L 5903:localhost:5900 username@your_server_ip
  username에는 계정명을, your_server_ip에는 접속할 SSH 서버의 주소를 적습니다. -L 옵션은 로컬 호스트의 특정 포트를 암호화된 SSH 채널을 통해 특정 호스트의 포트로 포워딩시키는 옵션입니다. 위의 예에서는 로컬 호스트의 5903 포트를 원격 호스트의 5900 포트와 연결시키고 있습니다. 이런 연결을 'SSH 터널'이라고 부릅니다. 이해할 때 한 가지 주의할 점은 두 포트 번호의 중간에 있는 localhost인데 이것은 원격 호스트(SSH로 접속할 곳. 즉, "your_server_ip")의 입장에서 localhost를 뜻하는 겁니다. 위 명령어를 차례대로 설명하자면 "로컬 호스트의 5903 포트로 오는 트래픽을 암호화해서 'your_server_ip'로 보내고 그곳에서 복호화한 후 localhost(=your_server_ip)의 5900 포트로 다시 넘긴다."라는 의미가 됩니다. (2014.01.30 추가)위의 GatewayPorts 옵션을 yes로 지정해야 localhost가 아닌 다른 곳으로 설정할 수 있습니다.
 
  아래의 명령어로 VNC 서버를 실행합니다.
x11vnc -localhost -display :0
  "-localhost" 옵션을 사용하면 외부에서 가상 데스크탑으로 직접 접속하는 것을 허용하지 않습니다. 즉, 자신으로부터의 접속만 허용하는데 재미있게도 우리는 위에서 SSH 터널링을 통해 두 호스트를 연결했고 이로 인해 클라이언트 측에서 5903 포트에 데이터를 보내면 그게 서버 측으로 넘어가고 서버는 그것을 다시 자기 자신의 5900 포트로 보내기 때문에 "-localhost" 옵션을 사용해도 원격에 있는 클라이언트가 접속할 수 있게 되는 겁니다.

  이제 클라이언트 데스크탑에서 VNC 뷰어 프로그램을 실행한 뒤 'localhost:3'을 접속 주소로 넣고 접속을 시도합니다. VNC에서 접속 주소 뒤에 넣는 숫자는 VNC 디스플레이 번호를 의미하는 값으로서 거기에 5900을 더한 값이 실제 접속 포트 넘버가 됩니다. 그러므로 'localhost:3'이라고 적은 것은 'localhost에 5903번 포트로 접속하라'라는 뜻입니다. 이 포트를 통해 서버의 5900번 포트(VNC 디스플레이 0번)로 접속하는 겁니다. 위에서 클라이언트의 5900번 포트와 서버의 5903번 포트를 SSH 터널로 연결했던 게 바로 이걸 위해서였던 겁니다.

  이제 VNC 트래픽은 SSH 터널을 통해 암호화되어 전송됩니다. 또한 SSH 터널을 사용하고 있다는 사실을 모르는 공격자는 VNC 서버의 "-localhost" 옵션 때문에 VNC 서버에 접속을 시도조차 할 수 없기 때문에 보안상 1석 2조가 되는 셈이죠.

  연결을 종료하고 싶으면 VNC 뷰어 프로그램을 종료한 후 SSH 접속을 하고 있는 터미널에서 exitlogout 명령어로 SSH 세션을 종료하면 됩니다.


9. 원격 접속하기
  이제 본방입니다. 사실 중요한 건 위에서 전부 다해서 그닥 설명할 것도 없습니다. 외부에 있는 클라이언트 컴퓨터에서 SSH 서버에 접속하기 위해 아래처럼 명령어를 실행합니다.
ssh -p port -L 5903:localhost:5900 username@your_server
  "port"에 서버의 포트 번호, "username"에 로그인할 계정명, "your_server"에 서버의 IP나 도메인을 적습니다. 접속을 시도하면 패스워드를 묻기까지 시간이 좀 걸립니다. 로그인에 성공하면 VNC 서버를 작동시키기 위해 아래의 명령어를 실행합니다.
x11vnc -localhost -display :0
  이제 클라이언트의 데스크탑(=GUI)에서 VNC 뷰어 프로그램을 실행한 뒤 'localhost:3'으로 접속합니다. 이제까지 설정이 올바르다면 서버의 데스크탑 화면이 나올 겁니다. 만약 배경화면을 사용하고 있다면 화면의 갱신속도가 매우 느릴 겁니다. 때문에 원격 접속을 사용할 때는 데스크탑의 배경화면을 단색으로 설정하는 것이 좋습니다.

  연결을 종료하고 싶으면 VNC 뷰어 프로그램을 종료한 후 SSH 접속을 하고 있는 터미널에서 exitlogout 명령어로 SSH 세션을 종료하면 됩니다.

2010/10/17 20:23 2010/10/17 20:23