rsyncを非インタラクティブモードに強制する


8

Pythonスクリプト内でrsyncを使用したいと思います。私はそれを使ってそれを呼んでいますsubprocessモジュールauthorized_key、リモートマシンのファイルに保存されている公開鍵を使用して認証しています。

唯一の問題は、間違ったリモートユーザー名を使用してrsyncを使用すると、パスワードの入力を求められるため、バックアップスクリプトが永久に停止することです。

強制できますか rsyncパスワードを要求するのではなく、認証できない場合にエラーで終了することはできますか?

ウディ

回答:


9

SSHリモートシェルで(たとえば、rsyncサーバーではなく)rsyncを使用すると仮定すると、rsyncでパスワードを要求しない方法でSSHを実行できます。たとえば、一度この呼び出しを使用できます:

rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path

これにより、rsyncは0回のパスワード試行でSSHを使用するように強制されます。他の認証方法(公開鍵やGSSAPIなど)を使用してアクセスできない場合、エラーで失敗します。その場合、rsyncはあなたを気に入らず、大声でSTDERRに文句を言い、終了コード255でブレークすることに注意してください。


5

静かに保つために使用するsshのコマンドラインオプションを次に示します。

ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no

あなたがknown_hostsファイルを維持しておらず、MitM警告を取得することを心配している場合にのみ、hostkeyのものが必要です。James Fが提案した認証タイプを指定するのではなく、パスワード認証を明示的に制限する必要がありました。私はこれを使用して、いくつかの異なるOSバージョンを持つ数百のホストを攻撃するので、それは単に非互換性であるかもしれません。


1
これらの設定は使用しないでください。Oreillyの「SSH、The Secure Shell:The Definitive Guide、Second Edition」のセクション11.5を参照してください。本によると、「残念ながら、サーバー認証を効果的にスキップすると、SSHセキュリティの重要な部分が無効になります。サーバーホストのなりすましと中間者攻撃への抵抗!この状況でも、サーバーキーを定期的に交換することは現実的ではありません。完了、またはキーが危険にさらされていることがわかっている場合にキーを取り消す(つまり、クライアントにもはや信頼しないように伝える)。」
Mick

1
@Mick:このような批判の問題は、一部のコンテキストでは完全に不適切であるということです。たとえば、私はrsync操作のターゲットが、ラボの奥深くに埋め込まれたプライベートネットワーク内の組み込みシステムのホストである環境で働いています。外部との接続はまったくなく、ビルドシステムは更新されたコードをターゲットにプッシュできる必要があります。これはsshとrsyncの完全に正当な使用法であり、明白な解決策はホストチェックをオフにすることです。それについて絶対的なルールを作ることは全く意味がありません。
Stabledog 2013年

@Stabledog-私のアドバイスは、ほとんどのユースケースに対する正しいアドバイスです。ただし、悪意のある攻撃者がMiTM攻撃を実行するためにネットワークへのアクセスを合理的に取得できると思わない場合は、弱いセキュリティ構成を選択できます。ラボ環境に必要なセキュリティ構成(前述のとおり)は、リスクが自然に軽減されるため、運用環境とは明らかに異なります。
Mick

けっこうだ。ここに哲学的な懸念と実用的な問題があります:sshは安全であるという能力よりもはるかに重要であり、実際...私がこれまで使用してきたほとんどの設定では、セキュリティは最も重要ではありません。 。すべてのタイプのリモート接続に最適なスイスアーミーナイフです。そのため、「セキュリティ純粋主義者」の叱責と、実際の人々が日常的に実用的な方法でそれを常に使用する方法との間には、この分離があります。私たちは皆、単なる愚か者であり、純粋主義者が「正しい」とは信じていません。いつケアするかを知るという問題です。
Stabledog 2013年

1

re:Jamesの提案(ttyを与えていない)、サブプロセスについては、Pdinへのパラメーターとしてstdin = Noneを指定してみてください。



0

rsyncの起動方法によっては、TTYまたはPTYを指定しないことが役立つ場合があります。

多くのプログラムは、ユーザーに入力を求めることを決定する前に、制御TTYがあるかどうかを確認します。system()および類似の呼び出しのデフォルトの動作は、ttyをサブプログラムに提供することですが、これを無効にすることができます。

また、両方のシステムを制御していて、この問題を解決しながらセキュリティ上の利点のためにパスワード認証から離れたい場合は、リモート側でパスワード認証を完全に無効にすることもできます。

SSH経由でrsyncを実行している場合は、問題のホストのssh_configファイルに以下を追加するか、-oコマンドラインスイッチを使用します。

PreferredAuthentications publickey

(rsyncではなくsshのみの)クイックテストで、パスワードを要求せずに公開鍵が受け入れられなかった場合にSSHがすぐに終了しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.