rsync (Remote synchronization) 원격서버 데이터 동기화를 위해 만들어진 유틸리티
- 소유권,그룹권한,심볼릭 링크,타임스탬프 공유로 여러 서버 동기화
- 이미 동기화된 데이터는 제외하고 동기화 (네트워크 트래픽 최소화)
- ssh 프로토콜을 이용한 원격지 동기화
- 다른 동기화 프로그램(rcp, scp) 보안 및 속도가 빠름 (SCP 보안 취약점 CVE-2018-20685, CVE-2019-6109-11)
rsync는 크게 두가지 방법으로 사용합니다.
rsync데몬(systemctl start rsyncd)을 구동시켜서 사용하는 방법과 ssh로 바로 접속해서 사용하는 방법이 있습니다.
rsync데몬을 사용할 경우 rsyncd.conf에 정의된 Alias에 의해 동기화작업을 진행합니다. 동기화가 되는 서버가 많을 경우에도 Alias만 적절히 수정하면서 동기화시킬 수 있습니다.
ssh프로토콜을 사용하는 경우 rsync데몬과는 상관없이 구동됩니다. 보통 원격지 백업용으로 사용됩니다.
- rsync데몬 (포트 873) 를 이용한 동기화 (원격::Alias)
rsync데몬 (포트 873)을 사용하는 경우 /etc/rsyncd.conf 정의된 Alias을 이용합니다.
rsyncd.conf 사용되는 계정은 root가 아닌 운용계정을 사용하는 것이 보안상 좋습니다.
원본서버 설정
- rsync 설치
# yum install rsync
# systemctl enable rsyncd
# systemctl start rsyncd
- rsync 사용자추가(운용계정)
# adduser rsync-user
# passwd rsync-user
- 방화벽 설정
# firewall-cmd --permanent --add-service rsyncd
# firewall-cmd --reload
- rsync 서비스 포트 확인(netstat -> yum install net-tools)
# netstat -tulpn | grep rsync
# tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 5177/rsync
# tcp6 0 0 :::873 :::* LISTEN 5177/rsync
- rsync 테스트용 디렉토리 생성
# mkdir /tmp/rsync-test
- rsync 접속계정 비밀번호 생성 (계정:비밀번호 형식으로 rsyncd.passwd 추가)
# vi /etc/rsyncd.passwd
# rsync-user:testpassword
- rsyncd.passwd 접근권한제한
# chmod 0600 /etc/rsyncd.passwd
/etc/rsyncd.conf 설정
# vi /etc/rsyncd.conf
# rsync사용계정 및 그룹
uid = rsync-user
gid = rsync-user
# 외부접근제한 ALL
hosts deny = *
# 최대 허용접속 갯수
max connections = 1
# daemon PID
pid file = /var/run/rsyncd.pid
# 예외폴더 및 파일
exclude = lost+found/
# 읽기 전용
read only =yes
# 로그파일위치
log file = /var/log/rsync.log
# 파일전송로그 활성화
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
# rsync alias
[test]
# 디렉토리 경로
path = /tmp/rsync-test
# 리스팅 가능
list = yes
# rsync접근계정
auth users = rsync-user
# rsync 비밀번호
secrets file = /etc/rsyncd.passwd
# 허용 Host
hosts allow = 10.0.120.55
SELinux 설정
- SELinux 설정
에러메세지(rsync @ERROR: chroot failed) 발생
# setsebool -P rsync_export_all_ro 1
rsync 재시작
# systemctl restart rsyncd
rsync alias확인
# rsync -v localhost::
test
백업(동기화)서버 설정
rsync alias 확인
# rsync -v 10.0.120.55::
test
telnet 이용한 네트워크 포트 확인
# telnet 10.0.120.55 873
Trying 10.0.120.55...
Connected to 10.0.120.55.
Escape character is '^]'.
@RSYNCD: 31.0
rsyncd.passwd 파일 생성
root계정이 아닌 경우 home디렉토리에 계정 생성 후 접근 제한하면 됩니다.
이때 백업(동기화)서버 rsyncd.passwd파일에는 비밀번호만 입력해야 됩니다.
# vi /home/{사용자계정}/rsyncd.passwd
testpassword
- 접근제한
# chmod 0600 /home/{사용자계정}/rsyncd.passwd
백업(동기화) 테스트
# rsync -aP --password-file=/home/{사용자계정}/rsyncd.passwd rsync-user@10.0.120.55::test /tmp/rsync-test
- ssh를 이용한 동기화 (원격:/Path)
ssh프로토콜을 사용할 경우 원격지 경로를 직접 명시하면 됩니다.
# rsync -option -e 'ssh -p ssh포트' user@origin-server:/path backup-server_path
하위 디렉터리 포함(-r), 타임스탬프 유지(-t), 동기화 출력(-v), 읽기편한포맷출력(-h)
원본서버 소유권 유지하지 않고 백업(동기화)을 실행하는 계정으로 귀속됨
# rsync -rtvh -e 'ssh -p 9999' backup-user@10.0.120.55:/tmp/rsync-test /home/backup-user/test
backup-user@10.0.120.55's password: ***********
receving incremental file list
.
.
.
.
send 304.89K bytes recevied 601.08K bytes 164.72K bytes/sec
total size is 978.09M speedup is 1,079.60
백업(동기화) 서버에 임의로 소유권을 지정해서 동기화(rsync)
--chown=소유자:소유자 그룹
# rsync -rtvh -e 'ssh -p 9999' --chown=db-user:db-group rsync-user@10.0.120.55:/tmp/rsync-test /home/backup-user/test
backup-user@10.0.120.55's password: ***********
receving incremental file list
.
.
.
.
send 304.89K bytes recevied 601.08K bytes 164.72K bytes/sec
total size is 978.09M speedup is 1,079.60
rsync 결과 리포트 출력
-- stats
# rsync -rt -e 'ssh -p 9999' --stats rsync-user@10.0.120.55:/tmp/rsync-test /home/backup-user/test
backup-user@10.0.120.55's password: ***********
Number of files: 16,204 (reg: 12,958, dir: 3,246)
Number of created files: 60 (reg: 55, dir: 5)
Number of deleted files: 0
Number of regular files transferred: 55
Total file size: 978,092,639 bytes
Total transferred file size: 142,705,304 bytes
Literal data: 142,705,304 bytes
Matched data: 0 bytes
File list size: 52,633
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 4,463
Total bytes received: 143,140,956
sent 4,463 bytes received 143,140,956 bytes 26,026,439.82 bytes/sec
total size is 978,092,639 speedup is 6.83
주기적인 백업 스크립트(chmod +x rsync_backup.sh)
원본서버 ssh자동 로그인 허용해야 됩니다.
스크립트 생성 후 적절히 cron에 등록하면 됩니다.
####################################################
# Rsync backup script
####################################################
RUNTIME=$(date +"%Y-%m-%d %H:%M:%S")
echo -e "---------------------------------------------------" >> rsync_backup.log
echo -e "---- Rsync Backup $RUNTIME ---- " >> rsync_backup.log
echo -e "---------------------------------------------------" >> rsync_backup.log
rsync -rt --delete --exclude='lost+found/' -e 'ssh -p 9999' --stats --chown=user:usergroup rsync-user@10.0.120.55:/raid/pg /backup/pg >> rsync_backup.log
echo -e "---------------------------------------------------" >> rsync_backup.log
echo -e "" >> rsync_backup.log
echo -e "" >> rsync_backup.log
echo -e "" >> rsync_backup.log
rsync client 옵션
shor | long | 설명 |
-a | --archive | 자주사용하는 옵션을 묶어놓은 옵션(-rlptgoD) |
-r | --recursive | 하위디렉토리까지 복사 (옵션이 비활성시 "skipping directory" 메세지 출력됨) |
-l | --links | 심볼릭 링크 유지 |
-p | --perms | 퍼미션 유지 |
-t | --times | 타임스탬프 유지 |
-g | --group | 그룹 소유권 유지 |
-o | --owner | 사용자 소유권 유지 |
-D | 디바이스 파일보존 (same as --devices --specials) | |
-h | --human-readable | 읽기 편한 포맷으로 출력(Human) |
-v | --verbose | 동기화시 상세 출력 |
-q | --quiet | 동기화시 출력표시 안함 |
--delete | 원본소스에 없는 파일은 백업서버에서 삭제 | |
--exclude | 동기화 예외 파일지정 | |
--include | 동기화 포함할 파일 지정 | |
-n | --dry-run | 실제로 동기화(복사)가 되는게 아니라 구동 테스트 |
-b | --backup | 백업서버에 이미 파일이 존재할 경우 백업 디렉토리에 백업 |
-u | --update | 백업서버에 원본보다 최신 파일이 있을 경우 해당 파일은 복사하지 않음 |
-e | ssh 프로토콜 사용 (ex: -e 'ssh -p 9999') | |
-z | 데이터파일 압축 | |
https://cipleme.tistory.com/25
Rsync 보안 침해사고 사례
'Linux > Cloud' 카테고리의 다른 글
시놀로지에 그누보드5 설치오류 500 Error, msyql_connect() Error (0) | 2024.07.24 |
---|---|
Synology phpMyAdmin 접근제어 방법 (0) | 2024.07.23 |
[OpenMediaVault5.6] Docker(Portainer) CUPS 설치 (0) | 2022.02.04 |
[OpenMediaVault5.6] SFTP 설치 (0) | 2022.01.30 |
[OpenMediaVault5.6] OMV Extras 설치 (Docker 사용) (0) | 2022.01.30 |