Baca file yang dimiliki oleh pengguna lain sebagai non-root

9

Saya mencadangkan server di server cadangan. Setiap server yang didukung memiliki akunnya sendiri di server cadangan, dan file-file tersebut disinkronisasi ulang. Adalah penting bahwa izin tetap utuh (menggunakan rsync -p) untuk menyederhanakan pemulihan.

Saya mencoba membuat skrip yang dapat membaca file dan membuat beberapa statistik. Saya tidak suka skrip itu dijalankan di bawah pengguna root, dan skrip itu tidak mungkin dijalankan untuk setiap pengguna cadangan, karena skrip harus dapat membaca semua file dari semua pengguna. Namun, ini menciptakan masalah ketika file misalnya chmodded 600. Saya tidak ingin menyentuh izin, tetapi pengguna lain kecuali untuk root dan pemilik tidak dapat membacanya.

Pengguna tertentu - bukan root - harus dapat membaca semua file dalam direktori atau partisi, terlepas dari tingkat izin (dan pemilik file tidak boleh mencegahnya). Apakah ada cara untuk mencapai ini? Saya menjalankan FreeBSD dengan volume ZFS.

Evianon
sumber
Ini adalah pertanyaan pertama saya di situs ini :) Anda mungkin dapat melihatnya juga. unix.stackexchange.com/questions/91488/…
Ramesh

Jawaban:

4

Gunakan sudo.

Jika sudoersfile Anda mencantumkan perintah yang tepat dan spesifik, maka perintah tersebut harus dipanggil persis seperti yang tercantum dalam sudoersatau akan ditolak.

Misalnya:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Dalam contoh ini pengguna backupdapat menjalankan perintah persis seperti yang ditunjukkan:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Jika mereka memanggil sudo rsync...alih-alih sudo /usr/bin/rsyncperintah gagal, atau jika flag atau path berbeda, perintah gagal.

Jika Anda melakukan ini dalam skrip maka Anda ingin mengaktifkan penggunaan tanpa perintah dari perintah-perintah itu:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Untuk lebih lanjut lihat sudoers(5)halaman manual di bawah Cmnd_list.

bahamat
sumber
Ide yang hebat. Saya menambahkan perintah ls, cat, head, tail etc. ke file sudoers dan sekarang dapat menjalankannya dengan hak akses root dan membaca semua file. Mungkin bukan solusi terbaik untuk semua orang, karena pengguna dapat membaca semua file pada sistem, tetapi itu bukan masalah dalam pengaturan saya.
Evianon
Nah jika Anda menggunakan Solaris saya akan menyarankan RBAC dan pfexec. Tetapi karena Anda menggunakan BSD, Anda sudoharus melakukannya.
bahamat
4

Anda dapat menulis suidversi catyang hanya dapat dieksekusi oleh pengguna cadangan Anda (buat grup eksklusif untuk pengguna cadangan dan buat yang dapat dieksekusi hanya dapat dibaca oleh grup itu). Ini cathanya akan memungkinkan Anda untuk membaca file di direktori yang Anda minati. (Anda mungkin ingin melarang tautan simbolik dan berhati-hati terhadap trik-trik seperti /dir/../otherdir/.)

Kemudian skrip Anda dapat menggunakan executable ini untuk membaca file tanpa memiliki hak root.

cjm
sumber
4

PERINGATAN: Seperti ditunjukkan Stephane dalam komentar di bawah, pemilik file masih dapat mencabut ACL.

Jika Anda memiliki akses root ke mesin, Anda bisa melakukan ini dengan ACL :

setfacl -R -m u:USERNAME:r /path/to/direcory

Ini akan memberikan penggunaan USERNAMEakses baca ke semua file dan direktori di bawah /path/to/directory.

terdon
sumber
Pemilik file masih dapat menghapus ACL tersebut.
Stéphane Chazelas
@StephaneChazelas oh. Bahkan jika ini dilakukan oleh root? Saya tidak menyadarinya. Apakah Anda tahu jalan keluarnya?
terdon
Tidak, di Linux saya akan melihat kombinasi kemampuan Linux dan LSM. Di FreeBSD saya tidak tahu.
Stéphane Chazelas
1

Bindfs adalah sistem file FUSE yang memberikan tampilan pohon direktori dengan berbagai izin dan kepemilikan. Tidak ada port untuk FreeBSD, tetapi Anda dapat mengkompilasi dari sumber.

Untuk memberikan pengguna backupper(dan hanya pengguna itu) tampilan di /some/filesmana semua file dapat dibaca, pasang tampilan yang dapat dibaca dunia /some/filesdalam direktori pribadi backupper.

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files
Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

ZFS memiliki beberapa mekanisme untuk ini.

Salah satu mekanisme masih dalam pengerjaan dan belum diimplementasikan, tetapi memungkinkan dataset untuk dipasang dengan override 'pemilik'. Dalam hal ini, Anda dapat mengkloning snapshot, memasangnya dengan pemilik yang diganti oleh pengguna cadangan, mencadangkannya, lalu menghancurkan klon tersebut. Kelemahannya adalah Anda tidak mencadangkan kepemilikan file yang sebenarnya.

Solusi terbaik mungkin adalah gaya ACFS ZFS nfsv4

Allan Jude
sumber
0

Saya punya dua ide untuk bagaimana mengatasi masalah ini menggunakan teknologi khusus FreeBSD, meskipun saya belum mencoba:

  • Gunakan Capsicum. Ini adalah metode yang saya sukai. Juga, karena baru-baru ini porting ke Linux, seharusnya juga berfungsi di sana. Akan seperti ini:

    1. Buat perintah drop-cap-write yang menjatuhkan CAP_WRITE kemudian mengeksekusi perintah yang disediakan pada baris perintah
    2. Gunakan sudo untuk memungkinkan pengguna cadangan untuk menjalankan perintah itu tanpa kata sandi
    3. Secara opsional, gunakan arahan ForceCommand sshd_config untuk secara otomatis menjalankan perintah itu setiap kali pengguna cadangan masuk. Dengan begitu, pengguna jarak jauh tidak perlu menentukan drop-cap-write dalam skrip cadangannya.
  • Gunakan kontrol akses wajib. Ini tidak berfungsi pada Linux AFAIK, dan lebih canggung untuk pengaturan. Akan seperti ini:

    1. Buat cadangan-penjara yang rootdirnya adalah /. Kode keras jailid.
    2. jalankan sshd di cadangan penjara. Izinkan root untuk masuk di sini, bahkan jika Anda tidak mengizinkan login root di sshd biasa
    3. Set ugidfw_enable = "YES" di /etc/rc.conf
    4. Gunakan aturan ugidfw yang terlihat seperti ini:

    ugidfw menambahkan subjek uid root jailid BACKUP_JAIL_ID mode rsx

Alan Somers
sumber