Neden 666 varsayılan dosya oluşturma izinleri?


12

Bildiğim gibi, umask kullanırken, dosyalara verebileceğiniz en yüksek izinler 666'dır umask 0000. Bu, bildiğim her sistemde 666 gibi görünen varsayılan dosya oluşturma izinlerinden kaynaklanıyor.

İçeriğini göstermek için yürütülebilir haklara ihtiyacımız olan dosyalar için biliyorum.
Ancak neden 666'daki varsayılan dosya oluşturma izinlerini sınırlıyoruz?


Ne tür bir sistem? umaskTanıştığım tek şey her zaman 0022, varsayılan izin 644 oluşturmaktı.
manatwork

Hayır yanlış anladın. Umask, varsayılan 666 dosya izinlerini kullanıyor ve kendi değerini (sisteminiz için 0022 olan) çıkartıyor. Böylece ayarlayabileceğiniz en yüksek izinler umask 0000- 666 dosya izinleriyle hala sınırlıdır. (Ama görünüşe göre klasörler 777 kullanıyor)
Peter

Yakaladım seni. Şimdi bu iyi bir soru.
manatwork

2
Dosya içeriğini görmek için yürütülebilir izinlere ihtiyacınız yoktur. Bu dizinler için böyledir, bu nedenle dizinler varsayılan olarak yürütme izinleriyle oluşturulur.
Joseph R.

1
İnanıyorum [ama emin olmak için daha fazla bakmak gerekir] bazı güvenlik sorunları önlemek için, bu tasarım gereği: "chmod" erişim olmadan, bir dosyayı yürütülebilir hale getiremezsiniz. umask 0000, 0666 ile dosyalar ve 0777 ile dizinler oluşturur [bu arada, oldukça korkunç bir varsayılan ayar, güvenlik açısından akıllıca!]
Olivier Dulac

Yanıtlar:


10

Anlayabildiğim kadarıyla, bu standart yardımcı programlara kodlanmıştır. Ben stracehem d touchyeni bir dosya oluşturmak ve bir mkdiryeni bir dizin oluşturma.

touchİzlemesi, bu üretilen:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

ise mkdiriz bu üretilen:

mkdir("newdir", 0777)                   = 0

C dosya / dizin oluşturma işlemi kodlama kısa, varsayılan izinleri değiştirmek için bir yol görmüyorum. Ancak bana öyle geliyor ki, dosyaları varsayılan olarak yürütülebilir hale getirmemek mantıklıdır: rastgele herhangi bir metnin yanlışlıkla kabuk komutları olarak yanlış yorumlanmasını istemezsiniz.

Güncelleme

İzin bitlerinin standart yardımcı programlara nasıl sabit kodlandığına dair bir örnek vermek için. Aşağıda, coreutilspakette, her ikisi için touch(1)ve mkdir(1)diğerlerinin yanı sıra kaynak kodunu içeren iki dosyadan bazı ilgili satırlar verilmiştir :

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

Başka bir deyişle, mod belirtilmezse, mod S_IRWXUGOtarafından değiştirilen (okuma: 0777) olarak ayarlayın umask_value.

touch.c daha da net:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Yani, umaskelbette dosya oluşturma işlemiyle değiştirilecek olan herkese okuma ve yazma izinleri verin (read: 0666) .

Bu programla yalnızca programlı bir şekilde dolaşabilirsiniz: örneğin, sistem çağrılarını doğrudan yaptığınız veya düşük düzeyli bir sistem araması yapmanızı sağlayan bir dilin içinden bir C programı içinden dosya oluştururken (bkz. Örneğin Perl sysopen, perldoc -f sysopen).


Haklısın, kaza istemiyorum. Ama değiştirmenin bir yolu yok, korkunç! Standart değerler 777 olmalıdır. Ve ihtiyacımız var umask fileve umask dir. İki farklı varsayılan değer ve hassas ayarlayın. Ama şimdi exec izinleri ile dosya oluşturmanın bir yolu yok.
Peter

1
@PeterI Pekala, oluşturma sırasında dizinin modunu belirtmek için mkdir(1)bir -manahtar sunar. Bununla birlikte, dosyalarda dosya oluşturma open(2)sistem aramasını kullandığından, dosyayı oluşturmak için kullandığınız araç mod bitlerini iletmekten sorumlu olan araçtır openve bu konuda bir şey alamazsınız. install(1)varsayılan olarak dosyanızı yeni bir konuma kopyalar ve yürütme bitlerini ayarlar, ancak bu oluşturma sırasında hala gerçekleşmez.
Joseph R.

Söylediğiniz şey, touchörneğin doğru değerleri ayarlamaktan sorumludur. Değerleri nerede sakladığını biliyor musunuz? Belki sistem çapında ayarlanmışlardır, böylece onları değiştirebiliriz? Çünkü özgür olmak istiyorum ;)
Peter

@PeterI Güncellenmiş cevaba bakın.
Joseph R.

1
Cevabı tekrar güncelledim. Sistem çağrısını doğrudan C içinden veya Perl gibi başka bir dilden yapabilirsiniz.
Joseph R.

6

İlk olarak, genel bir varsayılan yoktur, izinler dosyayı oluşturan uygulamaya bağlıdır. Örneğin, bu küçük C programı, umask 0000 ise (/ her durumda izinler 0777 & ~ umask olacaktır) izinler 0777 olan bir '/ tmp / foo' dosyası oluşturur:

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

Bununla birlikte, birçok uygulama 0666 izinlerine sahip dosyalar oluşturur. Bunun iki nedeni vardır:

  1. Güvenlik: Herhangi bir rastgele dosyanın çalıştırılabilir olmasını istemezsiniz.
  2. Kolaylık: Çoğu dosyanın çalıştırılabilir olması gerekmez. Yürütülebilir biti belirli bir kaç dosyada ayarlamak, çok sayıda diğer dosyadaki ayarı kaldırmaktan daha kolaydır. Tabii ki, umask 0133 bunu çözecekti, ancak hiçbir şey kazanılmadı ve isteseniz bile programların yürütülebilir dosyalar oluşturmasına izin veremezdiniz.

1
Güvenlik nedeniyle dosyalar x (yürütme) biti ayarlanmadan oluşturulur. [Cw] dosyalarının yanlışlıkla çalıştırılması bir "Kötü Şey" (tm) olabilir. Chmod programı, izin bitlerini gerektiği gibi (yeniden) ayarlayabilmenizi sağlar.
ChuckCottrill
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.