Kullanıcıların Linux'ta diğer kullanıcılara dosya aktarmasına izin verme


10

20 işlem düğümünden 98.000 işlem düğümüne kadar değişen yaklaşık 40 kümede uygulama çalıştıran birkaç bin kullanıcıdan oluşan bir ortamımız var. Bu sistemlerdeki kullanıcılar, geleneksel unix izinleri tarafından denetlenen devasa dosyalar (bazen> 1PB) üretir (ACL'ler genellikle dosya sisteminin özel yapısı nedeniyle kullanılamaz veya pratik değildir).

Şu anda "vermek" adında bir programımız var. Bu program, bir kullanıcının grup izinleri yetersiz olduğunda başka bir kullanıcıya "vermesine" izin veren bir suid-root programıdır. Böylece, kullanıcı başka bir kullanıcıya dosya vermek için aşağıdakine benzer bir şey yazar:

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

Alıcı kullanıcı daha sonra dosyayı almak için "take" (verme programının bir parçası) adlı bir komutu kullanabilir:

> take filename-to-receive

Dosyanın izinleri daha sonra alıcı kullanıcıya etkili bir şekilde aktarılır.

Bu program yıllardır sürüyor ve güvenlik ve işlevsel bir bakış açısıyla her şeyi tekrar gözden geçirmek istiyoruz.

Mevcut eylem planımız, şu andaki "ver" uygulamamızdaki bit çürümesini kaldırmak ve onu üretime yeniden dağıtmadan önce açık kaynaklı bir uygulama olarak paketlemektir.

Herkesin yalnızca geleneksel unix izinleri kullanılabilir olduğunda kullanıcılar arasında son derece büyük dosyaları aktarmak için kullandıkları başka bir yöntemi var mı?


1
Tüm kullanıcıların erişebildiği paylaşılan bir dizin oluşturamamanızın bir nedeni var mı?
Zoredache

1
Paylaşılan erişime sahip bir dizin varsa, izinsiz kullanıcılar paylaşıldıkça dosyalara erişebilir. Bu ortamda, bazen dosya adları da duyarlıdır. Maalesef, paylaşılan bir dizin bir seçenek değil. Paylaşılan bir dizinde üçüncü bir kullanıcının dosyayı kurcalama olasılığı da vardır.
Jon Bringhurst

Bir cron işi dosyaların kendisini kopyalamak için yeterli olmaz mıydı? Örnek: kullanıcı foo kullanıcı köpek yavrusu için dosya çubuğu vermek istiyorum. böylece alıcı kullanıcı adı içeren bir 'kontrol' dosyası ile cron işi tarafından taranan özel bir dizin oluşturur. Cron işleri bu 'kontrol' dosyasını okuyacaktır, eğer kullanıcı TAMAM ise, hedef dizinde alan TAMAM, kopya. Geçmişte uyumluluk sağlamak için 'kontrol' dosyası oluşturmak için 'vermek' için bir sarıcı oluşturabilirsiniz. Suid-root'a gerek yok, o dosyayı root olmayan kullanıcı altında kopyalayabilir ve daha sonra sahipliğini değiştirmek için sudo yapabilirsiniz.
jirib

Sadece izinleri değiştirmek istiyorsanız, chownyapmalısınız .. İlgili iki taraf da anlaştıktan sonra, dosyayı da kopyalamak istiyorsunuz gibi görünüyor.
zebediah49

@JiriXichtkniha Bir kontrol dosyası ve bir cron işi fikrini seviyorum. Ancak dosyalar kopyalanamayacak kadar büyük.
Jon Bringhurst

Yanıtlar:


1

Verici dosyayı gerçekten vermek istiyorsa, dosyayı herkes tarafından yazılabilir ve yapışkan biti olan (örneğin /tmp) bir dizine taşıyan bir SUID ikili dosyası kullanabilirsiniz , ardından yeni sahibin sahipliğini değiştirir. ve bitleri sizin için chown(3)çıkarmaya zaten özen gösterir . Bu şekilde yeni sahip, dosyayı taşımak da dahil olmak üzere dosyayla istediklerini yapabilir.set-user-IDset-group-ID

Herkes tarafından yazılabilen bu dizin, ev dizinleri için birden fazla dosya sistemi kullanmak ve performansın hemen korkunç olacağı için dosya sistemi sınırlarını geçmediğinizden emin olmak istiyorsanız kullanıcının ana dizinine ait olabilir. Bu durumda, muhtemelen alıcının yeni bir dosya sunulduğunda bunu bildiğinden emin olmak istersiniz.

E-postalar hile yapar. Daha Unixy çözümü /etc/profile, yeni teslim ettiğiniz dosyaları listeleyen bir çözüm olabilir . Eğer bu özelliği sunan eğer bonusu eklendi pam_echo( örn ile file=/tmp/deliveries/%u, bakınız pam_echo(8)). PAM ile ilgili herhangi bir şeyde olduğu gibi, tüm uygulamalarınızın önce böyle bir modül sunduğunu kontrol etmek istersiniz.


0

Belirli bir kullanıcı için belirli bir dosya adı yapısıyla ( to-$username_from-$username.tarörneğin) arşivlenen, paylaşılan bir dizine (muhtemelen çalıştırma izinleri olmadan) sahip bir sistem kullanabilirsiniz . Ver, dosyayı ve dosyayı chownshedef kullanıcıya yapar; take dosyayı ayıklar ve kaldırır.

Bunu gerçekten bir hareket olarak yapmak istiyorsanız (IE, dosya konumunu ve izinlerini değiştirin; dev dosya boyutu nedeniyle kopyalama yapamazsınız), -x izinleriyle paylaşılan bir dizine taşınmaktan kurtulabilirsiniz (böylece kimse yapamaz) dosyaları listeleme) ve aynı chownyöntem. mv, chown/ mv.


0

Xryl669'un dediği gibi dosyaları gerçekten paylaşmak için bir dizin kullanabilirsiniz. Şöyle görünmelidir:

$ 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

Give komutu olur

#!/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

Take komutu şuna benzer:

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

0

Ben gerçekten bir "vermek" ve "almak" taklit için uygulamayı yeniden yazmayı öneririm, daha ziyade korumalı bir dizinden "itme" ve "çekme". Dizininize yalnızca dosya taşıma işlemlerini gerçekleştiren push / pull uygulaması için erişilebilir. Alternatif olarak, uygulamanız / komut dosyanız yalnızca gönderen ve alıcı için izinlerin ayarlandığı rastgele, geçici bir dizin oluşturabilir.

Daha fazla güvenlik ister misiniz? PGP dosyayı şifreleyebilir / imzalayabilirsiniz (alıcının ortak anahtarını kullanarak).

Bir "güvenlik ve İşlevsel bakış açısından" dan redoing açısından, şiddetle öneririm değil SUID programları oluşturun. Ayrıcalıkları düzgün bir şekilde bırakmazsanız, sistemdeki herhangi bir dosyaya sanal olarak erişebilirsiniz. Programınız buggy ise (arabellek taşması vb.) - sisteminizde root erişimi elde etmek için bundan faydalanabilirsiniz.


0

Bu muhtemelen sizin için bir yarar değildir, ancak referans için cp --reflink kaynak hedefi yazma üzerine kopyalama kullanan dosyaların ince kopyalarını yapar.

Bu, dosyayı doğrudan kopyalayabileceğiniz ve yalnızca değiştirilen blokların kopyalanacağı anlamına gelir. Sabit bir bağdan farklı olarak, yeni dosyanın kendi inode ve meta verileri vardır, bu da standart chown şeyler kullanarak dosyanın kopyasını yeni kullanıcıya sağlayabilirsiniz.

Bildiğim kadarıyla bu şu anda sadece OCFS2 ve btrfs kullanılabilir bir özelliktir. Sanırım bu sorunu çözer ama kullanılabilirliği yaygın olarak görmüyorum muhtemelen yararlı olmayacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.