GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana mencegah chgrp menghapus "setuid bit"?

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).


Linux
  1. Pengantar perintah Linux chgrp dan newgrp

  2. Cara Menambah atau Menghapus Pengguna dari Grup di Linux

  3. Journalctl:Bagaimana Mencegah Teks Terpotong Di Terminal?

  1. 5 Contoh Praktis perintah chgrp di Linux

  2. Cegah 10.2 membuat direktori Wolfram Mathematica di Linux

  3. HDD Power-Up in Standby:mencegah agar tidak berputar

  1. Cegah Tmux Memulai Di Ssh?

  2. Bagaimana Mencegah `ls` Dari Menyortir Output?

  3. Bagaimana mencegah proses dari menulis file