Kiat untuk Mengamankan Server LAMP

Jawaban:

107

Jawaban David adalah dasar yang baik dari prinsip-prinsip umum pengerasan server. Seperti yang ditunjukkan David, ini adalah pertanyaan besar. Teknik khusus yang Anda ambil bisa sangat bergantung pada lingkungan Anda dan bagaimana server Anda akan digunakan. Peringatan, ini dapat mengambil banyak pekerjaan di lingkungan pengujian untuk membangun dan menyelesaikannya dengan benar. Diikuti oleh banyak pekerjaan untuk diintegrasikan 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 waktu yang tepat untuk membangunnya. Saya juga merekomendasikan menangani setiap komponen secara terpisah dari bawah ke atas.

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


Apache A bisa menyenangkan untuk diamankan. Saya merasa lebih mudah untuk mengeraskan OS dan mempertahankan kegunaan daripada Apache atau PHP.

Huruf M

P
Ini berjalan langsung ke seluruh gagasan Praktik Pemrograman Aman, yang merupakan disiplin sendiri. SANS dan OWASP memiliki jumlah informasi yang konyol tentang masalah ini, jadi saya tidak akan mencoba untuk mereplikasi di sini. Saya akan fokus pada konfigurasi runtime dan membiarkan pengembang Anda khawatir tentang sisanya. Terkadang 'P' dalam LAMP mengacu pada Perl, tetapi biasanya PHP. Saya mengasumsikan yang terakhir.

Scott Pack
sumber
1
Saya ingin memilih jawaban ini setidaknya 10 kali.
user58859
10
The silent N - Dengan IPTables atau firewall eksternal, memblokir koneksi jaringan hanya untuk apa yang diperlukan publik untuk diakses.
Matt
Ini harus menjadi wiki komunitas
Brian Adkins
1
Sangat mudah untuk melupakan firewall. Saya mendengar tentang seseorang yang membuat server web untuk sebuah situs web dan bahkan melakukan hacking TCP / IP stack untuk membuang lalu lintas yang bukan port 80. Hal lain yang terlewatkan adalah layanan yang tidak perlu - jika tidak perlu untuk dihidupkan, matikan.
Aaron Mason
4
@AaronMason: Selamat! Anda memiliki anekdot yang sukses. Mari kita ingat bahwa situasi spesifik Anda berhasil dengan baik, tetapi mari kita berharap pembaca di masa depan memahami lingkungan yang tidak biasa Anda. Dalam kasus umum saran ini sangat berbahaya.
Scott Pack
14

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

  1. Tetap Diperbarui. Ini berarti OS, semua layanan, dan TERUTAMA semua aplikasi web yang Anda jalankan.
  2. Nonaktifkan semua layanan yang tidak dibutuhkan, batasi layanan yang diperlukan untuk paparan minimum (jika Anda tidak terhubung ke MySQL dari jarak jauh, maka jangan didengarkan di TCP), dan jalankan firewall berbasis host. (Jika benar-benar LAMP, Anda harusnya 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 auth berbasis kunci.
  4. Pastikan Anda tidak masuk sebagai root. Masuk sebagai pengguna dan gunakan su & sudo.
  5. Meskipun tidak membuat hal-hal lebih aman, Anda harus menjalankan alat seperti logwatch sehingga Anda mengetahui apa yang terjadi di server Anda.

Semoga ini bisa membantu Anda memulai.

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

Berikut ini adalah daftar periksa yang bagus yang ingin saya mulai.

Firewall

  • Pendekatan yang bagus adalah dengan tidak mengizinkan lalu lintas untuk memulai, maka hanya buka apa yang Anda butuhkan , sesuai kebutuhan. Ini menghasilkan pembukaan port / ips minimum untuk membuat semuanya berfungsi dan yang meminimalkan eksposur Anda.
  • Untuk server LAMP, Anda mungkin 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.

SSH & Pengguna

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

Basis data

  • Sanitasi data pengguna
  • Kueri parameterisasi
  • Pertimbangkan abstrak DB untuk mesin itu sendiri. Pemisahan ini dapat mempersulit penyerang untuk mendapatkan ke tumpukan web Anda dan sebaliknya.
  • Seperti halnya perangkat lunak apa pun yang selalu terbarui adalah penting.
  • Seorang pengguna untuk setiap tujuan . Saat membuat pengguna mulai tanpa hak istimewa dan hanya menambahkan yang mereka butuhkan untuk membentuk sebelumnya peran mereka. Memiliki pengguna yang terpisah untuk aplikasi yang berbeda (atau terkadang bagian aplikasi yang berbeda) akan membantu mengurangi manfaat yang dimiliki penyerang jika mereka kompromi dengan satu akun. Juga berhati-hatilah dengan hak istimewa khusus seperti GRANT yang seharusnya tidak dianggap enteng.
  • Memiliki kebijakan untuk mengubah kata sandi secara berkala adalah ide yang bagus. Jika Anda khawatir tentang jumlah upaya yang diperlukan, ingatlah lebih jarang lebih baik daripada tidak sama sekali.
  • Memahami enkripsi kata sandi. Kata sandi garam . Jangan gunakan md5!

Perangkat lunak

  • Tetap perbarui perangkat lunak (os, server web, bahasa scripting, CMS). Banyak orang di luar sana akan memindai kerentanan yang diketahui di versi lama (belum ditonton)
  • Hapus semua perangkat lunak yang tidak Anda butuhkan (idealnya jangan menyimpan paket yang diperlukan untuk mengkompilasi perangkat lunak pada server produksi, lebih baik untuk melakukan pra-kompilasi perangkat lunak dan membuatnya tersedia sebagai paket ke mesin produksi Anda)
  • Pastikan izin file dikunci (terutama untuk hal-hal seperti unggahan pengguna dan file konfigurasi)
  • Kata sandi melindungi area admin untuk CMS di tingkat server web ( otentikasi http dapat berada 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
  • Otomatis manajemen server dan infrastruktur Anda (Sesuatu seperti Wayang, Koki atau SaltStack. Jika menggunakan AWS CloudFormation juga). Ini akan membantu Anda menambal berbagai hal di banyak server, dan mengurangi skenario seperti memperbaiki izin pada Server A tetapi lupa melakukannya di Server B
  • Jika memungkinkan jangan berikan versi khusus CMS, PHP, atau WebServer Anda. Walaupun menyembunyikan informasi ini bukan keamanan, ada banyak orang di luar sana yang memindai versi tertentu dari perangkat lunak yang berbeda dan semakin sedikit informasi yang Anda berikan secara bebas semakin banyak penyerang harus bekerja. Ini adalah cara yang baik untuk memastikan Anda bukan salah satu dari buah yang menggantung rendah. Tentu saja ini tidak akan melakukan apa-apa bagi seseorang yang ingin menghabiskan sedikit lebih banyak usaha untuk masuk
  • Batasi orang yang memiliki akses ke server
Drew Khoury
sumber
5

Menambah apa yang disarankan David, semakin modular instalasi Anda, maksud saya membatasi akses ke pengguna / grup tertentu yang dibuat khusus untuk satu tugas dan membatasi cakupannya, semakin aman tumpukan LAMP Anda: Contohnya adalah memiliki pengguna Apache untuk file / folder Apache dengan izin yang ditetapkan dan tidak dalam kelompok apa pun yang dapat mengakses file / folder sistem yang kritis. Pengguna yang dapat mengakses tabel MySql yang dikaitkan dengan situs web Anda yang akan Anda layani dan hanya tabel itu. Selain itu, Anda dapat membatasi akses mereka untuk memberikan jumlah akses minimum dari panggilan PHP. Juga, pastikan bahwa nama pengguna MySQL yang digunakan / diekspos melalui file PHP bukan nama pengguna atau kata sandi yang sama yang digunakan untuk pengguna lain.

Apa artinya ini: jika salah satu pengguna apache atau pengguna MySql dikompromikan, mereka tidak dapat melakukan kerusakan apa pun di luar ruang lingkup folder 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 bisa, misalnya, mengakses database dan menjatuhkan semua database dari MySQL dan merusak semua data Anda. Mereka MUNGKIN dalam keadaan tertentu dapat menjatuhkan tabel atau memasukkan informasi dalam beberapa tabel dalam database yang terisolasi, itulah sebabnya penting untuk hanya memberikan akses tabel di mana itu benar-benar diperlukan dan hanya memberikan izin yang diperlukan ... jika Anda tidak t perlu memiliki hak istimewa drop table atau memperbarui hak istimewa, maka jangan berikan kepada pengguna tersebut.

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

Waktu contoh! 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 tertentu dan memperbarui hak istimewa, tetapi tidak menjatuhkan atau membuat, dan tentu saja tidak . Selain itu, Anda membuat pengguna MySQL administratif lainnya dengan nama garfield untuk mengerjakan database MySQL dan Anda menghapus pengguna root dari database MySQL sehingga tidak dapat dikompromikan. garfield telah dikabulkan . hak istimewa di seluruh MySQL (secara 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 host ini akan memiliki set dokumen root diatur ke subfolder itu. Symlinks akan dinonaktifkan agar tidak secara tidak sengaja memberikan akses ke seluruh sistem.

Juga, Anda dapat membatasi akses ssh hanya untuk pengguna tertentu (atau grup tertentu, saya suka menempatkan mereka di grup ssh, dan menjadikan satu-satunya hal yang dapat menggunakan ssh).

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

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

86bulanprgmr
sumber
3

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

wsindhu
sumber
Selamat Datang di Kesalahan Server! Secara umum kami menyukai jawaban di situs untuk dapat berdiri sendiri - Tautan bagus, tetapi jika tautan itu putus, jawabannya harus memiliki informasi yang cukup untuk tetap membantu. Silakan pertimbangkan untuk mengedit jawaban Anda untuk memasukkan lebih detail. Lihat FAQ untuk info lebih lanjut.
slm
1

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

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

Quarind
sumber