Mengapa setuid diabaikan pada direktori?

19

Pada sistem Linux, Anda dapat berhasil chmod u+s $some_directory, tetapi alih-alih memaksakan kepemilikan subdirektori dan file baru untuk menjadi pemilik direktori yang berisi (dan mengatur subdirektori u+sjuga) seperti yang Anda harapkan, sistem hanya mengabaikan bit setuid. Subdirektori dan file terus mewarisi UID dari proses pembuatannya, dan subdirektori tidak diatur secara default.

Mengapa setuid diabaikan pada direktori, dan bagaimana saya bisa membuat sistem mengenalinya?

Blacklight Shining
sumber
Saya bertanya-tanya apakah opsi mount "nosuid" dapat memengaruhi ini.
Heptite
Sistem file yang dimaksud tidak di-mount dengan nosuid— walaupun ada satu lagi (ramdisk, /dev/shm) yang saya / mount nosuid, dan tampaknya memperlakukan setuidbit dengan cara yang persis sama. 6_9
Blacklight Shining
2
Mengenai penerapannya, kode sumber Linux sudah tersedia, jangan ragu untuk mengimplementasikan fitur ini. Karena sudah ada di FreeBSD, Anda dapat dengan mudah menyalin kode saya yakin. Tentu saja, bit-bit itu masih tidak memiliki arti pada sistem Linux orang lain.
mikebabcock

Jawaban:

16

Ingatlah bahwa bit setuid dan setgid diciptakan untuk tujuan yang sama sekali berbeda: menyebabkan executable dijalankan dengan uid atau gid pemiliknya, daripada uid atau gid dari pengguna yang menjalankan file. Penggunaan lainnya hanyalah fitur tambahan.

Bit-bit ini tidak memiliki fungsi pada file biasa yang tidak dapat dieksekusi. (Dan juga shell script pada beberapa distro, karena masalah keamanan.) Awalnya, mereka juga tidak memiliki fungsi untuk direktori. Jelas seseorang memutuskan akan keren untuk mengambil setgid yang tidak digunakan pada direktori dan menggunakannya untuk menegakkan konsistensi kepemilikan grup. Lagi pula, jika Anda bermain dengan kepemilikan grup, itu karena lebih dari satu orang bekerja dengan file tersebut, dan mungkin masuk akal untuk semua file dalam direktori yang diberikan milik grup yang sama, tidak peduli siapa yang membuatnya. Kesulitan karena seseorang yang lupa menjalankan newgrp dihilangkan.

Jadi, mengapa tidak menerapkan fitur yang sama untuk setuid dan file uid? Nah, uid jauh lebih mendasar daripada gid. Jika Anda menerapkan ini, seringkali file tidak akan menjadi milik pengguna yang membuatnya! Agaknya pengguna masih dapat memodifikasi file (dengan asumsi umask adalah sesuatu yang waras), tetapi mereka tidak dapat mengubah bit izin. Sulit melihat kegunaannya.

Isaac Rabinovitch
sumber
Saya ingin ini diterapkan, jika hanya demi konsistensi ... X3 Dalam hal apapun, kurang dari solusi seperti cronjob untuk secara berkala melalui dan mengubah kepemilikan, / apakah ada cara untuk memaksa kepemilikan file?
Blacklight Shining
4
Saya tergoda untuk mengutip Emerson di Foolish Consistency. Sebelum Anda dapat meyakinkan saya bahwa ini adalah fitur yang diinginkan, Anda harus menunjukkan kepada saya kasus penggunaan yang masuk akal.
Isaac Rabinovitch
1
FreeBSD chmod (2) sebenarnya memiliki beberapa diskusi tentang ini, tetapi hanya menyebutkan bahwa itu seharusnya tidak digunakan secara umum karena "lubang keamanan" yang tidak ditentukan. Saya menduga sebagian lainnya Unix tidak mengadopsi fitur ini karena sementara itu memang memiliki beberapa kasus penggunaan, itu bukan yang terlalu berguna.
jjlin
1
"Sulit untuk melihat utilitas dari itu" -> ditetapkan pada direktori home, jadi skrip provisi berjalan sebagai root tidak bisa lupa untuk menemukan sesuatu secara tidak sengaja?
ufotds
1
menjalankan skrip superuser di direktori home Anda adalah ide yang sangat buruk
Isaac Rabinovitch
7

Saya percaya bahwa jawaban untuk pertanyaan ini dikenakan pada masalah keamanan "file giveaway" yang telah mengakibatkan sebagian besar OS seperti Unix modern tidak mengizinkan "file giveaway". "File giveaway" adalah ketika pengguna non-superuser mengubah kepemilikan file kepada orang lain selain pengguna itu. Kemampuan ini memberikan banyak peluang untuk kerusakan.

Karena hadiah file tidak diizinkan, setuid pada direktori, yang akan melakukan fungsi yang sama dalam bentuk lain, tidak diizinkan, atau diabaikan jika diatur.

Untuk mengubah perilaku, Anda harus memodifikasi pustaka dan utilitas OS.

Yedric
sumber
2

Satu kasus penggunaan yang sangat baik untuk mengimplementasikannya adalah ini:

Katakanlah Anda memiliki server multi-situs dengan 3 situs aman. Anda memiliki 3 grup yang dibuat, satu untuk masing-masing pengelola situs yang berbeda. Semua file di semua situs harus dimiliki oleh pengguna apache agar apache dapat membaca dan menulis kepada mereka (drupal / wordpress, dll).

Jika setuid tetapi berfungsi seperti bit setgid untuk izin direktori akan terlihat seperti ini:

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

Dengan cara ini setiap kelompok pengelola memiliki akses untuk melihat dan menyentuh hanya konten mereka tetapi apache pengguna server web dapat menyajikan semua konten dan tidak perlu bagi pengguna untuk khawatir tentang mengubah kepemilikan file yang diunggah.

Kasus penggunaan lain adalah untuk unggahan ftp / http Anonim atau bahkan sftp / ssh. Grup dan GID pada direktori unggahan akan menjadi root dan begitu pula pemilik dan UID. Izin lainnya adalah -wx. Ini akan memungkinkan setiap orang MENULIS akses ke direktori unggahan tetapi mereka tidak dapat membaca apa pun setelah diunggah dan root akan memiliki semua file yang baru dibuat.

Jadi ada dua kasus penggunaan yang sangat baik dan valid untuk mengaktifkan fungsi UID pada direktori agar sesuai dengan bit GID.

Steven Mercurio

pengguna297422
sumber
1
Ini sepertinya tidak menjawab pertanyaan yang diajukan.
Kevin Panko
2
@KevinPanko Tidak, itu tidak menjawab pertanyaan saya. Bahkan mungkin di luar topik untuk situs ("untuk apa use case <nonexistent feature X>?"). Namun, itu berkaitan dengan pertanyaan saya, dan saya, sebagai penanya, merasa berguna.
Blacklight Shining
0

Agak terlambat ke pesta, tetapi jika pembaca di masa depan menemukan ini;) Seperti yang dinyatakan oleh orang lain, pada sistem file OS-X standar setUID untuk direktori diabaikan - dan sepertinya tidak ada cara yang mudah untuk mengatasi hal ini ( mount -o.... atau apa tidak). Seperti yang sering terjadi, halaman manual sebenarnya tidak mematuhi perilaku OS-X yang secara harfiah dinyatakan:

4000 (bit set-user-ID-on-eksekusi) [...] Direktori dengan set bit set-user-id akan memaksa semua file dan sub-direktori yang dibuat di dalamnya untuk dimiliki oleh pemilik direktori dan bukan oleh uid dari proses pembuatan [...]

tetapi juga mencantumkan kemungkinan untuk mencapai efek yang sama tanpa melepaskan kepemilikan aslinya. Linux menggunakan '[g /] setfacls' untuk efek yang sama (mereka izin tidak benar-benar terlihat pada pandangan pertama, sehingga kadang-kadang bisa menjadi gangguan).

Mengenai 'bagaimana saya bisa mencapai efek serupa', baca seluruh halaman manual dan bermain-main dengan:

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

Anda dapat memeriksa melalui

ls -le

jika semuanya terlihat baik-baik saja. Opsi lebih lanjut termasuk memasukkan aturan di posisi tertentu, menghapus atau mengganti aturan tertentu. Dua opsi penting di sini adalah " file_inheritdan directory_inherit" memungkinkan aturan untuk dilampirkan ke direktori / file baru.

Saya tidak terlalu suka menggunakan setUID, tetapi setGID sangat berguna pada server file di mana pengaturan grup 'utama' tidak berfungsi atau klien memiliki file yang tidak diizinkan menulis grup. Itu akan diselesaikan dengan:

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup
Keith
sumber
Selamat Datang di Stack Exchange! Ini adalah jawaban yang baik, meskipun karena berkaitan dengan OS X daripada distro Linux (yang, seperti yang Anda sebutkan, menggunakan sistem ACL yang berbeda), sepertinya tidak relevan di sini. Itu pasti akan sangat cocok pada pertanyaan tentang bagaimana membuat OS X direktori kehormatan setuid; mungkin Anda harus mempostingnya ?
Blacklight Shining
Ngomong-ngomong, bit yang Anda tinggalkan dari halaman manual OS X chownsebenarnya cukup penting! “[…] Jika sistem file yang mendasarinya mendukung fitur ini: lihat chmod (2) dan opsi suiddir untuk me-mount (8).” Sebenarnya saya belum pernah memperhatikannya sebelumnya. Jika HFS mengimplementasikan suiddir, Anda sebenarnya dapat mewujudkannya pada sistem OS X yang umum.
Blacklight Shining
(Dan OS X ACL sama "tidak benar-benar terlihat pada pandangan pertama" seperti Linux ACL.)
Blacklight Shining
0

Yah, itu harus menghormati standar. Saya dapat berpikir pada beberapa skenario dengan sftp-hanya bahwa itu akan menyelamatkan saya banyak masalah, baik dengan acl dan acl-mask-set yang sshd lakukan, dan reset yang harus saya lakukan untuk topeng itu.

Keamanan secara default cukup berguna, tetapi jika Anda tidak menjadikannya pilihan, Anda hanya membuat winghtmare.

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

Either way, itu seperti Linux berjalan sekarang, jadi gunakan saja ACL untuk mengatasi itu.

pengguna576407
sumber
-1

Menurut http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories bit setuid diabaikan untuk direktori pada sistem UNIX dan Linux. Namun dimungkinkan untuk bertindak seperti yang Anda harapkan di FreeBSD.

mikebabcock
sumber
Tidak membantu — saya bertanya mengapa setuiddiabaikan untuk direktori dan apakah mungkin membuatnya dikenali di Linux.
Blacklight Shining
Tampaknya jelas bahwa itu diabaikan di Linux karena diabaikan pada Unix, yang membuatnya menjadi perilaku yang benar untuk Linux agar cocok dengan * nix yang sebenarnya. Jangan ragu untuk membaca artikel yang dimaksud. Jawaban yang sama di greenend.org.uk/rjk/tech/perms.html dari 2004, juga merupakan duplikat dari serverfault.com/questions/371541/…
mikebabcock
Jadi mengapa itu diabaikan di Unix?
Isaac Rabinovitch
@IsaacRabinovitch sejak Blacklight memperjelas pertanyaannya adalah tentang Linux, itu tidak relevan [lidah di pipi] tapi saya curiga perilaku yang tidak terdefinisi di mana banyak Unix melakukan hal yang berbeda dengannya dan tidak melakukan apa pun adalah asumsi yang lebih aman.
mikebabcock
Pertanyaan saya / tagged linux, ya, tetapi itu tidak berarti saya akan lebih memilih yang samar-samar "Ini dilakukan dengan cara ini karena sistem lain melakukannya dengan cara ini" menjawab sebuah jawaban yang menjelaskan mengapa hal itu dilakukan pada sistem lain. (Mungkin linuxtag harus dihapus begitu saja?)
Blacklight Shining