wpenvolay.com/wordpress-guvenlik-onlemleri
Güncelleme 01.01.2021
Htaccess, Linux sunucularda kullanılan bir yapılandırma / bir komut dosyasıdır. Apache Web / HTTP Server sunucular için geliştirilmiş bir komut dosyası olsa da diğer Linux Serverlar’da da otomatik ve manuel olarak desteklenir. Sunucunun Güvenlik Yapılandırmalarından – Yetkilendirmelerine ve Erişim İzinlerinden URL Yönlendirmeleri / Yeniden Yazma kurallarına kadar çok esnek konfigürasyonları kapsar ve Hypertext Access’in kısaltmasıdır. Drupal, Joomla, WordPress gibi bir İçerik Yönetim Sistemi (CMS) tarafından otomatik olarak gelir ve çoğu sunucular kullanıcı tarafından düzenlenmesine / oluşturulmasına izin verir.
WordPress sisteminin temel güvenlik yapılandırmaları, ayarlar ve yönlendirmeleri için; -varsayılan olarak kabul edilebilecek- düzenlemelerini uygulamanız, hem WordPress üzerindeki işlerliliğinizi hem de temel yetkilendirme ve güvenlik önlemlerinizi garanti altına alır. Htaccess dosyası sunucunun kök klasöründe; public_html dizininde bulunur; müdahale etmeniz için FileZilla gibi bir FTP istemcisi kullanmanız veya cPanel / Plesk paneller üzerindeki Dosya Yöneticisine başvurmanız gerekir.
WordPress Default / Varsayılan Htaccess
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress |
WordPress .htaccess Kodları (WordPress Güvenlik – Temel)
Dizin Taramayı Devre Dışı Bırakın
Dizinlerdeki bütün dosyaları dışarıdan erişime kapatın: WordPress Dizin Gizleme hakkında ayrıntılı bilgi almak için WodPress’de Dizin Taramayı Devre Dışı Bırakma konusunu inceleyin
1 2 3 | # Dizin tarama devre disi Options -Indexes |
WordPress Sürümünü Gizli Tutun
Kök dizinde bulunan (public_html) ve silinse bile güncelleme sonrası yine gelen license.txt dosyası WordPress sisteminin sürümü hakkında bilgi sızdırır. Genelde sakıncalı olarak yorumlanmıyor olsa da WordPress sisteminizin sürümü; bir hacking senaryosunda kullanışlı bilgidir. Çünkü bir önceki sürümde taranmış açıklar son sürümde kapatılmış olabilirler ve dolayısıyla WordPress’in sürümünü öğrenmek girişim için kestirme bir yol açabilir. Bununla birlikte WordPress CMS kullandığınızı gizleyecek (eğer böyle bir amacınız varsa) metotlardan sadece biri olan readme.html dosyasını da engelleyebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # reddet <files license.txt> order allow,deny deny from all </files> <files readme.html> order allow,deny deny from all </files> |
Kritik PHP Dosyalarına Erişimi Engelleyin
WordPress sisteminde çekirdek dosyalara erişim; bir hack girişiminde Backdoor / Arka kapı açabilir ve olası bir açık tarafından da bu dosyalara dışarıdan müdahale edilebilir. Güvenlik açıklarının sistematik olarak kontrol edilmediğini varsaydığımızda; çekirdek dosyalarının kontrol edilmesini önceden önlemek, temel WordPress güvenliğinin en kolay ve en hızlı yoludur.
1 2 3 4 5 6 7 8 9 | # Core PHP reddet <FilesMatch "^.*(error_log|wp-config\.php|php.ini|\.[hH][tT][aApP].*)$"> Order deny,allow Deny from all </FilesMatch> |
1 2 3 4 5 6 7 | <files wp-trackback.php> order allow,deny deny from all </files> |
Hotlink Suistimallerini Engelleyin
Sitenizdeki her bir dosya download edildiğinde / görüntülendiğinde bant genişliği harcar. Dosyaların doğrudan link yapıları, başka bir web sitesi tarafından da kullanılabilir ve bu durum bant genişliğinizi çalınmasına yol açar. Aşağıdaki komutun son satırını özelleştirebilirsiniz; video / text formatlarını da buraya ekleyebilirsiniz. Example.com dosyaların görüntüleneceği adrestir; web sitenizin alan adı ile değiştirin. Dosyalarınıza doğrudan bağlantı vermesi için de google.com için izin verin.
Eğer partner siteniz ya da ikinci bir web siteniz varsa: RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] satırını kopyalayarak çoğaltın. (bu yapılandırma cPanel ve Plesk panellerde de gerçekleştirilebilir; bu paneller üzerindeki yapılandırmalar da Htaccess dosyasını düzenleyecektir)
1 2 3 4 5 6 7 8 9 10 11 12 13 | # HOTLINK bos yonlendirme icin izin ver RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC] RewriteRule \.(jpg|jpeg|png|gif|exe)$ - [NC,F,L] |
1 2 3 4 5 6 7 8 9 10 11 | # HOTLINK bos yonlendirme reddet RewriteEngine on RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC] RewriteRule \.(jpg|jpeg|png|gif|exe)$ - [NC,F,L] |
Injection / XSS Değişkenlerini Değiştirin
XSS Enjeksiyon, web sitelerinin yapısının ve görünümünün değiştirilmesine, yasaklanmış bölümlerine / dosyalarına erişimini sağlayan; böylelikle kimlik bilgilerinin çalınmasına ve ip uçlarının toplanmasına izin veren kod hatalarıdır. XSS saldırılarındaki / Siteler Arası Komut Dosyası Enjeksiyonları’ndaki bu global PHP isteklerini aşağıdaki bir kod parçacığı değiştirmeyi deneyin
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Injection / XSS degiskenler <IfModule mod_rewrite.c> RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) RewriteRule .* index.php [F,L] </IfModule> |
MySQL / Veritabanı Enjeksiyon Sorgularını Engelleyin
MySQL Injtection PHP / WordPress sistemlerine yapılan yaygın bir ataktır. Web siteniz, Dedicated Server’da / Adanmış bir sunucuda barınıyorsa, muhtemelen bu sunucudaki mod_security kuralları düzenlenmiştir. Ama web siteniz paylaşımlı bir barındırmada yer alıyorsa bu kuralları değiştirme ve kontrol etme durumunuz yok demektir. Böyle bir senaryoda, MySQL / Veritabanı Enjeksiyon temel deneme girişimlerini / sorgularını aşağıdaki kodla önlemeye çalışın
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | <IfModule mod_rewrite.c> # Enable rewrite engine RewriteEngine On # MySQL / DB INJECTION Query reddet - CODE wpenvolay.com RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC] RewriteRule ^(.*)$ - [F,L] # TimThumb Hack RewriteCond %{REQUEST_URI} (timthumb\.php|phpthumb\.php|thumb\.php|thumbs\.php) [NC] RewriteRule . - [S=1] # Supheli sorgu reddet RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|\)|\(|%0A|%0D|%22|%27|%28|%3C|%3E|%00).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR] RewriteCond %{THE_REQUEST} \?\ HTTP/ [NC,OR] RewriteCond %{THE_REQUEST} \/\*\ HTTP/ [NC,OR] RewriteCond %{THE_REQUEST} etc/passwd [NC,OR] RewriteCond %{THE_REQUEST} cgi-bin [NC,OR] RewriteCond %{THE_REQUEST} (%0A|%0D) [NC,OR] # MySQL - RFI, base64 RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http%3A%2F%2F [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR] RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR] RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR] RewriteCond %{QUERY_STRING} ftp\: [NC,OR] RewriteCond %{QUERY_STRING} http\: [NC,OR] RewriteCond %{QUERY_STRING} https\: [NC,OR] RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR] RewriteCond %{QUERY_STRING} ^(.*)/self/(.*) [NC,OR] RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*) [NC,OR] RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR] RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR] RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR] RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR] RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR] RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR] RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR] RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR] RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR] # PHP-CGI RewriteCond %{QUERY_STRING} ^(%2d|\-)[^=]+ [NC,OR] #proc/self/ RewriteCond %{QUERY_STRING} proc\/self\/environ [NC,OR] RewriteCond %{QUERY_STRING} (sp_executesql) [NC] RewriteRule ^(.*)$ - [F,L] </IfModule> |
XML – RPC Dosyasına Erişimi Engelleyin
XML – RPC, WordPress’in uzaktan veri iletimini sağlayan protokolüdür. Bu PHP dosyası, üçüncü taraf uygulamaların sisteminize erişimine izin verir. Jetpack gibi üçüncü taraf bir uygulama kullanmıyorsanız ve ne yaptığınızdan tam olarak emin değilseniz; XML – RPC DDoS ataklarına da açık hale gelebilirsiniz; böyle bir senaryoda WordPress’in bu özelliğini devre dışı bırakın.
1 2 3 4 5 6 7 8 9 | # XML - RPC reddet <files xmlrpc.php> order allow,deny deny from all </files> |
Yazar Taramalarını Engelleyin
Aslında yaygın ve krtik bir açık meydana getirmese bile -temel bir parola atak girişimi- düşünüldüğünde web sitenizdeki yazarlar (Siz – Administrator dahil) hakkında da bilgiler toplanabilir. Bu taramayı devre dışı bırakarak; hacking metotlarında kullanılan temel ip uçlarından birini daha kapatabilirsiniz
1 2 3 4 5 6 7 8 9 | # Author scan reddet RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} (author=\d+) [NC] RewriteRule .* - [F] |
Htaccess Dosyanıza Yetkisiz Erişimi Engelleyin
Sunucunuz üzerindeki açıklardan; (bunlar yalnızca sunucu üzerinde / web server üzerinde çalışan ve kontrolünüz dışında çalışan eklentilerdeki açıklar da olabilirler) yararlanılarak htaccess dosyasına da müdahale edilebilir ve yetkisiz girişimlere de doğrudan htaccess üzerinden izin verilebilir.
Apache Web Server üzerinde çalışan htaccess kodları; ne bu konudaki ne de başka bir platformdaki özelleştirilebilir kod parçacıkları ile sınırlı değildir ve bir sunucu üzerinde kritik özelleştirmelerden, kritik izinlere kadar birçok değişikliği meydana getirebilirler. Gerçi güvenlik prensiplerine dikkat eden barındırma şirketleri, paylaşımlı sunucular üzerindeki bu tür müdahaleleri göz önünde tutarlar; ama yine de aşağıdaki kod parçacığı ile bu dosya üzerinde, uzaktan bir düzenleme izni bulunmadığından emin olun.
1 2 3 4 5 6 7 8 9 10 11 | # Htcacces edit reddet <files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </files> |
Kök dizindeki – public_html dizinindeki PHP dosyalarının uzaktan erişimlere açık olmadıklarını URL üzerinde doğrulayın: example.com/wp-activate.php biçiminde direkt URL adreslerine başvurun; wp-signup.php ve diğerleri için. Eğer, açık görünüyorsa, bu dosyaların her birini ayrı olarak aşağıdaki kod parçacığı engelleyin. Benzersiz yönetici URL’si tanımlanmamış ise wp-login.php için uygulamayın.
1 2 3 4 5 6 7 | # wp-active.php reddet <files wp-active.php> order allow,deny deny from all </files> |
Bir not
Diğer birçok anlatımlarında olduğu gibi htaccess için de sıradan WordPress rehberlerinde göz doldurmak için opsiyonel yapılandırmalar yer alır. Bunlar genellikle WordPress URL Yönlendirme, IP Adreslerini Engelleme ve Yönetici Paneli İçin İzin Verilecek IP Adreslerini Belirleme gibi fonksiyonlarıdır.
WordPress’de URL yönlendirme gereksinimini duyuyorsanız muhtemelen WordPress SEO ile ilgilenmektesiniz ve ihtiyacınız olan şey bir SEO Eklentisi üzerindeki yönergelerdir. Eğer ki eski bir alan adınızı, yeni alan adınıza yönlendirmek istiyorsanız, buna daha sonra başka bir başlık altında ihtiyaç duyacaksınız demektir, çünkü SEO sizin için önemli demektir; bu durumda da htaccess’deki 301 Redirect işlevi yeterli değil demektir.
Kullanıcı IP adreslerinin yasaklanması ya da yalnızca bir IP adresine izin verilmesini temel WordPress htaccess yapılandırmasında araya sıkıştırmak; statik IP ve Dinamik IP kavramlarını atlamaktır. İnternet Servis Sağlayıcınız (ISS) tarafından özel olarak atanmış Statik / Sabit IP kullanmıyorsanız bu fonksiyonu tercih etme durumunuz olmayacaktır.
Referanslar
httpd.apache.org/docs/current/mod/
Üstad şöyle joomla, drupal, wordpress cmsleri arasında avantaj ve dezavantalarıyla ilgili teknik bir yazı çıkartabilir misin? birçok şey var nette ama bu işe hakim birisinden takip etmek kullanıcılara seçim yapmayı daha fazla kolaylaştırabilir.
olabilir. başka bir konudaki yorumda özet olarak böyle bir karşılaştırma vardı: https://wpenvolay.com/internet-sitesi-nasil-kurulur#yorum-118
Greetings! Very useful advice in this particular post.
It’s the little changes which will make the most important changes. Thanks a lot for sharing!