ユーザーが読み取れないファイルを見つけますか?


12

特定のユーザーが読み取ることができないファイルを見つけたいのですが。

ユーザー名が「user123」であり、「user123」というグループに属しているとします。user123が所有している場合にu + rがオンになっているファイルを見つけたい。ファイルがグループuser123の場合、g + rがオンになっている必要があります。o + rをオンにすることができないことに失敗しました。

GNU findには「読み取り可能」なので、これを行うことができます。

sudo -u user123 find /start ! -readable -ls

ただし、このプロセスは、sudoアクセス権のないユーザーが実行する必要があります。したがって、IIはこれを試しました(o + rはチェックしませんが、現時点ではそれは重要ではありません)。

find /start \( -user user123 ! -perm -u=r  \) -o \( -group user123 ! -perm -g=r  \) -ls

しかし、それはこのファイルをリストします:

272118    4 -rw-------   1 user123   user123       3243 Jul  3 19:50 /start/blah/blah/file.txt

このファイルは、/startuser123が所有する、g=roff の唯一のファイルです。findが-u=rasを解釈しているかのよう-g=rです。

ロジックを逆にして、代わりにテストすることnot ( truth )にしました。

find /etc/puppet ! \( \( -user puppet -perm -u=r  \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \)  -ls

うまくいきました!

なぜオリジナルはfind失敗したのですか?それはfind(ありそうもない)のバグですか、それとも論理が間違っていますか?

更新:ロジックが間違っていました。以下に指摘されているように、!(A || B || C)==(!A &&!B &&!C)これらは2つの同等のステートメントです。

find /start ! \( \( -user user123 -perm -u=r \) -o \( -group user123 -perm -g=r \) -o \( ! \( -user user123 -o -group user123 \) -perm -o=r \) \) -ls
find /start ! \( -user user123 -perm -u=r \) ! \( -group user123 -perm -g=r \) ! \( ! \( -user user123 -o -group user123 \) -perm -o=r \) -ls

私の目標は、ユーザー/グループを2回テストする必要がないことでした。私が本当に必要としているのは、より複雑なif-then-else構造です。これは、おそらく-xor演算子がある場合にのみ可能です。私はxorを使ってxorを構築できますが、上記の2つのソリューションよりも複雑になります。


1
puppetファイルにアクセスできると言うので、2番目のロジックも間違っています--wxrwxrwx puppet puppet
ステファンChazelas

回答:


7

論理が間違っています。このファイルは所有されuser123ており、ユーザーのrビットが設定されているため、リストされるべきではないと考えています。ただし、2番目の基準(グループが所有しuser123、グループのrビットが設定されていない)に一致するため、リストに表示されます。

2番目のバージョンは、モルガンの法則の 1つにより機能します。ステートメントのグループの論理ORを否定することは、個々のステートメントの否定をANDすることと論理的に同等です。言い換えると:

 ! ( A || B || C ) == ( !A && !B && !C )

したがって、作業findはファイルを探しています

  • ない(ユーザーが所有し、そのユーザーがuser123読み取り可能)AND
  • ない(グループが所有し、グループuser123によって読み取り可能)AND
  • 誰もが読めない。

最初findのファイルは

  • ユーザーが所有し、そのユーザーuser123が読み取ることはできませんOR
  • グループが所有していて、そのグループuser123が読み取れない、または(完了している場合)
  • 誰もが読めない

したがって、上記の3つの基準のすべて(必ずしもすべてではない)に一致するファイルが表示されます。

編集

ちなみに(あなたのプロフィールを見た後)、私はあなたのO'Reillyの本の大ファンです:)


分析ありがとうございます。はい、それはモーガンの法則の誤用でした。しようとしてい( !A && !B && !C )たのですが!、各パーツの内部に移動しましたが、これは無効です。ありがとう!
TomOnTime 2013

PS私はあなたが私の本のファンであることがうれしいです!私はあなたがそれを読んでいる言語興味があります。
TomOnTime

@TomOnTime英語はもちろんです。私はそれを助けることができれば、元の言語で本を読むようにしています。
ジョセフR.

8

ユーザーが特定のパスを介してファイルにアクセスできるかどうかを確認するために考慮すべきことは、はるかに多くあります。

  • ファイルの所有者
  • ファイルのグループ
  • ファイル内のACL
  • ユーザーのuid、gid、および補足的なgid
  • そのファイルにつながるパスコンポーネントへの検索アクセス。
  • ファイルがシンボリックリンクかどうか
  • アクセス許可は、ID 0のユーザーに異なる方法で適用されます。
  • SELinuxのようなより多くのセキュリティ機能...

実際にすべてのuidとgidをユーザーのuidとgidに切り替えて確認するまでは、システムと同じロジックを実装することは非常に困難です。

zshを使用すると、(rootとして)次のことができます。

readable() (
  USERNAME=$u
  [ -r "$REPLY" ]
)
u=some-user
print -rl -- **/*(DoN^+readable)

またはperl

find . -print0 | sudo -u some-user perl -Mfiletest=access -l -0ne '
  print unless -r'

つまり、どちらの場合も、ディレクトリツリーを降りrootて、対応するユーザーとしてファイルアクセスをテストします。

ランニングfind -readableなどsome-userのケースではないであろうと、ユーザーがアクセスできない、あるいは全く読み取り権限(ただし、おそらくアクセス)を持たないため、ディレクトリを過ぎて行くことはできませんよう。

(ACLやパスコンポーネントではなく)ファイル自体の権限と所有権のみを検討する場合でも、少なくとも(ここではGNU構文)が必要です。

u=some-user; g=$(id -G "$u" | sed 's/ / -o -group /g'); IFS=" "
find . ! \( -user "$u" -perm -u=r -o \
          ! -user "$u" \( -group $g \) -perm -g=r -o \
          ! -user "$u" ! \( -group $g \) -perm -o=r \)

ファイルがユーザーによって所有されている場合、他のすべてのアクセス許可は無関係であるという考えです。そうでない場合、ファイルがユーザーのグループのいずれかによってグループ所有されている場合、「その他」の権限は関係ありません。


1
ACLとその他の要素についての良い点。100%正しい評価はaccess()、と同じカーネルコードを使用しているためopen()です。したがって、がオプションであるsudo -u user123 find /start -readable場合に最適なソリューションですsudo
TomOnTime 2013

1
@TomOnTime。いいえ、使用している場合sudo -u user123 find -readable、入力できないディレクトリや読み取りできないディレクトリにあるファイルは報告されません(そのため、偽陰性と偽陽性が存在します)。そのzshため、ディレクトリツリーを降順でルートとして使用し、実際のユーザーとしてaccess()[ -r ... ])を実行することをお勧めします(設定すると$USERNAMEzshすべてのuidとgidが変更されますsudo)。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.