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

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Setting Up An NFS Server And Client On CentOS 5.5

  CentOS 5.5에서 입문 수준의 간단한 NFS(Network File System: 네트워크를 통해 파일과 디렉토리를 공유하는 프로토콜) 세팅을 단계별로 보여주는 포스트입니다. 말이 CentOS지 일단 설치만 하면 설정이야 다 똑같지만요. 저는 우분투를 가지고 했기 때문에 우분투에서 차이가 있는 부분은 따로 기술하겠습니다.

1. 서버와 클라이언트의 도메인과 IP
  본 포스트에서 사용할 NFS 서버와 클라이언트의 도메인 및 IP는 다음과 같습니다.
  • NFS 서버 : server.example.com, 192.168.0.100
  • NFS 클라이언트 : client.example.com, 192.168.0.101
2. NFS 설치
  서버와 클라이언트 모두 아래의 두 패키지를 설치합니다.
yum install nfs-utils nfs-utils-lib
  덤으로 우분투라면 아래의 명령어를 통해 설치가 가능합니다.
sudo apt-get install nfs-kernel-server
  그리고 서버의 경우 아래의 명령어를 통해 이후 부팅 시 자동으로 NFS 데몬이 실행되도록 만들고 그것과 별도로 바로 데몬을 실행합니다.
chkconfig --levels 235 nfs on
/etc/init.d/nfs start

3. 서버에서 공유할 디렉토리 설정
  이제 서버에서 공유할 디렉토리를 설정해야 하는데 이 작업을 "export"라고 합니다. 이 포스트에서는 /var/nfs라는 디렉토리를 만들어서 export하겠습니다.

  NFS를 이용할 때 알아둬야 할 것이 있는데 바로 서버가 공유한 디렉토리를 클라이언트가 이용할 때 클라이언트에서 NFS를 이용하는 계정의 UID와 GID 값을 서버에서도 사용한다는 겁니다. 그래서 만약 클라이언트에서 UID 값이 100인 사용자가 어떤 NFS 서버의 공유 디렉토리를 이용하는데 그 서버에서 UID가 100인 사용자가 전혀 다른 사용자라면 클라이언트 사용자는 NFS 서버의 공유 디렉토리에서 전혀 다른 사용자 계정의 권한을 가지고 행동할 수 있습니다. 이것이 특히 문제가 되는 경우는 클라이언트에서 root 계정(UID 0)을 가지고 서버의 공유 디렉토리로 접근하는 경우인데 root 계정의 UID는 0이므로 클라이언트의 root가 서버의 공유 디렉토리에서도 root 계정 권한을 가지고 행동할 수 있게 됩니다. 그렇기 때문에 NFS에서는 클라이언트 계정의 UID가 0일 경우 옵션에서 따로 설정하지 않는 한 기본적으로 클라이언트의 UID와 GID를 65534로 바꿔버립니다. 참고로 NFS는 이 UID에 해당하는 계정와 그룹은 각각 nobody와 nogroup라고 가정합니다.

  하지만 클라이언트의 계정이 일반 계정일 경우 어쨌든 문제가 되기 때문에 저는 옵션을 하나 첨가하여 접속하는 모든 계정의 UID와 GID를 65534로 만들어버리겠습니다. 즉, FTP의 anonymous처럼 만들어버리는 거죠. 먼저 /var/nfs라는 디렉토리를 만들고 대충 권한을 755쯤으로 준 다음에 소유자를 nobody, 소유 그룹을 nogroup으로 만듭니다. 우분투의 경우 물론 명령어 앞에 sudo가 필요하겠죠.
mkdir /var/nfs
chown nobody:nogroup /var/nfs     또는    chown 65534:65534 /var/nfs
chmod 755 /var/nfs
  그런데 여기에 또 함정이 있습니다. 서버에서 /etc/passwd와 /etc/group 파일의 nobody와 nogroup의 UID와 GID를 확인하시기 바랍니다. 만약 두 값이 65534가 아니면 위 명령어 중 chown nobody:nogroup /var/nfs 명령어가 나중에 문제가 됩니다. 왜냐하면 NFS는 (앞으로 할 저의 설정에 의해)클라이언트의 UID와 GID를 65534로 취급할 것인데 위의 chown nobody:nogroup /var/nfs 명령어는 nobody와 nogroup의 UID와 GID가 65534일 것이라고 가정하고 내린 것이기 때문입니다. 따라서 nobody와 nogroup의 UID와 GID가 65534가 아니라면 클라이언트는 저 공유 디렉토리 안에서 주인이 아닌 other의 권한을 가지게 됩니다. 따라서 nobody와 nogroup의 UID와 GID를 65534로 바꾸거나 직접 UID와 GID를 지정해주는 chown 65534:65534 /var/nfs 명령어를 사용해야 합니다.

  이제 NFS의 공유 설정을 담당하는 /etc/exports 파일을 편집해야 합니다. 다음과 같은 줄을 추가합니다.
/var/nfs 192.168.0.101(rw,sync,no_subtree_check,all_squash)
  맨 앞에는 공유할 디렉토리 경로를 입력합니다. 그 다음은 한 칸 띄고 접속을 허용할 IP나 도메인을 입력하고 괄호 안에 적용할 옵션을 나열합니다.

  rw는 읽기/쓰기를 허용하는 옵션으로 이 옵션이 없으면 디렉토리의 퍼미션과 상관없이 쓰기를 할 수 없습니다. sync는 요청한 내용이 서버의 스토리지에 적용된 후에만 응답을 주도록 하는 옵션입니다.

  no_subtree_check는 보안과 관련된 옵션으로 파일시스템의 전체가 아닌 서브 디렉토리를 export한 경우 클라이언트가 파일을 요청했을 때 해당 파일이 해당 파일시스템에 진짜 존재하는지까지만 검사할 것인지, 아니면 export한 디렉토리에 진짜 속해있는지까지 검사할 것인지를 결정하는 옵션 중 전자에 해당하는 옵션입니다. 특별히 신경 쓸 필요는 없는 옵션이며 괜히 보안성 높인다고 후자에 해당하는 subtree_check 옵션을 사용할 경우 파일을 열고 있을 때 어떤 이유로 인해 그 파일의 이름이 바뀔 경우 공유에 문제가 발생할 수 있다는 것을 염두해야 합니다.

  all_squash는 모든 클라이언트를 '손님'으로 취급하겠다는 것으로 '손님'의 디폴트 UID/GID 값은 앞서 65534입니다. 이 옵션으로 인해 모든 클라이언트는 동일한 권한을 가지게 됩니다. 앞에서 제가 한 설정에 따르면 nobody/nogroup에 계정에 해당합니다.

  /etc/exports 파일의 수정이 끝났으면 아래의 명령으로 수정한 내용을 적용합니다. 우분투라면 언제나 그렇듯 앞에 sudo를 추가로 써줍니다.
exportfs -a

4. 클라이언트에서 공유 디렉토리 마운트하기
  서버의 설정이 모두 끝났으므로 이제 클라이언트에서 마운트를 하겠습니다. 먼저 마운트할 디렉토리를 만듭니다.
mkdir ~/nfs
  그리고 마운트를 합니다. 우분투 유저는 sudo를 잊지 맙시다.
mount 192.168.0.100:/var/nfs ~/nfs
  df 명령어를 통해 아래처럼 마운트된 NFS 디렉토리들을 볼 수 있습니다.
mirashi@myservlab:/home/mirashi$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             224G  1.9G  211G   1% /
udev                 1003M  216K 1003M   1% /dev
none                 1003M     0 1003M   0% /dev/shm
none                 1003M  544K 1003M   1% /var/run
none                 1003M     0 1003M   0% /var/lock
none                 1003M     0 1003M   0% /lib/init/rw
/dev/sda1             177M   52M  116M  31% /boot
192.168.1.10:/var/nfs
                      224G  1.9G  211G   1% /home/mirashi/nfs
  마운트된 NFS 공유 디렉토리는 umount를 통해 마운트를 해제할 수 있습니다. 역시 루트 권한이 필요하므로 우분투 유저는 sudo를 사용합시다.


2010/11/19 15:18 2010/11/19 15:18
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Using mysqldump to Back Up Your MySQL Database

  저번에 SSH와 관련된 글에서도 mysqldump를 이용해서 백업을 하는 모습이 잠깐 등장했었는데요. 이걸 이용해서 서버의 모든 데이터베이스를 백업할 수도 있고 하나의 데이터베이스나 테이블 단위로 백업하는 것도 가능합니다. 그래서 이번에는 MySQL에서 가장 기초적인 백업 도구인 mysqldump를 이용한 백업에 대해 알아보겠습니다. 터미널에서 mysqldump를 쳐보면 대략 아래와 같은 실행법이 출력됩니다.
mirashi@myservlab:~$ mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
  예를 들어 모든 데이터베이스의 스키마와 데이터를 backup.sql이라는 이름으로 저장하려면 다음과 같이 명령어를 사용하면 됩니다. 물론 루트가 아니라도 모든 DB를 읽을 수 있는 권한이 있는 계정이 있다면 그 계정을 사용하면 되겠습니다
mysqldump -u root -p --all-databases > backup.sql
Enter password:   <- 패스워드 입력
  만들어진 파일을 까보면 SQL 문으로 이뤄진 것을 볼 수 있는데 DB를 하나하나 Use로 선택하면서(없으면 생성) 기존의 테이블을 DROP으로 지운 후 백업할 당시의 내용으로 다시 만드는 것을 볼 수 있습니다.

  아래는 'singleDB'라는 이름의 데이터베이스를 db_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB > db_backup.sql
  그리고 아래는 'singleDB'라는 데이터베이스 안에 있는 'singleTABLE'이라는 이름의 테이블을 table_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB singleTABLE > table_backup.sql
  경우에 따라서는 데이터베이스의 스키마만 백업하고 싶을 수도 있는데 그럴 때는 아래처럼 --no-data 옵션을 추가하면 됩니다.
mysqldump -u root -p --no-data singleDB > db_backup.sql
  이와 반대로 데이터만 백업하고 싶을 때는 --no-create-info 옵션을 주면 됩니다.
mysqldump -u root -p --no-create-info singleDB > db_backup.sql
  이제 이걸 응용해서 cron을 이용해 자동으로 백업을 하도록 만들어보겠습니다. 먼저 DBbackup.sh 이란 이름으로 아래의 간단한 스크립트를 만듭시다. 스크립트의 저장 위치는 /var/scripts, MySQL 루트 계정의 패스워드는 abcd, 백업할 데이터베이스명은 singleDB, 백업의 저장 위치는 /var/backup, 파일명은 'DBbackup-년월일.sql'로 가정하겠습니다.
#!/bin/sh
mysqldump -uroot -pabcd singleDB > /var/backup/DBbackup-`date +%Y%m%d`.sql
  파일 내에 MySQL 루트 계정의 비번이 노출되어 있으므로 퍼미션 관리에 신경써야 합니다. 이제 'crontab -e'를 통해 특정 시간에 스크립트가 실행되도록 만듭니다. 아래 예에서는 새벽 3시에 돌아가도록 하고 있습니다.
0 3 * * * /var/script/DBbackup.sh
  지금까지 알아본 방법은 MySQL에서 백업을 하는 방법 중 가장 간단한 방법입니다. 만약 증분 백업을 원하신다면 binary_log 툴을 이용하는 방법이 있고 이중화를 위한 마스터/슬레이브 구성(마스터 서버의 데이터를 슬레이브 서버로 복사)을 원하신다면 Replication을 이용하는 방법이 있습니다. 아마 언젠가 관련 내용을 포스트하는 날이 오지 않을까 싶네요.


2010/11/18 15:29 2010/11/18 15:29
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : The easiest way to set up Samba for file-sharing

  이름을 처음 듣는 사람은 꼭 한 번 웃거나 잘못들은 줄 알고 다시 물어보는 그 삼바 서버입니다. 파일 서버나 프린터 서버 역할을 수행할 수 있지요. 리눅스, BSD, OS X 끼리의 호환은 물론이고 윈도우의 파일과 프린터 공유 프로토콜을 사용하기 때문에 윈도우와도 호환이 된다는 것은 이 프로그램의 가치를 크게 높입니다. 또한 버전 4부터는 엑티브 디렉토리의 서버로도 사용할 수 있다니 대단하지만 어쨌든 이 포스트에서 중요한 건 그게 아니고...

  일단 여기서는 단순한 파일 서버를 구축하는 것이 목표이므로 일단 삼버를 설치합니다. 설정 파일은 /etc/samba/smb.conf 파일인데 만약 RHEL이나 페도라에서 SELinux 기능을 사용하고 있다면 추가적으로 몇 가지 작업을 해야 하며 그 내용은 설정 파일에 주석으로  적혀 있습니다. 어찌 됐든 간단한 설정 파일을 만들어보자면 아래와 같습니다.
[global]

workgroup = WORKGROUP

server string = Samba Server Version %v

log file = /var/log/samba/log.%m

max log size = 50

security = user

passdb = tdbsam

[homes]

comment = Home Directories

browseable = no

writable = yes
  내용은 인증 방식을 계정 방식(security = user)으로 사용하고 존재하는 모든 사용자의 홈 디렉토리를 공유한다는 내용입니다. 물론 마음대로 드나들 수 있는 건 아니고 인증을 통해 해당 홈 디렉토리에 접근할 수 있는 사용자임을 증명해야 합니다.

  먼저 워크그룹명을 'workgroup'이 아닌 다른 걸로 사용하고 있다면 사용하고 있는 워크그룹명으로 변경합니다. 또한 삼바는 시스템의 인증 방법(PAM 등)을 그대로 사용하지 않기 때문에 계정별로 삼바용 패스워드를 따로 설정해야 합니다. 이것은 시스템에 접근하기 위한 패스워드가 아닌 삼바 파일 서버에 접근할 때 쓰는 패스워드이므로 햇갈리지 않도록 합시다. 삼바용 패스워드를 설정하는 명령어는 아래와 같습니다.
# smbpasswd -a 계정명
  패스워드를 집어넣고 상콤하게 삼바 서비스를 리스타트시킵니다.
# service samba start
또는
# service smb start
  네트워크에 다른 리눅스(또는 BSD나 OS X) 시스템이 있다면 거기서 아래의 명령어를 통해 특정 시스템의 공유 자원들을 볼 수 있습니다. '\\localhost' 부분에 특정 호스트의 IP나 호스트명을 넣으시면 됩니다. 물어보는 패스워드는 해당 계정의 시스템 패스워드가 아닌 삼바 패스워드입니다.
mirashi@myservlab:/etc/samba$ smbclient -L \\localhost
Enter mirashi's password:
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.4.0]

        Sharename       Type      Comment
        ---------       ----      -------
        homes           Disk      Home Directories
        print$          Disk      Printer Drivers
        IPC$            IPC       IPC Service (myservlab server (Samba, Ubuntu))
        mirashi         Disk      Home Directories
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.4.0]

        Server               Comment
        ---------            -------
        MYSERVLAB            myservlab server (Samba, Ubuntu)
        PLANET-EARTH        

        Workgroup            Master
        ---------            -------
        WORKGROUP            MYSERVLAB
  이제 모든 준비가 끝났습니다. 이제 GNOME의 네트워크 브라우저(리눅스), 파인더(OS X), 윈도우 익스플로러(윈도우)에서 주소줄에 '\\IP주소(또는 호스트명)\계정명'를 입력하고 로그인 창에서 계정명과 패스워드를 집어넣으면 공유한 디렉토리에 접근할 수 있습니다.

  배포판과 삼바의 버전에 따라 설정 파일의 옵션이 조금씩 다를 수 있으니 주석을 잘 참고하도록 합시다. 예를 들어 저의 경우엔 'writable = yes' 대신 'read only = yes'로 되어 있었습니다.


2010/11/17 17:56 2010/11/17 17:56
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Set Up a TFTP Server on Linux


TFTP 기본 개념

  이번에는 TFTP에 대한 글입니다. PXE를 사용해보셨거나 시스코 장비를 공부하셨다거나 VoIP에 대해 공부해보셨다면 아마 한 번쯤은 사용해보셨을 겁니다. TFTP는 Trivial File Transfer Protocol의 약자로서 FTP의 단순화 버전이라고 할 수 있습니다. RFC에 표준으로 등록된 년도를 기준으로 봤을 때 FTP보다 약 9년 후인 1980년에 등장했습니다. 단순해서 오버헤드가 거의 없고 동일 네트워크 내에서 파일을 전송하기에 최적화된 프로토콜인데 예전에는 네트워크를 통해 부팅하기 위해 주로 사용했습니다. 요즘은 VoIP에서 큰 역할을 차지한다는데 뭐 쓰이는 곳은 언제나 그렇듯 보나마나 인터넷 전화 단말기에게 기본 네트워크 정보를 뿌리는 역할이겠네요.

  TFTP는 특이하게도 전송에 UDP(69번 포트)를 사용하고 FTP처럼 ASCII와 바이너리 전송 모드가 있습니다. 하지만 서버 내의 디렉토리를 돌아다니는 기능은 없는데 이는 TFTP가 클라이언트와 상호작용을 하는 방식을 위한 프로토콜이 아니기 때문입니다. 즉, 요청하면 요청대로 바로 쏴주는 게 TFTP 스타일입니다. 보통 TFTP를 이용하는 클라이언트들은 부팅 직후 정해진 특정 파일을 서버에 요청합니다. 만약 서버에 해당 파일이 있으면 알았다고 대답하고 전송하는 것이죠. 이런 이유로 인해 TFTP는 앞서 말한 PXE(Preboot eXecution Environment) 같은 씬 클라이언트 셋업, 내부 저장 장치가 없는 임베디드 장치에 많이 사용됩니다.

  근데 인증 절차나 접근 제어 방법이 없습니다. 로그인이고 뭐고 없죠. 그래서 중간에 자기가 TFTP 서버인 척 하는 MITM(Man in the Middle) 공격에 취약합니다. 뭐든 장단점이 있는 거죠. 다행인 건 TFTP가 대부분 내부(사설) 네트워크 내에서만 사용된다는 거라고나 할까요? 근데 어쨌든 적은 항상 내부에 있기 마련이라 위험하긴 합니다.

 
TFTP 서버 설정

  리눅스에서 쓰는 TFTP는 크게 2가지가 있습니다. OpenBSD의 TFTP 데몬을 포팅한 tftpd-hpa라는 것과 처음부터 리눅스용으로 개발한 atftpd(Advanced TFTPd)가 그것이죠. 둘 모두 전송 블록 크기 협상, 타임아웃 협상 등 새로운 TFTP 개정 옵션을 지원합니다. 둘 중 어느 것을 선택하느냐는 보안, 멀티캐스트 지원 여부에 달려 있습니다. 뭐 다운로드와 설치는 자신의 배포판에 맞춰 알아서 합시다. -_-...너무 날로 먹나;

  먼저 aftpd는 TCP wrapper를 통한 호스트 수준의 보안만 제공합니다. 즉, /etc/hosts.allow와 /etc/hosts.deny 파일을 통해 접속허용/거부 주소를 등록하는 것이 전부입니다. 보안은 좀 부실하지만 멀티캐스트 TFTP를 지원하는 장점이 있습니다.

  tftpd-hpa는 보안상 추가로 몇 가지 보안 기능이 더 있습니다. 기본적으로 누구나 읽을 수 있는 파일(퍼미션 상으로 o+r)만 전송을 해주며, 클라이언트로부터 업로드가 들어올 경우 들어오는 파일의 이름이 이미 존재하고 있고 해당 파일이 누구나 쓸 수 있는 파일(퍼미션 상으로 o+w)일 경우에만 업로드를 허용합니다. 또한 데몬을 띄울 때 '-s' 옵션을 추가하면 TFTP 파일 디렉토리에 chroot(특정 디렉토리를 루트 디렉토리처럼 사용해서 접속자가 설정한 디렉토리의 상위 디렉토리로 못 나가게 하는 것)를 설정할 수 있습니다.

  당연히 두 서버 모두 inetd나 스탠드얼론 방식으로 돌릴 수 있으며 설정 파일은 /etc/default에 존재합니다. tftpd-hpa의 설정 파일은 /etc/default/tftpd-hpa이며 디폴트로 RUN_DAEMON="no"라는 줄이 있습니다. 이것은 inetd에 의해 운영된다는 뜻으로 이 값을 yes로 바꿔주면 스탠드얼론 방식으로 TFTP 서버를 띄울 수 있습니다. OPTION= 줄에는 실행 옵션을 적을 수 있는데 가장 중요한 옵션은 위에서 설명한 '-s /path/to/tftp/root/directory'입니다.

  atftpd의 설정 파일은 /etc/default/atftpd이며 디폴트로 USE_INET=true라는 줄이 있습니다. 설명할 가치도 없이 inetd로 구동한다는 내용입니다. 당연히 false로 바꿔주면 스탠드얼론으로 작동합니다. aftpd의 설정 파일에도 tftpd-hpa의 OPTION 줄과 같은 목적을 가진 OPTIONS=이라는 줄이 있습니다. aftpd의 TFTP 디렉토리 설정 방법은 약간 특이한데 OPTIONS= 줄의 가장 마지막 인자로 디렉토리 경로(예: /var/tftp)를 적어주면 됩니다.

  당연하지만 TFTP의 루트 디렉토리(예: /var/tftp)도 실존해야 합니다. 소유자와 퍼미션도 적절히 설정해야 하는데 두 서버 모두 디폴트로 'nobody' 계정을 사용자로 사용합니다. /var/tftp를 TFTP 루트 디렉토리로 사용할 경우 아래처럼 설정하면 되겠습니다.
chown -R nobody /var/tftp
chmod -R 777 /var/tftp
  이제 '/etc/init.d/atftpd restart'나 '/etc/init.d/tftpd-hpa restart'로 데몬을 실행합니다. 두 서버 모두 리눅스 표준 로그 시스템인 syslog를 사용해서 로그를 남깁니다.


GUI로 간단하게 돌리기

  "난 잠깐 동안만 TFTP 서버를 돌리면 되는데 CUI로 저딴 설정하기 귀찮다."라면 문명의 이기(?)인 GUI를 활용하는 방법이 있습니다. 파이선으로 만든 tftpgui라는 GUI TFTP 서버 프로그램이 있습니다. 파이선으로 만든지라 윈도우용와 리눅스를 모두 지원합니다. 그냥 압축 풀어서 'python ./tftpgui.py &'라는 식으로 실행하면 GUI 창이 열립니다. 이하 자세한 설명은 생략!(...날로 먹네2)


윈도우에서 더 간단하게 돌리기
  "다 필요 없고 난 윈도우에서 TFTP 돌려야 하는데 파이선 설치하기도 귀찮다."라면 예전 글에서 소개한 프로그램이 있었으니 그 이름하여 TFTPD32가 되겠습니다. 네. 그냥 실행해서 쓰시면 됩니다.


아, 마지막으로 한 가지...

69번 포트 뚫는 거 잊지 맙시다! 특히 윈도우에서 TFTPD32 돌리실 때 윈도우 방화벽에서 꼭 69번 뚫어주세요! "막을까? 허용할까?" 묻는 창 안 나옵니다!

2010/11/13 17:00 2010/11/13 17:00
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Three locks for your SSH door

  아무래도 SSH 접속을 허용하면 잠재적인 취약점이 생기기 마련입니다. 이번 글에서는 SSH 서비스를 통한 침입을 막기 위한 3가지 기술을 설명합니다.
  • SSH의 포트를 다른 값으로 바꾸고 SSH 설정을 보강하여 허접한 공격 튕겨내기
  • SSH를 통해 로그인이 가능한 사용자 목록 지정하기
  • SSH 접속이 가능하다는 사실을 숨기고 접속을 위한 비밀 절차 만들기
  당연하지만 이 글에 있는 내용을 실현하려면 루트 권한이 필요합니다. 덤으로 몇 가지 패키지를 설치해야 하고 만약 방화벽이나 공유기(라우터)를 사용한다면 그에 대한 설정도 해야 합니다.


more..



more..



more..

2010/10/25 16:39 2010/10/25 16:39
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Remotely Accessible Virtual Desktops
관련 글 : SSH와 VNC를 이용한 원격 접속 설정

  저번에 이어서 이번에는 가상 데스크탑을 이용한 원격 접속을 설정하는 포스팅입니다. 저번의 경우 로컬과 원격이 같은 데스크탑을 공유했기 때문에 원격에서 동시에 2명 이상이 접속할 수 없었고 로컬이나 원격 중 한 곳에서만 데스크탑을 사용할 수 있었습니다. 이번 포스팅은 그 제한을 타파하기 위해 '가상 데스크탑'이라는 것을 사용합니다. 말 그대로 가상의 데스크탑을 여러 개 띄워서 그 중 하나에 접속하는 것이죠.

  저번과 마찬가지로 이 포스팅은 데비안 기반(민트, 데비안, 우분투)의 배포판을 기준으로 작성되었습니다. 그리고 이전 글에 있는 내용을 이미 수행하여 SSH와 VNC 서버, Xfce 같은 가벼운 데스크탑 환경을 설치했음을 가정하고 설명합니다.


1. 가상 데스크탑 설정
  먼저 아래의 명령어를 통해 SSH로 원격 컴퓨터에 접속합니다. 당연하지만 port에는 SSH 서버의 포트 번호, username에는 로그인할 사용자명, your_server_ip에는 원격 컴퓨터의 IP를 적습니다.
ssh -p port username@your_server_ip
  접속하면 사용자의 홈 디렉토리 밑에 ".vnc"라는 디렉토리를 만듭니다. 맨 앞이 점(.)이니까 숨겨진 디렉토리가 되겠습니다. 그리고 그 밑에 xstartup이라는 파일을 만듭니다. 결과적으로 ~/.vnc/xstartup이라는 위치와 이름의 파일이 되겠군요. 이 파일은 데스크탑 환경이나 윈도우 매니저에 대한 설정을 담는 파일입니다. 이제 파일에 아래와 같은 내용을 적습니다.
#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
xfce4-session
  만약 데스크탑 환경으로 Xfce가 아닌 다른 것을 사용한다면 데스크탑 환경을 실행하기 위한 마지막 줄의 명령어를 자신이 사용할 것에 맞춰 적습니다. Fluxbox의 경우 "fluxbox"라고 적으면 되고 LXDE의 경우 "lxsession"이라고 적으면 됩니다.

  이 파일은 스크립트 파일이므로 편집을 마친 후 실행 권한을 주는 것을 잊지 맙시다. 이제 SSH 연결을 끊습니다. 만약 여러 사용자에 대해 가상 데스크탑을 설정하려면 위 작업을 가상 데스크탑을 사용할 각 계정마다 반복해서 해줘야 합니다.


2. 가상 데스크탑 실행하기
  가상 데스크탑을 사용하기 위해 특정한 디스플레이 번호를 정해야 합니다. 다시 클라이언트에서 SSH를 사용하여 원격 컴퓨터에 접속합니다. 단, 이번에는 VNC에서 사용할 포트에 대해 SSH 터널을 뚫어 접속합니다.
ssh -p port -L 5910:localhost:5901 username@your_server_ip
  저번에도 설명했지만 "localhost"의 왼쪽에 있는 것이 로컬의 포트 번호고 오른쪽에 있는 것이 원격의 포트 번호입니다. 로컬의 5910 포트로 들어가는 트래픽은 SSH 터널을 이용해 "your_server_ip" 주소를 가진 원격 호스트의 5901 포트로 흘러갑니다. 물론 그 반대도 마찬가지입니다. "localhost"는 "your_server_ip" 주소의 원격 컴퓨터에게 있어서 localhost 입니다. 그러므로 별로 신경 쓸 필요는 없습니다.

  왼쪽에 있는 5910은 로컬에서 사용할 포트 번호이기 때문에 아무거나 사용해도 별 문제는 없습니다. 단, VNC의 디스플레이 번호에 5900을 더한 것이 해당 디스플레이 번호가 사용하는 포트 번호가 되기 때문에 5900 이상의 숫자여야 합니다. 또한 0번은 보통 로컬 화면으로 사용되므로 5901 이상의 디스플레이 번호를 사용하면 됩니다.

  오른쪽에 있는 5901은 원격에서 사용할 포트 번호이기 때문에 원격 호스트에서 VNC 서버를 실행할 때 넣는 디스플레이 번호와 맞춰야 합니다.

  이제 가상 데스크탑을 실행하겠습니다. SSH로 연결한 터미널에서 아래의 명령어를 실행합니다.
vncserver :1 -localhost -geometry 1100x700 -dpi 100 -depth 16
  "-localhost" 옵션은 저번 글에서 설명했으므로 넘어가고 다른 옵션들도 이름으로 뭘 의미하는지 알 수 있으니 생략하겠습니다. 해상도 같은 것은 원하는 값으로 바꿉시다. 중요한 것은 ":1"인데 설명 안 해도 눈치채셨겠지만 디스플레이 번호입니다. 바로 위에서 디스플레이 번호에 5900을 더한 값이 해당 디스플레이 번호에서 사용하는 포트 번호라고 설명했습니다. 위 예에서는 1번을 사용했으므로 5901번 포트를 사용하게 됩니다. 아까 SSH 터널을 뚫을 때 원격 컴퓨터의 5901번 포트를 뚫은 이유가 이겁니다. 명령어가 실행되고 나면 원격 호스트의 1번 디스플레이가 만들어집니다.


3. 가상 데스크탑 접속하기
  저번과 다를 게 없습니다. 클라이언트에서 VNC 뷰어를 실행한 주소에 "localhost:10"이라고 적고 접속합니다. ":10"인 이유는 아까 SSH 터널을 뚫을 때 로컬의 5910번 포트를 뚫었기 때문입니다. 제대로 설정이 됐다면 원격 데스크탑이 열릴 겁니다.

  만약 설정에 문제가 없는 거 같은데 열리지 않는다면 방화벽을 확인합시다. 공유기 같은 걸 사용하고 있고 외부에서 공유기 내부에 있는 호스트에 접속하려는 거라면 포트 포워딩도 꼭 확인합시다. 하긴, 이 글을 보고 있고 이미 SSH 접속도 성공했다면 이런 설명을 할 필요도 없겠군요.

  그리고 주의할 점이 가상 데스크탑에서 배경화면을 사용하면 화면 갱신 속도가 느리기 때문에 되도록이면 배경을 사용하지 않는 것이 좋습니다.


4. 접속해제
  저번과 비슷합니다만 중간에 가상 데스크탑을 닫는 과정이 추가됩니다. 먼저 VNC 뷰어를 종료하고 아래의 명령어로 가상 데스크탑을 닫은 후 SSH에서 exitlogout 명령어로 SSH 세션을 종료하면 됩니다.
vncserver -kill :1
  한 가지 중요한 점은 VNC 뷰어와 SSH 접속만 종료하고 가상 데스크탑은 그대로 남겨둘 경우 다음에 VNC 뷰어로 다시 로그인할 때 이전에 접속을 종료하기 전의 상태가 그대로 나온다는 겁니다. 윈도우의 '원격 데스크탑 연결'과 동일하게 작동한다는 뜻이죠. 당연하지만 이렇게 다시 접속할 때는 가상 데스크탑을 또 실행할 필요가 없습니다.

2010/10/19 00:02 2010/10/19 00:02
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
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : http://symkat.com/35/ssh-tips-and-tricks-you-need/

  요즘 구직 활동 때문에 포스팅을 못한지 정말 오래됐네요. 뭐, 어차피 보는 사람도 없지만;;
  리눅스에서 가장 흔히 볼 수 있는 SSH 클라이언트 프로그램인 OpenSSH에 대한 몇 가지 팁이 있어서 포스팅해봅니다.

more..



more..



more..



more..



more..



more..




2010/10/16 21:23 2010/10/16 21:23