この設定では以下のことができるようになります。
- 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 ではリモート接続には 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
以上です。
コメント