Pertanyaan Tips untuk Mengamankan Server LAMP


Ini adalah sebuah Pertanyaan Kanonis tentang Mengamankan tumpukan LAMP

Apa pedoman mutlak untuk mengamankan server LAMP?


91
2017-12-14 01:52






Jawaban:


Jawaban David adalah dasar yang baik dari prinsip-prinsip umum pengerasan server. Seperti yang ditunjukkan David, ini adalah pertanyaan besar. Teknik spesifik yang Anda ambil dapat sangat bergantung pada lingkungan Anda dan bagaimana server Anda akan digunakan. Peringatan, ini bisa membutuhkan banyak pekerjaan dalam lingkungan pengujian untuk membangun dan menyelesaikan pekerjaan dengan benar. Diikuti oleh banyak pekerjaan untuk mengintegrasikan ke dalam lingkungan produksi Anda, dan yang lebih penting, proses bisnis.

Namun, pertama-tama, periksa untuk melihat apakah organisasi Anda memiliki kebijakan pengerasan, karena mungkin itu yang paling relevan secara langsung. Jika tidak, tergantung pada peran Anda, ini mungkin saat yang tepat untuk membangunnya. Saya juga merekomendasikan untuk menangani setiap komponen secara terpisah dari bawah ke atas.

L
Ada banyak panduan bagus yang tersedia untuk membantu Anda. Daftar ini mungkin atau tidak dapat membantu Anda tergantung pada distribusi Anda.

Sebuah
Apache bisa menyenangkan untuk aman. Saya merasa lebih mudah untuk mengeraskan OS dan mempertahankan kegunaan dari Apache atau PHP.

The M

The P
Hal ini membentang ke seluruh ide Praktik Pemrograman Aman, yang merupakan seluruh disiplinnya sendiri. SANS dan OWASP memiliki banyak informasi tentang hal ini, jadi saya tidak akan mencoba untuk mengulangnya di sini. Saya akan fokus pada konfigurasi waktu proses dan membiarkan pengembang Anda khawatir tentang sisanya. Kadang-kadang 'P' di LAMP mengacu pada Perl, tetapi biasanya PHP. Saya mengasumsikan yang terakhir.


105
2017-12-14 14:50



Saya ingin memberikan suara jawaban ini setidaknya 10 kali. - user58859
N diam - Dengan baik IPTables atau firewall eksternal, memblokir koneksi jaringan hanya ke yang diperlukan untuk diakses oleh publik. - Matt
Ini harus menjadi wiki komunitas - Brian Adkins
Sangat mudah melupakan firewall. Saya mendengar seseorang yang membangun server web untuk situs web dan bahkan pergi sejauh meretas tumpukan TCP / IP untuk membuang lalu lintas yang bukan port 80. Hal lain yang terlewatkan adalah layanan yang tidak perlu - jika tidak perlu harus dihidupkan, matikan. - Aaron Mason
@AaronMason: Selamat! Anda memiliki anekdot yang sukses. Mari kita ingat bahwa situasi spesifik Anda berjalan dengan baik, tetapi semoga pembaca di masa depan memahami lingkungan Anda yang tidak biasa. Dalam kasus umum, saran ini sangat berbahaya. - Scott Pack


Anda telah mengajukan pertanyaan yang, sejujurnya, layak untuk beberapa buku tentang topik ini. Tetapi ada beberapa pedoman dasar umum yang berfungsi dengan baik:

  1. Terus Diperbarui. Ini berarti OS, semua layanan, dan TERUTAMA semua webapp yang Anda jalankan.
  2. Nonaktifkan semua layanan yang tidak diperlukan, batasi yang dibutuhkan untuk eksposur minimum (jika Anda tidak terhubung ke MySQL secara remote, maka jangan dengarkan pada TCP), dan jalankan firewall berbasis host. (Jika itu LAMP ketat, Anda harus baik dengan 80 dan 443, tapi mungkin SSH juga untuk administrasi.))
  3. Gunakan kata sandi yang kuat. Lebih baik lagi, jika Anda menggunakan SSH, gunakan hanya autentikasi berbasis kunci.
  4. Pastikan Anda tidak masuk sebagai root. Masuk sebagai pengguna dan gunakan su & sudo.
  5. Meskipun tidak membuat semuanya lebih aman, Anda harus menjalankan alat seperti logwatch sehingga Anda mengetahui apa yang terjadi di server Anda.

Harapan yang membantu Anda memulai.


13
2017-12-14 02:23



Saya akan menyarankan untuk membaca "Panduan untuk Konfigurasi Aman Red Hat Enterprise Linux 5" yang ditulis oleh NSA - ALex_hha
terlambat ke pesta, tetapi saya baru saja membaca bahwa "tidak masuk sebagai root" bukan lagi masalah besar, terutama jika Anda menggunakan autentikasi SSH berdasarkan kunci publik / pribadi. - the0ther


Berikut ini daftar yang bagus yang saya ingin mulai dengan.

Firewall

  • Pendekatan yang bagus adalah tidak mengizinkan lalu lintas untuk memulai dengan, lalu hanya buka apa yang kamu butuhkan, saat Anda membutuhkannya. Ini menghasilkan pembukaan port minimum / ips untuk membuat semuanya bekerja dan itu meminimalkan Anda eksposur.
  • Untuk server LAMP Anda hanya perlu membuka port untuk http / https ke dunia dan ssh untuk sysadmin.
  • Pastikan hal-hal seperti lalu lintas ipv6 dikunci jika tidak menggunakannya
  • AWS menyediakan grup keamanan, linux memiliki iptables serta banyak paket untuk dipilih dari.

SSH & Pengguna

  • Tanpa kata sandi untuk akses ssh (gunakan kunci pribadi)
  • Jangan biarkan root ke ssh (pengguna yang tepat harus ssh masuk, kemudian su atau sudo)
  • Gunakan sudo untuk pengguna sehingga perintah dicatat
  • Catat upaya masuk tanpa izin (dan pertimbangkan perangkat lunak untuk memblokir / mencekal pengguna yang mencoba mengakses server Anda terlalu sering, seperti fail2ban)
  • ssh pada port non-standar (ini dapat berguna untuk memastikan Anda tidak bergantung pada buah yang rendah, dan menyimpan banyak lalu lintas yang mengganggu, tetapi tidak akan berbuat banyak untuk keamanan, terutama dengan sendirinya)
  • mengunci ssh ke hanya rentang ip yang Anda perlukan (kisaran besar lebih baik daripada tanpa kisaran)

Database

  • Sanitasi data pengguna
  • Parameterisasi permintaan
  • Pertimbangkan untuk mengabstraksikan DB ke mesin itu sendiri. Pemisahan ini dapat mempersulit penyerang untuk masuk ke tumpukan web Anda dan sebaliknya.
  • Seperti perangkat lunak apa pun tetap up to date penting.
  • Seorang pengguna untuk setiap tujuan. Saat membuat pengguna memulai dengan tidak ada hak istimewa dan tambahkan hanya yang mereka butuhkan untuk memformat peran mereka. Memiliki pengguna terpisah untuk berbagai aplikasi (atau terkadang bagian aplikasi yang berbeda) akan membantu mengurangi manfaat yang dimiliki penyerang jika mereka berkompromi dengan satu akun. Juga hati-hati dengan hak khusus seperti GRANT yang seharusnya tidak diberikan dengan ringan.
  • Memiliki kebijakan untuk mengubah kata sandi secara berkala adalah ide yang bagus. Jika Anda khawatir tentang jumlah usaha yang diperlukan, ingat lebih jarang adalah lebih baik daripada tidak sama sekali.
  • Memahami enkripsi kata sandi. Sandi garam. Jangan gunakan md5!

Perangkat lunak

  • Selalu perbarui perangkat lunak (os, server web, bahasa scripting, CMS). Banyak orang di luar sana akan memindai kerentanan yang diketahui dalam versi lama (belum di-patch)
  • Hapus perangkat lunak apa pun yang tidak Anda perlukan (idealnya jangan menyimpan paket yang diperlukan untuk mengcompile perangkat lunak di server produksi, lebih baik untuk melakukan pra-kompilasi perangkat lunak dan membuatnya tersedia sebagai paket untuk mesin produksi Anda)
  • Pastikan file izin dikunci (terutama untuk hal-hal seperti unggahan pengguna dan file konfigurasi)
  • Sandi melindungi area admin untuk CMS di tingkat server web (otentikasi http dapat duduk di depan CMS yang rentan dan membantu memblokir akses, yang merupakan cara yang baik untuk mencegah serangan)
  • Gunakan SSL untuk area admin dan data sensitif lainnya
  • Mengotomasi manajemen server dan infrastruktur Anda (Sesuatu seperti Wayang, Koki atau SaltStack. Jika menggunakan AWS CloudFormation juga). Ini akan membantu Anda menambal banyak hal di banyak server, dan mengurangi skenario seperti memperbaiki izin di Server A tetapi lupa untuk melakukannya di Server B
  • Jika memungkinkan, jangan berikan versi tertentu dari CMS, PHP, atau WebServer Anda. Meskipun mengaburkan informasi ini bukanlah keamanan, banyak orang di luar sana yang memindai untuk versi khusus perangkat lunak yang berbeda dan semakin sedikit informasi yang Anda berikan dengan bebas, semakin banyak penyerang harus bekerja. Ini adalah cara yang baik untuk memastikan Anda bukan salah satu dari buah gantung rendah. Tentu saja ini tidak akan melakukan apa-apa bagi seseorang yang ingin menghabiskan lebih banyak usaha untuk masuk
  • Batasi orang yang memiliki akses ke server

7
2017-08-10 08:08





Menambah apa yang David sarankan, semakin modular instalasi Anda, maksud saya membatasi akses ke pengguna / kelompok tertentu yang dibuat khusus untuk satu tugas dan membatasi ruang lingkup mereka, semakin aman tumpukan LAMP Anda: Contohnya adalah memiliki pengguna Apache untuk file / folder Apache dengan izin yang disetel sesuai dan tidak dalam grup apa pun yang dapat mengakses file / folder sistem penting. Seorang pengguna yang dapat mengakses tabel MySql yang terkait dengan situs web Anda yang akan Anda layani dan hanya tabel-tabel itu. Selain itu, Anda dapat membatasi akses mereka untuk memberikan jumlah minimum akses dari panggilan PHP. Juga, pastikan bahwa nama pengguna MySQL yang digunakan / terpapar melalui file PHP bukanlah nama pengguna atau kata sandi yang sama yang digunakan untuk pengguna lain.

Apa artinya ini: jika pengguna apache atau pengguna MySql dikompromikan, mereka tidak dapat melakukan kerusakan apa pun di luar lingkup folder (s) apache memiliki akses ke (dalam kasus pengguna apache) dan di luar tabel ( s) / database (dalam kasus pengguna untuk database MySQL).

Jika entah bagaimana pengguna MySQL dikompromikan, mereka tidak dapat, misalnya, mengakses database dan menghapus semua database dari MySQL dan merusak semua data Anda. Mereka MUNGKIN dalam beberapa keadaan dapat menjatuhkan tabel atau menyisipkan informasi dalam beberapa tabel dalam basis data yang terisolasi, itulah sebabnya mengapa penting untuk hanya memberikan akses tabel di tempat yang benar-benar diperlukan dan hanya memberikan izin yang diperlukan ... jika Anda tidak t harus memiliki hak istimewa tabel drop atau memperbarui hak istimewa, kemudian tidak memberikannya kepada pengguna itu.

Juga, jika karena alasan tertentu username dan kata sandi akun administratif Anda ditemukan untuk MySQL, jika Anda menggunakan nama pengguna yang berbeda dari nama pengguna di sistem Anda, mereka harus terlebih dahulu merusak keamanan sistem Anda sebelum masuk ke database Anda untuk melakukan kerusakan. Hal yang sama berlaku untuk pengguna apache dan akses ke file.

Contoh waktu! Saya akan memberikan contoh sistem untuk menyederhanakan ide.

katakanlah Anda memiliki pengguna di sistem Anda (root harus dinonaktifkan untuk keamanan melalui sesuatu seperti umod-l atau passwd -l, dll.): john, barney, terence, dan lisa.

Anda dapat membuat pengguna di MySQL dengan nama bigbird (pastikan Anda menggunakan kata sandi hash). Bigbird hanya memiliki hak pilih dan memperbarui hak istimewa, tetapi tidak menjatuhkan atau membuat, dan tentu saja tidak . Selain itu, Anda membuat pengguna MySQL administratif lain dengan nama garfield untuk bekerja pada database MySQL dan Anda menghapus pengguna root dari database MySQL sehingga tidak dapat dikompensasi. garfield telah dikabulkan . hak istimewa di seluruh MySQL (efektif, ini hanya mengganti nama root).

sekarang, Anda membuat grup apache atau pengguna dan kami akan menyebutnya apweb2. Appweb2 bukan anggota grup lain, dan semua file / folder untuk apache disimpan di / home / apweb2 /. Setiap host virtual akan memiliki subfolder sendiri dan masing-masing dari host ini akan memiliki akar dokumen yang ditetapkan ke subfolder itu. Symlink akan dinonaktifkan agar tidak secara tidak sengaja memberikan akses ke seluruh sistem.

Juga, Anda dapat membatasi akses ssh ke pengguna tertentu saja (atau grup tertentu, saya suka menempatkannya di grup ssh, dan membuat satu-satunya hal yang bisa menggunakan ssh).

Juga, Anda dapat memilih pengguna yang memiliki hak sudo untuk membatasi hal-hal lebih jauh. Langkah lain yang dapat Anda lakukan lebih lanjut adalah membuat ssh pengguna tidak dapat melakukan sudo, Anda dapat membuat pengguna khusus yang dapat menggunakan sudo yang tidak dapat menggunakan ssh, sehingga begitu Anda ssh masuk, Anda harus masuk ke pengguna lain untuk memiliki akses ke sudo.

Jadi, dengan memodulasi setiap segmen, jika ada yang disusupi, seluruh tumpukan tidak akan dikompromikan dan Anda dapat memperbaiki masalah 1 alih-alih harus memulai dari awal lagi dari awal.


4
2017-07-30 04:49





Saya menemukan dokumen ini dari SANS.org sangat membantu http://www.sans.org/score/checklists/linuxchecklist.pdf


2
2017-08-10 11:50



Selamat Datang di Server Fault! Umumnya kami menyukai jawaban di situs agar dapat berdiri sendiri - Tautan itu hebat, tetapi jika tautan itu rusak, jawabannya harus memiliki cukup informasi untuk tetap membantu. Silakan mempertimbangkan mengedit jawaban Anda untuk menyertakan lebih banyak detail. Lihat FAQ untuk info lebih lanjut. - slm


Pada saat ini, jangan mengabaikan virtualisasi kontainer, yaitu Docker, systemd-nspawn, dan mekanisme virtualisasi kontainer tempat mereka dibangun (ruang nama, grup). Menggunakan virtualisasi kontainer memungkinkan Anda mengisolasi proses, misalnya, jika salah satu layanan disusupi, penyerang tidak akan mendapatkan akses ke layanan lain.

Dalam kasus LAMP, adalah mungkin untuk menggunakan, misalnya, empat kontainer Docker dengan SSH-server, Apache, MySQL, PHP-FPM / Python / Perl / dll.


0
2017-07-27 20:00