Indiańskie sztuczki czyli Apache Tweaks

Wiele razy konfigurując Apache'a, przy tworzeniu kolejnych stron czy serwisów szukałem w sieci tych samych informacji. Aż zdecydowałem zrobić swój notatnik sztuczek związanych z Apache'm...

Indiańskie sztuczki czyli Apache Tweaks

Wiele razy konfigurując Apache'a, przy tworzeniu kolejnych stron czy serwisów szukałem w sieci tych samych informacji. Np. jak zabezpieczyć strone w budowie na hasło czy zwiększyć wartość maksymalnego uploadu na serwer. Aż zdecydowałem zrobić swój notatnik sztuczek związanych z Apache'm i rozszerzyć te moje zapiski o więcej niż lamerskie podpowiedzi na hinduskich blogach...

Wpis ten będzie aktualizowany z biegiem czasu, gdy napotkam i sprawdzę coś nowego zwiazanego z Apache'm

Zapraszam do lektury - może czymś zaskoczę - w temacie dośc utartym.

Włączenie lokalnych plików .htaccess

Allow / Deny

W celu zablokowania dostępu do danego katalogu na serwerze z poziomu przegladarki, nalezy w pliku .htaccess (w tym katalogu) umieścić poniższy wpis:

order deny,allow
deny from all
allow from none

Gdy chcemy aby tylko z konkretnych lokalizacji był dostęp należy tożsamo umieścić:

order allow,deny
allow from 1.1.1.1
deny from all

Gdy chcemy "zbanować"  jakieś lokalizacje należy:

order deny,allow
deny from 1.1.1.1
allow from all

Tworzenie hasła przy pomocy htpass

htpass -c -s ./file_with_pass_hash user_name

gdzie:
-c - tworzenie pliku passfile. Jeżeli już istnieje, zostanie nadpisany przez nowotworzony.
-s - używamy szyfrowania SHA w celu hashowania hasła.

może również być:
-B - używamy szyfrowania Bcrypt w celu hashowania hasła. To wydaje się najbezpieczniejsze obecnie w htpass.

Aby usunąć wpis hasła danego uzytkownika z pliku passfile:

htpass -D user_name

Więcej komend i opisów w podręczniku użytkownika komendy htpass:
https://httpd.apache.org/docs/2.4/programs/htpasswd.html

Ustawienie passfile z htpass w Apache'owym .htaccess

W pliku .htaccess, w lokacji, którą chcemy chronić należy umieścić:

AuthUserFile /absolete/path/to/file_with_pass_hash
AuthName My Web Site
require valid-user

Ograniczenia dostępu na hasło

  • Dostęp dla wszystkich na hasło, a tylko dla zadanych IPków bez hasła:
<IfModule mod_auth.c>
 AuthName "Username and password required"
 AuthUserFile /absolete/path/to/file_with_pass_hash
 AuthType Basic
 Require valid-user
 Order Deny,Allow
 Deny from all
 Allow from 1.1.1.1
 Allow from 1.1.1.2
 Satisfy Any
</IfModule>
  • Dostęp dla wszystkich bez hasła, a tylko dla zadanych IPków na hasło:
<IfModule mod_auth.c>
 AuthName "Username and password required"
 AuthUserFile /absolete/path/to/file_with_pass_hash
 AuthType Basic
 Require valid-user
 Order Allow,Deny
 Allow from all
 Deny from 1.1.1.1
 Deny from 1.1.1.2
 Satisfy Any
</IfModule>
  • Dostęp do danego pliku na hasło:
<IfModule mod_auth.c>
 <Files "protected.html">
  AuthName "Username and password required"
  AuthUserFile /absolete/path/to/file_with_pass_hash
  Require valid-user
  AuthType Basic
 </Files>
</IfModule>
  • Dostęp do plików o danych rozszerzeniach na hasło:
<IfModule mod_auth.c>
 <FilesMatch "\.(inc|txt|log|dat|zip|rar)$">
  AuthName "Username and password required"
  AuthUserFile /absolete/path/to/file_with_pass_hash
  Require valid-user
  AuthType Basic
 </FilesMatch>
</IfModule>

Przekierowania przy pomocy .htaccess

  • Przekierowanie z pliku file.html do nowej lokalizacji:
Redirect 301 file.html http://yourdomain.com/new/file.html
  • Przekierowanie całego katalogu:
RedirectMatch 301 /blog(.*) http://yourdomain.com/$1
  • Przekieroanie HTTP na HTTPS:
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Przekierowania Rewrite przy pomocy .htaccess

  • Przekierowanie product.php?id=12 na product-12.html:
RewriteEngine on
RewriteRule ^product-([0-9]+)\.html$ product.php?id=$1
  • Przekirowanie product.php?id=12 na product/ipod-nano/12.html
RewriteEngine on
RewriteRule ^product/([a-zA-Z0-9_-]+)/([0-9]+)\.html$ product.php?id=$2
  • Przekierowanie bez sufixu www na url z sufixem www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^viralpatel\.net$
RewriteRule (.*) http://www.viralpatel.net/$1 [R=301,L]
  • Przekierowanie yoursite.com/user.php?username=xyz na yoursite.com/xyz
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?username=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?username=$1
  • Przekierowanie domeny na nowy subfolder wewnątrz public_html
RewriteEngine On
RewriteCond %{HTTP_HOST} ^test\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.test\.com$
RewriteCond %{REQUEST_URI} !^/new/
RewriteRule (.*) /new/$1 

Wyłączenie listowania katalogów

Options -Indexes

lub

IndexIgnore *

Odmowa dostępu dla statycznych plików (obrazków, css, itd...) jeżeli pole referrer nie jest lokalne lub puste:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteCond %{HTTP_REFERER} !^http://www.askapache.com.*$ [NC]
RewriteRule \.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$ - [F,NS,L]

Limity w .htaccess

php_value upload_max_filesize 20M
php_value post_max_size 20M
php_value max_execution_time 200
php_value max_input_time 200

, gdzie

upload_max_filesize - maksymalna wielkość pliku uploadowanego
post_max_size - maksymalna wielkość przedmiotu wysyłanego POSTem
max_execution_time - maksymalny czas wykonywania w sekundach podczas sciągania plików
max_input_time - maksymalny czas wykonywania w sekundach podczas ładowania plików

Zmiana lokalnie strony kodowej

AddDefaultCharset UTF-8
DefaultLanguage pl-PL

Zabronienie zapisywania 'Zapisz jako' z poziomu przeglądarki

addType application/octet-stream .avi .mpg .mov .pdf .xls .mp4

Blokowanie requestów do strony w zależności od złych wartości User-Agent

SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT
SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT
Deny from env=HTTP_SAFE_BADBOT

Zatrzymywania złego hotlinkowania obrazków z Twojej strony:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !google. [NC]
RewriteCond %{HTTP_REFERER} !search?q=cache [NC]
RewriteCond %{HTTP_REFERER} !msn. [NC]
RewriteCond %{HTTP_REFERER} !yahoo. [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpe [L]

<IfModule mod_autoindex.c>
 IndexOptions FancyIndexing IconHeight=16 IconWidth=16
</ifModule>