Apache Server Sürümünü Gizleme

Linux sistemlerle uğraşan kişilerin karşısına sıklıkla çıkması muhtemel servislerden biri de; Ngnix, Apache gibi web servisleri. Bu yazıda, Apache Server sürümünü, header bilgilerinden tamamen nasıl gizleyebileceğimizi göreceğiz.

Not: Bu yazıda, örneklerimi RHEL 9.1 (Plow) sürümü üzerinden yapacağım. Debian tabanlı dağıtımlarda, ilgileneceğiniz dosya adı farklı olacaktır. Ancak yapılandırma dosyasına ekleyeceğiniz kısım aynıdır.

TL;DR;

mod_security kur. ServerTokens Prod, SecServerSignature ” ” boş bırak. Apache restart/reload

Nessus gibi araçlarla yapılan güvenlik taramaları sonucunda, “Apache ServerTokens Information Disclosure” gibi uyarılarla karşılaşabilirsiniz. Burada sizden beklenen, Apache’nin hassas sayılabilecek bazı bilgilerini, karşı taraftan gizlemesi için birtakım düzenlemeler yapmanızdır.

Apache, bu gizleme işlemi için bir fırsat sunar. Ancak sadece belirli bir yere kadar. Gün sonunda, şayet herhangi bir Apache modülü kullanmıyorsanız, Server Name olarak Apache dönmek durumundasınız. Konuyla ilgili pek çok tartışma yapılmış. İsim gizlemenin güvenlik önlemi olmadığını savunanlar da var. Bu özelliğin mutlaka eklenmesi gerektiğini düşünenler de. Yazının sonuna, bu tartışmalarla ilgili birkaç link bırakacağım.

Sorunun Çıkış Noktası

Hızlıca bir Apache kurulumu yapıp basit bu sunucuya talep gönderelim. Bakalım karşımıza neler çıkacak:

Apache web sunucusundan gelen curl yanıtı

Şimdi de “curl” programının “-I” veya “–head” parametresini kullanarak sadece header bilgisini çekelim:

[root@rhel8-demo html]# curl -I 192.168.1.42
HTTP/1.1 200 OK
Date: Mon, 09 Oct 2023 19:31:27 GMT
Server: Apache/2.4.53 (Red Hat Enterprise Linux)
Last-Modified: Mon, 09 Oct 2023 19:28:57 GMT
ETag: "9d-6074d99f79e48"
Accept-Ranges: bytes
Content-Length: 157
Content-Type: text/html; charset=UTF-8
Apache’nin varsayılan ayarlar ile döndüğü header bilgileri

Bu çıktıya bakıldığında, kullanılan web server’ın Apache 2.4.53 olduğu ve hatta Red Hat Enterprise Linux bir cihaz üzerinde çalıştığı bilgisi görülebiliyor. İşte bu bilgilerin görünmesi, bazen can sıkıcı olabilir. Şimdi gelin, bu durumu nasıl değiştireceğimize bir göz atalım.

Apache ServerTokens Yapılandırması

Apache sunucunuzun yapılandırma dosyasında (RHEL tabanlı sistemler için varsayılan olarak /etc/httpd/conf/httpd.conf dosyası), “ServerTokens” isimli direktife müdahale ederek, Apache’nin header’da sunacağı bilgileri değiştirebilirsiniz.

ServerTokens direktifi, belirtilmediği takdirde tüm bilgileri döner. Yukarıda bir örneğini gördük. Alabileceği değerler ise şunlardır:

FullApache sürümü, OS bilgisi, PHP bilgisi gibi tüm bilgiler
ProdApache
MajorMajör sürüm numarası
MinorMinör sürüm numarası
MinApache sürümü
OSApache sürümü ve OS bilgisi
ServerTokens direktifinin döndüğü değerler

Dosyamızda bu değişiklikleri yaparak, farklı durumlar için çıktıları görelim. Tabii ki değişiklikler arasında Apache servisine restart ya da reload göndermemiz gerektiğini unutmayalım:

[root@rhel8-demo html]# vim /etc/httpd/conf/httpd.conf
[root@rhel8-demo html]# systemctl restart httpd
[root@rhel8-demo html]# echo ServerTokens Full denemesi && curl -I 192.168.1.42
ServerTokens Full denemesi
HTTP/1.1 200 OK
Date: Mon, 09 Oct 2023 19:42:24 GMT
Server: Apache/2.4.53 (Red Hat Enterprise Linux)
Last-Modified: Mon, 09 Oct 2023 19:28:57 GMT
ETag: "9d-6074d99f79e48"
Accept-Ranges: bytes
Content-Length: 157
Content-Type: text/html; charset=UTF-8

[root@rhel8-demo html]# vim /etc/httpd/conf/httpd.conf
[root@rhel8-demo html]# systemctl restart httpd
[root@rhel8-demo html]# echo ServerTokens Prod denemesi && curl -I 192.168.1.42
ServerTokens Prod denemesi
HTTP/1.1 200 OK
Date: Mon, 09 Oct 2023 19:43:05 GMT
Server: Apache
Last-Modified: Mon, 09 Oct 2023 19:28:57 GMT
ETag: "9d-6074d99f79e48"
Accept-Ranges: bytes
Content-Length: 157
Content-Type: text/html; charset=UTF-8

[root@rhel8-demo html]# vim /etc/httpd/conf/httpd.conf
[root@rhel8-demo html]# systemctl restart httpd
[root@rhel8-demo html]# echo ServerTokens Major denemesi && curl -I 192.168.1.42
ServerTokens Major denemesi
HTTP/1.1 200 OK
Date: Mon, 09 Oct 2023 19:43:38 GMT
Server: Apache/2
Last-Modified: Mon, 09 Oct 2023 19:28:57 GMT
ETag: "9d-6074d99f79e48"
Accept-Ranges: bytes
Content-Length: 157
Content-Type: text/html; charset=UTF-8
Apache ServerTokens direktifinin farklı davranışları

Görüldüğü üzere, farklı tanımlar ile farklı header bilgileri dönülmektedir. ServerTokens ile ilgili daha detaylı bilgi almak için, Apache’nın ilgili dokümanından faydalanabilirsiniz.

Apache Header Bilgisini Tamamen Gizleme (SecServerSignature)

Header bilgisini tamamen gizlemek istediğinizi varsayalım. Burada da karşınıza “SecServerSignature” direktifi geliyor. Apache yapılandırma dosyamızda şu düzenlemeyi yaparsak:

ServerTokens Prod
SecServerSignature ' '

her şey yolunda gidecekmiş gibi görünse de, bir syntax kontrolü yaptığımızda, Invalid command ‘SecServerSignature’ hatası ile karşılacağız:

[root@rhel8-demo html]# httpd -t
AH00526: Syntax error on line 37 of /etc/httpd/conf/httpd.conf:
Invalid command 'SecServerSignature', perhaps misspelled or defined by a module not included in the server configuration

Bunun çözümü ise oldukça basit. Apache’nin “mod_security” modülünü kurmamız yeterli olacaktır.

[root@rhel8-demo html]# yum install mod_security
.................
[root@rhel8-demo html]# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::a00:27ff:feff:9536%enp0s3. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Bu işlem sonrasında, SecServerSignature ile ilgili aldığımız syntax hatasının ortadan kalktığını ve konumuzda ilgisi olmayan bir uyarı ile birlikte syntax’ın doğru olduğunu gösteren bir mesajı göreceksiniz.

curl attığımızda ise:

[root@rhel8-demo html]# curl --head 192.168.1.42
HTTP/1.1 200 OK
Date: Mon, 09 Oct 2023 19:52:41 GMT
Server:
Last-Modified: Mon, 09 Oct 2023 19:28:57 GMT
ETag: "9d-6074d99f79e48"
Accept-Ranges: bytes
Content-Length: 157
Content-Type: text/html; charset=UTF-8

header bilgilerinden Apache server sürümünü ve ismini tamamen gizlediğimizi görebilirsiniz.

Dikkat!

  • Pek çok serviste olduğu gibi, Apache servisi de farklı dizinlerin altından yapılandırma dosyaları çekmektedir (include). httpd.conf dosyasında yaptığınız değişikliklerin sonucunda hiçbir tepki göremiyorsanız; servisi yeniden başlattığınızdan ve yaptığınız ayarlamaların farklı dosyalar tarafından ezilmediğinden emin olun.
  • SecServerSignature direktifini boş bıraktığınızda, aşağıdaki gibi bir hata alırsınız:
[root@rhel8-demo html]# httpd -t
AH00526: Syntax error on line 362 of /etc/httpd/conf/httpd.conf:
SecServerSignature takes one argument, the new signature of the server

Bunun sebebi olduka açıktır. Bu direktife bir argüman vermeniz gerekmektedir. Bu nedenle tırnak işaretleri arasında bir boşluk bıraktığınızdan emin olun. Bu sayede header boş dönmez, ancak boşluk döner.

Dilerseniz, SecServerSignature direktifi altını boş bırakmak yerine, farklı bir string ile de doldurabilirsiniz:

Apache custom SecServerSignature

Daha ileri yapılandırma önerileri ve ipuçları için, OWASP Secure Configuration Guide‘ın Apache ile ilgili şu kısmını okuyabilirsiniz.

Linkler