Strony

sobota, 19 listopada 2011

OpenWRT (Backfire) + lighttpd + PHP5 + AUTH + SSL

Instalacja i konfiguracja lighttpd i php z autoryzacją typu digest (htdigest)

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 update
opkg install lighttpd
Modyfikujemy plik konfiguracyjny
#/etc/lighttpd/lighttpd.conf
server.document-root = "/www"
Startujemy serwer i sprawdzamy czy działa
/etc/init.d/lighttpd start
Następnie stopujemy serwer WWW
/etc/init.d/lighttpd stop

2. Instalacja i konfiguracja php
Instalujemy php i moduł do lighttpd
opkg update
opkg install lighttpd-mod-cgi
opkg install php5-cgi
Aby 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
#/etc/php.ini
doc_root = "/www"
Konfiguracja lighttpd
#/etc/lighttpd/lighttpd.conf
server.modules = (
...
        "mod_cgi",
...
)
cgi.assign = ( ".php"  => "/usr/bin/php-cgi" )
index-file.names = ( "index.html", "default.html", "index.htm", "default.htm", "index.php")
Tworzymy plik php i sprawdzamy czy działa
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" {
     ssl.engine                  = "enable"
     ssl.pemfile                 = "/etc/lighttpd/server.pem"
 }
4. Autoryzacja w lighttpd
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/sh
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
5. Redirect z http na https
Instalacja modu REDIRECT
opkg update
opkg install lighttpd-mod-redirect
Włą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
#/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

czwartek, 17 listopada 2011

OpenWRT (Backfire) + lighttpd + php5 + DokuWiki

Po podstawowej konfiguracji lighttpd + php5 pobrałem stabilną wersję DokuWiki (www.dokuwiki.org)
cd /tmp
wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2011-05-25a.tgz
gzip -d dokuwiki-2011-05-25a.tgz
tar -xvf dokuwiki-2011-05-25a.tar
mv dokuwiki-2011-05-25a /home/lighttpd/ssl/html/
Przy próbie instalacji aplikacji
http://server/dokuwiki/install.php
otrzymałem błąd:
The installer found some problems, indicated below. You can not continue until you have fixed them.

    * PHP function session_start is not available. Maybe your hosting provider disabled it for some reason?
    * PHP function utf8_encode is not available. Maybe your hosting provider disabled it for some reason?
    * PHP function utf8_decode is not available. Maybe your hosting provider disabled it for some reason?

Rozwiązaniem było doinstalowanie modułów php:
opkg update
opkg install php5-mod-session
opkg install php5-mod-xml

Nie ma potrzeby ingerencji w plik konfiguracyjny /etc/php.ini
ponieważ po instalacji w lokalizacji /etc/php5/ tworzą się odpowiednie pliki konfiguracyjne .ini
root@server:~$ cat /etc/php5/session.ini
extension=session.so