UPDATE: 2013-01-15
W skrócie:
Konfiguracja lighttpd wraz z php5, autoryzacją na poziomie serwera www oraz przekierowaniem wybranych katalogów z http na https, a po co ? A po to, żeby bezpiecznie się autoryzować.
Sprzęt:
TP-LINK TL-WR1043ND, alternatywny firmware ze strony http://eko.one.pl, OpenWrt Backfire 10.03.1-RC6 r28934 2011-11-12, skonfigurowany extroot 2GB
1. Instalacja i konfiguracja lighthttp
2. Instalacja i konfiguracja php
3. Włączenie https w lighttpd
4. Autoryzacja w lighttpd
5. Redirect z http na https
6. Firewall
7. Literatura
1. Instalacja i konfiguracja lighthttp
Instalujemy serwer
opkg updateModyfikujemy plik konfiguracyjny
opkg install lighttpd
#/etc/lighttpd/lighttpd.confStartujemy serwer i sprawdzamy czy działa
server.document-root = "/www"
/etc/init.d/lighttpd startNastępnie stopujemy serwer WWW
/etc/init.d/lighttpd stop
2. Instalacja i konfiguracja php
Instalujemy php i moduł do lighttpd
opkg updateAby interpreter php pracował poprawnie w pliku konfiguracyjnym /etc/php.ini zmienna doc_root powinna być skonfigurowana identycznie jak zmienna server.document-root w konfiguracji lighttpd
opkg install lighttpd-mod-cgi
opkg install php5-cgi
#/etc/php.iniKonfiguracja lighttpd
doc_root = "/www"
#/etc/lighttpd/lighttpd.confTworzymy plik php i sprawdzamy czy działa
server.modules = (
...
"mod_cgi",
...
)
cgi.assign = ( ".php" => "/usr/bin/php-cgi" )
index-file.names = ( "index.html", "default.html", "index.htm", "default.htm", "index.php")
echo "<#? PHP phpinfo(); ?#>" >> /www/index.php# - usuń to - blogger parsuje kod
Aby interpretować skrypty sh dodajemy:
cgi.assign = ( ".sh" => "/bin/sh" )
3. Włączenie https w lighttpd
Instalujemy openssl i generujemy certyfikat typu self-sign
opkg update
opkg install openssl-util
cd /etc/lighttpd/
openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
chown root:root server.pem
chmod 400 server.pem
Włączenie SSL można wykonać ją na 2 sposoby:
a. Za pomocą poniższej konfiguracji lighthttp przełączy się w tryb SSL-only, oznacza to, że będzie nasłuchiwał tylko i wyłącznie na porcie 443.
#/etc/lighttpd/lighttpd.conf
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/server.pem"
W dokumentacji jest napisane, ze prawdopodobnie trzeba będzie również zmienić server.port na 443, nic podobnego, w OpenWRT (lighttpd/1.4.28 (ssl)) serwer automatycznie zabindował się do portu 443
b. Aby włączyć SSL obok normalnego HTTP czyli równolegle serwować tą samą stronę po http i https, należy dodać socket do konfiga.
$SERVER["socket"] == ":443" {4. Autoryzacja w lighttpd
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/server.pem"
}
Instalacja modułu AUTH
opkg update
opkg install lighttpd-mod-auth
Włączamy moduł auth
#/etc/lighttpd/lighttpd.conf
server.modules = (
...
"mod_auth",
...
)
## debugging
# 0 for off, 1 for 'auth-ok' messages, 2 for verbose debugging
auth.debug = 2
# definiujemy metodę autoryzacji
auth.backend = "htdigest"
# wskazujemy plik z loginami i haslami
auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd-htdigest.user"
#definiujemy gdzie obowiązuje autoryzacja: czyli katalog download, użytkownicy muszą zostać autoryzowani metodą digest, lecz zostaną wpuszczeni tylko ci, którzy należą do strefy "download area"
auth.require = ("/download/" =>
(
"method" => "digest",
"realm" => "download area",
"require" => "valid-user"
)
)
Tworzymy prosty skrypt dodający użytkowników do pliku o nazwie htdigest.sh
#!/bin/sh5. Redirect z http na https
user=$1
realm=$2
pass=$3
hash=`echo -n "$user:$realm:$pass" | md5sum | cut -b -32`
echo "$user:$realm:$hash"
#nadajemy prawa do wykonywania
chmod 755 htdigest.sh
#przykład użycia:
#./htdigest.sh[space]'login'[space]'realm'[space]'password'
./htdigest.sh 'piotr' 'download area' 'password' >>/etc/lighttpd/lighttpd-htdigest.user
Instalacja modu REDIRECT
opkg updateWłączamy moduł redirect i ustawiamy, aby podczas próby wejścia do katalogu download nastąpiło przekierowanie na ten sam adres lecz po protokole https
opkg install lighttpd-mod-redirect
#/etc/lighttpd/lighttpd.conf
server.modules = (
...
"mod_redirect",
...
)
#poniższy kod sprawi, że zostaniemy przekierowani z adresu http://serwerip/download/ na https://serwerip/download/
$SERVER["socket"] == ":80" {
$HTTP["url"] =~ "^/download/*" {
$HTTP["host"] =~ "(.*)" {
url.redirect = ( "^/(.*)" => "https://%1/$1" )
}
}
}
Jeśli chcemy przekierować wszystko z portu 80 na 443
$SERVER["socket"] == ":80" {
$HTTP["host"] =~ "(.*)" {
url.redirect = ( "^/(.*)" => "https://%1/$1" )
}
}
6. Firewall
Na koniec wypuszczenie serwera w eter, odblokowanie portu 443 lub/i 80 na firewallu na interfejsie WAN
#/etc/config/firewall
config rule
option src wan
option proto tcp
option dest_port 443
option target ACCEPT
config rule
option src wan
option proto tcp
option dest_port 80
option target ACCEPT
/etc/init.d/firewall restart
7. Literatura
http://eko.one.pl/?p=openwrt-php
http://eko.one.pl/?p=openwrt-http
http://redmine.lighttpd.net/wiki/lighttpd/Docs:SSL
http://redmine.lighttpd.net/wiki/lighttpd/HowToSimpleSSL
http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModAuth
http://redmine.lighttpd.net/wiki/lighttpd/HowToAuthenticationFromMultipleFiles
https://wiki.archlinux.org/index.php/Lighttpd_for_SSL_and_non-SSL
http://redmine.lighttpd.net/wiki/lighttpd/TutorialLighttpdAndPHP
http://redmine.lighttpd.net/wiki/lighttpd/HowToRedirectHttpToHttps
http://redmine.lighttpd.net/wiki/lighttpd/HowToRedirectWww