Linux #22
백업(Backup) 및 복구(Restore)
시스템 관리자의 매우 중요한 업무 중 하나가 바로 이 백업과 복구이다. 조직의 IT 관리에서 가장 중요한 것 한 가지만 꼽으라고 시스템 엔지니어에게 물으면 아마도 '데이터 관리'라고 말할 것이다. 이런 소중한 데이터를 규칙적으로 백업해 두어야 시스템에 문제가 있을 때 데이터를 복원할 수 있다. 수시로 데이터를 백업하고 복원해보는 연습도 해 두어야 한다. 복원을 얼마나 빨리 잘 해놓느냐 하는 것이 관리자의 실력이라고도 볼 수 있다.
백업에 관한 이론을 다 설명할 수는 없지만 '보통 1차로 모든 데이터를 다 백업해두는 Full backup을 수행한 뒤, 2차로 데이터 증가분만 백업하는 Incremental backup을 수행하고, 필요하면 3차로 백업에서 놓친 부분(archive bit가 1)을 백업해두는 Differential backup'을 수행한다. 현장에서 백업은 Full backup > Incremental backup을 수행하고, 복원은 Full backup + Incremental backup1 + Incremental backup2 +..식으로 차례로 해주면 된다.
백업 저장용 매체로 과거에 ZIP drive(100M, 250M), tape drive, CD/DVD drive 등을 사용하였었지만 현재는 다시 tape drive를 주로 사용하는 추세이다. 보통 tape backup은 판매자 벤더에 의해서 테이프 저장매체 구매 시 백업 소프트웨어도 함께 제공받기 때문에 벤더의 설명대로 사용하면 된다. 테이프 백업은 저장용량도 크지만 백업/복원 중에 다른 작업을 수행할 수 있다는 장점이 있다.
백업은 매일 실시하는 child(daily) backup, 해당 주말에 실시하는 parent(weekly) backup, 그리고 해당 월말에 수행하는 grand-parent(monthly) backup식으로 분류한다. 이렇게 하면 백업 테이프는 요일별로 하나씩 5개(월~금), 그리고 해당 주말에 1개, 그리고 이들을 모두 모아서 한 달에 월별 백업 1개가 필요하므로 총 10개(5(주중)+4(한 달 4주)+1(월별))만 있으면 매월 순환해 가면서 백업 매체 테이프를 사용할 수 있다. 일정한 규칙으로 백업하므로 관리도 수월해진다. 백업 매체의 순환과 복원을 위해서 이런 규칙을 지정해서 사용한다.
여기서는 일반 Linux 머신에서 사용할 수 있는 백업/복원 도구들을 알아본다. 사실 늘 사용하는 tar, rsync, cp, mv 도구들은 백업으로 데이터를 다른 곳으로 복사/이동해 두거나, 복원으로 이동한 데이터를 다시 가져오는 기능만 할 뿐이지 백업도구가 가지고 있는, 예를 들어서 증가분 백업 등을 세밀하게 실행할 수 없으므로 이들을 백업도구로 보기엔 무리가 있다. 그렇지만 이들 도구나 다음에 소개하는 도구들도 유용하므로 잘 알아 둘 필요는 있다.
백업이나 복원해주는 - cpio
=>cpio 도구는 find, cat, ls 등 명령어와 함께 사용해서 그 결과를 백업 시켜 주는데 주로 find 명령어와 함께 사용된다. cp로 일일이 파일을 지정해서 복사하기 어려울 때 요긴하게 사용될 수 있다.
파일을 원격지로 복사해서 백업 효과를 내주는 - rsync
Bacula로 백업과 복원하기
Bacula(Bacula management server)는 상용 프로그램과 비교해도 손색없이 백업과 복원을 수행해주는 매우 강력하고 풍부한 기능을 가지고 있는 도구이다. 그리고 무료이다. 서버-클라이언트 개념으로 작동되며 Bacula 서버는 모든 백업/복원 관련 지시를 해주는 Director (dir), 실제 백업 데이터를 저장하는 Storage(sd), 콘솔에서 명령어를 수행하게 해주는 Console, 백업할 데이터를 발생시키는 리얼 서버들인 Agent(fd)가 있다. bat(Bacula Admin Tool)은 그래픽 도구이다. Bacula 클라이언트는 실제 웹, 파일, 데이터베이스 서버 등으로써 Bacula 서버에 백업될 데이터를 발생시키는 리얼 서버 머신들을 말한다.
EXTundelete로 데이터 복구하기
이 EXTundelete도 복원 도구인데 4G이상의 파일/디렉터리는 복원하지 못한다. 각 파일에 대한 inode 정보로 파일의 변동여부를 검사해서 복구해주는 원리이다. 데이터가 있었던 파티션을 umount 시킨 뒤 작업해야 하므로 USB나 별도의 디스크에서 작업한 데이터를 복원할 때 주로 사용하는 것이 좋다.
TestDisk와 Photorec로 파티션과 그래픽 데이터 복구하기
TestDisk는 파티션 복원 프로그램인데 이 모듈을 설치하면 사진, 그림 등 그래픽 데이터를 전문적으로 복구해주는 Photorec도 함께 설치된다. Photorec로 일반 파일이나 디렉터리도 복원할 수 있다.
블록장치를 백업/복원해주는 - dump와 restore
외부 장치, 특히 테이프 드라이브(/dev/st0로 보임)를 사용해서 백업/복원하려면 UNIX 시스템에서 전통적으로 사용해오는 dump와 restore 명령어를 사용할 수 있다. 테이프 드라이브 대신 별도의 하드디스크를 추가해서 실습해본다.
XFS/BTRFS로 백업/복원하기
Linux 시스템에서 부팅에 문제가 있을 것을 대비해서 GRUB를 백업해두는 것이 좋다.
GRUB 부트로더는 MBR(Master Booot Recorde)에 저장되는데 HDD의 첫번째 섹터, 첫번째 트랙에 위치하고 512MB 저장공간을 차지한다.
백업은 저장공간이므로 dd를 사용해서
dd if=/dev/sda of=/tmp/sda.mbr copunt=1 bs=512K ; sync 해주면 된다.
복원은
dd if=/tmp/sda.mbr of=/dev/sda 하면 된다.
GRUB 손상 시 시스템에 들어가는 세 가지 방법
GRUB가 손상되어서 정상 부팅이 불가능할 때의 필요한 조치를 알아보자. 일단 시스템으로 들어가야 복구 작업을 수행해서 복구할 수 있다.
1) 시스템을 부팅하면서 Press any key to enter the menu.라는 메시지가 보일 때 5초 내에 아무키나 누르면 GRUB 설정화면으로 들어간다. e를 누르면 편집할 수 있고, a를 누르면 추가할 수 있으며, c를 누르면 명령어 콘솔로 들어가게 된다.
앞에서 이 /boot/grub/grub.conf 파일을 백업해 두었다면, 이제 c를 입력하고 엔터해서 grub> 프롬프트가 뜨면 위 그림에 맞춰서 입력해주면 된다.
① root (hd0,0)을 입력하고(백업한 파일을 메모장으로 열고 Ctrl+c로 복사해서 Ctrl+v로 붙여넣기하면 편리할 것이다) 이제
② kernel /vmlinuz-2.6.32-431 ~ 이하를 입력하고,
③ initrd /initramfs-2.6.32-431 ~ 이하를 입력한다. 이어서
④ boot를 입력하면 정상 부팅된다.
2) 혹은 1)처럼 해서 grub> 콘솔로 들어가면
① grub> find /boot/grub/stage1(OR /grub/stage1) 해서 (hd0,1)과 (hd0,3)식으로 나오면 stage1 파일을 MBR에 복사해서 root 파티션으로 만들어 줄 수 있다.
② grub> install /grub/stage1 d (hd0,1) 해서 첫 번째 디스크 두 번째 파티션에 GRUB를 설치해 주면 /boot/grub/device.map에 정보가 들어있게 된다.
③ quit 한 뒤,
④ reboot 해주면 정상 부팅된다.
3) 또 앞에서 살펴 본대로 복구 모드로 들어가서 진행 도중 메뉴선택 창에서 Start shell을 선택해서 bash-4.1# 프롬프트가 되면, 차례로
① chroot /mnt/sysimage 해주고,
② grub-install /dev/sda 해서 GRUB를 MBR에 다시 설치한 뒤, exit, exit 하고,
③ 다시 복구 메뉴선택 창에서 Reboot를 선택하면 정상 부팅된다.
참고로 GRUB를 새로 설치하려면
① 콘솔에서 grub —version 해서 현재 설치되어 있는 GRUB 버전을 보는데 0.93이라면
a. rpm -qa |grep grub 해서 설치여부를 보고,
b. rpm -e --nodeps grub-0.93-4식으로 기존 패키지를 삭제하고
② CentOS 설치 DVD를 CentOS1 가상머신에 물려놓고,
a. cd /mnt/Packages 하고, ls –l grub* 해서 패키지를 보고,
b. rpm -Uvh grub-0.97-83.i386.rpm식으로 설치해주면 된다. 이어서
c. grub —version 해서 버전을 확인한 다음, 위 3)에서처럼
d. grub-install /dev/sda 해서 MBR 영역에 재 설치할 수 있다.
OR bash-4.1#에서
① grub 하고, lsblk –l 해서 /boot 파티션을 보고,
② grub> root (hd0,0) 해서 /boot가 위치한 파티션을 지정하고
③ grub> setup (hd0) 해서 MBR에 GRUB를 설치한 뒤에,
④ grub> reboot 해주어도 된다.
VPN(Virtual Private Network)으로 네트워크 간 보안연결
신뢰할 수 없는 트래픽이 다량으로 오가는 공중망(public network)에서 본사와 지사간의 정보를 빠르고 보안이 적용된 안전한 연결로 데이터를 송수신하는 방법으로 전용회선(dedicated line)이나 임대회선(leased line) 등을 사용할 수 있다. 하지만 비용이 만만치 않고 업무시간 종료나 휴일 등 회선을 사용하지 않을 때에는 타인이 활용할 수 없기 때문에 전반적으로 회선 낭비가 될 수 있다.
이를 해결하기 위해서 VPN이 생겨나게 되었는데 하드웨어나 소프트웨어를 적절히 사용해서 공중망에서도 전용회선과 같은 효과를 내게 하는 기법이다. 본사와 지사를 터널로 연결해서 그 안에서 통신이 이뤄지게 하면 송수신 데이터가 외부로 노출되지 않는 전용선처럼 운영될 수 있다. 보통 '라우터/리눅스<=>라우터/리눅스', '라우터/리눅스<=>소프트웨어', 그리고 '소프트웨어<=>소프트웨어'로 연결하는 방식 중 하나를 사용해서 VPN을 구성한다.
실습은 본사 CentOS1 머신에 OpenVPN 패키지를 설치해서 VPN 서버로 하고, 지사 CentOS2와 Windows 7 머신에 OpenVPN 패키지를 설치해서 지사 VPN 클라이언트들이 본사 VPN 서버에 터널로 연결하는 VPN을 만들어 보자. VPN 서버와 VPN 클라이언트는 공개키/개인키로 연결되므로 패스워드 인증보다는 한층 강화된 보안연결이 된다.
앞에서 알아본 대로 개인키/공개키 배포는 다음 두 가지 중 한 가지로 처리되는데
1) 클라이언트에서 공개키/개인키를 생성해서 개인키는 자신이 가지고 있고, 공개키는 서버에 보 내서 접속할 때 인증 받게 하거나
=>처음부터 인증 받은 사용자만 들어오게 됨, 조직 내부에서 사용됨
2) 서버에서 공개키/개인키를 생성해서 공개키는 자신이 가지고 있고, 개인키는 각 클라이언트에 게 나눠줘서 접속할 때 인증 받게 한다.
=>불특정 다수 중에서 인증 받은 사용자만 들어오게 함. 대부분 상업 조직에서 사용됨
먼저 CentOS1 머신에 VPN 서버를 설치한다.
① yum search openvpn* 해서 openvpn 패키지가 없으면,
a. yum -y install epel-release 해서 OpenVPN을 설치하게 하는 epel 리포를 설치해주고,
b. yum –y install openvpn 해서 OpenVPN을 설치한 다음,
c. 이제 터널연결에 필요한 키를 생성하기 위해서 wget ftp://ftp.pbone.net/mirror/ftp5. gwdg.de/pub/opensuse/repositories/home:/matthewdva:/build:/EPEL:/el7/RHEL_7/noarch/easy-rsa-2.2.2-1.el7.noarch.rpm 해서 easy-rsa-2.2.2~.rpm을 다운받고,
d. rpm –ivh easy-rsa[Tab] 해서 각종 키를 편리하게 생성해주는 easy-rsa를 설치한다(그냥 yum -y install easy-rsa 해서 설치하면 easy-rsa-3.0대가 설치되는데 오류가 자주 생겨서 안정된 2.0대로 설치했다).
② ls /usr/share/easy-rsa/2.0/ 해서 파일들을 확인하고,
a. mkdir –p /etc/openvpn/easy–rsa/keys 해서 키가 복사될 /easy-rsa/keys 디렉터리를 새로 만들고,
b. cp –arp /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/ 해서 파일을 복사하고,
③ 이제 필요한 설정을 해주는데
a. nano -c /etc/openvpn/easy-rsa/vars 하고
29줄 export KEY_CONFIG=/etc/openvpn/easy-rsa/openssl.cnf와
64줄 export KEY_COUNTRY="KR"
65줄 export KEY_PROVINCE="Seoul"
66줄 export KEY_CITY="Kuro"
67줄 export KEY_ORG="Duniv"
68줄 export KEY_EMAIL="centos@kahn.edu"
69줄 export KEY_OU="Security"
72줄 export KEY_NAME="centos1"식으로 고쳐서 저장한다. 나중에 SSL 인증서 생성 시 필요한 질문들의 답을 미리 정해주는 것이다. 저장한다.
b. 다시 cd /etc/openvpn/easy-rsa && ls 해서 vars 파일을 본 뒤,
c. cp -arp openssl-1.0.0.cnf openssl.cnf 해서 설정파일을 복사해서 메인 설정파일로 사용하게 하고
d. chmod 755 * 해서 현재 디렉터리 밑의 모든 파일들의 권한을 바꾸고,
e. source ./vars 해서 변경을 vars 파일에 적용시킨다.
f. ./clean-all 해서 rm -rf on /etc/openvpn/easy-rsa/keys를 실행한다.
④ 이제 CA 인증서와 사전 공유키에서 사용될 Diffie-Hellman 키를 생성한다.
a. ./build-ca 하면 질문이 나오는데 앞에서 지정한 값 KR, Seoul, Kuro, Duniv, paul@ kahn.edu, sec 등이 디폴트로 나오므로 모두 엔터해서 받아들이면 생성된다.
b. ./build-dh 하면 2,048 길이의 키를 Generator 2(Diffie-Hellman) 기법으로 생성해준다.
⑤ 계속해서 VPN 서버 키를 생성하는데 2,048 길이의 개인키를 RSA 기법으로 생성한다.
a. ./build-key-server VPNserver 하면 역시 질문이 나오는데 앞에서 지정한 값이 디폴트로 나오므로 모두 엔터해주고 맨 나중의 'extra' attributes 두 질문은 그냥 엔터해서 넘어간다.
b. 인증서에 서명하겠느냐는 질문에 y를 입력하고,
c. 인증서를 요청하겠느냐는 질문에도 y를 입력하면 생성된다.
=>VPN 서버 키가 생성되었다.