web-dev-qa-db-ja.com

ルートログインを許可せずにLinuxでsshを介してZFSを送受信する

ファイルシステムを複製したいstorage/photosルートとしてsshログインを有効にせずにsourceからdestinationに。次のようなさまざまな組み合わせを試しました。

Sudo zfs send -R storage/photos@frequent_2015-02-12_18:15 | ssh example.com Sudo zfs recieve storage/photos
Sudo zfs send -R storage/photos@frequent_2015-02-12_18:15 | ssh example.com su -c zfs recieve storage/photos
Sudo zfs send -R storage/photos@frequent_2015-02-12_18:15 | ssh example.com 'Sudo -S zfs recieve storage/photos <~/topsecret'

Zfsストリームはすでに標準入力に接続されているため、Sudo-Sを使用してパスワードを渡すことはできません。そして、stdinではなくインタラクティブ端末を期待する上記の2つの例。

おそらく、サーバーでrootログインを有効にしたくないのはばかげています。しかし、ブルートフォース攻撃者がどちらがニースであるかを推測するためのもう1つのことが残されています。

6
Rovanion

これはrootログインを完全に削除するわけではありませんが、フル機能のログイン以外のことを保護します。

ローカルユーザーの公開鍵(通常は~/.ssh/id_rsa.pub)authorized_keysファイル(~/.ssh/authorized_keys)リモートユーザーの場合。これにより、パスワードプロンプトが排除され、SSHキーのブルートフォースが困難になるため、セキュリティが向上します。おそらく、sshd_configPermitRootLogin without-password-これにより、リモートルートログインがSSHキーのみに制限されます(正しいパスワードでも失敗します)。

次に、authorized_keysファイルのForceCommandディレクティブを使用してセキュリティを追加し、zfsコマンドのみの実行を許可できます。

5
BowlesCR

私は今日早く同じ問題に遭遇しました。 「zfsallow」コマンドを使用して、通常のユーザーに特定の操作を実行することを許可できることがわかりました。

rootとして、サーバーで次の手順を実行します。zfsallow your_username receive、create、mount storage/photos

その後、your_usernameを使用してサーバーにSSHで接続できるようになり、受け取るzfs権限が付与されます。ここを参照してください: http://docs.Oracle.com/cd/E19253-01/819-5461/gfkco/index.html

8
analog900

まだ0.7.0にアップグレードしていない人のために、私が思いついた解決策を次に示します。リモートサーバーにSSHで接続し、以下を実行します。

mkfifo zfs-pipe

# It doesn't ask for your password until the pipe starts to receive 
# data. So check back here when you start the local command
Sudo zfs receive storage/photos < zfs-pipe  

次にローカルで:

Sudo zfs send -R storage/photos@frequent_2015-02-12_18:15 | \
       pv | ssh example.com "cat - > zfs-pipe"

もちろん、pvはオプションです。進捗状況を監視するものがあるのはいいことです

最後に、パイプをクリーンアップします。

rm zfs-pipe
2
dylanPowers

@ analog900は正しい方向に進んでいます。

Rootログインの必要性を回避するなど、セキュリティを強化するための1つの鍵は、ZFSの組み込みのアクセス許可構造を使用することと、バックアップ転送を逆に構造化することです 'ラウンドとpullバックアップをプッシュするのではなく、ネットワーク経由で。ルートアクセスなしでファイルシステムをバックアップする機能は、ZFSファイルシステムの主要な設計上の成果の1つです。

destinationでジョブを実行し、sourceからデータをプルします。おそらく次のようになります。

  • sourceマシンで、非特権ユーザーアカウントfooを作成し、zfs allowを使用してそのアカウントに次の機能を付与します。スナップショットの作成と送信:
    zfs allow foo mount,snapshot,send storage/photos
  • destinationマシンで、非特権アカウントbarを作成し、そのアカウントにファイルシステムを受信/作成/マウントする機能を与えます。
    zfs allow bar mount,create,receive storage/photos
  • 宛先で、ユーザーbarとして、バックアップジョブ専用のsshキーを作成します。そのキーのパブリック半分を、ソースマシンのユーザーfoo.sshディレクトリにインストールします。これにより、ユーザーはbar@destinationアカウントへのfoo@sourceセキュアsshログインアクセスが可能になります。また、destinationの〜bar/.ssh/configファイルを編集して、正しいSSHキーファイル名(前に作成したもの)とユーザー名を自動的に使用するようにします。
    Host source
       Hostname FQDN.of.source.example.com
       User foo
       IdentityFile ~bar/.ssh/backup_key_id_rsa
  • 次に、bar@destinationからバックアップジョブを実行します。
    dt=$(date +%Y-%m-%d_%H:%M:%S)
    ssh source "zfs snap storage/photos@frequent_$dt"
    ssh source "zfs send -R storage/photos@frequent_$dt" | zfs receive storage/photos

この方法でそれを行うには、noルートアクセスが必要です。

2
Jim L.