Computer/LINUX

SSH키를 이용한 RSYNC 백업법

알찬돌삐 2012. 8. 10. 16:12

 SSH키를 이용한 RSYNC 백업법
============================
A 서버 : 백업대상 서버 (원본서버)  A서버계정:suhan
B 서버 : 백업진행 서버 (백업서버)  B서버계정:inkaftp

시나리오:  B 서버는 A 서버의 특정 계정으로 자동로그인 하여 A 의 내용을 B로 Rsync 한다.
======================================================================================

1> 키생성
B 서버에서 키를 생성해보도록 하겠다.
키는 생성하는 위치가 중요한것이 아니라 개인키를 가진쪽이 공개키를 가진쪽으로 접속한다.

[inkaftp@edutotal ~]$ ssh-keygen -d -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/inkaftp/.ssh/id_rsa):
Created directory '/home/inkaftp/.ssh'.
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again: <ENTER>
Your identification has been saved in /home/inkaftp/.ssh/id_rsa.
Your public key has been saved in /home/inkaftp/.ssh/id_rsa.pub.
The key fingerprint is:
11:ce:7a:2d:60:0d:09:b3:2a:8b:3f:de:9a:8f:96:20 inkaftp@edutotal.com

RSA 방식으로 키를 만들었으며 , 패스워드는 넣지 않았다.

.pub 파일이 공개키이며 이파일은 접속을 당할 서버 즉 A서버의 접속할 계정에 심어야 된다.

 

2> 공개키를 전송한다.
#scp /home/inkaftp/.ssh/id_rsa.pub suhan@A서버아이피:~/.ssh/autorized_keys 
(키가여러개일때는 뒤에 숫자를 붙인다 keys2...)
.ssh 디렉이 없으면 먼저 만들어두도록 한다

패스워드 묻어볼것이다... 중략...

 

3> B서버에서 A 서버로 접속테스트 해본다.
# ssh  -i /home/inkaftp/.ssh/id_rsa suhan@A서버아이피
RSA key fingerprint is 03:c0:4d:25:a6:5d:0c:41:70:a7:11:0e:f7:12:ee:c8.
Are you sure you want to continue connecting (yes/no)? yes <ENTER>

정상접속이 된다면 성공이다.


4> RSYNC 에 걸어보자

서버가 여러개일 경우 관리를 위해 개인키 id_rsa 파일을 알아보기 쉽게 계정과 서버아이피로 이름을바꾼후에  -i 옵션으로 로딩한다.
# mv /home/inkaftp/.ssh/id_rsa  /home/inkaftp/.ssh/suhan_AServer

#rsync -avzrt --delete -e "ssh -i /home/inkaftp/.ssh/suhan_AServer" suhan@A서버아이피:/home/suhan/www /home/inkaftp/backup
#rsync -avzrt --delete --rsh="ssh -i /home/inkaftp/.ssh/suhan_AServer -l suhan" A서버아이피:/home/suhan/www /home/inkaftp/backup

위의 2개 모두 정상 동작할것이다.


5> B서버의 inkaftp Cron 에 등록한다.
[inkaftp#B서버]$ vi /home/inkaftp/rsync_cron_exe.sh
#!/bin/bash
rsync -avzrt --delete -e "ssh -i /home/inkaftp/.ssh/suhan_AServer" suhan@A서버아이피:/home/suhan/www /home/inkaftp/backup
만든 파일에 실행권한을 준다.

[inkaftp#B서버]$ crontab -e
30 4 * * * /home/inkaftp/rsync_cron_exe.sh | mail -s [백업알리미] 내멜주소  <=결과를 메일로 보내준다.

 


PS. 서버내에 공간이충분하고 파티션이나 드라이버가나눠져 있다면 매일 매일 내부백업을 해두는것도 도움이 될것이다.
vi /etc/cron.daily/rsync_exe.sh
#!/bin/bash
rsync  -avzrt --delete /home/mainweb/www  /home1

 

 


유닉스 계열에는 백업 또는 동기화로써 많이 사용되는 rsync 란 툴이 있다.
나 역시 rsync 를 백업 툴로써 사용한다. 그런차에 ssh 를 이용해 볼까 생각이 들었다.

우선 rsync를 간략히 설명하자면 서비스서버의 TCP/873 포트를 통해 특정 디렉토리의 데이터를
백업 서버의 로컬로 가져오며 2번째 실행부터는 업데이트된 내용만 가져올수 있다 그러니 백업에 대한 트래픽을
상당히 절약할 뿐 아니라 백업에 대한 서버의 부하도 줄일수 있다
다만 서비스 서버에 중요파일을 지워지거나 수정되었고 백업서버에서 rsync 를 통해 백업을 했다면
백업서버를 통해 복구할수 없는 경우가 대부분이다.
이는 rsync 가 백업툴이 아니라 동기화 툴이기 때문이다.
이런 개념을 잘 생각하고 백업툴로써 사용할것인지 아닐것인지는 사용자의 몫으로 남겨놓겠다.

일반적으로 rsync는 서비스 서버에서 xinetd 에 종속되어 실행되며 TCP/873 포트를 통해 접속한다.
그리고 tcpwrapper 등으로 접속 IP를 제어한다. 여기서 설명하고자 하는건 일반적인 rsync 를 이용하는게
아니니 일반적인 rsync를 설치하려면 다른 문서들을 참조하기 바란다.

다음은 그 설치 방법이다 환경이 다르면 약간의 차이가 있을수 있으나 조금만 노력하면 설치할수 있으리라
생각된다.

[테스트 설치 환경]
서비스서버 : CentOS 5
백업서버 : Redhat 7.3

우선 백업서버에 rsync가 설치되어 있어야 한다.
rsync 가 없다면 yum 을 이용해 설치해 보자.
# yum install rsync
혹시 redhat 7.3을 이용하는 사람이 있어 yum 이 설치되지 않았거나 yum repository 를 찾지 못하는 분들을
위해 rpm 화일을 하단에 첨부하니 다운받아서 설치하길 바란다.

rsync 가 설치되었다면 rsync 명령어를 이용해보자.
일반적인 rsync 와 ssh 를 통한 rsync 가 다른점이 이제 나타난다.
일반적인 rsync 는 서비스서버쪽에 xinetd를 통해 TCP/873 포트로 LISTEN 하는 데몬을 띄운다.
하지만 ssh를 이용한 건 서비스 서버쪽에 rsync 데몬이 필요없다.

# rsync -avz --delete -e 서비스서버도메인또는IP:/백업대상폴더 /백업을넣을폴더
# rsync -avz --delete --rsh="ssh -l 서비스서버계정" 서비스서버도메인또는IP:/백업대상폴더 /백업을넣을폴더

위 2명령어의 차이는 첫번째는 현재 백업서버의 계정이름으로 똑같이 서버에 접근한다는 것이다.
즉 root 권한이면 서비스서버에 root 권으로 접근하고 일반계정이면 서비스서버의 일반계정으로 접근을한다는
것이다. 그래서 불편한 점이 있고 게다가 root 권한이면 서비스서버에 root 로 접속해야 하니..
ssh에서 root 로그인을 풀어야 한다.

그래서 개인적으로는 두번째 명령어를 이용한다.
현재 백업계정에서 root 로 작업하는 상태라고 할때도 서비스 서버의 일반계정을 지정할수가 있기 때문이다.
물론 여기에도 단점은 있다. 서비스서버에 일반계정이 접근할수없는 화일을 가져올수 없는 문제가 발생한다.
예를들면 root 만 접근 가능한 화일들 또는 아파치만 접근가능한 파일들 업로드 되어 nobody 만 읽을수 있는
화일들이 그 대상이다. 그러니 웹 디렉토리를 백업하려거든 권한에 주의 해주어야 한다.
예를 들면 아파치가 nobody 권한으로 실행된다면 웹에서 화일을 upload 한뒤 최소한 704 가 되도록한다.

그럼 다시 돌아가서 위의 명령어중 2번째 명령어를 실행시키자.
그럼 처음 ssh 접속시에 나오는 key 값을 받아오며 저장하겠냐고 물어본다.
yes 하고 나면 password 를 물어온다.
위에서 지정한 서비스 서버 계정의 패스워드를 입력하자.
그럼 데이터를 받아오기 시작할것이다.

여기서 걸리는게 있다. 백업을 매일 수작업으로 하기 싫다는것이다.
대부분의 사람들이 여기서 멈추고 일반적인 rsync 로 돌아가는것 같다.
그래서 스크립트를 하나 짜서 돌리기로 하자.
==================================================================================================
#!/usr/bin/expect
spawn bash -c "rsync -az --delete --rsh="ssh -l 서비스서버계정" 서비스서버도메인또는IP:/백업대상폴더 /백업을넣을폴더";
expect -re "Password:"
sleep 0.2
send "서비스서버계정패스워드\r"
interact
==================================================================================================
위의 내용을 backup.sh 와같이 화일로 만든후 권한을 700 권한을 주자..
그리고 /etc/crond.daily 같은 폴더에 넣어둔다.

그럼 매일 업데이트된 내용이 백업이 될것이다.

[참고]
Redhat 7.3 에서 하다보니 없는 프로그램이 꽤 있었다.
게다가 최근까지 서비스하던 yum repository 도 잘 안보인다.
그래서 나와같이 고생하는 Redhat 7.3 User를 위해 관련된 화일을 업로드 해둔다.

expect-5.32.2-67.i386.rpm : http://ideaargo.devself.com/blog/attachment/1064738108.rpm
rsync-2.5.4-2.i386.rpm : http://ideaargo.devself.com/blog/attachment/1326425661.rpm
tk-8.3.3-67.i386.rpm : http://ideaargo.devself.com/blog/attachment/1264166103.rpm

 

 


* 아래는 위와 관련되어서 제가 종종 사용하는 실례입니다.
  위의 내용과 차이점은 자동로그인 처리하는 방식이라는 점입니다.
  필요하신 분 응용해서 사용하세연.ㅋ

*실행스크립트를 아무리 퍼미션 설정한다고 해도
  가급적 패스워드를 쓰는 것은 지양하려 합니다.

* 오직 백업서버측에서만 처리하는 내용들입니다.

* 운용중인 데이터가 들어있는 원본 서버를 순서를 매겨서
  www.server.com, www1.server.com 등으로 표현했습니다.

* 기본적으로 서버 관리라는 측면에서 root 를 기준하였습니다만,
  ssh 접근 권한 있는 일반 사용자 계정으로도 가능합니다.

----------------------------------------------------------------------------------------------------------
:: SSH 자동인증 처리  ::
----------------------------------------------------------------------------------------------------------

1. 네트워크 통신시에 백업 서버를 표현해줄 고유키를 생성합니다.
----------------------------------------------------------------------------------------------------------
[root#] ssh-keygen -d (그냥 엔터만 계속 쳐서 넘어갑니다)

Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
9d:88:df:39:3f:c1:71:90:64:d0:4e:cf:87:96:16:99 root@backup.server.com

 
2. 생성한 고유키를 원본 데이터 서버로 전송해줍니다(서버간 신용도 만렙찍기 위함)
----------------------------------------------------------------------------------------------------------
[root#] scp -p /root/.ssh/id_dsa.pub root(at)www.server.com:~/.ssh/authorized_keys2

The authenticity of host 'www.server.com (1.1.1.1)' can't be established.
RSA key fingerprint is 11:bc:0f:bb:ea:16:92:da:59:da:7d:33:b7:39:57:bb.
Are you sure you want to continue connecting (yes/no)? (yes 라고 입력후 엔터)
Warning: Permanently added 'www.server.com,1.1.1.1' (RSA) to the list of known hosts.
root(at)www.server.com's password: (데이터가 있는 서버의 root 패스워드를 입력한다)
id_dsa.pub                                          100% 1119    1.1KB/s  00:00
 
* (at) 이라고 적은 것을 @ 로 바꿔주세요. 슥훌 에디터 버그네요. ㅡ_ㅡ;;



3. 아래와 같은 방식으로 다른 데이터 서버들에게 적용시킬 수 있습니다.
----------------------------------------------------------------------------------------------------------
[root#] scp -p /root/.ssh/id_dsa.pub root@www2.server.com:~/.ssh/authorized_keys2
[root#] scp -p /root/.ssh/id_dsa.pub root@www3.server.com:~/.ssh/authorized_keys2
 

4. 패스워드를 한 번만 입력해주면 그 다음 접속시에는 패스워드를 묻지 않습니다.
  단, 1)호스트 표시 정확해야 하고, 2)사용자 ID 일치, 조건을 만족해야 합니다.
  호스트 표시는 도메인네임이든 IP든 한 가지를 사용하고, 항상 같아야 합니다.


----------------------------------------------------------------------------------------------------------
:: backup서버에서 자동실행되는 Rsync 쉘스크립트 ::
----------------------------------------------------------------------------------------------------------

/usr/sbin/Rsyncs.sh
----------------------------------------------------------------------------------------------------------
#!/bin/sh
if [ $1 == "1" ] ; then
    ##### www.server.com #####
    rsync -ar --delete -e ssh www.server.com:/home/* /backup1
fi
if [ $1 == "2" ] ; then
    ##### www2.server.com #####
    rsync -ar --delete -e ssh www2.serv.ercom:/home/* /backup2
fi
if [ $1 == "3" ] ; then
    ##### www3.server.com #####
    rsync -ar --delete -e ssh www3.serv.ercom:/home/* /backup3
fi
.....................................................................................
* 각  데이터 서버의 /home/ 아래에 있는 모든 파일&디렉토리를
  백업서버의 /backup.. 디렉토리로 가져오되, 동기화를 시켜서 처리한다는 것입니다.
 


----------------------------------------------------------------------------------------------------------
:: /etc/crontab 에서의 실행 설정 ::
----------------------------------------------------------------------------------------------------------

vi /etc/crontab
----------------------------------------------------------------------------------------------------------
# Backup Servers' Data by RSync
00 2 * * * root Rsyncs 1
00 3 * * * root Rsyncs 2
00 4 * * * root Rsyncs 3
----------------------------------------------------------------------------------------------------------
* 처리에 소요되는 시간을 감안해서 순차적으로 서버마다 처리되도록 합니다.

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > LINUX' 카테고리의 다른 글

UCC 를 위한 ffmpeg 설치  (0) 2012.08.10
Text Processing  (0) 2012.08.10
ssh 접속 공격 막기  (0) 2012.08.10
snort  (0) 2012.08.10
pam_abl 을 통한 SSH 공격방어  (0) 2012.08.10