Jika Anda ingin mengimplementasikan chgrp -R nobody /whatever
Anda sambil mempertahankan bit setuid Anda dapat menggunakan kedua find
ini perintah
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
opsi mengambil file dengan set bit setuid. Perintah pertama kemudian menerapkan chgrp
lalu chmod
untuk mengembalikan bit setuid yang telah terlempar. Yang kedua berlaku chgrp
ke semua file yang tidak memiliki bit setuid.
Bagaimanapun, Anda tidak ingin memanggil chgrp
atau chmod
pada symlink karena itu akan mempengaruhi target mereka, karenanya ! -type l
.
Membersihkan bit SUID dan SGID pada chgrp
(atau chown
) sangat masuk akal. Ini adalah tindakan pengamanan untuk mencegah masalah keamanan. Untuk SGID (pada yang dapat dieksekusi, saya kira) berarti jalankan program ini dengan grup efektif dari pemilik grup .
Jika Anda mengubah pemilik grup, maka dalam hal keamanan dan kontrol akses ini adalah sesuatu yang sama sekali berbeda, yaitu alih-alih berjalan dengan uvw
grup yang efektif program sekarang berjalan dengan grup efektif xyz
.
Jadi Anda harus mengembalikan bit SUID atau SGID secara eksplisit pada perubahan kepemilikan.
Tambahan:Atas klaim bahwa chgrp (atau chown) hanya boleh menghapus SGID (atau SUID, resp.)
Oleh chown
ing atau chgrp
Jika Anda mengubah pengaturan keamanan untuk yang dapat dieksekusi, dan ini adalah alasan yang cukup untuk menghapus atribut peningkatan hak istimewa apa pun. Kekuatan Unix berasal dari kesederhanaan konseptual, dan keamanan Unix sudah cukup rumit. Untuk tujuan ini menghapus SUID dan SGID pada setiap perubahan kepemilikan hanyalah jaring pengaman - lagipula, dalam sejarah Unix/Linux ada beberapa kerentanan karena pengaturan SUID atau SGID yang salah arah.
Jadi tidak ada alasan yang lebih dalam mengapa Unix berperilaku seperti ini, ini hanyalah keputusan desain yang konservatif.
Pembersihan setuid
, setgid
bit (setidaknya di Linux) pada non-direktori dilakukan oleh kernel pada chown()
panggilan sistem dilakukan oleh chgrp
, bukan dengan chgrp
diri. Jadi satu-satunya cara adalah memulihkannya setelah itu.
Ini juga menghapus kemampuan keamanan.
Jadi, di 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
)
Dan jalankan (sebagai root
):
chown_preseve_sec :newgroup file1 file2...
untuk mengubah grup sambil mencoba mempertahankan izin.
Secara rekursif, Anda dapat melakukan:
# 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=-
(itu semua dengan asumsi tidak ada yang mengacaukan file pada saat yang sama).