Cara mengizinkan pengguna untuk mentransfer file ke pengguna lain di linux

10

Kami memiliki lingkungan beberapa ribu pengguna yang menjalankan aplikasi pada sekitar 40 cluster mulai dari 20 node komputasi hingga 98.000 node komputasi. Pengguna pada sistem ini menghasilkan file besar (kadang-kadang> 1PB) yang dikendalikan oleh izin unix tradisional (ACL biasanya tidak tersedia atau praktis karena sifat khusus dari sistem file).

Saat ini kami memiliki program yang disebut "beri", yang merupakan program suid-root yang memungkinkan pengguna untuk "memberikan" file ke pengguna lain ketika izin grup tidak mencukupi. Jadi, pengguna akan mengetik sesuatu seperti berikut ini untuk memberikan file ke pengguna lain:

> give username-to-give-to filename-to-give ...

Pengguna penerima kemudian dapat menggunakan perintah yang disebut "take" (bagian dari program give) untuk menerima file:

> take filename-to-receive

Izin file kemudian secara efektif ditransfer ke pengguna penerima.

Program ini telah ada selama bertahun-tahun dan kami ingin meninjau kembali hal-hal dari sudut pandang keamanan dan fungsional.

Rencana tindakan kami saat ini adalah menghapus bit busuk dalam implementasi "pemberian" kami saat ini dan mengemasnya sebagai aplikasi open source sebelum kami memindahkannya ke dalam produksi.

Adakah yang punya metode lain yang mereka gunakan untuk mentransfer file yang sangat besar antar pengguna ketika hanya izin unix tradisional yang tersedia?

Jon Bringhurst
sumber
1
Apakah ada alasan mengapa Anda tidak bisa hanya membuat direktori bersama di mana semua pengguna memiliki akses?
Zoredache
1
Jika ada direktori dengan akses bersama, maka pengguna tanpa izin akan memiliki akses ke file saat mereka dibagikan. Dalam lingkungan ini, kadang-kadang nama file juga sensitif. Jadi, sayangnya, direktori bersama bukanlah opsi. Dengan direktori bersama, ada juga kemungkinan pengguna ketiga merusak file.
Jon Bringhurst
Tidakkah cukup tugas cron akan menyalin file itu sendiri? Contoh: pengguna foo ingin memberikan bilah file ke anak anjing pengguna. jadi dia membuat direktori khusus yang dipindai oleh pekerjaan cron dengan file 'kontrol' yang berisi nama pengguna penerima. Pekerjaan cron akan membaca file 'control' ini, jika pengguna OK, direktori tujuan memiliki ruang OK, salin. Anda masih dapat membuat pembungkus untuk 'memberi' hanya membuat file 'kontrol' untuk memiliki kompatibilitas historis. Tidak perlu suid-root, Anda dapat menyalin file itu di bawah pengguna non-root dan kemudian sudo untuk mengubah kepemilikan.
jirib
Jika Anda hanya ingin mengubah izin, chownharus melakukannya .. Sepertinya Anda juga ingin menyalin file, setelah kedua belah pihak yang terlibat setuju.
zebediah49
@JiriXichtkniha Saya suka ide file kontrol dan pekerjaan cron. Namun, file terlalu besar untuk disalin.
Jon Bringhurst

Jawaban:

1

Jika emitor benar-benar mau memberikan file itu, Anda dapat menggunakan biner SUID yang memindahkan file ke direktori yang dapat ditulisi oleh semua dan memiliki bit yang lengket (seperti /tmp ), kemudian mengubah kepemilikan ke pemilik baru. chown(3)sudah mengurus menghapus set-user-IDdan set-group-IDbit untuk Anda. Dengan cara ini pemilik baru dapat melakukan apa yang diinginkannya dengan file tersebut, termasuk memindahkannya.

Direktori ini dapat ditulisi oleh semua orang dapat menjadi direktori home pengguna, jika Anda ingin menggunakan beberapa filesystem untuk direktori home dan ingin memastikan Anda tidak melewati batas filesystem karena kinerjanya akan langsung mengerikan. Dalam hal ini, Anda mungkin ingin memastikan penerima tahu kapan file baru ditawarkan.

Email akan melakukan trik. Solusi Unixy yang lebih banyak adalah /etc/profileyang mencantumkan file yang baru Anda kirim. Bonus tambahan jika Anda menawarkan fitur ini dengan pam_echo( misalnya dengan file=/tmp/deliveries/%u, lihat pam_echo(8)). Seperti halnya PAM apa pun yang terkait, Anda ingin memeriksa bahwa semua implementasi Anda menawarkan modul semacam itu terlebih dahulu.

Pierre Carrier
sumber
0

Anda dapat menggunakan sistem dengan direktori bersama, (mungkin tanpa mengeksekusi perms.), Di mana hal-hal untuk pengguna tertentu diarsipkan dengan struktur nama file tertentu ( to-$username_from-$username.tar, misalnya). Berikan membuat file danchowns itu kepada pengguna target; ambil ekstrak file dan hapus.

Jika Anda ingin melakukannya sebagai gerakan yang benar-benar (IE, mengubah lokasi file dan izin; tidak ada penyalinan karena ukuran file raksasa), Anda mungkin bisa lolos dengan pindah ke direktori bersama dengan -x perms (sehingga tidak ada yang bisa daftar file di sana), dan chownmetode yang sama . mv, chown/ mv.

zebediah49
sumber
0

Seperti yang dikatakan xryl669, Anda dapat menggunakan direktori untuk benar-benar berbagi file. Seharusnya terlihat seperti ini:

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

Perintah memberi menjadi

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

Perintah take terlihat seperti ini:

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~
miniBill
sumber
0

Saya sarankan untuk menulis ulang aplikasi untuk meniru "memberi" dan "menerima", tetapi "mendorong" dan "menariknya" dari direktori yang dilindungi. Direktori Anda hanya dapat diakses untuk aplikasi push / pull - yang menangani pemindahan file. Atau, aplikasi / skrip Anda dapat membuat direktori sementara yang acak dengan izin yang ditetapkan hanya untuk pengirim dan penerima.

Ingin memiliki keamanan lebih? Anda dapat PGP mengenkripsi / menandatangani file (menggunakan kunci publik penerima).

Dalam hal mengulanginya dari "sudut pandang keamanan dan fungsional", saya sangat menyarankan untuk tidak membuat program SUID. Jika Anda tidak menjatuhkan hak istimewa dengan cara yang benar, Anda dapat mengakses file apa saja di sistem. Jika program Anda bermasalah (buffer overflow, dll ...) - Anda dapat mengeksploitasi ini untuk mendapatkan akses root pada sistem Anda.

ndrix
sumber
0

Ini mungkin tidak berguna bagi Anda tetapi untuk referensi cp --reflink target sumber melakukan salinan tipis file menggunakan copy-on-write.

Ini berarti Anda dapat menyalin file itu langsung dan hanya blok yang diubah yang benar-benar akan disalin. Tidak seperti tautan keras, file baru memiliki inode dan metadata sendiri yang berarti Anda kemudian dapat memberikan salinan file ke pengguna baru menggunakan hal-hal chown standar.

Sejauh yang saya tahu ini adalah fitur yang hanya tersedia di OCFS2 dan btrf saat ini. Saya kira itu tidak memecahkan masalah Anda tetapi melihat ketersediaan itu tidak luas itu mungkin tidak akan berguna.

Matthew Ife
sumber