2

こんにちは私はLinux環境で作業しており、パスを入力として受け取り、そのファイル/ディレクトリへの読み取りアクセス権を持つすべてのユーザーのリストを出力するコマンドを作成しようとしています。

たとえば、ファイル/ a / b / cがuserid、uとgroupid、gによって所有されており、いくつかのアクセス許可がある場合、このコマンドで/aと/a / bのアクセス許可を識別し、 cを読むことができます。特に、グループが参加するときに問題が発生します。

グループ外の読み取りアクセスの識別をケースに分けようとしています。

1)gはcの親のgid、gp、(または祖父母など)のgidと一致します。この場合、gpに許可がある場合(040以下)、gのすべてのメンバーがcを読み取ることができます。

2)gは、cの親のgidであるgpとは異なります。2つのサブケース:

... a)ユーザーID mはgのメンバーであり(g内のすべてのm(mはcを所有していません))、cの親pを所有しています。次に、pに許可がある場合、mはcを読み取ることができます:400以下。

... b)ユーザーID mはgのメンバーであり(cのgid内のすべてのm(mはcを所有していません))、cの親pを所有していません。次に、pに許可がある場合、mはcを読み取ることができます:004以下の制限。

3)uはpを所有します。この場合、pには400以下の制限が必要です。

ちなみに、私はこのシステムにルートアクセス権を持っています。/ etc/groupと/etc/ passwdに一連の猫を作成し、関連情報をgrepする必要があると思いますが、これは問題ありません。また、この環境では'statは無料であると見なすことができます(これは、すでにこの情報を持っているより大きなプロジェクトの一部です)。

私が探しているのは、既存のソリューション、擬似コード、または私が見逃しているアルゴリズムやその他の考慮事項をブレインストーミングするのを手伝ってくれる人だと思います。必要に応じて、明確な質問をしてください。ここでのこの疑似ロジックは、読みやすいものではないことを私は知っています。みんなありがとう。

4

2 に答える 2

2

私はあなたの最善の解決策は次のとおりだと思います:

1.)cの許可を決定します。

if(b does not have a minimum of world execute bit settings) i.e. 711
      return error; ( or owner && root)
      // you can easily extend this check to recursively work back to /
if (c has global read permissions) 
       return everyone;
else if (c has group read permissions)
       determine group name && return all members of said group
else (return owner && root)

2.)上記のグループのメンバーの決定は、getentを使用して行うことができます。たとえば、getentgroup-システム上のすべてのグループを返しますgetentpasswd-すべてのユーザーを返します3.)権限は「statc」などで決定できます。

于 2012-06-04T17:48:59.890 に答える
1

catingに欠陥があります。getent代わりに使用してください。ACLを確認することを忘れないでください。

于 2012-06-01T21:26:53.173 に答える