chgrpが「setuidビット」をクリアするのを防ぐ方法は?

chgrpが「setuidビット」をクリアするのを防ぐ方法は?

私たちはRHベースのLinuxイメージを持っています。これを当社の製品の最新の開発バージョンにアップグレードするには、一部の「特殊アーカイブ」を「適用」する必要があります。

アーカイブを作成した人は、基本イメージの一部の権限が間違っていると考えて実行するように指示されました。

sudo chgrp -R nobody /whatever

後でアプリケーションを実行すると、いくつかの理解できない問題が発生しました。

後で知った:電話chgrp〜する明らか/whateverのバイナリファイルのSetuidビット情報。

実際の問題は次のとおりです。いくつかのバイナリ〜しなければならない正しい動作のために setuid ビットをセットしてください。

簡単に言うと、「chgrp」コマンドを実行する方法はありますか?いいえ私のsetuidビットを殺してみましょうか?

私はローカルUbuntuで次のコマンドを実行して同じ結果を得ました。

mkdir sticky
cd sticky/
touch blub
chmod 4755 blub 
ls -al blub 

-->赤い背景を持つファイル名を表示 - >はい、setuidです。

chgrp -R myuser .
ls -al blub 

-->赤い背景なしでファイル名を表示する --> setuidが消える

答え1

chgrp -R nobody /whateversetuidビットを維持しながらこれを達成するには、次の2つのfindコマンドを使用できます。

find /whatever ! -type l -perm -04000 -exec chgrp nobody {} + \
                                      -exec chmod u+s {} +
find /whatever ! -type l ! -perm -04000 -exec chgrp nobody {} +

このfind ... -perm 04000オプションは setuid ビットがセットされたファイルを選択します。次に、最初のコマンドはaを適用し、次にchgrpaを適用してchmodキャンセルされたsetuidビットを復元します。 2番目はchgrpsetuidビットを持たないすべてのファイルに適用されます。

chgrpどんな状況でも呼び出すか、シンボリックリンクを使用したくありません。chmodこれはターゲットに影響を与えるので! -type l

答え2

でSUIDとSGIDビットをクリアchgrp(または)するのは完璧です。chownこれはセキュリティの問題を防ぐためのセキュリティ対策です。実行可能ファイルのSGIDの場合有効なグループ所有者グループとしてこのプログラムを実行してください。

グループ所有者を変更すると、セキュリティとアクセス制御の点で完全に異なります。つまり、uvwプログラムは有効グループではなく有効グループとして実行されますxyz

したがって、所有権が変更された場合は、SUIDまたはSGIDビットを明示的に復元する必要があります。

付録:chgrp(またはchown)がSGID(またはSUID)のみをクリアする必要があるとの主張

chowning または ing を使用すると、chgrp実行可能ファイルのセキュリティ設定を変更できます。これは、すべての特権エスカレーション属性を消去するのに十分です。 Unixの力は概念の単純さから来ていますが、Unixのセキュリティはすでにかなり厳しいです。このため、所有権の変更時にSUIDとSGIDを削除するのは安全ネットワークです。結局のところ、Unix / Linuxの歴史上、間違ったSUIDまたはSGID設定が原因で脆弱性がかなり多くありました。

したがって、Unixが今のように振る舞うより深い理由はありません。それは単なる保守的なデザインの決定です。

答え3

setuid非ディレクトリビットのクリア(少なくともLinuxでは)は、カーネル自体ではなくシステムコールを完了するとカーネルによって実行されますsetgid。したがって、唯一の方法は後で回復することです。chown()chgrpchgrp

また、セキュリティ機能も削除されます。

したがって、GNU Linuxでは:

chown_preserve_sec() (
  newowner=${1?}; shift
  for file do
    perms=$(stat -Lc %a -- "$file") || continue
    cap=$(getfattr -m '^security\.capability$' --dump -- "$file") || continue
    chown -- "$newowner" "$file" || continue
    [ -z "$cap" ] || printf '%s\n' "$cap" | setfattr --restore=-
    chmod -- "$perms" "$file"
  done
)

そして、以下を実行します(例root:):

chown_preseve_sec :newgroup file1 file2...

権限を維持しながらグループを変更してください。

再帰的には、次のことができます。

# save permissions (and ACLs). Remove the "# owner" and "# group" lines
# to prevent them being restored!
perms=$(getfacl -RPn . | grep -vE '^# (owner|group): ')
# save capabilities
cap=$(getfattr -Rhm '^security\.capability$' --dump .)

chgrp -RP nobody .

# restore permissions, ACLs and capabilities
printf '%s\n' "$perms" | setfacl --restore=-
[ -z  "$cap" ] || printf '%s\n' "$cap" | setfattr -h --restore=-

(これは同時にファイルを壊す他に何もないと仮定します)。

答え4

いつものように、管理において行ける方法はたくさんあります。

私が思いついた解決策はこんな感じです。

cd /home/me
getfacl -R /whatever > whatever-permissions.org 2> /dev/null

# A) change lines starting with      # group: root
# to                                 # group: whatineed
sed 's/^# group: root/# group: whatineed/g' whatever-permissions.org > whatever-permissions.new

# B) change lines with               group::x.y
# to                                 group::xwy
# (where x, y mean: whatever was there before)
sed 's/^group::\(.\).\(.\)/group::\1w\2/g' whatever-permissions.new > whatever-permissions.new

cd /
setfacl --restore /home/me/whatever-permissions.new

関連情報