私たちは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 /whatever
setuidビットを維持しながらこれを達成するには、次の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を適用し、次にchgrp
aを適用してchmod
キャンセルされたsetuidビットを復元します。 2番目はchgrp
setuidビットを持たないすべてのファイルに適用されます。
chgrp
どんな状況でも呼び出すか、シンボリックリンクを使用したくありません。chmod
これはターゲットに影響を与えるので! -type l
。
答え2
でSUIDとSGIDビットをクリアchgrp
(または)するのは完璧です。chown
これはセキュリティの問題を防ぐためのセキュリティ対策です。実行可能ファイルのSGIDの場合有効なグループ所有者グループとしてこのプログラムを実行してください。。
グループ所有者を変更すると、セキュリティとアクセス制御の点で完全に異なります。つまり、uvw
プログラムは有効グループではなく有効グループとして実行されますxyz
。
したがって、所有権が変更された場合は、SUIDまたはSGIDビットを明示的に復元する必要があります。
付録:chgrp(またはchown)がSGID(またはSUID)のみをクリアする必要があるとの主張
chown
ing または ing を使用すると、chgrp
実行可能ファイルのセキュリティ設定を変更できます。これは、すべての特権エスカレーション属性を消去するのに十分です。 Unixの力は概念の単純さから来ていますが、Unixのセキュリティはすでにかなり厳しいです。このため、所有権の変更時にSUIDとSGIDを削除するのは安全ネットワークです。結局のところ、Unix / Linuxの歴史上、間違ったSUIDまたはSGID設定が原因で脆弱性がかなり多くありました。
したがって、Unixが今のように振る舞うより深い理由はありません。それは単なる保守的なデザインの決定です。
答え3
setuid
非ディレクトリビットのクリア(少なくともLinuxでは)は、カーネル自体ではなくシステムコールを完了するとカーネルによって実行されますsetgid
。したがって、唯一の方法は後で回復することです。chown()
chgrp
chgrp
また、セキュリティ機能も削除されます。
したがって、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