web-dev-qa-db-ja.com

別のユーザーとのrsync

AWSで2つのubuntuインスタンスを使用しています(これらにアクセスするには、pemキーを使用します)。

両方のインスタンスにrsyncを設定しましたが、デフォルトのユーザーであるubuntu @ ipaddressを使用すると機能します。ただし、別のユーザーでrsyncを使用しようとすると(たとえば、_Sudo su - jenkins_と入力するか、rsyncコマンドの前にSudoと入力する)、次のエラーが発生します。

_Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.0]
_

私が取った手順:

jenkinsとしてログインしているときにsshキーを(ssh-keygenを使用して)作成し、_authorized_keys_の_/home/ubuntu/.ssh/authorized_keys_ファイルに追加しました(rsyncを実行しています) from)および_$JENKINS_HOME/.ssh/authorized_keys_(私もそこからrsyncを実行してみました)。

同じことをするためにpemキーを使ってみましたが、それもうまくいきませんでした。

これが私が実行しようとしているものです

_rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins_

そして、ここにキーファイルがあります

_rsync -avuh --delete -e 'ssh -i path/to/key.pem' [email protected]:/var/lib/jenkins/* /var/lib/jenkins_

PS:私がubuntuユーザーで実行したくない唯一の理由は、多くのことでfailed: Permission denied (13)を取得するためです(ファイルはjenkinsが所有しているため)。

最終目標:

Cronjobを実行して、バックアップjenkinsインスタンスをプライマリインスタンスで常にバックアップし続けようとしています。

_*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins_

3
Fadi

私はそれが古い投稿であることを知っていますが、念のために他の人を助けることができます...

あなたは2つのことを区別する必要があります:

  • who SSH接続を確立します
  • which リモートユーザーがファイルを所有していますコピーするファイル。

概観

(srcmachine)  (rsync)   (destmachine)
  srcuser    -- SSH -->   destuser
                             |
                             | Sudo su jenkins
                             |
                             v
                          jenkins

Rsyncしたいとしましょう:

  • から:
    • マシン:srcmachine
    • ユーザー:srcuser
    • ディレクトリ:/var/lib/jenkins
  • に:
    • マシン:destmachine
    • ユーザー:destuser to SSH接続を確立
    • ディレクトリ:/tmp
    • 最終的なファイルの所有者:jenkins

解決

rsync --rsync-path 'Sudo -u jenkins rsync' -avP --delete /var/lib/jenkins destuser@destmachine:/tmp

解説

     --rsync-path=PROGRAM    specify the rsync to run on the remote machine

トリックは、SSH接続を確立するユーザー(rsync)とは別のユーザー(jenkins)でリモートマシン上でdestuserを実行するように指示することです。

必要条件

SSHアクセス

(srcmachine)         (rsync)   (destmachine)
  srcuser           -- SSH -->   destuser

[~/.ssh/id_rsa]                [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]

~/.sshの権限を制限することを忘れないでください:

chmod 700 ~/.ssh

destuserのsudoer

destuserには、Sudo -u jenkins rsyncを実行する権限が必要です。

一般に、destusersudoersのメンバーとして設定します。これを行うには、root @ destmachineで:

cat > /etc/sudoers.d/destuser << EOF
destuser ALL=(ALL) NOPASSWD:ALL
EOF

rsyncの前にテストするには、destuser @ destmachineにログオンして、次のコマンドを実行します。

Sudo su jenkins
echo $USER

返される場合:

jenkins

これは、jenkinsユーザーとしてログに記録されていることを意味し、rsyncへのエスカレード特権が機能するため、jenkinsコマンドも機能することを意味します。

悪い解決策に関する注意:宛先ユーザーとのSSH接続を確立するjenkins

なぜこれをしないのですか?

(srcmachine)         (rsync)   (destmachine)
  srcuser           -- SSH -->    jenkins

[~/.ssh/id_rsa]                [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]

jenkinsは「サービス」アカウントであるため、外部HTTPアクセス用のポート(80など)を公開するサービスを実行し、存在する可能性があることを意味します。 HTTP経由のJenkinsサービスを介したセキュリティ違反により、アクセス権が取得されます。

そのため、さまざまなサービスを実行するためのwww-dataユーザーなどがあります。公開しているポートからハッキングされた場合、多くのことはできません。

  • すべてが読み取り専用です。
  • /var/log/THE_SERVICEで書くことを除いて。

したがって、jenkinsユーザーにSSHアクセスを許可すると、表面攻撃が発生します(したがって、SSHアクセスの場合はroot !!として)。

さらに、別のユーザー(rootwww-dataなど)としてrsyncを実行する場合は、SSHキーの公開鍵をそれらのアカウントにコピーする必要があります(面倒)。

適切な解決策ユーザーアカウントへのSSHアクセスをできるだけ少なくするdestuser)that CAN escaladateを "必要なサービス」アカウント(jenkinsrootなど)。

3
Samuel Phan

別のユーザーと同様のrsyncingの問題が発生しました。次のコマンドを実行して解決しました:

rsync -avu -e "ssh -i my-key -o StrictHostKeyChecking=no -l user-i-want-to-use-in-rsync" ./local_dir remote_Host:remote-Host-dir

別のユーザーとしてrsyncを実行できるようにするには、キーを操作する必要がある場合があることに注意してください。

2
user3650655