Mencegah aplikasi lain dari pengikatan ke port 80 dan 443

16

Minggu lalu saya mendapat telepon dari pelanggan yang ketakutan karena dia pikir situsnya diretas. Ketika saya melihat situs webnya, saya melihat apache2halaman default. Malam itu server saya ( Ubuntu 16.04 LTS) telah ditingkatkan dan di-boot ulang. Biasanya ketika terjadi kesalahan saya akan mendapat peringatan di malam hari. Kali ini tidak, karena sistem pemantauan memeriksa kode status HTTP 200, dan apache2halaman default dilengkapi dengan kode status 200.

Apa yang terjadi adalah bahwa selama startup apache2lebih cepat untuk mengikat ke port 80 dan 443 daripada server web saya yang sebenarnya nginx. Saya tidak menginstal apache2 sendiri. Melalui aptitude why apache2saya menemukan paket php7.0 memerlukannya.

Menghapus saja apache2tidak akan berhasil karena tampaknya php7.0 memerlukannya. Apakah mungkin membuat pembatasan sehingga hanya nginx yang diizinkan untuk mengikat ke port 80 dan 443?

Solusi lain lebih dari diterima juga.

Boyd
sumber
15
Dan inilah mengapa Anda harus mengonfigurasi server langsung Anda untuk hanya memperbarui ketika Anda secara eksplisit meminta pembaruan, sehingga Anda dapat terlebih dahulu menguji pembaruan Anda pada mesin pengembangan.
Nzall
2
Saya tidak menguji upgrade pada mesin uji terlebih dahulu, tetapi selalu periksa changelogs sebelum menjadwalkan upgrade secara manual . Sepertinya apache2 menyelinap melalui upgrade sebelumnya. Hanya saja kali ini reboot apache2 adalah yang pertama mengikat port http dan https.
Boyd
9
Sebagai catatan - This time not, because the monitoring system checks for HTTP status code 200. Anda dapat meningkatkan sistem pemantauan dengan membuatnya memeriksa konten aktual halaman web (beberapa string tertentu di badan atau header), ini akan lebih dapat diandalkan.
VL-80
2
@ Bob Saya tidak menguji upgrade pada mesin uji dulu, tapi selalu periksa changelogs Tapi Anda baru saja mengalami betapa tidak dapat diandalkannya metode itu. Membaca changelog tidak dapat memberi tahu Anda apa dampaknya pada sistem yang digunakan, juga tidak akan memberi tahu Anda tentang bug atau ketidakcocokan yang diperkenalkan.
Andrew Henle
5
@Nall untuk bersikap adil kedengarannya seperti masalah semacam ini mungkin tidak muncul di mesin uji ... ia secara efektif memiliki kondisi balapan, apakah apache2 atau nginx akan mengikat port, dan mesin uji secara teoritis bisa berakhir memiliki nginx menang (hanya karena kebetulan) selama pengujian sehingga masalah tidak akan ditemukan.
Doktor J

Jawaban:

29

Anda tidak dapat mencegah port terikat oleh layanan yang salah. Dalam kasus Anda, hapus saja apache dari autostart dan Anda akan menjadi baik.

Untuk 16,04 dan lebih baru:

sudo systemctl disable apache2

Untuk versi Ubuntu yang lebih lama:

sudo update-rc.d apache2 disable
Gerald Schneider
sumber
2
Saya akan melakukan ini, tetapi saya berharap dapat mempertahankan diri dari situasi di masa depan di mana paket lain yang mengikat ke port 80 dan 443 tanpa sadar diinstal pada sistem saya sebagai ketergantungan dari paket lain.
Boyd
1
Karena ini adalah 16,04, juga:systemctl disable apache2
muru
12
@ Boyd: Mengapa Anda menginstal paket secara membabi buta "tanpa sadar"? Kenapa, di server langsung Anda yang digunakan oleh pelanggan, Anda bahkan tidak membaca paket dan dependensi mana yang sedang diinstal? Dan kenapa Anda tidak menguji semuanya di server mirror sebelum menjalankan? Ini adalah prinsip operasi dasar dan akan menyelesaikan semua masalah Anda.
Lightness Races dengan Monica
6
@BoundaryImposition Ingin mempertahankan perangkat lunak yang mengikat port tidak berarti saya hanya menginstal paket secara membuta. Tapi kita juga manusia, ada kesalahan. Sayangnya kami tidak dapat menguji setiap operasi pada server dummy terlebih dahulu tetapi dalam kasus ini tidak akan langsung menunjukkan masalah, karena apache2 dipasang seminggu sebelum masalah muncul (sistem bahkan di-boot ulang sementara itu tanpa masalah ). Meskipun tidak dapat menguji setiap peningkatan, kami masih meningkatkan setiap minggu. Kami lebih suka tambalan keamanan terkini dari risiko downtime yang terbatas (melalui pemantauan).
Boyd
3
@ Boyd: "Sayangnya kami tidak dapat menguji setiap operasi pada server dummy terlebih dahulu" Kenapa tidak? Apakah pelanggan Anda mengetahui bahwa Anda melewati prosedur ini?
Lightness Races dengan Monica
27

Jika Anda benar-benar tidak menggunakan apache2, dan PHP 7.0 yang mengharuskannya, maka sepertinya Anda telah libapache2-mod-php7.0menginstalnya. Paket itu tidak berguna tanpa Apache. Karena Anda menggunakan nginx, Anda mungkin juga memiliki php7.0-fpmatau php7.0-cgidiinstal, baik yang cukup untuk memuaskan php7.0's persyaratan ketergantungan:

$ apt-cache depends php7.0
php7.0
 |Depends: php7.0-fpm
 |Depends: libapache2-mod-php7.0
  Depends: php7.0-cgi
  Depends: php7.0-common
  Conflicts: <php5>

Jika Anda telah php7.0-{fpm,cgi}menginstal salah satu , Anda dapat melanjutkan dan menghapus instalasi Apache.

muru
sumber
6
Saya memang belajar hari ini bahwa dalam situasi saya, saya lebih baik hanya menginstal php7.0-fpmdan bukan php7.0paket. Ini juga disarankan oleh Ondřej Surý github.com/oerdnj/deb.sury.org/wiki/…
Boyd
5
Ini adalah solusi nyata untuk masalah sebenarnya: Cara menginstal nginx dan PHP di Ubuntu tanpa menginstal Apache.
David Cullen
2

Untuk menjawab pertanyaan Anda, Anda mungkin dapat membatasi port ke aplikasi tertentu dengan menggunakan SElinux. Saya belum menggunakannya sendiri dan hanya memiliki pengetahuan yang dangkal tentang kemampuannya, tetapi di sini adalah sebuah pointer yang saya temukan di situs ini:

/server//a/257056/392230

Dalam jawaban itu, wzzrd tampaknya menunjukkan cara memberi izin aplikasi tertentu (foo) untuk mengikat ke port tertentu (803). Anda hanya perlu memiliki pengaturan kebijakan sehingga hanya aplikasi Anda (nginx) yang diizinkan port yang Anda tentukan (80 dan 443).

Mendasarkan diri pada jawaban wzzrd, mungkin semudah menambahkan ini ke kebijakan

allow nginx_t nginx_port_t:tcp_socket name_bind;

dan menjalankan ini

semanage port -a -t nginx_port_t -p tcp 80
semanage port -a -t nginx_port_t -p tcp 443

Meskipun, saya membayangkan Anda juga akan memerlukan garis dalam kebijakan yang menentukan bahwa tidak ada program lain yang dapat mengikat port tersebut.

Pada akhirnya, saya hanya menebak konfigurasi yang tepat.

Lagi pula, saya tidak berpikir sudah ada Ubuntu yang telah menginstal dan mengaktifkan SElinux secara default. Karena saya percaya ini membutuhkan penerapan tambalan tertentu ke berbagai utilitas dan opsi kernel, mungkin lebih mudah untuk menggunakan Centos yang memang telah menginstal dan mengaktifkan SElinux sejak awal.

Maaf, saya tidak bisa membantu lagi. Mungkin lain kali, saya akan mengunduh gambar Centos dan mencoba ini; itu akan menjadi langkah pembelajaran yang baik. Saya akan memperbarui jawaban ini jika saya melakukannya.

JoL
sumber
2
lol @ "mungkin lebih mudah menggunakan Centos"
David Cullen
2

Sesuatu yang belum saya lihat di jawaban, tetapi masih ada kemungkinan:

Ubah konfigurasi Apache untuk mendengarkan port lain, untuk berjaga-jaga. Anda dapat melakukannya dengan membuka file konfigurasi Apache, dan mengubah jalur yang ada Listen 80ke port lain.

Milan Drossaerts
sumber
Itu "memecahkan" masalah sama dengan jawaban yang diterima, tetapi dengan masalah tambahan maka harus menjelaskan / mendokumentasikan perubahan Anda. Selain itu, sementara itu memang memecahkan masalah, tidak ada yang menyelesaikan seluruh masalah. Jika apache dinonaktifkan tetapi lain kali reboot, aplikasi X mengikat ke port 80, Anda memiliki kesalahan yang sama lagi.
Darren H
0

Saya tidak punya jawaban untuk pertanyaan persis Anda, tetapi mungkin Anda perlu melihat distro Anda. Saya akan mempertimbangkan distro apa pun yang memungkinkan layanan (apache2 di sini) pada instalasi menjadi tidak aman. Pertimbangkan untuk melihat distro yang tidak melakukannya. Saya tidak bisa mengatakan saya pernah melihat perilaku itu di Archlinux, saya yakin ada orang lain.

phelbore
sumber
1
Jadi apa yang Anda rekomendasikan, untuk memformat server dan menginstal beberapa distribusi lainnya? Dan mengapa Anda percaya bahwa ubuntu tidak dapat menangani layanan tertentu, seperti yang ditunjukkan beberapa jawaban lainnya? Jawaban ini adalah komentar religius dan tidak membantu sama sekali.
Wtower
Saya tidak akan memformat server sekarang dan menginstal distribusi baru, tetapi saya pasti akan berubah waktu berikutnya saya harus memutakhirkan server. Ubuntu baru saja ditunjukkan dalam posting ini sebagai tidak cocok karena itu mengaktifkan layanan yang belum dikonfigurasi (pengecualian untuk ini akan menjadi sesuatu seperti login grafis atau layanan suara, hal-hal yang biasanya hanya berfungsi dan tidak terpapar ke internet publik ). Saya takut jawaban itu mungkin berasal dari agama yang sedikit, tetapi itu bukan maksudnya, itu mencoba menunjukkan solusi untuk apa yang saya lihat sebagai masalah yang lebih besar.
phelbore
1
Meskipun saya setuju dengan Anda bahwa distro tidak pantas untuk melakukan itu, saya pikir ini akan lebih tepat sebagai komentar, karena itu tidak benar-benar menjawab pertanyaan.
JoL
Ini poin yang adil.
Lightness Races dengan Monica