정기적으로 홈 네트워크의 Raspberry Pi에 자동으로 백업하고 싶습니다. 집에서 백업하는 것만으로도 충분합니다.
내가 "자동 백업을 수행하는 방법"에 대해 읽은 모든 가이드에서는 내 파이에 비밀번호 없는 SSH 키를 넣으라고 나와 있습니다. 내 컴퓨터에 액세스할 수 있는 사람은 누구나 내 백업에 액세스할 수 있기 때문에 이 작업을 수행하고 싶지 않습니다. 이는 백업의 한 가지 목적을 완전히 없애줍니다.
현재 솔루션은 비밀번호로 보호된 SSH 키와 rsync 스크립트입니다. 작동하는 데 시간이 좀 걸렸지만 이제 홈 네트워크에 로그인하자마자 비밀번호를 묻는 메시지가 표시된 다음 백업됩니다.
restic
이제 일종의 버전 백업이 필요해서 사용하고 싶습니다 . 다른 장치도 백업하고 싶습니다. Restic 가이드는 다시 비밀번호 없는 SSH 키를 사용하라고 말했습니다.
이제 나는 반대 생각을 가지고 있습니다. 즉, 내 (오프라인) pi는 비밀번호 없이 내 노트북에 SSH로 접속할 수 있습니다(그러나 사용이 제한됨 resric
). 스크립트를 사용하여 일부 systemd.timer를 실행하여 내 노트북에 액세스할 수 있는지 확인하고 그럴 경우 백업을 시작할 수 있습니다.
그러나 이것은 진부해 보이며 이것이 일반적인 시나리오라고 확신합니다. 하지만 가이드를 찾을 수 없습니다.
일반적인 방향을 알려 주실 수 있나요? 내가 하고 싶은 일에 대해 더 자세히 알 수 있도록 일부 용어도 도움이 될 것입니다!
답변1
결합하면 백업하려는 머신에서 연결할 수 있는 REST API를 제공하는 서비스를 사용하여 백업 서버에 서비스를 설정할 restic
수 있습니다 . rclone
보통 REST API를 사용rclone
restic
restic
많은restic
SFTP를 통해 사용하는 것보다 빠릅니다.
rclone serve restic --help
SSL 사용 방법 및 htpasswd
인증 방법을 포함하여 이에 대한 내용이 잘 문서화되어 있습니다 .이 문서를 주의 깊게 읽어야 합니다.. 백업 서버가 공개 서버이거나(그러면 안 됩니다), 개인이 아닌 설정을 위해 백업 서버를 수행하는 경우 어떤 방식으로든 개별 사용자를 인증하여 보안을 유지해야 합니다.
로컬 네트워크 외부 에서 사용할 수 있게 하려면 localhost
백업 서버로 사용되는 호스트에 최소한 다음 설정이 필요합니다.
rclone serve restic --addr :8080 /var/backup/restic
/var/backup/restic
저장소를 저장하려는 경로는 다음 과 같습니다 restic
(위 명령을 실행하는 사용자는 해당 경로에 대한 쓰기 권한이 있어야 하므로 이를 위한 전용 서비스 사용자를 생성해야 할 수도 있습니다). --addr :8080
"사용 가능한 모든 인터페이스에서 포트 8080에 바인딩"을 의미합니다 (기본적으로 rclone
에만 바인딩 localhost:8080
).
그런 다음 다음 명령을 사용하여 여기에 연결할 수 있습니다(이렇게 하면 restic
저장소가 초기화되고 내 홈 디렉터리의 첫 번째 스냅샷이 생성됩니다).
restic -r rest:http://backupsrv:8080/testrepo init
restic -r rest:http://backupsrv:8080/testrepo backup "$HOME"
restic
여기서는 이름이 지정된 저장소를 생성하고 사용하려고 하며 testrepo
을 통해 백업 서버에 액세스할 수 있다고 가정합니다 backupsrv
. 호스트 이름을 올바른 이름이나 IP 번호로 바꿔야 합니다.
이렇게 하면 저장소 비밀번호를 묻는 메시지가 대화형으로 표시되지만, 평소와 같이 환경 변수에 암호를 전달할 수 있습니다 ( 대신 을 사용하여 저장소를 RESTIC_PASSWORD
전달할 수 있는 것처럼 ).restic
RESTIC_REPOSITORY
-r ...
내 개인 Synology NAS에서 다음 Docker 컨테이너(파일 docker-compose.yml
)를 실행합니다.
version: '3'
services:
rclone:
image: rclone/rclone:latest
container_name: rclone
hostname: diskstation.local
ports:
- 18080:8080
restart: unless-stopped
command: ["serve","restic","/backup"]
environment:
- RCLONE_ADDR=0.0.0.0:8080
- RCLONE_STATS=1h
- RCLONE_VERBOSE=1
volumes:
- /volume1/Restic/backup:/backup
NAS의 포트 18080에서 REST API를 제공 하며 restic
여기에 백업을 저장할 수 있습니다 /volume1/Restic/backup
(컨테이너에 대한 바인드 마운트를 통해). rclone
격리된 LAN(방화벽 및 캐리어 등급 NAT 뒤)에 있는 개인 NAS이므로 설정 보안이 매우 낮습니다.
답변2
특정 작업으로 제한되는 비밀번호 없는 키를 갖는 것이 아이디어입니다.
예를 들어 Restic(SFTP를 통해 백업을 저장함)을 사용하거나 순수 rsync를 사용하면 백업 서버가 백업 디스크의 Btrfs/ZFS 스냅샷을 유지하도록 할 수 있으며 SSH 키를 사용하여 루트 권한 없이 계정에 액세스할 수 있습니다. 스냅샷은 삭제할 수 없습니다.) 누군가가 키를 사용하여 Restic 저장소를 원격으로 삭제하면 마지막 스냅샷에서 복원하는 데 몇 초가 걸리며 그 이후에는 정상적으로 노트북 복구를 계속하게 됩니다.
SSH를 통해 통신하는 자체 "서버"가 있는 Borg Backup과 같은 프로그램의 경우 특정 강제 원격 명령으로만 키를 제한하여 SFTP나 셸이 아닌 Borg 서버를 시작할 수 있습니다. Borg에는 force 명령에 사용할 수 있는 "추가 전용" 옵션이 있으므로 키는 새 백업을 업로드하는 데만 사용할 수 있고 이전 백업은 삭제할 수 없습니다.
그러나 아마도 누군가가 1) 노트북의 암호화되지 않은 파일에 액세스할 수 있고 2) 홈 네트워크에 연결되어 있다면 더 큰 문제가 발생할 가능성이 높습니다.
답변3
내가 "자동 백업을 수행하는 방법"에 대해 읽은 모든 가이드에서는 내 파이에 비밀번호 없는 SSH 키를 넣으라고 나와 있습니다. 내 컴퓨터에 액세스할 수 있는 사람은 누구나 내 백업에 액세스할 수 있기 때문에 이 작업을 수행하고 싶지 않습니다. 이는 백업의 한 가지 목적을 완전히 없애줍니다.
첫 번째 진술은 정확하지만 이에 대한 나의 이해를 설명하려고 노력하겠습니다. (그리고 최소 권한의 원칙도 있습니다.)
- 백업하고 싶은 컴퓨터가 있습니다.
- 누군가가 실수로 컴퓨터에 액세스하여 백업을 파괴할 수 없도록 백업을 보호하려고 합니다.
여기서 해결 방법은 PC가 아닌 백업 서버(Pi)에서 백업을 구동하는 것입니다. (Linux/Mac 클라이언트) 또는 (Windows 클라이언트) rsync
와 함께 사용 하는 경우 Pi가 PC에 액세스할 수 있도록 구성표를 설정하십시오. (Pi에 비밀번호 없이 액세스하는 데에는 PC가 필요하지 않습니다.)ssh
rsyncd
일반적인 접근 방식은 Pi에서 cron
PC를 자주(예: 4시간마다) 백업하려고 시도하지만 일단 성공하면 다음 날까지 다시 시도하지 않는 것입니다. 이 스크립트는 테스트되지 않았지만 솔루션의 뼈대를 제공해야 합니다. timeout 4h
전체 백업에는 이 정도면 충분하다는 점에 유의하는 것이 중요합니다 .
basedir=/data/backup_dir # Backups target directory
my_pc=192.168.130.33 # Your PC name or IP address
today=$(date +'%Y-%m-%d') # Today
stamp=$(cat "$basedir/.stamp" 2>/dev/null) # Date of last backup
if [ "$today" = "$stamp" ]
then
# Last backup was today
exit 0
fi
if ! ping -q -c1 "$my_pc"
then
# PC not responding to ping
exit 1
fi
# Backup your PC
if timeout 4h rsync -a "$my_pc":/…/ "$basedir/$today"
then
# Success
echo "$today" >"$basedir/.stamp"
exit 0
fi