본문 바로가기

Linux/기타

rsync + ssh + 공개키 + crond 를 이용한 백업시스템 구축하기

=================================================================== OPENSSH-LAB> rsync + ssh + 공개키 + crond 를 이용한 백업시스템 구축하기 google에서 rsync over ssh 검색하면 많은 문서를 참고할 수 있다. !!! rsync 를 사용하는 방법 !!! 1. rsync 데몬을 실행하는 방법 (/etc/rsync.conf) ==> 보안 X !!! 2. rsync over ssh 를 실행하는 방법 ==> 보안 O !!! 2 번인 SSH를 이용한 rsync는 ssh를 이용하므로 rsync 데몬을 사용할 !!! 필요가 없다. !!! 조건 : !!! root 로 접속이 가능(O)하고 root의 비번을 알고 있어야 된다. !!! root 가 접근할 수 없거나 권한이 없는 파일들은 백업을 할 수가 없다. - 백업대상서버 : 백업을 당하는 서버 - 백업서버 : 백업을 하는 서버 백업대상서버(s1) : 192.168.56.101 ssh port : 22 백업서버(s4) : 192.168.56.103 ssh port : 22 ######################## ## 백업서버 구축 연습 ## ######################## -- 순서 -- 1. scp를 이용해서 복사를 한다 2. rsync over ssh 로 /etc 백업 3. rsync over ssh 로 공개키기반 /etc 백업 -- 순서 -- 1. scp 로 /etc 백업 - ssh port 가 다른 포트로 변경되면 scp -P 옵션을 주고 복사를 해야한다. - scp -P 2200 -r 192.168.56.101:/etc . 192.168.56.103(s4)# mkdir /backup; cd /backup 192.168.56.103(s4)# scp -r 192.168.56.101:/etc . 192.168.56.103(s4)# scp -r 192.168.56.101:/etc . <-- scp로 (단점) : 다시 복사한다. ==> 변경사항과 상관없이 모두 다시 받아온다는 단점이 있다. 2. rsync over ssh 로 /etc 백업 (단점 : 동기화는 되지만 수동으로 비밀번호를 입력해야 한다.) - ssh port 가 다른 포트로 변경되면 -e "ssh -p 2200" 옵션을 주어야 한다. - # rsync -avz -e "ssh -p 2200" 192.168.56.101:/etc . 192.168.56.103(s4)# rm -rf etc 192.168.56.103(s4)# rsync -avz -e "ssh" 192.168.56.101:/etc . : : - rsync 는 변경된 파일만 가져오므로 아래는 변경이 안되었기 때문에 가져오지 않는다. # rsync -avz -e "ssh" 192.168.56.101:/etc . root@192.168.56.101's password: receiving incremental file list <-- 여기에 아무것도 나오지 않으면 안받아 왔다는 것이다. sent 200 bytes received 44955 bytes 18062.00 bytes/sec total size is 56602039 speedup is 1253.51 - 사용자를 생성하고 변경된 파일을 받아온다. - 사용자를 생성하면 passwd, shadow, group 이런 파일들이 변경이 된다. 192.168.56.101(s1)# useradd abc 192.168.56.103(s4)# rsync -avz -e "ssh" 192.168.56.101:/etc . root@192.168.56.101's password: receiving incremental file list etc/ etc/group etc/group- etc/gshadow etc/gshadow- etc/passwd etc/passwd- etc/shadow etc/shadow- sent 445 bytes received 46685 bytes 18852.00 bytes/sec total size is 56602251 speedup is 1200.98 /etc 백업 192.168.56.103(s4)# killall -9 ssh-agent 192.168.56.103(s4)# ssh-keygen <-- passphrase : 20150330 입력 192.168.56.103(s4)# scp ~/.ssh/id_rsa.pub \ > 192.168.56.101:.ssh/authorized_keys root@192.168.56.101's password: <-- passphrase : 20150617 입력 id_rsa.pub 100% 408 0.4KB/s 00:00 - ssh-agent 를 실행한다. 192.168.56.103(s4)# ssh-agent > ssh-agent.txt 192.168.56.103(s4)# . ssh-agent.txt - ssh-add 를 실행한다. 192.168.56.103(s4)# ssh-add Enter passphrase for /root/.ssh/id_rsa: <-- passphrase 입력 : 20150617 Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) 192.168.56.103(s4)# rsync -avz -e "ssh" 192.168.56.101:/etc . <-- 비번이 입력이 없으면 성공 192.168.56.101(s1)# usreadd abc2 192.168.56.103(s4)# rsync -avz -e "ssh" 192.168.56.101:/etc . <-- 비번이 입력이 없으면 성공 -- 연습 -- ######################## ## 실제 백업서버 구축 ## ######################## !!! 위에서의 단점 192.168.56.101(s1)번이 root로 접근이 가능하다는 것이다. !!! PermitRootLogin 은 3개의 값을 지정할 수 잇다. !!! yes : root 접근허용 가능 !!! no : root 접근허용 금지 !!! forced-commands-only : !!! 공개키의 명령만 실행하겠다는 의미로 !!! root로 접근은 금지하되 특정 명령어는 가능하게 할때 사용한다. -- 순서 -- 1. 백업대상 서버에서 설정및 sshd 재시작 - /etc/ssh/sshd_config 에서 PermitRootLogin forced-commands-only 2. 백업서버에서 백업대상 서버로 root 로 접근이 가능한지 TEST - root 접근이 안된다. 3. 백업대상 서버에서 공개키(authorized_keys) 파일을 복사 - 공개키가 존재해야 된다. 4. /root/bin/validate-rsync 생성 - 파일이 존재하지 않으므로 수동으로 생성한다. 5. 백업서버에서 rsync 로 백업 - 테스트로 한번 백업한다. 6. 백업스크립트 작성 - 쉘로 작성한 간단한 백업 스크립트이다. 7. crond 에 등록 -- 순서 -- 1. 백업대상 서버에서 설정 192.168.56.101(s1)# vi /etc/ssh/sshd_config -- /etc/ssh/sshd_config -- : PermitRootLogin forced-commands-only <-- 수정 (root : 로그인 X) : -- /etc/ssh/sshd_config -- 192.168.56.101(s1)# /etc/init.d/sshd restart 2. root 로 접근이 가능한지 TEST - 아래 두 개 모두 root로 로그인이 안되야 한다. 192.168.56.103(s4)# ssh 192.168.56.101 192.168.56.103(s4)# rsync -avz -e "ssh" 192.168.56.101:/etc . 3. 백업대상 서버에서 공개키(authorized_keys) 파일을 복사 - $HOME/.ssh 디렉토리가 존재하면 skip하고 없다면 디렉토리를 생성한다. 192.168.56.101(s1)# ssh localhost <-- yes ^c - 공개키를 생성한다. 192.168.56.103(s4)# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): <-- 암호문을 입력한다. Enter same passphrase again: <-- 암호문을 입력한다. Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 5f:ac:59:77:66:62:d7:c5:05:ba:3a:b3:fc:9a:2c:0f root@s4.whiteboan.com 192.168.56.101(s1)# vi /etc/ssh/sshd_config -- /etc/ssh/sshd_config -- : PermitRootLogin yes <-- 수정 (root : 로그인 O) : -- /etc/ssh/sshd_config -- 192.168.56.101(s1)# /etc/init.d/sshd restart - 공개키를 복사한다. 192.168.56.103(s4)# scp .ssh/id_rsa.pub 192.168.56.101:.ssh/authorized_keys 192.168.56.101(s1)# vi /etc/ssh/sshd_config -- /etc/ssh/sshd_config -- : PermitRootLogin forced-commands-only <-- 수정 (root : 로그인 X) : -- /etc/ssh/sshd_config -- 192.168.56.101(s1)# /etc/init.d/sshd restart - authorized_keys 파일에 내용을 추가한다. - 추가사항 1 : 백업서버의 IP - 추가사항 2 : 실행명령어 192.168.56.101(s1)# vi .ssh/authorized_keys -- ~/.ssh/authorized_keys -- from="192.168.56.103",command="/root/bin/validate-rsync" ssh-rsa A.... -- ~/.ssh/authorized_keys -- 4. /root/bin/validate-rsync 생성 - 존재하지 않는 파일을 생성한다. 192.168.56.101(s1)# mkdir ~/bin 192.168.56.101(s1)# install -m 700 /dev/null ~/bin/validate-rsync 192.168.56.101(s1)# vi ~/bin/validate-rsync -- ~/bin/validate-rsync -- #!/bin/sh case "$SSH_ORIGINAL_COMMAND" in *\&*) echo "Rejected" ;; *\(*) echo "Rejected" ;; *\{*) echo "Rejected" ;; *\;*) echo "Rejected" ;; *\<*) echo "Rejected" ;; *\`*) echo "Rejected" ;; rsync\ --server*) $SSH_ORIGINAL_COMMAND ;; *) echo "Rejected" ;; esac -- ~/bin/validate-rsync -- 5. 백업서버에서 rsync 로 백업 - 접근시 공개키 비번을 물어보고 공개키의 비번을 입력시 데이터를 받아오면 성공한 것이다. 192.168.56.103(s4)# rsync -avz -e "ssh" 192.168.56.101:/etc . 6. 백업스크립트 작성 192.168.56.103(s4)# cd ~/bin 192.168.56.103(s4)# install -m 700 /dev/null remote-backup.sh 192.168.56.103(s4)# vi remote-backup.sh -- remote-backup.sh -- #!/bin/sh backupdir=/backup today=$(date +%Y%m%d) mkdir $backupdir/$today cd $backupdir/$today for dir in etc home bin do rsync -avz -e "ssh" 192.168.56.101:/$dir . done -- remote-backup.sh -- - 스크립트가 잘 작동하는지 테스트한다. 192.168.56.103(s4)# ./remote-backup.sh 7. crond 에 등록 (새벽 4시 2분에 실행) - run-parts 스크립트에 의해서 실행한다. 192.168.56.103(s4)# cp remote-backup.sh /etc/cron.daily 8. crond test - 2015.3.31 04:00 설정 192.168.56.103(s4)# date 033104002015 192.168.56.103(s4)# ls /backup : : *** ssh-agent , ssh-add 를 이용해서 해결 *** ===================================================================


'Linux > 기타' 카테고리의 다른 글

NFS & SAMBA  (0) 2015.06.18
chroot환경의_OpenSSH설치하기  (0) 2015.06.17
공개키 인증방식으로 접속  (0) 2015.06.17
ssh란?  (0) 2015.06.17
scp 사용하기  (0) 2015.06.16