ルートなしでSSHを介してリモートシステム上のすべてのファイルを再同期するには?

ルートなしでSSHを介してリモートシステム上のすべてのファイルを再同期するには?

リモートコンピュータをバックアップするには、このコマンドがあります。問題は、すべてのファイルを読み取り、コピーするにはrootアクセス権が必要であることです。セキュリティ上の理由から、ルートを有効にせずにsudoUbuntu方式を使用しました。これを行うには、素晴らしいパイプや他のものが必要ですか?

rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/

答え1

まず、rootアカウントを使用することをお勧めします。次のように設定すると:

  • sshd_configターゲットコンピュータの構成をPermitRootLogin without-password
  • バックアップが抽出されたコンピュータからssh-keygenSSH秘密鍵を生成するために使用します(まだSSH鍵がない場合のみ)。パスワードを設定しないでください。これに関する詳細情報が必要な場合は、Googleチュートリアルがたくさんあります。
  • /root/.ssh/id_rsa.pubバックアップコンピュータの内容を/root/.ssh/authorized_keysターゲットコンピュータの内容に追加します。
  • これで、バックアップマシンは、パスワード認証を使用せずにターゲットマシンへのルートアクセス権を持つことができます。

これにより、最終設定が非常に安全になります。


sudo特にNOPASSWD注釈で提案されているものと組み合わせて、rootアカウントを使用するよりもセキュリティ上の利点はありません。たとえば、次の提案があります。

ファイルに以下を追加します/etc/sudoersrsyncuser ALL= NOPASSWD:/usr/bin/rsync

とにかく、デフォルトでrsyncuserrootアクセスを許可します。尋ねる:

rsync@MartinvonWittich ?を使用してフルルートシェルを取得するのは簡単ですsudo。 go[m]e[through]してください。

まあ、簡単です。推奨設定では、パスワードを入力しなくてもrsyncuserルートとして実行できるようになりました。ファイルを操作する非常に強力なツールなので、ルート権限でファイルを操作できる非常に強力なツールがあります。この問題を悪用する方法を見つけるには数分しかかかりませんでした(Ubuntu 13.04でテストされており、必須ですが成功しませんでした)。rsyncrsyncrsyncuserdashbash

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自分のアカウントをrootとして識別し、その中にファイルを作成して/etc読み取ることができるルートシェルを作成しました/etc/shadow。私の脆弱性は設定です設定値dashバイナリビットLinuxは常に所有者(この場合はroot)の権限でバイナリを実行します。

実際の根を持つことは妥当な理由のために推奨されません。 – redanimalwar 15時間前

いいえ、rootアカウントが絶対に適切な場合は、不器用に解決する理由はありません。それは別の形に過ぎません。貨物崇拝プログラミング- あなたは実際にはsudoとrootの概念を理解しておらず、どこかで読んだので、「ルートは悪く、sudoは良い」という信念を盲目的に適用しています。

一方では、それがsudo確かに作業に適したツールである状況があります。たとえば、グラフィカルLinuxデスクトップ(Ubuntuなど)でインタラクティブに作業するときに、rootアクセスが必要なまれなsudo場合に使用することをお勧めします。 Ubuntuは、sudoユーザーが常にrootアカウントにログインするのを防ぐために、rootアカウントを意図的に無効にし、デフォルトでそれを使用するように強制します。 rootとしてログインすることは、ユーザーがWebブラウザのみを使用したい場合には危険です。

一方、あなたのような場合には、自動化スクリプトにバックアップを実行するなどの操作へのルートアクセスが必要です。sudo問題を解決するためにルートアカウントを使用することは意味がないだけでなく、危険です。rsyncuser一見すると、権限のない一般アカウントのように見えます。ただし、すでに説明したように、攻撃者がすでにアクセス権を持っている場合は、完全なルートアクセス権を簡単に取得できますrsyncuser。したがって、本質的にルートアカウントのように見えない追加のルートアカウントがありましたが、これは良いことではありません。

答え2

リモートコマンドが特権で実行される--rsync-pathようにするには、このオプションを使用します。たとえば、コマンドは次のようになります。rsyncsudo

rsync -chavzP --rsync-path="sudo rsync" --stats [email protected]:/ .

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

  • たとえば、次のコマンドを実行して入力して、tty_tickets使用しているユーザーがオプションを無効にしたことを確認します。sudo visudo -f /etc/sudoers.d/local-rsync

    Defaults:your.username.for.rsync !tty_tickets
    
  • requiretty使用しているユーザーがこのオプションを無効にしていることを確認してください。おそらく基本的にオフになっているでしょう。方法は上記と同じです。

  • sudoたとえば、次を実行してリモートシステムでパスワードをシードします。ssh -t [email protected] sudo

答え3

簡単な方法は、次ssh-askpassの機能を備えたグラフィックプログラムを使用することですsudo。これにより、端末に接続されていないことを避け、sudoパスワードを安全に入力することができます。

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  [email protected]:/ .

もちろん、ssh-askpassプログラムは指定された場所にインストールされており、使用しているコンピュータでXセッションが実行されている必要があります。このプログラムにはssh-askpass動作する必要があるいくつかのバリエーションがあります(Gnome / KDEバージョン)。または、または同じグラフィック交換プログラムがsudo機能する必要があります。gksukdesudo

答え4

今日この問題は、構成ファイルを変更したり、ユーザーアカウントにrootレベルの権限を付与したりせずに解決しました。私の特別な設定は、Aコンピュータのユーザーがfoo自分が所有しているディレクトリのすべてのユーザーディレクトリをfooコンピュータにコピーする必要があることです。 (ユーザーにsudo権限があります。)barbackupAAfoo

私が使用するコマンドは次のとおりです。Aディレクトリのユーザーが呼び出します。/homefoo

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

これはすべてのユーザーディレクトリにアクセスできるようにrsyncをsudoとして実行しますが、rsyncにユーザーの資格情報を使用fooしてシステムにアクセスするにはsshを使用するように指示します。私の要件は上記の質問とは少し異なりますが、これにより、システム構成を損なうことなく、管理している特定のコンピュータのすべてのユーザーディレクトリをすばやくバックアップできます。barA

関連情報