web-dev-qa-db-ja.com

別のユーザーが所有するファイルを非rootとして読み取る

バックアップサーバーでサーバーをバックアップしています。バックアップされる各サーバーは、バックアップサーバー上に独自のアカウントを持ち、ファイルはrsyncされます。復元を簡素化するために、権限はそのまま(rsync -pを使用)にしておくことが重要です。

ファイルを読み取って統計を作成できるスクリプトを作成しようとしています。このスクリプトがrootユーザーの下で実行されるのは好ましくありません。また、すべてのユーザーからすべてのファイルを読み取ることができるはずなので、すべてのバックアップユーザーに対して実行することは不可能です。ただし、これにより、たとえばファイルがchmodded 600の場合に問題が発生します。アクセス権を変更したくありませんが、rootと所有者以外の別のユーザーはファイルを読み取ることができません。

特定の-非root-ユーザーは、アクセス許可レベルに関係なく、ディレクトリまたはパーティション内のすべてのファイルを読み取ることができる必要があります(そして、ファイルの所有者にはそれを防ぐ方法がありません)。これを達成する方法はありますか? FreeBSDをZFSボリュームで実行しています。

9
Evianon

Sudoを使用します。

sudoersファイルに正確で特定のコマンドがリストされている場合、コマンドはsudoersにリストされているとおりに呼び出す必要があります。そうしないと、コマンドは拒否されます。

例えば。:

_backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/
_

この例では、ユーザーbackupは、表示されているとおりにコマンドを実行できます。

_Sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/
_

_Sudo rsync..._ではなく_Sudo /usr/bin/rsync_を呼び出すと、コマンドは失敗します。または、フラグまたはパスが異なる場合、コマンドは失敗します。

スクリプトでこれを行う場合は、これらのコマンドをパスワードなしで使用できるようにする必要があります。

_backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/
_

詳細については、_Cmnd_list_のsudoers(5)のマニュアルページを参照してください。

4
bahamat

警告:ステファンが以下のコメントで指摘したように、ファイルの所有者は引き続きACLを取り消すことができます。

マシンへのrootアクセス権がある場合、これを ACLs で実行できます。

setfacl -R -m u:USERNAME:r /path/to/direcory

これにより、USERNAME/path/to/directoryの下のすべてのファイルとディレクトリへの読み取りアクセス権が付与されます。

4
terdon

バックアップユーザーだけが実行できるsuidバージョンのcatを書くことができます(グループをバックアップユーザー専用にして、実行可能ファイルをそのグループだけが読み取り可能にします)。このcatでは、関心のあるディレクトリのファイルのみを読み取ることができます。(おそらく、シンボリックリンクを禁止し、/dir/../otherdir/のようなトリックに注意する必要があります。)

その後、スクリプトはこの実行可能ファイルを使用して、root権限なしでファイルを読み取ることができます。

4
cjm

BindfsFuse であり、さまざまな権限と所有権を持つディレクトリツリーのビューを提供します。 FreeBSD用のポートはありませんが、ソースからコンパイルできます。

すべてのファイルが読み取り可能な/some/filesのビューをユーザーbackupper(およびそのユーザーのみ)に提供するには、backupperのプライベートディレクトリに/some/filesの全世界で読み取り可能なビューをマウントします。

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files

ZFSにはこのためのメカニズムがいくつかあります。

メカニズムの1つはまだ開発中であり、まだ実装されていませんが、データセットを「所有者」オーバーライドでマウントできます。この場合、スナップショットのクローンを作成し、所有者を上書きしてバックアップユーザーにマウントし、バックアップしてから、クローンを破棄できます。欠点は、ファイルの実際の所有権をバックアップしないことです。

最善の解決策は、おそらくZFS nfsv4スタイルのACLです。

0
Allan Jude

FreeBSD固有のテクノロジを使用してこの問題を解決する方法については、2つのアイデアがありますが、まだ試していません。

  • トウガラシを使用します。これは私の好みの方法です。また、最近Linuxに移植されたため、そこでも動作するはずです。それはこのようになります:

    1. CAP_WRITEをドロップするdrop-cap-writeコマンドを作成し、コマンドラインで指定されたコマンドを実行します
    2. Sudoを使用して、バックアップユーザーがパスワードなしでそのコマンドを実行できるようにする
    3. 必要に応じて、sshd_configのForceCommandディレクティブを使用して、バックアップユーザーがログインするたびにそのコマンドを自動的に実行します。これにより、リモートユーザーはバックアップスクリプトでdrop-cap-writeを指定する必要がなくなります。
  • 必須のアクセス制御を使用します。これはLinux AFAIKでは機能せず、セットアップがより厄介です。それはこのようになります:

    1. Rootdirが/であるバックアップ刑務所を作成します。 jailidをハードコードします。
    2. バックアップ刑務所でsshdを実行します。通常のsshdでrootログインを許可しない場合でも、ここでrootがログインできるようにします
    3. /etc/rc.confにugidfw_enable = "YES"を設定します
    4. 次のようなugidfwルールを使用します。

    ugidfw add subject uid root jailid BACKUP_JAIL_ID mode rsx

0
Alan Somers