Mengapa 666 izin pembuatan file default?

12

Seperti yang saya ketahui, saat menggunakan umask, izin tertinggi yang dapat Anda berikan ke file adalah 666. Yang dilakukan oleh umask 0000. Itu karena izin pembuatan file default, yang tampaknya 666 pada setiap sistem yang saya tahu.

Saya tahu untuk file, kami membutuhkan hak yang dapat dieksekusi untuk menampilkan kontennya.
Tapi mengapa kita membatasi izin pembuatan file default di 666?

Peter
sumber
Sistem apa? Satu-satunya yang umasksaya temui adalah selalu 0022, menciptakan izin default 644.
manatwork
Tidak, Anda salah paham. Umask menggunakan izin file default 666 dan mengurangi nilainya sendiri (yaitu 0022 untuk sistem Anda). Jadi izin yang paling Anda bisa atur adalah umask 0000- yang masih membatasi untuk mengajukan izin 666. (Tetapi ternyata folder menggunakan 777)
Peter
Kena kau. Sekarang ini pertanyaan yang bagus.
manatwork
2
Anda tidak perlu izin yang dapat dieksekusi untuk melihat konten file. Ini berlaku untuk direktori, itulah sebabnya direktori dibuat secara default dengan mengeksekusi izin.
Joseph R.
1
Saya percaya [tetapi perlu melihat lebih banyak untuk memastikan] bahwa ini adalah desain, untuk menghindari beberapa masalah keamanan: tanpa akses ke "chmod", Anda tidak dapat membuat file dapat dieksekusi. umask 0000 membuat file dengan 0666 dan direktori dengan 0777 [yang, omong-omong, merupakan pengaturan default yang mengerikan, dari sisi keamanan!]
Olivier Dulac

Jawaban:

10

Sejauh yang saya tahu, ini hard-coded menjadi utilitas standar. Saya straceberdua touchmembuat file baru dan mkdirmembuat direktori baru.

The touchjejak yang dihasilkan ini:

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

sedangkan mkdirjejak menghasilkan ini:

mkdir("newdir", 0777)                   = 0

Pendek pengkodean proses pembuatan file / direktori di C, saya tidak melihat cara memodifikasi izin default. Bagi saya, tampaknya, membuat file yang tidak dapat dieksekusi secara default masuk akal: Anda tidak ingin teks acak sengaja disalahartikan sebagai perintah shell.

Memperbarui

Untuk memberi Anda contoh bagaimana bit izin dikodekan dengan keras ke dalam utilitas standar. Berikut adalah beberapa baris yang relevan dari dua file dalam coreutilspaket yang berisi kode sumber untuk keduanya touch(1)dan mkdir(1), antara lain:

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;
}   

Dengan kata lain, jika mode tidak ditentukan, atur ke S_IRWXUGO(baca: 0777) dimodifikasi oleh umask_value.

touch.c bahkan lebih jelas:

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

Artinya, berikan izin baca dan tulis kepada semua orang (baca: 0666), yang akan dimodifikasi oleh proses umaskpembuatan file, tentu saja.

Anda mungkin dapat mengatasi ini hanya secara programatik: yaitu saat membuat file dari salah satu program C, di mana Anda membuat panggilan sistem secara langsung atau dari dalam bahasa yang memungkinkan Anda untuk melakukan syscall tingkat rendah (lihat misalnya Perl di sysopenbawah perldoc -f sysopen).

Joseph R.
sumber
Anda benar, saya tidak ingin ada kecelakaan. Tetapi tidak memiliki cara untuk mengubahnya, itu mengerikan! Nilai standar harus 777. Dan kita perlu umask filedan umask dir. Tetapkan dua nilai standar yang berbeda dan baik-baik saja. Tapi sekarang saya tidak punya cara untuk membuat file dengan perm exec.
Peter
1
@ Peter Yah, mkdir(1)memang menawarkan Anda -mberalih untuk menentukan mode direktori pada saat pembuatan. Namun, dengan file, karena pembuatan file menggunakan open(2)syscall, alat yang Anda gunakan untuk membuat file adalah yang bertanggung jawab untuk meneruskan bit mode ke opendan Anda tidak mendapatkan suara dalam masalah ini. install(1)secara default menyalin file Anda ke lokasi baru dan menetapkan bit eksekusi, tetapi itu masih tidak terjadi pada waktu pembuatan.
Joseph R.
Apa yang Anda katakan, bahwa touchmisalnya bertanggung jawab untuk menetapkan nilai yang benar. Apakah Anda tahu di mana nilai itu disimpan? Mungkin mereka diatur di seluruh sistem - jadi kita bisa mengubahnya? Karena saya ingin membebaskan diri ;)
Peter
@PeterI Lihat jawaban yang diperbarui.
Joseph R.
1
@PeterI Saya memperbarui jawabannya lagi. Anda mungkin dapat melakukan syscall langsung dari dalam bahasa C atau bahasa lain seperti Perl.
Joseph R.
6

Pertama, tidak ada standar global, izin tergantung pada aplikasi yang membuat file. Misalnya, program C kecil ini akan membuat file '/ tmp / foo' dengan izin 0777 jika umask adalah 0000 (dalam hal apa pun izin akan menjadi 0777 & ~ umask):

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

Yang sedang berkata, banyak aplikasi membuat file dengan izin 0666. Itu memiliki dua alasan:

  1. Keamanan: Anda tidak ingin file sembarang dapat dieksekusi.
  2. Kenyamanan: sebagian besar file tidak perlu dapat dieksekusi. Lebih mudah untuk mengatur bit yang dapat dieksekusi pada beberapa file tertentu daripada menghapusnya pada sejumlah besar file lainnya. Tentu saja, umask 0133 akan menyelesaikan ini, tetapi tidak ada yang dimenangkan dan Anda tidak dapat membiarkan program membuat file yang dapat dieksekusi bahkan jika Anda menginginkannya.
Adaephon
sumber
1
File dibuat tanpa bit x (eksekusi) yang ditetapkan untuk alasan keamanan. Eksekusi file yang tidak disengaja [cw] harus menjadi "Bad Thing" (tm). Program chmod memberi Anda kemampuan untuk (mengatur ulang) bit izin sesuai kebutuhan.
ChuckCottrill