Apa izin unix sempurna untuk direktori proyek web biasa?

12

Apa izin minimal yang sempurna dalam format oktal untuk diikuti oleh aplikasi web yang ditulis?

  1. Direktori tempat pengguna mengunggah file statis (file gambar / swf / js) akan berada
  2. Direktori tempat admin mengunggah file statis (file gambar / swf / js) akan berada
  3. Direktori tempat pustaka yang digunakan dalam aplikasi berada
  4. Direktori tempat skrip sisi server yang dapat dieksekusi / dapat dijelajahi berada
  5. Direktori tempat file yang sudah ada (txt atau xml) akan diedit oleh kode di sisi server

Inilah saran dan justifikasi saya

  1. 555, semua orang dapat membaca dan menulis, tidak ada yang bisa mengeksekusi
  2. 544, pemilik sendiri dapat menulis, semua orang hanya bisa membaca, tidak ada yang bisa mengeksekusi
  3. 000, tidak ada yang perlu membaca, menulis atau mengeksekusi, hanya akan digunakan oleh server web?
  4. 661, pemilik dapat membaca, menulis, semua orang hanya dapat mengeksekusi
  5. 600, pemilik dapat membaca, menulis (mungkin tidak diperlukan), tidak ada orang lain yang bisa melakukan apa pun

Sekarang saya tertarik pada dua hal:

  1. Apakah ada sesuatu yang umum digunakan dalam aplikasi berbasis web yang saya lewatkan di daftar pertama?
  2. Adakah yang tidak Anda setujui dalam daftar kedua, apa alternatif Anda, dan mengapa lebih baik?
pengguna893730
sumber
1
Saya tidak mengerti mengapa orang TIDAK menggunakan ACL hari ini ...
pfo

Jawaban:

20

Menganggap bahwa 'aplikasi web' berjalan di server (seperti apache, nginx, dll) dan ditulis dalam beberapa bahasa skrip dinamis (seperti PHP, Ruby, dll), Anda memiliki kesalahpahaman tentang siapa 'pengguna' itu.

Pengguna bukan orang yang masuk ke aplikasi Anda - itu, dan peran mereka dalam aplikasi (admin, dll) sama sekali tidak relevan dengan skenario. Pengguna adalah pengguna sistem linux yang menjalankan proses di bawah. Kode situs web Anda dijalankan hanya sebagai satu pengguna - itu mungkin pengguna server web Anda (yang sebenarnya bukan hal yang baik), atau mungkin pengguna yang spesifik untuk situs Anda (yang jauh lebih baik).

Di linux, pengguna menjadi bagian dari grup - kami dapat menambahkan pengguna ke grup lain dan memberikan hak istimewa ke grup itu.

Pengaturan yang baik akan membuat server Anda berjalan sebagai satu pengguna (sebut saja pengguna ini 'server web') dan jalankan bahasa skrip dinamis Anda (mis. Via FastCGI) sebagai pengguna sendiri (satu pengguna per situs - sebut pengguna pertama kami 'site1') .

Untuk melayani file Anda, server web perlu mengaksesnya, dan bahasa skrip membutuhkan akses ke file tersebut. Itu berarti: 'site1' dan 'server web' harus dapat membaca file Anda. Hanya satu dari mereka, namun dapat 'memiliki' file. Pemilik adalah 'pengguna' (dalam pengguna, grup, lainnya). Kita juga memerlukan bahasa scripting kita untuk dapat menulis ke direktori (dan membaca file yang telah ditulisnya). Oleh karena itu, pengguna 'site1', perlu izin baca dan tulis. Karena kami ingin izin grup dan lainnya seketat mungkin, 'pemilik' kami akan menjadi 'site1', dan izin pengguna yang sesuai akan dibaca dan ditulis.

Karena kami tidak dapat menentukan izin untuk server web kami sebagai 'pengguna' lain, kami akan menambahkan 'server web' ke grup 'situs1' (tentu saja Anda dapat, membuat grup yang berbeda dengan 'situs1' dan 'server web' di dalamnya. Semua anggota grup ini akan diberikan izin yang sama. Izin yang paling longgar (dari pengguna, grup, set lainnya) akan diterapkan ke pengguna yang diberikan untuk menentukan izin mereka.

Perlu dicatat bahwa pengaturan yang baik tidak memerlukan file untuk menjalankan izin untuk bahasa yang dinamis. File-file tersebut tidak langsung dijalankan, melainkan dibaca menjadi penerjemah - hanya izin baca yang diperlukan untuk menjalankan skrip tipikal (yang tidak menulis apa-apa).

Izin 'mengeksekusi' pada direktori memiliki arti yang berbeda - izin mengizinkan traversal tanpa bisa membaca konten. Agar dapat membaca file di direktori, pengguna harus memiliki 'mengeksekusi' izin pada setiap direktori di atasnya.

Untuk aplikasi web, setiap file harus memiliki izin baca oleh pemiliknya - jika tidak, ini adalah file yang tidak berguna. Apakah pengguna atau admin mengunggah file (melalui aplikasi web Anda) 'pemilik' (yaitu bahasa dinamis) perlu izin menulis. Pengaturan yang efisien akan mencoba menyajikan file statis secara langsung melalui server web, karena bahasa dinamis cenderung lambat dalam membaca file besar dan menggemakan konten. Karena itu server web perlu akses baca ke file statis Anda.

Oleh karena itu, izin file minimal mungkin:

  • File di direktori tempat pengguna mengunggah file statis (file gambar / swf / js) akan berada: 640
  • File dalam direktori tempat admin mengunggah file statis (file gambar / swf / js) akan berada: 640
  • File di direktori tempat pustaka yang digunakan dalam aplikasi berada: 400 (atau 440)
  • File dalam direktori tempat skrip sisi server yang dapat dieksekusi / dapat dijelajahi berada: 400 (atau 440)
  • File dalam direktori tempat file yang sudah ada (txt atau xml) akan diedit oleh kode di sisi server: 640 atau 600
    • (tergantung pada apakah server web akan menampilkan ini, kadang-kadang tidak dimodifikasi)

Sementara, izin direktori minimal mungkin:

  • Direktori tempat pengguna mengunggah file statis (file gambar / swf / js) akan berada: 750
  • Direktori tempat admin mengunggah file statis (file gambar / swf / js) akan berada: 750
  • Direktori tempat pustaka yang digunakan dalam aplikasi berada: 500 (atau 550) [setidaknya harus 510]
  • Direktori tempat skrip sisi server yang dapat dieksekusi / dapat dijelajahi berada: 500 (atau 550) [setidaknya harus 510]
  • Direktori tempat file yang sudah ada (txt atau xml) akan diedit oleh kode di sisi server: 750 atau 700
    • (tergantung pada apakah server web akan melayani file dari sini, kadang-kadang tidak dimodifikasi)

Sekali lagi - server web Anda harus memiliki izin 'laksanakan' pada setiap direktori di atas direktori yang memerlukan aksesnya - jadi bahkan jika server web tidak akan menyajikan file dari direktori yang diberikan, kami harus memberikan izin untuk menjalankannya.

Sangat umum untuk memberikan akses web server baca ke sebagian besar file (jadi ubah 500 hingga 550). Izin 'agak aman' standar biasanya 755 untuk direktori dan 644 untuk file - tanpa izin eksekusi, semua orang dapat membaca, dan hanya pengguna yang dapat menulis - Anda akan mencatat bahwa sebagian besar file pada sistem linux memiliki izin ini.

Ingatlah bahwa izin 'lain' merujuk pada pengguna sistem apa pun yang bukan pemilik atau dalam grup (yaitu semua pengguna sistem yang tersisa). Menjaga izin 'orang lain' Anda terbatas, karena pengguna ini tidak dikenal - Anda belum secara eksplisit memberi mereka izin. Izin lainnya seringkali paling mudah untuk memanfaatkan sistem yang dikompromikan (misalnya salah satu alasan mengapa / tmp adalah target umum).

Dalam konteks di atas, saya kira dua pertanyaan terakhir Anda tidak relevan. Tetapkan izin direktori Anda menjadi 550 (dan berikan izin file ke 440), lalu berikan izin menulis kepada pengguna untuk direktori apa pun yang akan ditulis oleh aplikasi Anda (direktori: 750; file: 640).

(Anda tentu saja memerlukan izin menulis untuk mengunggah file - tetapi jika Anda mau, Anda dapat menghapusnya setelah itu - bisa dibilang, jika seseorang menulis ke direktori yang hanya dapat ditulis oleh pemiliknya - akun Anda telah disusupi - yang merupakan salah satu akun alasan untuk menjaga izin restriktif).

cyberx86
sumber
@ Iain: Tentu saja - sedang memikirkan izin file pada saat itu - akan memperbaikinya - terima kasih.
cyberx86
1

Adalah normal untuk memiliki set izin minimum untuk menyelesaikan pekerjaan. Jika Anda memiliki server web dan pengguna berbagi grup yang sama, maka Anda dapat menghapus kebutuhan untuk memberikan akses apa pun o. Izin juga terkait dengan pengguna. Anda tampaknya salah memahami izin oktal.

  1. 555 r-xr-xr-xtidak rw-rw-rw. Karena ini adalah direktori maka untuk membuat / menghapus file yang Anda perlu xatur sehingga 750 rwxr-x---akan menjadi tempat yang baik untuk memulai. Ini memungkinkan pengguna yang memiliki direktori untuk menambah / menghapus file dan semua orang dalam grup umum untuk mengaksesnya.
  2. Sama dengan 1. di atas.
  3. Jika mereka benar-benar file statis dari 050 akan memberikan akses server web namun untuk membuat file di tempat pertama 750 akan menjadi minimum.
  4. Sama seperti 3 di atas.
  5. 070 akan menjadi minimum untuk memungkinkan server web membaca dan mengubah file tetapi file perlu dibuat sehingga 770 mungkin lebih realistis.
Iain
sumber
Bukankah server web perlu menjalankan izin pada direktori untuk membaca file (poin # 1 (740?), 3, 5)?
cyberx86
Doh! memang x diperlukan untuk mengakses file r hanya memungkinkan Anda untuk membuat daftar mereka ... pergi untuk minum kopi.
user9517
0

Secara umum kita akan menggunakan mode 0755, 0775, atau 2775 pada direktori (bit SGID pada direktori, untuk BSD dan untuk Linux jika sistem file di-mount dengan BSD semantik akan membuat asosiasi grup dari file baru sesuai dengan pengaturan direktori induk daripada pengaturan GID default pembuat file). Ini memungkinkan semua pengguna untuk melintasi (chdir masuk dan keluar) dan membaca (menjalankan perintah ls atau melakukan readdir / membaca panggilan sistem) direktori yang dimaksud. Alternatif menambahkan opsi grup / tulis dan, seperti disebutkan, bit SGID, pada direktori, dapat membantu menjaga semua file dan subdirektori yang terkait dengan grup yang sesuai.

Untuk file biasanya menggunakan 0644 atau mungkin 0664 (dapat dibaca dunia dan grup dapat ditulis atau tidak). Jelas untuk skrip dan binari CGI kita harus menambahkan x-bit; dan untuk beberapa situasi khusus, dengan binari yang teruji dengan sangat baik, orang dapat menambahkan bit SUID atau SGID. Biasanya UNIX dan Linux akan mengabaikan bit SUID / SGID pada skrip dan hanya menghormati semantiknya untuk binari asli yang dikompilasi dan dapat dieksekusi. Namun Anda mungkin menjalankan situs Anda di bawah sesuatu seperti Apache dengan beberapa modul seperti "setuidhack" yang dapat digunakan untuk membuat server web menghormati bit SUID / SGID bahkan pada skrip yang ditafsirkan. (Ini dilakukan oleh stat daemon HTTP () di setiap file dan menggunakan kode fork () / execve () kustom mereka sendiri, menginterpolasi string interpreter yang benar ke dalam vektor execve () daripada hanya meneruskan executable '

Itu hanya panduan paling umum. Mereka tidak "sempurna" untuk semua situasi dan Anda harus berkonsultasi dengan dokumen untuk server web Anda dan semua aplikasi web atau kerangka kerja yang Anda instal dan konfigurasikan ... dan Anda mungkin ingin berkonsultasi dengan pakar keamanan UNIX sebelum Anda memperlihatkan file, kode, atau server Anda ke Internet publik.

Jim Dennis
sumber