Menghosting ASP.NET Core di Linux dengan Apache

Oleh Shayne Boyer

Dengan menggunakan panduan ini, pelajari cara menyiapkan Apache sebagai server proksi terbalik di CentOS 7 untuk mengalihkan lalu lintas HTTP ke aplikasi web ASP.NET Core yang berjalan di Kestrel server. Ekstensi mod_proxy dan modul terkait membuat proksi terbalik server.

Perhatian

Artikel ini mereferensikan CentOS, distribusi Linux yang mendekati status End Of Life (EOL). Harap pertimbangkan penggunaan dan rencanakan yang sesuai. Untuk informasi selengkapnya, lihat panduan Akhir Masa Pakai CentOS.

Prasyarat

  • Server yang menjalankan CentOS 7 dengan akun pengguna standar dengan hak istimewa sudo.
  • Instal runtime .NET Core di server.
    1. Kunjungi halaman Unduh .NET Core.
    2. Pilih versi .NET Core non-pratinjau terbaru.
    3. Unduh runtime non-pratinjau terbaru dalam tabel di bawah Jalankan aplikasi - Runtime.
    4. Pilih tautan instruksi manajer Paket Linux dan ikuti instruksi CentOS.
  • Aplikasi ASP.NET Core yang ada.

Kapan saja di masa mendatang setelah meningkatkan kerangka kerja bersama, mulai ulang aplikasi ASP.NET Core yang dihosting oleh server.

Menerbitkan dan menyalin melalui aplikasi

Konfigurasikan aplikasi untuk penyebaran yang bergantung pada kerangka kerja.

Jika aplikasi dijalankan secara lokal di lingkungan Pengembangan dan tidak dikonfigurasi oleh server untuk membuat koneksi HTTPS yang aman, adopsi salah satu pendekatan berikut:

  • Konfigurasikan aplikasi untuk menangani koneksi lokal yang aman. Untuk informasi selengkapnya, lihat bagian konfigurasi HTTPS.

  • Konfigurasikan aplikasi untuk dijalankan di titik akhir yang tidak aman:

    • Nonaktifkan Middleware Pengalihan HTTPS di lingkungan Pengembangan (Program.cs):

      if (!app.Environment.IsDevelopment())
      {
          app.UseHttpsRedirection();
      }
      

      Untuk informasi lebih lanjut, lihat Menggunakan beberapa lingkungan di ASP.NET Core.

    • Hapus https://localhost:5001 (jika ada) dari applicationUrl properti dalam Properties/launchSettings.json file.

Untuk informasi selengkapnya tentang konfigurasi menurut lingkungan, lihat Menggunakan beberapa lingkungan di ASP.NET Core.

Jalankan penerbitan dotnet dari lingkungan pengembangan untuk mengemas aplikasi ke dalam direktori (misalnya, bin/Release/{TARGET FRAMEWORK MONIKER}/publish, di mana {TARGET FRAMEWORK MONIKER} tempat penampung adalah Target Framework Moniker (TFM)) yang dapat berjalan di server:

dotnet publish --configuration Release

Aplikasi ini juga dapat diterbitkan sebagai penyebaran mandiri jika Anda lebih suka tidak mempertahankan runtime .NET Core di server.

Salin aplikasi ASP.NET Core ke server menggunakan alat yang terintegrasi ke dalam alur kerja organisasi (misalnya, SCP, SFTP). Adalah umum untuk menemukan aplikasi web di bawah direktori var (misalnya, var/www/helloapp).

Catatan

Di bawah skenario penyebaran produksi, alur kerja integrasi berkelanjutan melakukan pekerjaan menerbitkan aplikasi dan menyalin aset ke server.

Mengonfigurasi server proksi

Proksi terbalik adalah penyiapan umum untuk melayani aplikasi web dinamis. Proksi terbalik mengakhiri permintaan HTTP dan meneruskannya ke aplikasi ASP.NET.

Server proksi meneruskan permintaan klien ke server lain alih-alih memenuhi permintaan itu sendiri. Proksi terbalik diteruskan ke tujuan tetap, biasanya atas nama klien arbitrer. Dalam panduan ini, Apache dikonfigurasi sebagai proksi terbalik yang berjalan di server yang sama yang Kestrel melayani aplikasi ASP.NET Core.

Karena permintaan diteruskan oleh proksi terbalik, gunakan Middleware Header yang Diteruskan dari paket Microsoft.AspNetCore.HttpOverrides . Middleware memperbarui Request.Scheme, menggunakan X-Forwarded-Proto header, sehingga URI pengalihan dan kebijakan keamanan lainnya berfungsi dengan benar.

Komponen apa pun yang bergantung pada skema, seperti autentikasi, pembuatan tautan, pengalihan, dan geolokasi, harus ditempatkan setelah memanggil Middleware Header yang Diteruskan.

Middleware Header yang Diteruskan harus dijalankan sebelum middleware lainnya. Urutan ini memastikan bahwa middleware yang mengandalkan informasi header yang diteruskan dapat menggunakan nilai header untuk pemrosesan. Untuk menjalankan Middleware Header yang Diteruskan setelah middleware diagnostik dan penanganan kesalahan, lihat Urutan Middleware Header yang Diteruskan.

Panggil UseForwardedHeaders metode di bagian Startup.Configure atas sebelum memanggil middleware lainnya. Konfigurasikan middleware untuk meneruskan X-Forwarded-For header dan X-Forwarded-Proto .

Microsoft.AspNetCore.HttpOverrides Tambahkan namespace layanan ke bagian atas file:

using Microsoft.AspNetCore.HttpOverrides;

Dalam alur pemrosesan aplikasi:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.UseAuthentication();

Jika tidak ForwardedHeadersOptions ditentukan ke middleware, header default yang akan diteruskan adalah None.

Proksi yang berjalan pada alamat loopback (127.0.0.0/8, [::1]), termasuk alamat localhost standar (127.0.0.1), dipercaya secara default. Jika proksi atau jaringan tepercaya lainnya dalam organisasi menangani permintaan antara Internet dan server web, tambahkan ke daftar KnownProxies atau KnownNetworks dengan ForwardedHeadersOptions. Contoh berikut menambahkan server proksi tepercaya di alamat IP 10.0.0.100 ke Middleware KnownProxies Header yang Diteruskan di Startup.ConfigureServices:

System.Net Tambahkan namespace layanan ke bagian atas file:

using System.Net;

Gunakan pendaftaran layanan berikut:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});

Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Core untuk bekerja dengan server proxy dan memuat penyeimbang.

Menginstal Apache

Perbarui paket CentOS ke versi stabil terbarunya:

sudo yum update -y

Instal server web Apache di CentOS dengan satu yum perintah:

sudo yum -y install httpd mod_ssl

Contoh output setelah menjalankan perintah:

Downloading packages:
httpd-2.4.6-40.el7.centos.4.x86_64.rpm               | 2.7 MB  00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : httpd-2.4.6-40.el7.centos.4.x86_64      1/1 
Verifying  : httpd-2.4.6-40.el7.centos.4.x86_64      1/1 

Installed:
httpd.x86_64 0:2.4.6-40.el7.centos.4

Complete!

Catatan

Dalam contoh ini, output mencerminkan httpd.86_64 karena versi CentOS 7 adalah 64 bit. Untuk memverifikasi di mana Apache diinstal, jalankan whereis httpd dari prompt perintah.

Mengonfigurasi Apache

File konfigurasi untuk Apache terletak di /etc/httpd/conf.d/ dalam direktori. Di Apache di Ubuntu, semua file konfigurasi host virtual disimpan di /etc/apache2/sites-available. File apa pun dengan ekstensi .conf diproses dalam urutan alfabet selain file konfigurasi modul di /etc/httpd/conf.modules.d/, yang berisi file konfigurasi apa pun yang diperlukan untuk memuat modul.

Buat file konfigurasi, bernama helloapp.conf, untuk aplikasi:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}s
</VirtualHost>

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    ServerName www.example.com
    ServerAlias *.example.com
    ErrorLog ${APACHE_LOG_DIR}/helloapp-error.log
    CustomLog ${APACHE_LOG_DIR}/helloapp-access.log common
</VirtualHost>

Catatan: Versi Apache sebelum 2.4.6 tidak memerlukan RequestHeader set berisi trailing s:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

Untuk informasi selengkapnya, lihat %{VARNAME}s di mod_headers Modul Apache.

VirtualHost Blok dapat muncul beberapa kali, dalam satu atau beberapa file di server. Dalam file konfigurasi sebelumnya, Apache menerima lalu lintas publik pada port 80. www.example.com Domain sedang dilayani, dan *.example.com alias diselesaikan ke situs web yang sama. Untuk informasi selengkapnya, lihat Dukungan host virtual berbasis nama. Permintaan diproksi pada root ke port 5000 server di 127.0.0.1. Untuk komunikasi dua arah, ProxyPass dan ProxyPassReverse diperlukan. Untuk mengubah KestrelIP/port, lihat Kestrel: Konfigurasi titik akhir.

VirtualHost Blok dapat muncul beberapa kali, dalam satu atau beberapa file di server. Dalam file konfigurasi sebelumnya, Apache menerima lalu lintas publik pada port 80. www.example.com Domain sedang dilayani, dan *.example.com alias diselesaikan ke situs web yang sama. Untuk informasi selengkapnya, lihat Dukungan host virtual berbasis nama. Permintaan diproksi pada root ke port 5000 server di 127.0.0.1. Untuk komunikasi dua arah, ProxyPass dan ProxyPassReverse diperlukan. Untuk mengubah KestrelIP/port, lihat Kestrel: Konfigurasi titik akhir.

Buat tautan simbolis ke /etc/apache2/sites-enabled direktori untuk dibaca Apache selama startup:

sudo ln -s /etc/apache2/sites-available/helloapp.conf /etc/apache2/sites-enabled/

Peringatan

Kegagalan untuk menentukan arahan ServerName yang tepat di blok VirtualHost mengekspos aplikasi Anda terhadap kerentanan keamanan. Pengikatan wildcard subdomain (misalnya, *.example.com) tidak menimbulkan risiko keamanan ini jika Anda mengontrol seluruh domain induk ( *.comdibandingkan dengan , yang rentan). Untuk informasi selengkapnya, lihat RFC 9110: Semantik HTTP (Bagian 7.2: Host dan :authority).

Pengelogan dapat dikonfigurasi per VirtualHost penggunaan ErrorLog dan CustomLog arahan. ErrorLog adalah lokasi di mana server mencatat kesalahan, dan CustomLog mengatur nama file dan format file log. Dalam hal ini, di sinilah informasi permintaan dicatat. Ada satu baris untuk setiap permintaan.

Simpan file dan uji konfigurasi. Jika semuanya berlalu, responsnya harus Syntax [OK].

sudo apachectl configtest

Mulai ulang Apache:

sudo systemctl restart httpd
sudo systemctl enable httpd

Untuk informasi selengkapnya tentang nilai direktif header, lihat Modul Apache mod_headers.

Memantau aplikasi

Apache sekarang disiapkan untuk meneruskan permintaan yang dibuat ke http://localhost:80 aplikasi ASP.NET Core yang berjalan di Kestrelhttp://127.0.0.1:5000. Namun, Apache tidak disiapkan untuk mengelola proses.Kestrel Gunakan systemd dan buat file layanan untuk memulai dan memantau aplikasi web yang mendasar. systemd adalah sistem init yang menyediakan banyak fitur canggih untuk memulai, menghentikan, dan mengelola proses.

Membuat file layanan

Buat file definisi layanan:

sudo nano /etc/systemd/system/kestrel-helloapp.service

Contoh file layanan untuk aplikasi:

[Unit]
Description=Example .NET Web API App running on CentOS 7

[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/local/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=apache
Environment=ASPNETCORE_ENVIRONMENT=Production 

[Install]
WantedBy=multi-user.target

Catatan: Atur local/bin folder untuk distribusi Anda. Beberapa versi Ubuntu memerlukan ExecStart=/usr/bin/dotnet

Dalam contoh sebelumnya, pengguna yang mengelola layanan ditentukan oleh User opsi . Pengguna (apache) harus ada dan memiliki kepemilikan file aplikasi yang tepat.

Gunakan TimeoutStopSec untuk mengonfigurasi durasi waktu untuk menunggu aplikasi dimatikan setelah menerima sinyal interupsi awal. Jika aplikasi tidak dimatikan dalam periode ini, SIGKILL dikeluarkan untuk mengakhiri aplikasi. Berikan nilai sebagai detik tanpa unit (misalnya, 150), nilai rentang waktu (misalnya, 2min 30s), atau infinity untuk menonaktifkan batas waktu. TimeoutStopSec default ke nilai DefaultTimeoutStopSec dalam file konfigurasi manajer (systemd-system.conf, system.conf.d, systemd-user.conf, user.conf.d). Batas waktu default untuk sebagian besar distribusi adalah 90 detik.

# The default value is 90 seconds for most distributions.
TimeoutStopSec=90

Beberapa nilai (misalnya, string koneksi SQL) harus diloloskan agar penyedia konfigurasi membaca variabel lingkungan. Gunakan perintah berikut untuk menghasilkan nilai yang lolos dengan benar untuk digunakan dalam file konfigurasi:

systemd-escape "<value-to-escape>"

Pemisah titik dua (:) tidak didukung dalam nama variabel lingkungan. Gunakan garis bawah ganda (__) sebagai pengganti titik dua. Penyedia konfigurasi Variabel Lingkungan mengonversi garis bawah ganda menjadi titik dua saat variabel lingkungan dibaca ke dalam konfigurasi. Dalam contoh berikut, kunci ConnectionStrings:DefaultConnection string koneksi diatur ke dalam file definisi layanan sebagai ConnectionStrings__DefaultConnection:

Pemisah titik dua (:) tidak didukung dalam nama variabel lingkungan. Gunakan garis bawah ganda (__) sebagai pengganti titik dua. Penyedia konfigurasi Variabel Lingkungan mengonversi garis bawah ganda menjadi titik dua saat variabel lingkungan dibaca ke dalam konfigurasi. Dalam contoh berikut, kunci ConnectionStrings:DefaultConnection string koneksi diatur ke dalam file definisi layanan sebagai ConnectionStrings__DefaultConnection:

Environment=ConnectionStrings__DefaultConnection={Connection String}

Simpan file dan aktifkan layanan:

sudo systemctl enable kestrel-helloapp.service

Mulai layanan dan verifikasi bahwa layanan sedang berjalan:

sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service

◝ kestrel-helloapp.service - Example .NET Web API App running on CentOS 7
    Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
    Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-helloapp.service
            └─9021 /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

Dengan proksi terbalik yang dikonfigurasi dan Kestrel dikelola melalui systemd, aplikasi web sepenuhnya dikonfigurasi dan dapat diakses dari browser di komputer lokal di http://localhost. Memeriksa header respons, header Server menunjukkan bahwa aplikasi ASP.NET Core dilayani oleh Kestrel:

HTTP/1.1 200 OK
Date: Tue, 11 Oct 2016 16:22:23 GMT
Server: Kestrel
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked

Menampilkan log

Karena aplikasi web yang digunakan Kestrel dikelola menggunakan systemd, peristiwa dan proses dicatat ke jurnal terpusat. Namun, jurnal ini mencakup entri untuk semua layanan dan proses yang dikelola oleh systemd. Untuk melihat kestrel-helloapp.serviceitem -spesifik, gunakan perintah berikut:

sudo journalctl -fu kestrel-helloapp.service

Untuk pemfilteran waktu, tentukan opsi waktu dengan perintah . Misalnya, gunakan --since today untuk memfilter hari ini atau --until 1 hour ago untuk melihat entri jam sebelumnya. Untuk informasi selengkapnya, lihat halaman pria untuk journalctl.

sudo journalctl -fu kestrel-helloapp.service --since "2016-10-18" --until "2016-10-18 04:00"

Perlindungan data

Tumpukan ASP.NET Core Data Protection digunakan oleh beberapa middleware ASP.NET Core, termasuk middleware autentikasi (misalnya, cookie middleware) dan perlindungan pemalsuan permintaan lintas situs (CSRF). Bahkan jika API Perlindungan Data tidak dipanggil oleh kode pengguna, perlindungan data harus dikonfigurasi untuk membuat penyimpanan kunci kriptografi persisten. Jika perlindungan data tidak dikonfigurasi, kunci disimpan di memori dan dibuang saat aplikasi dimulai ulang.

Jika ring kunci disimpan dalam memori saat aplikasi dimulai ulang:

  • Semua token autentikasi berbasis cookie menjadi tidak valid.
  • Pengguna diminta untuk masuk lagi pada permintaan berikutnya.
  • Data apa pun yang dilindungi dengan ring kunci tidak dapat lagi didekripsi. Ini mungkin termasuk token CSRF dan cookie ASP.NET Core MVC TempData.

Untuk mengonfigurasi perlindungan data untuk mempertahankan dan mengenkripsi cincin kunci, lihat:

Mengamankan aplikasi

Mengonfigurasi firewall

Firewalld adalah daemon dinamis untuk mengelola firewall dengan dukungan untuk zona jaringan. Port dan pemfilteran paket masih dapat dikelola oleh iptable. Firewalld harus diinstal secara default. yum dapat digunakan untuk menginstal paket atau memverifikasi paket diinstal.

sudo yum install firewalld -y

Gunakan firewalld untuk membuka hanya port yang diperlukan untuk aplikasi. Dalam hal ini, port 80 dan 443 digunakan. Perintah berikut secara permanen mengatur port 80 dan 443 untuk dibuka:

sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent

Muat ulang pengaturan firewall. Periksa layanan dan port yang tersedia di zona default. Opsi tersedia dengan memeriksa firewall-cmd -h.

sudo firewall-cmd --reload
sudo firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources: 
services: dhcpv6-client
ports: 443/tcp 80/tcp
masquerade: no
forward-ports: 
icmp-blocks: 
rich rules: 

Konfigurasi HTTPS

Mengonfigurasi aplikasi untuk koneksi lokal aman (HTTPS)

Perintah eksekusi dotnet menggunakan file aplikasiProperties/launchSettings.json, yang mengonfigurasi aplikasi untuk mendengarkan URL yang disediakan oleh applicationUrl properti (misalnya, https://localhost:5001;http://localhost:5000).

Konfigurasikan aplikasi untuk menggunakan sertifikat dalam pengembangan untuk dotnet run perintah atau lingkungan pengembangan (F5 atau Ctrl+F5 di Visual Studio Code) menggunakan salah satu pendekatan berikut:

Mengonfigurasi proksi terbalik untuk koneksi klien aman (HTTPS)

Peringatan

Konfigurasi keamanan di bagian ini adalah konfigurasi umum yang akan digunakan sebagai titik awal untuk penyesuaian lebih lanjut. Kami tidak dapat memberikan dukungan untuk alat, server, dan sistem operasi pihak ketiga. Gunakan konfigurasi di bagian ini dengan risiko Anda sendiri. Untuk informasi selengkapnya, akses sumber daya berikut:

Untuk mengonfigurasi Apache untuk HTTPS, modul mod_ssl digunakan. Ketika modul httpd diinstal, modul mod_ssl juga diinstal. Jika tidak diinstal, gunakan yum untuk menambahkannya ke konfigurasi.

sudo yum install mod_ssl

Untuk menerapkan HTTPS, instal mod_rewrite modul untuk mengaktifkan penulisan ulang URL:

sudo yum install mod_rewrite

Ubah file helloapp.conf untuk mengaktifkan komunikasi aman pada port 443.

Contoh berikut tidak mengonfigurasi server untuk mengalihkan permintaan yang tidak aman. Sebaiknya gunakan Middleware Pengalihan HTTPS. Untuk informasi selengkapnya, lihat Menerapkan HTTPS di ASP.NET Core.

Catatan

Untuk lingkungan pengembangan di mana konfigurasi server menangani pengalihan aman alih-alih Middleware Pengalihan HTTPS, sebaiknya gunakan pengalihan sementara (302) daripada pengalihan permanen (301). Penembolokan tautan dapat menyebabkan perilaku yang tidak stabil di lingkungan pengembangan.

Strict-Transport-Security Menambahkan header (HSTS) memastikan semua permintaan berikutnya yang dibuat oleh klien melalui HTTPS. Untuk panduan tentang mengatur Strict-Transport-Security header, lihat Menerapkan HTTPS di ASP.NET Core.

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:443>
    Protocols             h2 http/1.1
    ProxyPreserveHost     On
    ProxyPass             / http://127.0.0.1:5000/
    ProxyPassReverse      / http://127.0.0.1:5000/
    ErrorLog              /var/log/httpd/helloapp-error.log
    CustomLog             /var/log/httpd/helloapp-access.log common
    SSLEngine             on
    SSLProtocol           all -SSLv3 -TLSv1 -TLSv1.1
    SSLHonorCipherOrder   off
    SSLCompression        off
    SSLSessionTickets     on
    SSLUseStapling        off
    SSLCertificateFile    /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    SSLCipherSuite        ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
</VirtualHost>

Catatan

Contoh ini menggunakan sertifikat yang dihasilkan secara lokal. SSLCertificateFile harus menjadi file sertifikat utama untuk nama domain. SSLCertificateKeyFile harus menjadi file kunci yang dihasilkan saat CSR dibuat. SSLCertificateChainFile harus menjadi file sertifikat perantara (jika ada) yang disediakan oleh otoritas sertifikat.

Apache HTTP Server versi 2.4.43 atau yang lebih baru diperlukan untuk mengoperasikan server web TLS 1.3 dengan OpenSSL 1.1.1.

Catatan

Contoh sebelumnya menonaktifkan Stapling Protokol Status Sertifikat Online (OCSP). Untuk informasi dan panduan selengkapnya tentang mengaktifkan OCSP, lihat OCSP Stapling (dokumentasi Apache).

Simpan file dan uji konfigurasi:

sudo service httpd configtest

Mulai ulang Apache:

sudo systemctl restart httpd

Saran Apache tambahan

Memulai ulang aplikasi dengan pembaruan kerangka kerja bersama

Setelah meningkatkan kerangka kerja bersama di server, mulai ulang aplikasi ASP.NET Core yang dihosting oleh server.

Header tambahan

Untuk mengamankan dari serangan berbahaya, ada beberapa header yang harus dimodifikasi atau ditambahkan. Pastikan modul mod_headers diinstal:

sudo yum install mod_headers

Amankan Apache dari serangan clickjacking

Clickjacking, juga dikenal sebagai serangan redress UI, adalah serangan berbahaya di mana pengunjung situs web ditipu untuk mengklik tautan atau tombol di halaman yang berbeda dari yang saat ini mereka kunjungi. Gunakan X-FRAME-OPTIONS untuk mengamankan situs.

Untuk mengurangi serangan pembajakan klik:

  1. Edit file httpd.conf:

    sudo nano /etc/httpd/conf/httpd.conf
    

    Tambahkan baris Header append X-FRAME-OPTIONS "SAMEORIGIN".

  2. Simpan file.

  3. Mulai ulang Apache.

Sniffing jenis MIME

Header X-Content-Type-Options mencegah Internet Explorer dari MIME-sniffing (menentukan file Content-Type dari konten file). Jika server mengatur Content-Type header ke text/html dengan nosniff set opsi, Internet Explorer merender konten sebagai text/html terlepas dari konten file.

Edit file httpd.conf:

sudo nano /etc/httpd/conf/httpd.conf

Tambahkan baris Header set X-Content-Type-Options "nosniff". Simpan file. Mulai ulang Apache.

Penyeimbangan Beban

Contoh ini menunjukkan cara menyiapkan dan mengonfigurasi Apache di CentOS 7 dan Kestrel pada komputer instans yang sama. Untuk tidak memiliki satu titik kegagalan; menggunakan mod_proxy_balancer dan memodifikasi VirtualHost akan memungkinkan untuk mengelola beberapa instans aplikasi web di belakang server proksi Apache.

sudo yum install mod_proxy_balancer

Dalam file konfigurasi yang ditunjukkan di bawah ini, instans tambahan disiapkan helloapp untuk berjalan pada port 5001. Bagian Proksi diatur dengan konfigurasi penyeimbang dengan dua anggota untuk memuat byrequest keseimbangan.

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
    ProxyPass / balancer://mycluster/ 

    ProxyPassReverse / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5001/

    <Proxy balancer://mycluster>
        BalancerMember http://127.0.0.1:5000
        BalancerMember http://127.0.0.1:5001 
        ProxySet lbmethod=byrequests
    </Proxy>

    <Location />
        SetHandler balancer
    </Location>
    ErrorLog /var/log/httpd/helloapp-error.log
    CustomLog /var/log/httpd/helloapp-access.log common
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>

Batas Tarif

Menggunakan mod_ratelimit, yang termasuk dalam modul httpd , bandwidth klien dapat dibatasi:

sudo nano /etc/httpd/conf.d/ratelimit.conf

Contoh file membatasi bandwidth sebagai 600 KB/detik di bawah lokasi akar:

<IfModule mod_ratelimit.c>
    <Location />
        SetOutputFilter RATE_LIMIT
        SetEnv rate-limit 600
    </Location>
</IfModule>

Bidang header permintaan panjang

Pengaturan default server proksi biasanya membatasi bidang header permintaan menjadi 8.190 byte. Aplikasi mungkin memerlukan bidang yang lebih panjang dari default (misalnya, aplikasi yang menggunakan ID Microsoft Entra). Jika bidang yang lebih panjang diperlukan, direktif LimitRequestFieldSize server proksi memerlukan penyesuaian. Nilai yang akan diterapkan tergantung pada skenario. Untuk informasi selengkapnya, lihat dokumentasi server Anda.

Peringatan

Jangan tingkatkan nilai LimitRequestFieldSize default kecuali diperlukan. Meningkatkan nilai meningkatkan risiko serangan buffer overrun (overflow) dan Denial of Service (DoS) oleh pengguna berbahaya.

Sumber Daya Tambahan: