Rsync поверх SSH с авторизацией отдельных пользователей на стороне Rsync


Настройка Rsync сервера для резервного копиравания данных, с поддержкой rsync порта под Windows.
Примерную схему работы можно видеть на изображении выше.

Rsync клиент соединяется с rsync сервером поверх SSH подключения (key auth), проходит авторизацию самого rsync и синхронизирует данные c каталогом указанным в конфигурации rsync.

По большей части, эта заметка посвящена именно авторизации “windows rsync” клиентов поверх ssh.

Настройка сервера

Создаём пользователя от которого будет работать rsync и происходить ssh авторизация

1
2
sudo useradd -d /mnt/backup backup
sudo chown backup:backup /mnt/backup

создаём ssh ключ для авторизации

1
2
3
4
5
sudo su backup
ssh-keygen
echo -n "no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding,command=\"/usr/local/bin/rsync_validate\" " > ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

и добавляем скрипт коротый будет обрабатывать ssh подключения и прокидывать rsync через nc /usr/local/bin/rsync_validate.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\>*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
*\|*)
echo "Rejected"
;;
rsync\ --server*)
/bin/nc localhost 873
;;
nc\ localhost\ 873*)
/bin/nc localhost 873
;;
*)
echo "Rejected"
;;
esac

даём права на исполнение

1
chmod +x /usr/local/bin/rsync_validate

Далее необходимо настроить сам rsync:
/etc/rsyncd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
uid = backup
gid = backup
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
secrets file = /etc/rsyncd.rsct
log file = /var/log/rsyncd.log
address = localhost

[client1Dir]
    path = /mnt/backup/client1
    use chroot = yes
    read only = no
    comment = "Client1 backup"
    hosts allow = localhost
    auth users = client1
    list = no

[client2Dir]
    path = /mnt/backup/client2
    use chroot = yes
    read only = no
    comment = "Client1 backup"
    hosts allow = localhost
    auth users = client1
    list = no

uid/gid - пользователь под которым будет работать rsync.
exclude - список файлов и каталогов которые rsync будет игнорировать (разделитель - пробел, можно файл со списком).
secrets - путь к файлу с паролями пользователей.
address - адрес на который биндится rsync, в нашем случае это localhost/127.0.0.1.
В клиентской секции, в auth users необходимо указать пользователя прописанного в /etc/rsyncd.rsct, в path путь к каталогу с файлами клиента.

/etc/rsyncd.rsct

1
2
client1:Client1PaSsWoRd
client2:Client2PaSsWoRd

На этом настройку сервера можно считать законченой.
На этом этапе клиент может подключиться к серверу через ssh и пройти авторизацию rsync.

Настройка клиентов

Я некоторое время промучился с настройкой rsync под windows, а точнее с rsync авторизацией на сервере.
В принципе только из-за этого и появилась эта заметка - что-бы не забыть.
Windows
backup.bat

1
2
3
4
5
setlocal
set RSYNC_PASSWORD=Client1PaSsWoRd
set LOGNAME=client1

rsync.exe  -vauz --progress   --log-file="backup.log"  -e ".\ssh.exe -F ssh_config"  out/ rsync://ServerAddr.com/client1Dir

По ссылке можно скачать комплект rsync который используется мной на Windows системах.
backup.bat - необходимо откорректировать переменные RSYNC_PASSWORD пароль rsync, LOGNAME логин rsync.
idrsa - приватный ключ SSH пользователя backup или того что вы выбрали для работы rsync.
ssh_config - конфиг SSH клиента, необходимо подправить, Host и User при необходимости.

Linux
backup.sh

1
2
3
4
5
#!/bin/bash
export RSYNC_PASSWORD=Client2PaSsWoRd
export LOGNAME=Client2
# "-l backup" заменить на своего ssh юзера, id_rsa рядом с скриптом
rsync -arvzu --progress --log-file="backup.log" -e "ssh -i ./id_rsa -l backup" ~/PathToDir/ rsync://ServerAddr.com/client2Dir

Так-же как и в предыдущем скрипте, необходимо поправить переменные RSYNC_PASSWORD пароль rsync, LOGNAME логин rsync.
В строке ssh клиента -e "ssh -i ./id_rsa -l backup заменить backup на своего пользователя.
Хоть в linux и нормально обрабатывается RSYNC_CONNECT_PROG, но я решил использовать однообразные скрипты в двух системах, а так как windows самая пришибленная то её вариант и стал основным. :)
Можно избавиться от имени пользователя ssh, в скрипте и вынести его в ssh_config как и в windows варианте.
rsync://ServerAddr.com/client2Dir client2Dir - имя секции в /etc/rsyncd.conf

Комментарии