Linux でのファイルのアクセス許可

こんにちは、みんな。 私たちは積極的に作業に取り組んでおり、すでに XNUMX 月に多くの強力なリリースを準備しています。 とりわけ、みんなが大好きなコースの新しいストリームへの登録が発表されました。 「Linux管理者」。 発売に備えて、私たちは伝統的に役立つ資料の翻訳を共有しています。

Linux でのファイルのアクセス許可

ファイル権限は、SUID 実行可能ファイルに代わる安全な代替手段を提供しますが、最初は少し混乱するように思えるかもしれません。


私たちは皆、バイナリを知っています SUID アール セキュリティの観点からは間違った決定。 幸いなことに、アプリケーションがいくつかの限られた権限を必要とする場合は、次のようなより効率的な方法があります。 ファイル権限.

上記の記事を詳しく読むのを避けたい場合は、時間を節約しましょう。 基本的に、ファイル権限により、root として実行されるプロセスが許可されるため、特定の機能を保持するための操作が許可されます。 このリスト権限が削除され、権限のないユーザーによって実行された場合。 これは、攻撃者がバッファ オーバーフローやその他のエクスプロイトを使用してプロセスを侵害した場合、プロセスが実際に必要とする特定の最小限の権限以外は利用できないことを意味します。

権限は、通常常に root として実行されるサービスには最適ですが、コマンド ライン ユーティリティについてはどうでしょうか? 幸いなことに、適切なユーティリティがインストールされていれば、これもサポートされます。 Ubuntu を使用している場合は、たとえば次のパッケージが必要になります。 libcap2-bin。 また、非旧式カーネル (バージョンから) を実行する必要もあります。 2.6.24).

これらの関数を使用すると、SUID ビットの設定と同様に、アクセス許可を実行可能ファイルに関連付けることができますが、アクセス許可の特定のセットに対してのみです。 ユーティリティ setcap ファイルにアクセス許可を追加したり、ファイルからアクセス許可を削除したりするために使用されます。

最初のステップは、必要な権限を選択することです。 この記事では、次のようなネットワーク診断ツールがあると仮定します。 tracewalk、使用できるはずです 生のソケット。 これには通常、アプリケーションを root として実行する必要がありますが、 リスト 許可だけが必要であることがわかりました CAP_NET_RAW.

バイナリが置かれているディレクトリにいると仮定します。 tracewalk、次のようにこの権限を追加できます。

sudo setcap cap_net_raw=eip tracewalk

今のところサフィックスを無視してください =eip 解決策については、数秒以内に説明します。 権限名は小文字であることに注意してください。 次のコマンドを使用して、権限が正しく構成されているかどうかを確認できます。

setcap -v cap_new_raw=eip tracewalk

または、特定の実行可能ファイルに設定されているすべての権限をリストすることもできます。

getcap tracewalk

参考までに、次のコマンドを使用して、実行可能ファイルからすべての権限を削除することもできます。

setcap -r tracewalk

この時点で、実行可能ファイルを特権のないユーザーとして実行できるはずです。また、生のソケットを操作できるはずですが、root ユーザーが持つ他の特権は何も持っていません。

では、この奇妙な接尾辞は何を意味するのでしょうか? =eip? これには、アクセス許可の性質をある程度理解する必要があります。 各プロセスにはXNUMXセットの権限があります- 効果的で、継承可能で、許可されている:

  • 効果的 アクセス許可は、プロセスが実際に何ができるかを定義するものです。 たとえば、次の場合は生のソケットを処理できません。 CAP_NET_RAW は有効なセットに含まれていません。
  • 利用可能 アクセス許可は、プロセスが適切な呼び出しを使用して要求した場合に、プロセスが持つことが許可されるアクセス許可です。 これらは、許可を要求するために特別に記述されていない限り、プロセスが実際に何も実行することを防ぎます。 これにより、実際に必要な期間のみ、重要なアクセス許可を有効なセットに追加するプロセスを作成できます。
  • 継承可能 権限は、生成された子プロセスのアクセス可能なセットで継承できる権限です。 手術中 fork() または clone() その時点ではまだ同じ実行可能ファイルを実行しているため、子プロセスには常に親プロセスのアクセス許可のコピーが与えられます。 継承可能なセットは次の場合に使用されます。 exec() (または同等の) が呼び出され、実行可能ファイルを別のファイルに置き換えます。 この時点で、プロセスの利用可能なセットは継承可能なセットによってマスクされ、新しいプロセスに使用されるアクセス可能なセットを取得します。

したがって、ユーティリティ setcap を使用すると、特定の実行可能ファイルに対してこれら XNUMX つのセットのアクセス許可を個別に追加できます。 グループの意味は、ファイルのアクセス許可では若干異なるように解釈されることに注意してください。

  • 利用可能 ファイル権限は、実行可能ファイルを呼び出した親プロセスがその権限を持っていなかった場合でも、実行可能ファイルに対して常に使用できる権限です。 かつては「強制」許可と呼ばれていました。
  • 遺伝性の ファイルのアクセス許可は、呼び出しプロセスのセットからアクセス許可を削除するためにも使用できる追加のマスクを定義します。 これらは呼び出しプロセスの継承されたセットに加えて適用されるため、アクセス許可は両方のセットに存在する場合にのみ継承されます。
  • 効果的 ファイル権限は実際にはセットではなく単一ビットであり、設定されている場合、使用可能なセット全体も新しいプロセスの有効なセットにコピーされることを意味します。 これを使用して、アクセス許可を要求するために特に作成されていないプロセスにアクセス許可を追加できます。 XNUMX ビットなので、任意の権限に設定した場合は、すべての権限に設定する必要があります。 これは、アクセス許可をサポートしていないアプリケーションによるアクセス許可の使用を許可するために使用されるため、レガシー ビットと考えることができます。

経由で権限を指定する場合 setcap 三文字 e, i и p を参照してください。 効果的、継承可能、アクセス可能 をそれぞれセットします。 したがって、以前の仕様は次のようになります。

sudo setcap cap_net_raw=eip tracewalk

...解像度が CAP_NET_RAW 利用可能な継承可能なセットに追加する必要があり、有効ビットも設定する必要があります。 これにより、ファイルに対して以前に設定されたアクセス許可がオーバーライドされます。 複数の権限を一度に設定するには、カンマ区切りのリストを使用します。

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

権限ガイド このすべてについて詳しく説明していますが、この投稿で何が起こっているのかが少しでも解明できれば幸いです。 注意すべき点とコツがいくつか残っています。

まず、ファイル機能はシンボリックリンクでは機能しません。バイナリ ファイル自体 (つまり、シンボリックリンクのターゲット) にファイル機能を適用する必要があります。

第二に、解釈されたスクリプトでは機能しません。 たとえば、権限を割り当てたい Python スクリプトがある場合、それを Python インタープリター自体に割り当てる必要があります。 これは、そのインタプリタで実行されるすべてのスクリプトに指定されたアクセス許可が与えられるため、潜在的なセキュリティ問題であることは明らかですが、それでも SUID にするよりははるかに優れています。 最も一般的な回避策は、必要な操作を実行できる別の実行可能ファイルを C または同等のもので作成し、スクリプトから呼び出すことのようです。 これは、バイナリを使用する Wireshark で使用されるアプローチに似ています。 /usr/bin/dumpcap 特権操作を実行するには:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

第三に、環境変数を使用するとファイルのアクセス許可が無効になります。 LD_LIBRARY_PATH 明らかなセキュリティ上の理由から(1)。 同じことが当てはまります LD_PRELOAD、 私の知る限りでは。

1. 攻撃者は明らかに標準ライブラリの XNUMX つを置き換えて使用できるため、 LD_LIBRARY_PATHシステムのライブラリよりも優先してそのライブラリが呼び出されるように強制し、その結果、呼び出し側アプリケーションと同じ権限で独自の任意のコードが実行されるようにします。

それだけです。 コースプログラムの詳細については、次のサイトをご覧ください。 24 月 XNUMX 日に開催されるウェビナー。

出所: habr.com

コメントを追加します