スクリプト

【CentOS/RHEL】rsync自動バックアップスクリプト ~root権限/expectコマンドいらずの本格派~

この設定では以下のことができるようになります。

  • rsyncによるリモートサーバのバックアップが自動スケジュールで実行できます。
  • SSHアクセスは root権限じゃないけど、バックアップのためのファイルアクセスはrootと同じ権限で実行できます。
  • expectコマンドは不要です。

シナリオ

SV-A (192.168.100.124) の /etc 配下を、SV-B (192.168.100.125) にバックアップします。SV-B から rsync で SV-A に接続しに行きます。

SSHの公開鍵認証認証の用意

expectに頼らずSSH認証を行うにはパスワード不要の「公開鍵認証」を実装しましょう。

まずは共通ユーザbkupusrを作成します。SV-A にて bkupusr を作成し、.ssh ディレクトリを作成する。

[root@SV-A ~]# useradd bkupusr
[root@SV-A ~]# passwd bkupusr
新しいパスワード:[パスワードを入力]
[root@SV-A ~]# su - bkupusr
[bkupusr@SV-A ~]$ mkdir -m 700 .ssh

SV-B にも bkupusr を作成。

[root@SV-B ~]# useradd bkupusr
[root@SV-B ~]# passwd bkupusr
新しいパスワード:[パスワードを入力]
ユーザー bkupusr のパスワードを変更。

次にSV-B で鍵ペア(公開鍵と秘密鍵)を作ります。(SV-A で作るのでも構いませんが、秘密鍵は極力移動させないのが原則です)

[root@SV-B ~]# su - bkupusr
[bkupusr@SV-B ~]$ ssh-keygen -t ed25519 -P ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/bkupusr/.ssh/id_ed25519): [何も入力せずEnter]

このコマンドにより /home/bkupusr/.ssh 配下に id_ed25519 と id_ed25519.pub が生成されます。

[bkupusr@SV-B ~]$ ls -l /home/bkupusr/.ssh
-rw-------. 1 bkupusr bkupusr 399 10月 17 00:01 id_ed25519
-rw-r--r--. 1 bkupusr bkupusr  94 10月 17 00:01 id_ed25519.pub

次に、SV-B の id_ed25519.pub (公開鍵)を SV-A に "authorized_keys" というファイル名でコピーします。

[bkupusr@SV-B ~]$ scp /home/bkupusr/.ssh/id_ed25519.pub bkupusr@192.168.100.124:/home/bkupusr/.ssh/authorized_keys
/home/bkupusr/.ssh/authorized_keys
The authenticity of host '192.168.100.124 (192.168.100.124)' can't be established.
ECDSA key fingerprint is SHA256:t4WjgZ9NMX0FOE9JN7rAhrcKsd9iR+kFYEH5b8T0ra4.
ECDSA key fingerprint is MD5:48:e0:c0:43:99:ec:be:86:1a:15:80:04:a4:d5:c9:6e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.124' (ECDSA) to the list of known hosts.
bkupusr@192.168.100.124's password: [パスワード入力]
id_ed25519.pub                                100%   94    84.8KB/s   00:00
[bkupusr@SV-B ~]$

すると ssh の -i オプションで秘密鍵を指定することで、パスワード無しにSSHログインできるようになります。

[bkupusr@SV-B ~]$ ssh -i /home/bkupusr/.ssh/id_ed25519 bkupusr@192.168.100.124
Last login: Wed Oct 10 17:28:54 2018
[bkupusr@SV-A ~]$

rsync の準備

rsync は主にリモートのファイルを効率的にコピーするコマンドです。

【rsync】差分同期の仕組みとオプション, ログの見方(フォーマット)
rsync のアルゴリズム ~単純コピーのcp/scpコマンドとはどのように違う...

rsync ではリモート接続には SSH を使います。一般ユーザ bkupusr で接続しますが、--rsync-path オプションを使うことでリモートサーバにて sudo でroot実行のコピーをすることができます。

まずは rsync のインストール。両サーバに必要です。

[root@SV-A ~]# yum -y install rsync
[root@SV-B ~]# yum -y install rsync

SV-A側で rsync の sudo 権限を与えます。

[root@SV-A ~]# visudo
~~~最終行に以下2行を追記~~~
Defaults!/usr/bin/rsync !requiretty
bkupusr         ALL=(ALL)       NOPASSWD: /usr/bin/rsync

SV-B側で格納先ディレクトリを作成します。

[root@SV-B ~]# mkdir -p /bkup/SV-B/etc

これで準備完了です。

rsync 実行

SV-Bから以下を実行します。

[root@SV-B ~]# rsync -av --numeric-ids --delete --rsync-path='sudo rsync' -e "ssh -i /home/bkupusr/.ssh/id_ed25519" bkupusr@192.168.100.124:/etc/ /bkup/SV-A/etc --log-file=/root/rsync.log

これが成功すればこのコマンドをスクリプト化して cron に登録するだけです。

vi にて以下ファイルを作成します。

[root@SV-B ~]# vi rsync.sh

以下を追記。

rsync -av --numeric-ids --delete --rsync-path='sudo rsync' -e "ssh -i /home/bkupusr/.ssh/id_ed25519" bkupusr@192.168.100.124:/etc/ /backup/SV-A/etc --log-file=/root/rsync.log

:wq で保存した後、実行権限を付与。

[root@SV-B ~]# chmod 700 rsync.sh
[root@SV-B ~]# ll
-rwx------. 1 root root  176 10月 17 00:46 rsync.sh

cron に登録。

[root@SV-B ~]# crontab -e

以下を追記。

5 0 * * * /root/rsync.sh

以上です。

コメント

タイトルとURLをコピーしました