rootユーザーなしでSSH経由でリモートマシンのすべてのファイルをrsyncしますか?


68

リモートマシンをバックアップするこのコマンドがあります。問題は、すべてのファイルを読み取り、コピーするためにルート権限が必要なことです。セキュリティ上の理由でルートユーザーを有効にしておらずsudo、Ubuntuの方法を使用しています。これを行うには、クールなパイピングなどが必要ですか?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/

3
rootそもそもアカウントを使用するだけです。sudo、特にNOPASSWDコメントで推奨されているように組み合わせても、マシンのセキュリティは実際には向上しません。
マーティン・フォン・ウィッティヒ

回答:


89

そもそもルートアカウントを使用することをお勧めします。このように設定した場合:

  • sshd_configターゲットマシンでをに設定しますPermitRootLogin without-password
  • ssh-keygenバックアップを取得するマシンで使用して、SSH秘密鍵を作成します(SSH鍵がまだない場合のみ)。パスフレーズを設定しないでください。この詳細が必要な場合は、Googleでチュートリアルを作成してください。
  • /root/.ssh/id_rsa.pubバックアップマシンのコンテンツを/root/.ssh/authorized_keysターゲットマシンのコンテンツに追加します。
  • これで、バックアップマシンは、パスワード認証を使用することなく、ターゲットマシンへのルートアクセス権を持ちます。

その結果、セットアップはかなり安全になります。


sudo、特にNOPASSWDコメントで推奨されているように組み合わせると、ルートアカウントを使用するだけではセキュリティ上の利点はありません。たとえば、この提案:

/etc/sudoersファイルに次を追加します。rsyncuser ALL= NOPASSWD:/usr/bin/rsync

rsyncuserとにかく基本的にルート権限を付与します。あなたが尋ねる:

@MartinvonWittichでrsync実行されるため、完全なルートシェルを簡単に取得できsudoます。お願いします[m] e [through]

まあ、簡単です。推奨構成でrsyncuserrsync、パスワードを要求されることなく、rootとして実行できるようになりました。rsyncは、ファイルを操作するための非常に強力なツールであるため、現在rsyncuser、ルート権限でファイルを操作するための非常に強力なツールがあります。これを悪用する方法を見つけるのにほんの数分しかかかりませんでした(Ubuntu 13.04でテストしましたがdash、動作bashしませんでした):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

ご覧のとおり、ルートシェルを作成しました。whoamiアカウントをルートとして識別し、でファイルを作成でき、/etcから読み取ることができます/etc/shadow。私の悪用は、バイナリにsetuidビットを設定することでしたdash。これにより、Linuxは常に所有者(この場合はroot)の許可でそのバイナリを実行します。

正当な理由により、実際のルートを持つことは推奨されません。– redanimalwar 15時間前

いいえ、それを使用することが絶対に適切な状況でrootアカウントを不器用に操作するのは、正当な理由ではありません。これは貨物カルトプログラミングのもう1つの形式です。sudoとrootの背後にある概念を本当に理解していないので、「rootは悪い、sudoは良い」という信念を盲目的に適用します。

一方でsudo、仕事に間違いなく適切なツールである状況があります。たとえば、グラフィカルなLinuxデスクトップでインタラクティブに作業している場合、Ubuntuを使用するsudoと、ルートアクセスが必要なまれなケースで使用する必要があります。Ubuntuは意図的に無効化されたルートアカウントを持ち、sudoユーザーがログインするために常にルートアカウントを使用することを防ぐためにデフォルトで使用することを強制します。 、したがって、デフォルトでルートアカウントを持っていないため、愚かな人々はこれを行うことができません。

一方、あなたのような状況では、自動化されたスクリプトが何かに対するルート権限を必要とする場合があります。たとえば、バックアップを作成する場合です。sudoルートアカウントを回避するために使用することは無意味であるだけでなく、危険でもありrsyncuserます。一見すると、通常の特権のないアカウントのように見えます。しかし、既に説明したように、攻撃者が既にrsyncuserアクセスを取得していれば、完全なルートアクセスを取得することは非常に簡単です。したがって、基本的に、ルートアカウントのように見えない追加のルートアカウントがありますが、これは良いことではありません。


2
いい説明。rootでsudoを使用する別の理由は、複数の人がサーバー上でsysadminロールを持っているという状況でしょうか?このように、ルートのSSHキーを共有する代わりに、それぞれが独自のSSHキーを使用できますか?
ネイサンS.ワトソン-ヘイ14年

2
@ NathanS.Watson-ヘーグあなただけのように簡単にすべてのSSHキーを入れることができます/root/.ssh/authorized_keysので、各ユーザーが自分の殻、家と持つことができますさまざまな家庭を持つ複数のルートアカウントを作成しても、あるいは.ssh/authorized_keys:)
マーティン・フォン・Wittich

2
特定のコマンドのみを許可するようにsshキーを制限することもできます。何かを自動化する場合、おそらくパスフレーズなしでこれらのsshキーを作成するか、少なくともマシンの実行中はいつでもアクセスできるようにするため、間違いなく良いアイデアです。(つまり、そのマシンのルートが他のマシンのルートへのアクセスを許可することを意味します。)
ピーターコルデス

2
sudoルートの使用に関するMartinの懸念は有効ですが、sudoersファイルで正確なrsyncパラメーターを指定することで軽減できるようです。Ubuntuのsudoers(5)のマニュアルページによると:「Cmndにコマンドライン引数が関連付けられている場合、Cmndの引数はコマンドラインでユーザーが指定した引数と完全に一致する必要があります(またはワイルドカードがある場合は一致します) 」sudoersファイルが正確なオプション(ソースと宛先を含む)で正確なrsyncコマンドを指定している場合、安全であると思われます。

4
以前に提起されなかった1つの考慮事項:sshd通常、アカウントへの接続に使用された認証キーは記録されないため、そのように接続するとbob、のキーで直接sudo接続する場合よりも優れた監査証跡が得られます。rootbob
コーデラー

71

--rsync-pathオプションを使用して、リモートrsyncコマンドをsudo特権で実行します。コマンドは次のようになります。

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

sudoパスワードの入力を求められた場合はNOPASSWD、リモートユーザーアカウントで特権を使用することで(rootには無意味で、他のユースケースでは意味があるかもしれません)、またはそれを行いたくない場合は、それを回避する必要があります:

  • tty_ticketseg sudo visudo -f /etc/sudoers.d/local-rsync を実行し、次のように入力して、使用しているユーザーのオプションが無効になっていることを確認します。

    Defaults:your.username.for.rsync !tty_tickets
    
  • requiretty使用しているユーザーのオプションが無効になっていることを確認してください-デフォルトでオフになっている可能性があります。方法は上記と同じです。

  • sudoたとえば、次のコマンドを実行して、リモートマシンのパスワードをシードします。 ssh -t user@192.168.1.2 sudo


1
@scaiを求めているパスワードは、最も可能性が高いsudoパスワードではなく、sshパスワード
ウムラウト

2
@redanimalwarを使用すると、ユーザーsudo /usr/bin/rsyncはパスフレーズを要求せずに次のことができます。man sudoersこれを行う方法を確認してください。このために追加のバックアップユーザーを作成することをお勧めします。
ウムラウト

5
sudo /usr/bin/rsyncパスワードとして要求せずに実行できるよう にするには、/etc/sudoersファイルに次を追加します。rsyncuser ALL= NOPASSWD:/usr/bin/rsyncこれにより、ユーザーrsyncuser(上記のように専用のバックアップユーザーを作成することをお勧めします)に必要なユーザー名を追加できます。
M_dk

4
@M_dkには、rsync基本的に常にルート権限が付与されます。そのアカウントで完全なルートシェルを取得するのはおそらく非常に簡単です。そもそも実際のルートアカウントを使用する方が良いと思います。
マーティンフォンヴィッティッヒ

1
echo "password" | something私が実際にこれを使用したことは決してなく、rsyncのsudoless実行(これもここでは推奨されていません)を許可することで生じるセキュリティ問題に同意するという答えは決して悪いことではありません。何をtty_tickets私は実際には考えているん、必要なようで、セキュリティ上の問題。これは、sshでsodoを実行してからコマンドを実行するだけで、何も微調整することなく安全に動作しますか?しかし、スクリッピングの目的でその質問をしたので、pwなしのキーベースのsshが安全であり、正しいことであることに完全に同意します。代わりに、マーティンズの回答を受け入れました。
-redanimalwar

17

これを行う簡単な方法の1つは、でグラフィカルssh-askpassプログラムを使用することです。これにより、ターミナルに接続されていないsudoという事実を回避しsudo、パスワードを安全に入力できます。

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .

もちろん、ssh-askpassプログラムは指定された場所にインストールする必要があり、作業中のマシンでXセッションを実行する必要があります。ssh-askpass動作するはずのプログラムにはいくつかのバリエーションがあります(Gnome / KDEバージョン)。また、グラフィカルなsudo交換プログラムのようなgksuまたはkdesudoも動作するはずです。


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .動作しません。 rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]。ああ、ubuntuはgnome-ssh-askpassを出荷しますが/usr/bin/ssh-askpass、ではなく、/usr/lib/ssh/x11...です。だからそれは働いた:)
ピーターコーデス

1
これは、もう一方の端で再構成を必要としないため、優れたソリューションの1つです。askpassをインストールし、X転送を有効にするだけでよく、どちらもかなり一般的です。
デビッドガードナー

1
インストール後にチャームのように動作しssh-askpassます。私は、の意味を調べなければならなかったので、-chavzPeこれらを長いオプションとして説明するのは素晴らしいことです。
krlmlr

これを試しましたが、リモートマシンでプロンプトが開かれ、ローカルマシンに転送されていません。X11Forwardingは機能しているので、xeyesSSH を使用して実行することで確認しました。
ジョイスバブー

7

ユーザーがすでにパスワードで保護されているsudo特権を持っている場合、私はそれらをそのままにして、パスワードなしでrsyncを使用するためのスタンザを追加するだけです。

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 

5

今日、この問題に遭遇し、構成ファイルを変更したり、ユーザーアカウントにルートレベルのアクセス許可を付与したりすることなく解決しました。私の特定のセットアップでは、Aマシン上fooのユーザーは、ユーザーが所有するディレクトリ内のすべてのユーザーディレクトリfooをマシンbarにコピーbackupする必要Aがありました。(ユーザーにAはsudo特権がありfooます。)

使用したコマンドは次のとおりです。上A/homeディレクトリでユーザーによって呼び出されましたfoo

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

これにより、rsyncがsudoとして実行され、すべてのユーザーディレクトリにfooアクセスできますが、barユーザーAの資格情報を使用してsshを使用してマシンにアクセスするようにrsyncに指示します。私のニーズは上記の質問とは少し異なりましたが、これにより、システムの構成に手を加えることなく、管理している特定のマシンのすべてのユーザーディレクトリのバックアップをすばやく取得できました。


2
これは素晴らしいです。の-iオプションを忘れましたssh--rsync-path="sudo /usr/bin/rsync" machineにsudoがある場合に使用できますbar。次に、asの読み取りとasのroot@foo書き込みをroot@bar行いますが、A@foo-> を介して転送しB@barます。ありがとう!
-ctbrown

所有者(ルートなど)は保持されません、正しいですか?
アンドリス

3

ターゲットマシンでrsyncをデーモンとして実行すると、必要な処理を実行できます。


1
私はこの答えを支持しましたが、rsynchデーモンを実行する方法と、rootアクセスを使用してそれを使用する方法についてのいくつかの説明があれば良いでしょう。
マイク・リッペルト

デーモンとしてのrsyncは、この場合には一致しません。これは、rsyncがrootとして起動された場合でもroot権限を削除し、すべてのファイルを転送できないためです。
teissler

2

私の解決策は使用--rsync-path="sudo rsync"することですが、パスワードを要求します、回避策:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

1
通常、パスワードをコマンドラインのワンライナーに入れることはお勧めできません。たとえば、プロセスツリーに表示されます。このタイプのステートメントの実際のパスワードを$( cat my_password.txt )わずかに良いものに置き換えることがありますが、通常は、CLIでパスワードが不要になるように、どちらかの側でアクセス許可を構成するか、SSHキーを使用することをお勧めします
JDS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.