2010-11-08

[linux] SSH経由でrootでrsyncしてサーバーの引っ越し

結論
rootでrsyncしようとsudo rsyncすると、SSHのAgent Forwardingに必要な環境変数をsudoがセキュリティ対策で削除して困ったが、sudo -E rsync とすると上手くいく。

蛇足
2HOSTの方針で、St.Louisのデータセンターが閉鎖されて、そのついでにセキュリティ問題発覚以後開発元がおかしなことになっている HyperVM から SolusVM への移行をすすめるので、新しいVPSノードを再設定できる人は、SolusVM管理下の新しいVPSノードを作るから各自移行してね、というメールが来たので、提案された通りにすることにしました。

そこで、古いサーバーのファイルを持っていくのに、scpでちまちまコピーするのも良いけどファイル数が多いと遅いので、rootでrsyncしてコピーすると良いのではないかと思って、やってみました。

しかし普通にsudo rsyncとすると、エージェントフォワーディングによる公開鍵認証にならないので、なぜなのか悩みましたが、sudoのセキュリティ対策によるものと分かりました。

CentOSでyumで入るsudoの/etc/sudoersはとても安全側に振ってあるみたいで、環境変数は指定されたものは全部削除されてしまい、SSH_AUTH_SOCKが削除されてAgent Forwardingが働きません。参考:sudo env と叩く

sudoのmanページを読むと、その環境変数を削除する機能を一時的に無効にするオプション -E (preserve environment) を追加したら、無事公開鍵により認証され、root権限でのrsyncができました。

実際に使ったコマンドは、
sudo -E rsync --archive --verbose example.com:/etc/ ./example.com-etc
のような感じで、example.com の /etc がローカルの ./example.com-etc に保存されます。