Unix Server Partitioning & Layout Sistem File

29

Ada banyak informasi yang bertentangan tentang partisi server Unix di internet, jadi saya perlu saran tentang cara melanjutkan.

Sejauh ini, pada server saya di lingkungan pengujian kami, saya tidak terlalu peduli tentang partisi dan saya mengkonfigurasi satu monolitik /ditambah partisi swap. Skema partisi ini sepertinya bukan ide yang bagus untuk server produksi kami. Saya telah menemukan titik awal yang baik di sini , tetapi tampaknya sangat tidak jelas pada detailnya.


Pada dasarnya saya memiliki server di mana saya akan menjalankan tumpukan LAMP dasar (Apache, PHP, dan MySQL). Itu harus menangani unggahan file (hingga 2GB). Sistem memiliki 2TB RAID 1 array.

Saya berencana untuk mengatur:

/         100GB 
/var     1000GB (apache files and mysql files will be here), 
/tmp      800GB (handles the php tmp file)
/home      96GB
swap        4GB

Apakah ini terdengar waras, atau saya terlalu rumit?

Buzut
sumber
1
Apa tujuan akhir Anda? Apa yang sebenarnya ingin Anda capai?
Scott Pack
9
Namun Anda memutuskan untuk mengukirnya, saya akan menyarankan menggunakan LVM untuk mendefinisikan partisi Anda dan kemudian mengalokasikan ruang secara konservatif, meninggalkan beberapa ruang disk tidak terisi. Kemudian ketika Anda memutuskan Anda membutuhkan lebih banyak ruang di suatu tempat, Anda bisa memperpanjang LV dan sistem file.
ktower

Jawaban:

33

Satu hal yang perlu diingat ketika meletakkan partisi Anda adalah mode kegagalan. Biasanya pertanyaan itu berbentuk: "Apa yang terjadi ketika partisi x terisi?" Voretaq7 tersayang mengemukakan situasi dengan penuh /sehingga menyebabkan sejumlah masalah sulit didiagnosis. Mari kita lihat beberapa situasi yang lebih spesifik.

Apa yang terjadi jika partisi Anda menyimpan log sudah penuh? Anda kehilangan data audit / pelaporan dan kadang-kadang digunakan oleh penyerang untuk menyembunyikan aktivitas mereka. Dalam beberapa kasus, sistem Anda tidak akan mengautentikasi pengguna baru jika tidak dapat merekam acara masuk mereka.

Apa yang terjadi pada sistem berbasis RPM ketika /varpenuh? Manajer paket tidak akan menginstal atau memperbarui paket dan, tergantung pada konfigurasi Anda, mungkin gagal secara diam-diam.

Mengisi partisi itu mudah, terutama ketika pengguna mampu menulisnya. Untuk bersenang-senang, menjalankan perintah ini dan melihat seberapa cepat Anda dapat membuat file besar cukup: cat /dev/zero > zerofile.

Selain mengisi partisi juga, ketika Anda menempatkan lokasi pada titik pemasangan yang berbeda, Anda juga dapat menyesuaikan opsi pemasangannya.

Apa yang terjadi ketika /dev/tidak dipasang dengan noexec? Karena /devbiasanya diasumsikan dipelihara oleh OS dan hanya berisi perangkat itu sering (dan terkadang masih) digunakan untuk menyembunyikan program jahat. Meninggalkan noexecmemungkinkan Anda melakukan peluncuran biner yang tersimpan di sana.

Untuk semua alasan ini, dan banyak lagi, banyak panduan pengerasan akan membahas partisi sebagai salah satu langkah pertama yang harus dilakukan. Bahkan, jika Anda sedang membangun server baru cara mempartisi disk, hal ini hampir persis merupakan hal pertama yang harus Anda putuskan, dan seringkali yang paling sulit untuk diubah nanti. Ada kelompok yang disebut Pusat Keamanan Internet yang menghasilkan sekumpulan panduan konfigurasi yang mudah dibaca. Anda mungkin dapat menemukan panduan untuk Sistem Operasi spesifik Anda dan melihat setiap spesifik yang mereka katakan.

Jika kita melihat RedHat Enterprise Linux 6, skema partisi yang disarankan adalah ini:

# Mount point           Mount options
/tmp                    nodev,nosuid,noexec
/var                    
/var/tmp                bind (/tmp)
/var/log
/var/log/audit
/home                   nodev
/dev/shm                nodev,nosuid,noexec

Prinsip di balik semua perubahan ini adalah untuk mencegah mereka saling mempengaruhi dan / atau membatasi apa yang dapat dilakukan pada partisi tertentu. Ambil opsi /tmpmisalnya. Apa yang dikatakannya adalah bahwa tidak ada node perangkat yang dapat dibuat di sana, tidak ada program yang dapat dieksekusi dari sana, dan bit set-uid tidak dapat diatur pada apa pun. Sesuai sifatnya, /tmphampir selalu dapat ditulis oleh dunia dan seringkali merupakan tipe khusus dari sistem file yang hanya ada di memori. Ini berarti bahwa seorang penyerang dapat menggunakannya sebagai titik pementasan yang mudah untuk menjatuhkan dan mengeksekusi kode jahat, kemudian menabrak (atau hanya me-reboot) sistem akan menghapus semua bukti. Karena fungsi dari /tmptidak memerlukan fungsi itu, kami dapat dengan mudah menonaktifkan fitur dan mencegah situasi itu.

Tempat penyimpanan log, /var/logdan /var/log/auditdiukir untuk membantu melindungi mereka dari kelelahan sumber daya. Selain itu, auditd dapat melakukan beberapa hal khusus (biasanya di lingkungan keamanan yang lebih tinggi) ketika penyimpanan lognya mulai terisi. Dengan menempatkannya di partisi ini deteksi sumber daya ini bekerja lebih baik.

Agar lebih verbose, dan kutip mount(8), inilah yang digunakan oleh opsi di atas:

noexec Jangan izinkan eksekusi langsung dari sembarang binari pada sistem file yang di-mount. (Sampai saat ini masih dimungkinkan untuk menjalankan binari menggunakan perintah seperti /lib/ld*.so / mnt / binary. Trik ini gagal sejak Linux 2.4.25 / 2.6.0.)

nodev Jangan menafsirkan karakter atau memblokir perangkat khusus pada sistem file.

nosuid Jangan biarkan bit set-user-identifier atau set-group-identifier berlaku. (Ini tampaknya aman, tetapi sebenarnya agak tidak aman jika Anda telah menginstal suidperl (1).)

Dari perspektif keamanan, ini adalah opsi yang sangat baik untuk diketahui karena mereka akan memungkinkan Anda untuk menempatkan perlindungan pada sistem file itu sendiri. Dalam lingkungan yang sangat aman Anda bahkan dapat menambahkan noexecopsi /home. Ini akan mempersulit pengguna standar Anda untuk menulis skrip shell untuk memproses data, katakanlah menganalisis file log, tetapi itu juga akan mencegah mereka dari mengeksekusi biner yang akan meningkatkan hak istimewa.

Juga, perlu diingat bahwa direktori home default pengguna root adalah /root. Ini berarti ia akan berada di sistem /file, bukan di /home.

Berapa banyak yang Anda berikan untuk setiap partisi dapat sangat bervariasi tergantung pada beban kerja sistem. Server tipikal yang saya kelola jarang membutuhkan interaksi orang dan karena itu /homepartisi tidak perlu terlalu besar. Hal yang sama berlaku untuk /varkarena cenderung menyimpan data yang agak fana yang sering dibuat dan dihapus. Namun, server web biasanya menggunakan /var/wwwsebagai taman bermainnya, yang berarti bahwa perlu juga pada partisi yang terpisah atau /var/perlu dibuat besar.

Di masa lalu saya merekomendasikan yang berikut sebagai baseline.

# Mount Point       Min Size (MB)    Max Size (MB)
/                   4000             8000
/home               1000             4000
/tmp                1000             2000
/var                2000             4000
swap                1000             2000
/var/log/audit       250

Ini perlu ditinjau dan disesuaikan sesuai dengan tujuan sistem, dan bagaimana lingkungan Anda beroperasi. Saya juga merekomendasikan menggunakan LVM dan menentang mengalokasikan seluruh disk. Ini akan memungkinkan Anda untuk dengan mudah tumbuh, atau menambahkan, partisi jika hal-hal seperti itu diperlukan.

Scott Pack
sumber
1
The noexecobservasi adalah salah satu yang penting secara umum - Ini dianggap praktik yang baik untuk me-mount /tmpdengan noexecbendera untuk menghindari pengguna yang jahat upload rootkit melalui eksploitasi keamanan browser. Demikian pula /homesering dipasang nosuidkarena tidak ada alasan untuk binari setuid berada di sana. Re: /devdan noexec, pada banyak (walaupun tidak semua) sistem modern /devsering merupakan devfssistem file dan tidak akan membiarkan pengguna membuat / menyimpan file biasa sama sekali (Pada FreeBSD ia mengembalikan " Operation not supported", di Ubuntu udevfilesystem yang dipasang pada /devmemungkinkan Anda membuat file biasa. ).
voretaq7
2
@ voretaq7: Ya, menggunakan /tmpsebagai jump pad sangat menyenangkan karena selalu ada dan hampir tidak pernah terkunci.
Scott Pack
Terima kasih atas saran tesis ini. Saya akan memeriksa noexec karena meningkatkan keamanan!
Buzut
12

Mengabaikan array RAID yang mendasarinya ( Lihat pertanyaan ini untuk detail lebih lanjut tentang level array RAID dan ketika Anda ingin menggunakannya ), mari kita berkonsentrasi pada pertanyaan inti yang Anda tanyakan:
"Bagaimana saya harus mengeluarkan sistem file server Unix saya?"


Apa yang salah dengan satu /partisi raksasa ?

Seperti yang Anda catat dalam pertanyaan Anda, banyak distribusi Linux (terutama distribusi "Desktop" seperti Ubuntu) menggunakan tata letak sistem file yang sangat sederhana: /dan [swap].

Skema ini memiliki keunggulan kesederhanaan - sangat bagus untuk pengguna DOS / Windows yang terbiasa dengan PC rumahan mereka dengan "hard drive" sebagai satu wadah monolitik besar ( C:\) tempat Anda membuang barang, dan Anda tidak perlu khawatir tentang kehabisan ruang pada filesystem - pastikan Anda tetap di bawah kapasitas disk dan semuanya (setidaknya secara teoritis) baik-baik saja.

Skema sistem file tunggal memiliki beberapa kelemahan - kelemahan yang paling sering dikutip adalah bahwa sistem Unix cenderung bereaksi sangat buruk ketika sistem file root terisi (sampai menolak untuk mem-boot), dan jika semuanya menulis ke /(root) satu program atau pengguna yang tidak patuh dapat menghapus seluruh sistem.
Sistem file besar tunggal juga cenderung menjadi kerugian total jika terjadi kerusakan sistem dan kerusakan sistem file berikutnya.

Masalah-masalah di atas, ditambah rasa organisasi yang kuat, adalah mengapa server Unix biasanya memiliki banyak sistem file.


Bagaimana Anda memecah sistem file Unix?

Jadi mudah-mudahan Anda yakin bahwa memiliki banyak sistem file masuk akal. Pertanyaannya sekarang adalah bagaimana Anda memecah sistem menjadi potongan-potongan logis, dan bagaimana Anda memutuskan berapa banyak ruang masing-masing?
Jawabannya adalah Anda tahu dan mengerti sistem operasi Anda akan diletakkan di mana. Titik awal untuk pemahaman itu adalah hierhalaman manual. Sebagian besar sistem Unix datang ( man hierdari sistem linux , dan man hierdari sistem BSD ), dan ditambah pengetahuan lokal Anda tentang apa yang akan Anda lakukan dengan kode yang akan Anda lakukan akan memandu Anda dalam menciptakan tata letak partisi yang waras.

Saya akan menjelaskan skema partisi umum di sini, tetapi skema ini harus selalu dimodifikasi untuk memenuhi kebutuhan spesifik Anda.

Skema Pemisahan Umum Unix

/
    The "root partition", /, does not usually need to be very large.
    It holds the basic items needed to boot the system, mount other filesystems
    and get you to a running, usable, multi-user environment.  It's also what
    is available to you when you bring up the system in single-user ("recovery")
    mode.  
    The contents of / should not change or grow substantially over time.

    NOTE: Anything that doesn't go on one of the other partitions described
          below will wind up taking space on the root partition (/).

/var
    The /var filesystem holds variable data -- log files, email, and on some
    systems databases (like MySQL or Postgres) store their data files here.  
    `/var` should be "Big Enough" to hold all the data you intend to cram into
    it.  I generally advise 10GB for systems that won't have a database or email
    server (just logs).  If you are building a database or mail server you
    should obviously make `/var` larger, or carve out separate filesystems for
    the database/mail data.

/usr
    The /usr filesystem holds "userland" programs, data, manual pages, etc.
    This is where things like the Firefox browser binary live.  On systems that
    will have a lot of large user applications this filesystem may be very large
    (100GB or more), and on stripped-down servers it may be relatively small.  
    A good rule of thumb is that the /usr filesystem should be twice as large
    as you need it to be in order to fit your initial installation of programs.

/home
    The /home filesystem holds user home directories, and on desktop systems is
    the largest and most prone to filling up.  When you download files from the
    internet, create spreadsheets, store a music library, etc. that data is
    stored in your home directory, and it adds up fast.
    It's important to allow enough room under /home for the "accumulated junk"
    you will gather over time, even on servers -- ad-hoc tarball backups, 
    package files you copied over to install, and the like.

Sistem File Khusus

/tmp and /var/tmp
    The temporary scratch space (/tmp) is "special" -- on most Unix systems
    the contents of /tmp are cleared on reboot, and on many modern systems
    /tmp is a special "tmpfs" (RAM) filesystem for better performance.
    /var/tmp is usually "persistent temporary files" (like vi recovery
    files), and is not cleared on reboot
    The same general rule applies as for all other filesystems: Make sure
    your temporary scratch filesystems are big enough to hold the stuff you
    want to put in them.

[swap]
    Swap Space is used by the kernel when you are running low on RAM --
    The old general rule of thumb was to have at least twice as much swap
    as you did RAM, however on modern systems it's usually sufficient to
    have "enough" swap -- 2GB is a practical lower limit, and an amount
    between half the installed RAM and the total installed RAM is usually
    adequate.
    On modern systems with relatively huge RAM pools (12G and up) it is
    probably not practical to use the system if it's swapping heavily
    enough to warrant the old "Twice the installed RAM" rule.
voretaq7
sumber
2
Dua alasan yang Anda daftarkan sebagian besar sudah usang hari ini. ext [234] mencadangkan beberapa ruang untuk root dan tidak akan mengizinkan program pengguna untuk menggunakannya semuanya sehingga sistem tidak akan mengalami masalah karena kehabisan ruang, dan semua sistem file modern menggunakan penjurnalan sehingga mereka tidak akan rusak setelah kecelakaan.
psusi
2
@psusi Ruang yang disediakan untuk pengguna root (biasanya 5-10% dari ukuran sistem file) tidak membantu Anda jika pengguna root adalah orang yang menulis file yang mengisi disk (seperti yang sering terjadi dengan file log). Juga salah untuk mengasumsikan bahwa hanya karena filesystem dijurnal, maka akan selalu aman dari korupsi - penjurnalan meningkatkan ketahanan, tetapi itu tidak menjamin keamanan (terutama jika Anda menemukan bug yang belum ditemukan dalam filesystem / kode penjurnalan dan mengaduk jurnal. - Orang-orang ReiserFS dapat menceritakan beberapa kisah hebat tentang hal itu dari masa-masa awal filesystem itu).
voretaq7
2
Memiliki utuh /usratau /vartidak membantu jika /rusak. Demikian juga memiliki utuh /tidak membantu (banyak) jika /homerusak. Anda akhirnya harus memulihkan dari cadangan. Belum lagi kegagalan tersebut adalah satu dari sejuta kecuali Anda menjalankan fs baru / tidak stabil.
psusi
4

Praktek mengukir filesystem seperti itu adalah dari hari-hari ketika tidak ada serangan perangkat lunak, dan disk drive kecil, jadi Anda harus menggunakan beberapa dari mereka, dan dengan demikian, satu-satunya cara untuk melakukan itu adalah memecah filesystem ke atas dan letakkan direktori yang berbeda di drive yang berbeda. Alasan historis lainnya adalah agar Anda dapat dengan mudah melepas partisi dan dumpcadangan, yang tidak dapat Anda lakukan dengan root. Alat ini sebagian besar tidak disukai hari ini dan sebagai gantinya dapat digunakan pada snapshot LVM bahkan pada root.

Tidak ada alasan untuk melakukan ini lagi. Satu-satunya alasan yang tersisa untuk melakukan ini adalah jika Anda ingin, misalnya, mencegah /tmpdari mengisi seluruh disk.

Alasan ini sebagian besar tidak relevan hari ini karena membuktikan pengguna dengan akses shell umum telah pergi di pinggir jalan, dan hari-hari ini server menjalankan layanan khusus, seperti server web atau mail. Karena Anda tidak memiliki pengguna acak yang dapat menjalankan perintah sewenang-wenang, Anda biasanya tidak perlu khawatir tentang mereka yang mencoba mengisi sistem file Anda (dan bahkan ketika Anda melakukannya, Anda memiliki kuota disk untuk menghentikannya).

Adapun tingkat serangan apa yang digunakan, Anda harus ingat bahwa tujuan utama serangan bukan untuk melindungi data (untuk itulah backup digunakan), tetapi untuk mempertahankan waktu kerja. Jika Anda melakukan /tmpraid0, maka server Anda akan tetap turun dan Anda harus memperbaikinya jika salah satu disk gagal. Anda juga mungkin ingin menggunakan raid10 bukan raid1 sehingga Anda mendapatkan kinerja yang lebih baik juga.

Alasan yang sangat bagus untuk TIDAK memecah filesystem adalah bahwa jika Anda mendapatkan alokasi yang salah, Anda dapat berakhir dengan bagian dari filesystem yang penuh walaupun ada banyak ruang kosong di tempat lain. Memperbaiki ini bisa sulit, kecuali jika Anda menggunakan LVM dan meninggalkan beberapa ruang yang belum ditetapkan.

psusi
sumber
4
Ada banyak alasan untuk terus mengukir sistem file Unix dengan cara tradisional. Jika tidak ada alasan untuk melakukan hal ini kita akan berhenti sekarang - sysadmin tidak BAHWA melekat tradisi misterius :)
voretaq7
1
@ voretaq7, lalu sebutkan beberapa. Jika Anda tidak bisa, maka anggaplah dengan membabi buta bahwa pasti ada yang bodoh.
psusi
1
Ini akan mendorong mereka yang downvoting untuk benar-benar memberikan argumen tandingan daripada membabi buta kebijaksanaan konvensional.
psusi
2
Menjaga / var / log dari mengambil semuanya dengan mengisi. Batasi korupsi pada sistem file. Menyederhanakan pencadangan - baik snapshot atau me-mount aturan traversal, orang sering ingin membuat cadangan pada jadwal yang berbeda. Menyederhanakan pencitraan / peningkatan. Mengizinkan pemilihan kinerja berbasis sistem file yang terkait dengan tugas.
Jeff Ferland
1
@ JeffFerland, paling tidak itu adalah alasan yang lemah untuk meletakkan / var / log di partisi sendiri, tetapi tidak untuk beberapa partisi lainnya. Kecuali jika Anda masih menggunakan dump, membuat cadangan bagian fs yang berbeda tidak perlu bagian tersebut berada di partisi yang berbeda. Upgrade tidak peduli dengan satu atau lain cara. Pencitraan juga bukan cara yang sangat baik untuk melakukan sesuatu.
psusi
3

Banyak informasi partisi dihasilkan ketika ruang disk saya kekurangan pasokan. Akibatnya, Anda akan melihat partisi yang relatif kecil untuk sejumlah kasus. Ukuran partisi yang diperlukan bervariasi tergantung pada penggunaan server. Yang paling variabel cenderung /tmp, /var, home, /opt, dan /srv. /usrcenderung berukuran wajar dan stabil. Ruang untuk /dapat mencakup salah satu atau semua partisi lain dan persyaratan ruang mereka. Ukuran sangat tergantung pada apa yang Anda lakukan sistem.

Saya akan meningkatkan swapdan mount /tmppada tmpfs. Anda /tmpkemudian akan menggunakan swap sebagai backing store, tetapi gunakan memori yang tersedia. Ukuran /tmppenampilan Anda sangat tinggi, tetapi akan menangani unggahan yang dibatalkan yang tidak dibersihkan.

Saya akan mempertimbangkan untuk memindahkan file MySQL /srv. Ini adalah level yang relatif baru dalam hirarki disk.

Jika Anda tidak mengetahui persyaratan utama Anda, pertimbangkan untuk menggunakan LVM dan perluas partisi Anda sebagai isi.

BillThor
sumber
Berhati-hatilah dalam meningkatkan swap - Sangat bagus untuk memiliki swap "cukup", tetapi jika Anda memiliki terlalu banyak swap, Anda tidak akan pernah menggunakannya (karena pada saat Anda bertukar berat, kinerja sistem terlalu menyakitkan). Saya akan mengatakan 4G yang diusulkan dalam pertanyaan mungkin "cukup" untuk tumpukan LAMP - jika Anda menggunakan 4G swap (dan sebenarnya paging data yang masuk dan keluar) Anda mungkin juga pada telepon yang berteriak karena situs webnya lambat :)
voretaq7
1
@ voretaq7 Tidak masalah apa ukuran swap jika Anda gunakan untuk program aktif. Menggunakannya untuk tmpfs di mana file besar dituliskan ke disk tetapi file yang lebih kecil tetap tinggal memori adalah penggunaan swap yang wajar. Menghemat menulis setiap file ke disk ketika tujuannya adalah untuk meletakkannya di tempat lain. Saya menyarankan menambah ruang swap karena sepertinya /tmpruang yang besar mungkin diperlukan.
BillThor
Mengapa tidak menggunakan file biasa untuk swap? Bukankah mereka sudah secepat partisi swap khusus untuk waktu yang lama?
Chris Smith
@ ChrisSmith File biasa harus hampir secepat partion khusus, tetapi mungkin tidak berdekatan pada disk yang mengarah untuk membagi permintaan I / O. Ini dapat ditebus dengan striping. Selain itu, relatif mudah untuk menghapus file swap secara tidak sengaja. File yang dihapus tidak akan jelas sampai sistem reboot, ketika itu tidak akan memiliki ruang swap lagi.
BillThor
@BillThor Ini benar - jika Anda menggunakan tmpfsdan berharap untuk memukul swap sebagai toko dukungan Anda harus memiliki swap "cukup" untuk memenuhi permintaan tmpfs Anda, ditambah cadangan yang sesuai untuk sistem juga. (Ini bukan sesuatu yang saya biasanya pikirkan karena satu-satunya sistem di mana saya menggunakan tmpfsdikonfigurasi untuk tidak menekan swap, karena memiliki kelebihan RAM dan saya menggunakan ruang sementara untuk file kecil yang dibuat / dihapus dengan cepat :)
voretaq7
2

Bergantung pada arsitektur Anda - Anda mungkin tidak ingin benar-benar menggunakan / tmp karena dihapus setelah setiap reboot. Jika situs Anda berurusan dengan pemrosesan unggahan akhirnya, mengubahnya ke lokasi lain (via php.ini) mungkin merupakan ide; di mana Anda bisa membuatnya menjadi titik pemasangan.

Seperti yang disarankan sebelumnya, sangat disarankan untuk menggunakan LVM dan kenaikan sesuai kebutuhan.

Saya juga sangat merekomendasikan partisi khusus untuk data MySQL (Anda masih bisa memasangnya di / var / lib / mysql).

es tipis
sumber
Ini umumnya ide yang baik untuk mengasumsikan bahwa file di /tmpmungkin tidak ada di sana nanti - menyelamatkan Anda dari kejutan yang tidak menyenangkan nanti :-)
voretaq7