ユーザーがLinuxで他のユーザーにファイルを転送できるようにする方法


10

20コンピューティングノードから98,000コンピューティングノードまで、サイズが約40のクラスター上で数千人のユーザーがアプリケーションを実行している環境があります。これらのシステムのユーザーは、従来のUNIXアクセス許可によって制御される大容量ファイル(1PBを超える場合もあります)を生成します(ファイルシステムの特殊な性質のため、ACLは通常、利用できないか、実用的ではありません)。

現在、「give」と呼ばれるプログラムがあります。これは、グループの権限が不十分な場合に、ユーザーが別のユーザーにファイルを「与える」ことができるsuid-rootプログラムです。したがって、ユーザーは次のように入力してファイルを別のユーザーに提供します。

> give username-to-give-to filename-to-give ...

受信側のユーザーは、「take」(giveプログラムの一部)と呼ばれるコマンドを使用してファイルを受信できます。

> take filename-to-receive

次に、ファイルの権限が受信ユーザーに効果的に転送されます。

このプログラムは何年も前から存在しており、セキュリティと機能の観点から再検討したいと思います。

私たちの現在の行動計画は、「ギブ」の現在の実装のビット腐敗を取り除き、それを本番環境に再デプロイする前にオープンソースアプリとしてパッケージ化することです。

従来のUNIXアクセス許可しか利用できない場合に、ユーザー間で非常に大きなファイルを転送するために使用する別の方法はありますか?


1
すべてのユーザーがアクセスできる共有ディレクトリを作成できない理由はありますか?
Zoredache

1
共有アクセスが可能なディレクトリがある場合、権限のないユーザーは共有されているファイルにアクセスできます。この環境では、ファイル名も重要な場合があります。したがって、残念ながら、共有ディレクトリはオプションではありません。共有ディレクトリでは、3人目のユーザーがファイルを改ざんする可能性もあります。
ジョンブリングハースト

cronジョブがファイル自体をコピーするのに十分ではないでしょうか?例:ユーザーfooがユーザーpuppyにファイルbarを与えたいとします。そのため、受信したユーザー名を含む「制御」ファイルを使用して、cronジョブによってスキャンされる特殊なディレクトリを作成します。cronジョブはこの「制御」ファイルを読み取ります。ユーザーがOKである場合、コピー先のディレクトリに空き容量があります。「give」のラッパーを作成して、「control」ファイルを作成するだけで、過去の互換性を維持できます。suid-rootは不要です。非rootユーザーの下でそのファイルをコピーしてから、所有権を変更するためにsudoを実行できます。
ジリブ

パーミッションを変更したいだけchownなら、それを行うべきです。関係する両方の当事者が同意したら、ファイルもコピーしたいようです。
zebediah49 2012年

@JiriXichtkniha制御ファイルとcronジョブのアイデアが好きです。ただし、ファイルが大きすぎてコピーできません。
ジョンブリングハースト2012年

回答:


1

エミッターが本当にファイルを提供する用意がある場合は、SUIDバイナリを使用して、すべてのユーザーが書き込み可能でスティッキービット(など/tmp)を持つディレクトリにファイルを移動し、所有権を新しい所有者に変更します。chown(3)すでに削除の世話をset-user-IDし、set-group-IDあなたのためのビットを。このようにして、新しい所有者は、ファイルの移動を含め、ファイルに対して必要なことを実行できます。

すべてのユーザーが書き込み可能なこのディレクトリは、ホームディレクトリに複数のファイルシステムを使用し、ファイルシステムの境界を越えないようにして、パフォーマンスがすぐに低下する場合に備えて、ユーザーのホームディレクトリに属する​​ことができます。この場合、おそらく新しいファイルが提供されたときに受信者に確実に知らせる必要があります。

電子メールでうまくいくでしょう。よりUnixyなソリューションは/etc/profile、新しく配信されたファイルをリストするです。あなたはこの機能を提供する場合のボーナスを追加しましたpam_echo例えばfile=/tmp/deliveries/%u、参照pam_echo(8))。すべてのPAM関連と同様に、すべての実装がそのようなモジュールを最初に提供していることを確認する必要があります。


0

共有ディレクトリを備えたシステムを使用することもできます(実行パーマなしの可能性があります)。ここでは、特定のユーザーの情報が特定のファイル名構造(to-$username_from-$username.tarなど)でアーカイブされます。Giveはファイルとchownsそれをターゲットユーザーに作成します。takeはファイルを抽出して削除します。

実際に移動する場合(つまり、ファイルの場所とアクセス許可を変更します。ファイルサイズが大きいため、コピーしないでください)、-x permsを使用して共有ディレクトリに移動しても問題ない場合があります(そのため、誰もできません)そこにファイルをリストします)、そして同じchown方法。 mvchown/ mv


0

xryl669が言うように、ディレクトリを使用して実際にファイルを共有できます。次のようになります。

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

giveコマンドは

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

takeコマンドは次のようになります。

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~

0

アプリを書き直して、「与える」と「取る」を真似るのではなく、保護されたディレクトリから「プッシュ」と「プル」することをお勧めします。ディレクトリには、ファイルの移動を処理するプッシュ/プルアプリのみがアクセスできます。または、アプリ/スクリプトは、送信者と受信者のみに権限が設定されたランダムな一時ディレクトリを作成できます。

セキュリティを強化したいですか?PGPでファイルを暗号化/署名できます(受信者の公開鍵を使用)。

「セキュリティと機能の観点」からのやり直しという点では、SUIDプログラムを作成しないことを強くお勧めします。適切な方法で特権を削除しないと、システム上の任意のファイルに仮想的にアクセスできます。プログラムにバグがある場合(バッファオーバーフローなど)-これを悪用して、システムのルートアクセスを取得できます。


0

これはおそらく役に立たないでしょうが、参考までにcp --reflinkソースターゲットは、コピーオンライトを使用してファイルのシンコピーを実行します。

つまり、ファイルを完全にコピーでき、変更されたブロックのみが実際にコピーされます。ハードリンクとは異なり、新しいファイルには独自のiノードとメタデータがあり、標準のchownを使用してファイルのコピーを新しいユーザーに提供できます。

私の知る限り、これは現在OCFS2とbtrfsでのみ利用可能な機能です。私はそれであなたの問題は解決すると思いますが、それが利用可能ではないので、それはおそらく役に立たないでしょう。

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