rsyncをパスワードなしで実行、ファイル同期(鍵交換による認証)

2020-02-24Others,RockyLinux/CentOS

Linuxのサーバー間で、rsyncコマンドを使ってファイルを同期する手順です。
送信側サーバーと受信側サーバーで鍵交換の設定を行い、パスワード入力するなしでrsyncを実行しています。

受信側サーバー: test-vm-01
送信側サーバー: test-vm-02

※手順の確認には、Rocky Linux release 9.4 (Blue Onyx)の仮想マシンを使用しています。
※Azure上で作成した仮想マシンで確認しています。
※"testuser"という名前でユーザーを作成して手順を確認しています。

スポンサーリンク

公開鍵認証によるSSH接続の許可

sshd_configに公開鍵認証の許可設定があります。
受信側サーバーの設定を確認し、noになっている場合や、コメントアウトされている場合には"PubkeyAuthentication yes"に設定変更します。
設定変更後にはsshdを再起動します。

[testuser@test-vm-01 ~]$ sudo vi /etc/ssh/sshd_config

# 変更前
44

45 # PubkeyAuthentication yes
46

# 変更前(コメントアウトを外す)
44

45 PubkeyAuthentication yes
46

[testuser@test-vm-01 ~]$ sudo systemctl restart sshd

※コメントアウトされておらず有効化されている場合は、そのまま変更しなくてOKです。
※今回は受信側サーバーがtest-vm-01となりまます。

送信側サーバーの設定

ssh-keygenコマンドを使って鍵ペアを作成

公開鍵、秘密鍵をssh-keygenコマンドを使って作成します。
鍵の暗号化形式はed25519形式としています。
rsyncの実行ユーザーでssh-keygenコマンドはrsync実行ユーザーで行います。

[testuser@test-vm-02 ~]$ ssh-keygen -t ed25519 -C " -N "
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/testuser/.ssh/id_ed25519):
Your identification has been saved in /home/testuser/.ssh/id_ed25519
Your public key has been saved in /home/testuser/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:9eFW7Dbch9sLqw22+Cuwbe5Jq/g4sPqsEpIF42W1S7Q
The key’s randomart image is:
+–[ED25519 256]–+
|o. o.o |
|..+ . o . |
| + E … o |
|o. . . .oo.= o |
|. . . So .+ * o|
| . + . o. . +.|
| o = +. o .. .|
| o oo..++ . o .|
| .ooo==.o.. . |
+—-[SHA256]—–+

デフォルトでは、ssh-keygenコマンドを実行したユーザーのホームディレクトリにある.sshディレクトリに鍵が生成されます。
ディレクトリを確認するとid_ed25519とid_ed25519.pub2つのファイルが生成されています。
id_ed25519が秘密鍵、id_ed25519.pubが公開鍵になります。

[testuser@test-vm-02 ~]$ ls -l ~/.ssh/
total 8
-rw——-. 1 testuser testuser 0 Oct 6 01:56 authorized_keys
-rw——-. 1 testuser testuser 387 Oct 6 05:03 id_ed25519
-rw-r–r–. 1 testuser testuser 82 Oct 6 05:03 id_ed25519.pub

chmodコマンドで生成した鍵やディレクトリの権限設定

注意メッセージが表示される場合があるので、念のため権限系の設定実施しておきます。
chmodコマンドで.sshディレクトリと公開鍵への権限設定します。
権限はrsync実行ユーザーのみが利用できるようにします。

[testuser@test-vm-02 ~]$ chmod 700 ~/.ssh
[testuser@test-vm-02 ~]$ chmod 600 ~/.ssh/id_ed25519.pub
[testuser@test-vm-02 ~]$ ls -al ~/.ssh/
total 8
drwx——. 2 testuser testuser 69 Oct 6 05:04 .
drwx——. 3 testuser testuser 74 Oct 6 01:56 ..
-rw——-. 1 testuser testuser 0 Oct 6 01:56 authorized_keys
-rw——-. 1 testuser testuser 387 Oct 6 05:03 id_ed25519
-rw——-. 1 testuser testuser 82 Oct 6 05:03 id_ed25519.pub

送信側サーバーから受信側のサーバーに公開鍵ファイルを転送

公開鍵を送信側(test-vm-02)から、送信側サーバー(test-vm-01)に公開鍵のファイルを転送します。
転送先のディレクトリは、rsyncで利用するログインユーザー名のホームディレクトリの.sshディレクトリを指定します。
今回はSCPコマンドでファイル転送実施しています。

【SCPコマンド例】
scp -P “SSHのポート番号" “送信するファイル" “接続先サーバーのログインユーザー名"@"接続先サーバーのホスト名":"送信先のディレクトリ"

# 公開鍵のファイルを送信側サーバーから受信側サーバーに転送
[testuser@test-vm-02 ~]$ cd  ~/.ssh 
[testuser@test-vm-02 .ssh]$
scp -P 22 /home/testuser/.ssh/id_ed25519.pub testuser@test-vm-01:/home/testuser/.ssh/test-vm-02_id_ed25519.pub
The authenticity of host 'test-vm-01 (10.0.1.4)’ can’t be established.
ED25519 key fingerprint is SHA256:IuqTIBCY+Ini556s6slIbaDUdHEGsdN2LuJ9wRNkG9s.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'test-vm-01’ (ED25519) to the list of known hosts.
testuser@test-vm-01’s password:パスワードを入力
id_ed25519.pub 100% 82 200.6KB/s 00:00

# 受信側サーバーで転送された公開鍵のファイルを確認
[testuser@test-vm-01 .ssh]$ ls -al

total 4
drwx——. 2 testuser testuser 62 Oct 6 05:29 .
drwx——. 3 testuser testuser 95 Oct 6 05:00 ..
-rw——-. 1 testuser testuser 0 Oct 6 05:01 authorized_keys
-rw——-. 1 testuser testuser 82 Oct 6 05:29 test-vm-02_id_ed25519.pub

※SSHのポート番号を変更していない場合は-pオプションを利用してポート番号を指定する必要はありません。

—広告—

受信側サーバーの設定

送信側サーバーの公開鍵をauthorized_keys ファイルに統合

受信側サーバーで送信側サーバーの公開鍵の内容を登録します。
事前に転送しておいた、送信側サーバーの公開鍵情報をauthorized_keys ファイルに書き込みます。
今回は、catコマンドを使って送信側サーバー(test-vm-02)の公開鍵情報を受信側サーバー(test-vm-01)のauthorized_keys ファイルに書き込みます。
書き込みが終わったら、転送しておいた送信側サーバーの公開鍵は不要なので削除します。

# 事前に転送しておいた、送信側サーバー(test-vm-02)の公開鍵のを受信側サーバー(test-vm-01)のauthorized_keysに書き込み
[testuser@test-vm-01 ~]$
 cd  ~/.ssh 
[testuser@test-vm-01 .ssh]$ cat test-vm-02_id_ed25519.pub >> authorized_keys

# 転送しておいた受信側サーバー(test-vm-01)の公開鍵を削除
[testuser@test-vm-01 .ssh]$ rm test-vm-02_id_ed25519.pub

chmodコマンドでauthorized_keysファイルやディレクトリの権限設定

authorized_keysファイルと.sshディレクトリの権限を設定します。

[testuser@test-vm-01 ~]$ chmod 700 ~/.ssh
[testuser@test-vm-01 ~]$ chmod 600 ~/.ssh/authorized_keys
[testuser@test-vm-01 ~]$ ls -al ~/.ssh/
total 4
drwx——. 2 testuser testuser 29 Oct 6 05:53 .
drwx——. 3 testuser testuser 111 Oct 6 06:00 ..
-rw——-. 1 testuser testuser 82 Oct 6 05:52 authorized_keys

※初期状態で正しく権限設定されており、この手順が不要な場合もあります。

rsyncコマンドでサーバー間のファイル転送

パスワードなしでrsyncコマンドを実行できるかを確認

送信側サーバー、受信側サーバーの設定後にrsyncコマンドを実行して確認します。
テスト用のファイルを作成して確認しています。

【rsyncコマンド例】"接続先サーバーのログインユーザー名"
rsync -avz -e “ssh -p 22" “転送元のディレクトリ" “転送先のログインユーザー名"@"転送先のサーバー名":"転送先のディレクトリ"

# テスト用のファイルを送信側サーバーで作成
[testuser@test-vm-02 tmp]$ echo test >> /tmp/rsync_test

# rsyncコマンドを送信側サーバーで実行してファイルを転送
[testuser@test-vm-02 .ssh]$
rsync -avz -e “ssh -p 22" /tmp/rsync_test testuser@test-vm-01:/tmp/rsync_test

sending incremental file list
rsync_test
sent 128 bytes received 35 bytes 326.00 bytes/sec
total size is 5 speedup is 0.03

# 受信側サーバーで転送されたファイルを確認
[testuser@test-vm-01 .ssh]$
ls -l /tmp/rsync_test
-rw-r–r–. 1 testuser testuser 9 Oct 6 06:01 /tmp/rsync_test

※コマンド例では、SSHのポート番号を明示的に指定しています。SSH接続時にデフォルトの22番ポートを利用する場合はオプションは不要です。
※rsyncコマンドのオプションは適時選択します。コマンド例では-aオプションを利用して権限の情報などを保持するようにしています。

cronに設定する事で同期が可能

送信側サーバーのcronでrsyncコマンドを定期実行するように設定することで、ファイルを自動的に同期させることが可能です。

最後に

パスワードなしでrsyncコマンドを実行する手順を、Rocky Linux環境を例に確認してみました。
引き続き色々試してみたいと思います。

※パスワードなしでSSH接続できる状態になります。セキュリティ面については充分注意するようにしてください。

Azure環境上でRocky Linuxの仮想マシンを作成する手順やOSの初期手順についてはこちらで紹介しています。

Rocky Linux 9でのSELinux無効化手順はこちらで紹介しています。

スポンサーリンク