Aman menggunakan find dengan sudo

10

Di server Linux, saya perlu menghapus hak akses root dari sekelompok pengguna. Tetapi para pengguna memiliki alasan yang sah untuk dapat menggunakan utilitas "find" untuk mencari file berdasarkan nama file, tanggal modifikasi, dan metadata lainnya.

Di server, nama file tidak sensitif, tetapi konten file mungkin.

Saya ingin menggunakan sudo untuk memungkinkan pengguna mencari file di mana saja di server. Utilitas "find" sangat bagus, tetapi memungkinkan untuk semua jenis efek samping, seperti menggunakan "-exec" untuk menelurkan perintah sewenang-wenang.

Bisakah saya mulai findbekerja dengan batasan saya?

Troels Arvin
sumber
14
Biasanya Anda tidak ingin hasil pencarian untuk pola nama file mengandung file yang sebenarnya tidak dapat Anda akses. Dalam hal itu kebutuhan Anda agak aneh.
HBruijn
2
Tidak ada yang memaksa Anda untuk terlibat dalam pertanyaan. Saya pikir salah satu tujuan Server Fault adalah untuk melayani sebagai forum untuk situasi aneh.
Troels Arvin
2
Kesalahan Server bukan forum, dan upaya membalikkan psikologi tidak mengubah validitas pengamatan HBruijn (yang, saya yakin, diajukan dalam upaya membantu Anda).
Lightness Races in Orbit

Jawaban:

19

Bagaimana dengan cari ?

cari membaca satu atau lebih database yang disiapkan oleh updatedb (8) dan menulis nama file yang cocok dengan setidaknya satu dari POLA dengan output standar, satu per baris. Jika --regex tidak ditentukan, POLA dapat berisi karakter globbing. Jika ada POLA yang tidak mengandung karakter globbing, cari berperilaku seolah-olah polanya adalah POLA .

Secara default, cari tidak memeriksa apakah file yang ditemukan dalam database masih ada. loc tidak pernah dapat melaporkan file yang dibuat setelah pembaruan terbaru dari database yang relevan.

Atau mungkin bahkan ditempatkan :

Secure Locate menyediakan cara aman untuk mengindeks dan cepat mencari file di sistem Anda. Ia menggunakan pengkodean tambahan seperti halnya GNU temukan untuk mengompresi basis datanya untuk membuat pencarian lebih cepat, tetapi juga akan menyimpan izin dan kepemilikan file sehingga pengguna tidak akan melihat file yang tidak dapat mereka akses.

Halaman manual ini mendokumentasikan slocate versi GNU. slocate Memungkinkan pengguna sistem untuk mencari seluruh sistem file tanpa menampilkan file yang tidak sah.

Lenniey
sumber
Ide bagus. Saya tidak tahu mengapa saya tidak memikirkan hal ini. Tetapi saya khawatir bahwa parameter "-d" dapat entah bagaimana digunakan untuk membaca file yang arbitrer, jika aturan sudo memungkinkan pengguna untuk menjalankan perintah "cari"?
Troels Arvin
2
@ TroroArvin: locatetidak perlu sudo; hanya updatedbpekerjaannya yang membutuhkan hak istimewa khusus. Dengan demikian, pengguna Anda seharusnya tidak pernah dapat berlari atau berlari sudo locate.
jwodder
1
@ jwodder: Di server RHEL 7: Katakanlah pengguna Anda tidak memiliki akses ke / data / foo. Di / data / foo, ada file "somefile.csv". Sekarang, ketika Anda melakukan "find somefile.csv", output dari "loc" tidak termasuk /data/foo/somefile.csv - kecuali pengguna Anda mengeksekusi "temukan" melalui sudo. (Menggunakan argumen "--nofollow" tidak membantu.)
Troels Arvin
1
@TroelsArvin tetapi -dbendera hanya menetapkan jalur basis data? Mungkin aku salah paham denganmu.
Lenniey
21

Berdasarkan man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

Ini berhasil untuk saya. (baris yang dimulai dengan '#' adalah root, yang dengan '$' adalah non-root) dalam hal ini pengguna non-root ada di wheelgrup.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

Mengingat apa yang diberikan kemampuan, itu cocok dengan apa yang Anda inginkan. Saya belum memeriksa apakah findmemiliki fitur yang memungkinkan Anda membaca byte di dalam file, tetapi hal-hal yang jelas seperti LD_PRELOADdan pustaka serangan shim seharusnya tidak berfungsi karena sifat pemeriksaan setuid di Linux, dan bit kemampuan tidak mendapatkan diwarisi oleh proses anak juga (tidak seperti setuid mentah) jadi itu bonus lain.

Ingatlah bahwa apa yang ingin Anda lakukan memang meningkatkan kemungkinan masalah privasi terkait dengan pembuatan atau akses file sementara, dan program ini dapat digunakan sebagai dasar untuk memasang upaya peningkatan kondisi ras / hak istimewa (terhadap program yang membuat nama file terkenal) tapi jangan lakukan pemeriksaan keamanan yang benar).

Juga, beberapa aplikasi yang ditulis dengan buruk dapat mengandalkan metadata file atau struktur pohon sebagai cara untuk menyampaikan makna atau menyembunyikan data. Hal ini dapat menyebabkan pelepasan informasi terbatas atau mengungkapkan dokumen istimewa yang tidak diketahui tentang (keamanan melalui ketidakjelasan yang saya tahu, tapi ini adalah hal yang ingin dilakukan oleh vendor sumber tertutup, khususnya).

Karena itu, berhati-hatilah dan berhati-hatilah dalam melakukannya dan pahami masih ada risiko yang terkait dengan hal ini meskipun hal-hal yang jelas tidak berhasil.

Oh, dan saya akan tertarik untuk melihat apakah seseorang memiliki bukti serangan konsep yang menggunakan mekanisme ini sebagai dasar untuk eskalasi hak istimewa dalam komentar!

Matthew Ife
sumber
5
Ini memang terlihat cukup menarik!
Sven
Seperti ini? Yah, tidak ada PoC, tapi tetap menarik: forums.grsecurity.net/...
Lenniey
Saya suka ide ini, tetapi memiliki kelemahan yang signifikan: sudofind sekarang menjadi biner yang bukan bagian dari paket perangkat lunak (misalnya RPM) pada sistem. Jadi jika distribusi mengirimkan patch untuk "find", maka sudofind tidak akan diperbarui.
Troels Arvin
2
@TroelsArvin Itu belum tentu buruk. Jika Anda menambahkan kapabilitas seperti setuid ke utilitas yang ada yang tidak dirancang untuk kapabilitas itu, Anda tidak ingin ada pembaruan pada utilitas yang mendasari sebelum Anda memverifikasi bahwa utilitas yang diperbarui dapat digunakan dengan aman dengan non-standar Anda. kemampuan. Bayangkan dalam kasus ini jika pembaruan memberi findkemampuan untuk mengeksekusi beberapa kode yang disediakan pengguna secara langsung, mirip dengan apa yang awkdapat dilakukan.
Andrew Henle
4
Masalah terbesar yang dapat saya lihat dengan ini adalah bahwa direktori yang dapat ditulis oleh dunia yang berada di bawah direktori yang tidak dapat dicari dapat tiba-tiba ditulis.
Tavian Barnes
2

Saya akan memberikan izin yang tepat kepada pengguna.

Secara default, jika umask adalah 022, direktori dibuat sehingga semua orang dapat membuat daftar dan membuat stat file di dalamnya. Jika tidak, Anda dapat secara manual mengubah izin direktori menjadi bitwise atau izin sebelumnya dan 0555:

chmod +0555 foo

Dan jika para pengguna itu tidak memiliki izin untuk mengeksekusi semua orangtua dari direktori itu (misalnya, direktori home pengguna lain), itu mungkin berarti Anda harus meletakkan direktori pertama di tempat lain.

Jika Anda hanya ingin membiarkan beberapa pengguna membaca dan menjalankan direktori itu, Anda dapat mengubah modenya menjadi 0750, menempatkan pengguna tersebut dalam sebuah grup, dan mengubah pemilik grup dari direktori ke grup itu:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo
yt7b97q-
sumber