Untuk alasan audit konfigurasi, saya ingin dapat mencari filesystem ext3 saya untuk file yang memiliki set atribut yang tidak dapat diubah (via chattr +i
). Saya tidak dapat menemukan opsi untuk find
atau serupa yang melakukan ini. Pada titik ini, saya khawatir saya harus menulis skrip saya sendiri untuk mengurai lsattr
output untuk setiap direktori. Apakah ada utilitas standar yang menyediakan cara yang lebih baik?
17
Jawaban:
Ini dapat sebagian diselesaikan dengan memipipkan
grep
perintah kelsattr
perintah.Namun, saya percaya ketika Anda menyebutkan seluruh
ext3
sistem file pencarian mungkin melibatkan/proc
,/dev
dan beberapa direktori lain yang jika melaporkan beberapa kesalahan Anda hanya ingin mengabaikan. Anda mungkin dapat menjalankan perintah sebagai,Anda mungkin ingin membuatnya
grep
sedikit lebih ketat dengan menggunakangrep
fasilitas PCRE agar lebih cocok dengan "-i-".Ini kemudian akan berfungsi untuk situasi seperti ini:
Tetapi tidak sempurna. Jika ada atribut tambahan yang diaktifkan di sekitar flag yang tidak dapat diubah, maka kami tidak akan mencocokkannya, dan ini akan dibodohi oleh file yang namanya cocok dengan pola di atas, seperti ini:
Kita bisa sedikit memperketat polanya seperti ini:
Tapi itu masih agak terlalu rapuh dan akan membutuhkan penyesuaian tambahan tergantung pada file dalam sistem file Anda. Belum lagi sebagai @StephaneChazeles telah disebutkan dalam komentar bahwa ini dapat diatasi dengan cukup mudah dengan memasukkan baris baru dengan nama file untuk memotong pola di atas
grep
.Referensi
https://groups.google.com/forum/#!topic/alt.os.linux/LkatROg2SlM
sumber
-i-
dalam namanya (ada 34 pada sistem saya saat ini login). Anda mungkin juga menginginkan-a
opsi ini+i
contoh pertama? Itu tidak bekerja untuk saya. Juga, menerima-i-
asumsi mengasumsikan bahwa atribut yang muncul berdekatani
(sepertia
) tidak disetel.^....i
? Atau setidaknya sesuatu seperti^[^ ]*i
jikai
bisa berada di posisi lain dari kelima.Mengingat bahwa tujuan skrip adalah mengaudit, sangat penting untuk berurusan dengan nama file yang sewenang-wenang, misalnya dengan nama yang mengandung baris baru. Ini membuatnya tidak mungkin untuk digunakan
lsattr
pada banyak file secara bersamaan, karena output darilsattr
dapat menjadi ambigu dalam kasus itu.Anda dapat berulang dengan
find
dan memanggillsattr
satu file pada suatu waktu. Ini akan sangat lambat.Saya sarankan menggunakan bahasa yang kurang rewel seperti Perl, Python atau Ruby dan melakukan pekerjaan
lsattr
sendiri.lsattr
beroperasi dengan mengeluarkanFS_IOC_GETFLAGS
syscall ioctl dan mengambil flag inode file . Inilah bukti konsep Python.sumber
FS_IOC_GETFLAGS
adalah0x80046601
.FS_IOC_GETFLAGS
tergantung padasizeof(long)
. Lihat misalnya perintah bash berikut untuk mencari tahu apa yang mengembang makro dalam C:gcc -E - <<< $'#include <linux/fs.h>\nFS_IOC_GETFLAGS' | tail -n1
. Saya mendapatkan dari itu ungkapan berikut:,(((2U) << (((0 +8)+8)+14)) | ((('f')) << (0 +8)) | (((1)) << 0) | ((((sizeof(long)))) << ((0 +8)+8)))
yang disederhanakan menjadi(2U << 30) | ('f' << 8) | 1 | (sizeof(long) << 16)
.Untuk menghadapi nama file sewenang-wenang (termasuk yang mengandung karakter newline), yang trik yang biasa adalah untuk menemukan file di dalam
.//.
bukan.
. Karena//
biasanya tidak dapat terjadi saat melintasi pohon direktori, Anda yakin bahwa//
sinyal awal nama file baru difind
(atau di sinilsattr -R
) output.Perhatikan bahwa output masih akan dipisahkan baris baru. Jika Anda perlu mengolahnya, Anda harus menyesuaikannya. Misalnya, Anda bisa menambahkan
-v ORS='\0'
agar dapat memberinya makan ke GNUxargs -r0
.Juga perhatikan bahwa
lsattr -R
(setidaknya 1,42.13) tidak dapat melaporkan flag file yang jalurnya lebih besar dari PATH_MAX (biasanya 4096), sehingga seseorang dapat menyembunyikan file yang tidak dapat diubah tersebut dengan memindahkan direktori induknya (atau komponen jalur mana pun yang mengarah ke itu, kecuali dirinya sendiri karena tidak dapat diubah) ke dalam direktori yang sangat dalam.Pekerjaan di sekitar akan digunakan
find
dengan-execdir
:Sekarang, dengan
-print0
, itu pasca-proses, tetapi jika Anda berniat untuk melakukan apa pun dengan jalur tersebut, perhatikan bahwa setiap panggilan sistem pada jalur file yang lebih besar dari PATH_MAX akan tetap gagal dan komponen direktori bisa diganti namanya dalam interval tersebut.Jika kita ingin mendapatkan laporan yang dapat diandalkan tentang pohon direktori yang berpotensi dapat ditulis oleh orang lain, ada beberapa masalah yang melekat pada
lsattr
perintah itu sendiri yang perlu kita sebutkan:lsattr -R .
melintasi pohon direktori, itu tergantung pada kondisi balapan. Orang dapat membuatnya turun ke direktori di luar pohon direktori yang dirutekan.
dengan mengganti beberapa direktori dengan symlink pada saat yang tepat.lsattr -d file
memiliki kondisi balapan. Atribut tersebut hanya berlaku untuk file atau direktori biasa. Begitulsattr
juga yanglstat()
pertama untuk memeriksa bahwa file tersebut dari jenis yang tepat dan kemudianopen()
diikuti olehioctl()
untuk mengambil atribut. Tapi itu panggilanopen()
tanpaO_NOFOLLOW
(atau O_NOCTTY). Seseorang dapat menggantifile
dengan symlink/dev/watchdog
misalnya antaralstat()
danopen()
dan menyebabkan sistem reboot. Itu harus dilakukanopen(O_PATH|O_NOFOLLOW)
diikuti olehfstat()
,openat()
dan diioctl()
sini untuk menghindari kondisi balapan.sumber
Terima kasih kepada Ramesh, slm dan Stéphane karena telah menunjuk saya ke arah yang benar (saya kehilangan
-R
saklar untuklsattr
). Sayangnya, sejauh ini tidak ada jawaban yang berfungsi dengan baik untuk saya.Saya datang dengan yang berikut:
Ini melindungi terhadap baris baru yang digunakan untuk membuat file tampak tidak dapat diubah ketika tidak. Itu tidak melindungi terhadap file yang ditetapkan sebagai tidak dapat diubah dan memiliki baris baru dalam nama file mereka. Tetapi karena file seperti itu harus dibuat seperti itu oleh root, saya dapat yakin bahwa file seperti itu tidak ada pada sistem file saya untuk kasus penggunaan saya. (Metode ini tidak cocok untuk deteksi intrusi dalam kasus di mana pengguna root dapat dikompromikan, tetapi kemudian keduanya tidak menggunakan
lsattr
utilitas sistem yang sama yang juga dimiliki oleh pengguna root yang sama.)sumber
Menggunakan
find -exec
terlalu lambat, parsing outputlsattr
tidak dapat diandalkan mirip denganls
, menggunakan Python seperti dalam jawaban oleh Gilles harus memilih konstanta untukioctl
bergantung pada apakah interpreter Python 32- atau 64-bit ...Masalah yang dihadapi adalah level yang lebih rendah, jadi mari kita tingkat yang lebih rendah: C ++ tidak seburuk bahasa scripting :) Sebagai bonus, ia memiliki akses ke header sistem C dengan kekuatan penuh dari preprosesor C.
Program berikut mencari file yang tidak dapat diubah, tetap berada dalam satu sistem file, yaitu tidak pernah melewati titik mount. Untuk mencari pohon yang terlihat, melintasi titik pemasangan seperlunya, hapus
FTW_MOUNT
tanda padanftw
panggilan. Juga tidak mengikuti symlink. Untuk mengikuti mereka, hapusFTW_PHYS
bendera.sumber
Alih-alih menyalurkan output ke grep, mengapa tidak menggunakan awk untuk mencocokkan 'i' di bidang pertama dari output?
Bahkan, saya menjalankan ini setiap hari melalui cron untuk memindai direktori / etc pada ratusan server dan mengirimkan hasilnya ke syslog. Saya kemudian dapat menghasilkan laporan harian melalui Splunk:
sumber
/etc
. Namun kedua perintah tersebut secara keliru menemukan file yang tidak dapat diubah yang dibuat dengantouch `"echo -e "bogus\n---------i---e-- changeable"`"
touch "`echo -e 'bogus\n---------i---e-- changeable'`"
Sangat sederhana, buka folder yang dicurigai dan jalankan perintah:
sumber