Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:lighty-chrooted

Howto Lighttpd 1.4.15 + PHP5 + Perl + SSL

Author: sledge0303

Installiert wird:
Lighttpd 1.4.18 mit chrooted Webroot

Beispiel einer Passwortabfrage für ein Verzeichnis
Erstellung eines Adminbereichs mit SSL
PHP5+ PHP5-MySQL
Perl
Hinweis: aus gegebenen Anlass möchte ich darauf hinweisen, es muss bei der momentanen Konstellation in diesem Howto nur der Domainname angepasst werden.
Ich habe mir schon was dabei gedacht, wenn das SSL Zertifikat außerhalb und das Passwortverzeichniss innerhalb des Chroot Verzeichnisses installiert wird.

Stand: 31.10.2007 13:00 Uhr

Installation des Lighty

Den User für das Lighty chroot erstellen:

adduser --home /var/lighttpd --shell /bin/false --no-create-home --system --group lighty

Abhängigkeiten:

apt-get install zlib1g libmysqlclient15-dev libpcre3-dev zlib1g-dev libbz2-dev \
libssl-dev debhelper libgtkhtml2-0 libgtkhtml2-dev gcc g++ flex libcurl3-dev libxpm-dev apache2-utils \
openssl ssl-cert php5-cgi php5-common php5-mysql psmisc openssl ssl-cert

SSL Zerfitikat erstellen:

mkdir -p /etc/lighttpd/ssl
 
openssl req -new -nodes -x509 -keyout /etc/lighttpd/ssl/lighttpd.pem -out /etc/lighttpd/ssl/lighttpd.pem -days 365
chown lighty:lighty /etc/lighttpd/ssl/lighttpd.pem
chmod 600 /etc/lighttpd/ssl/lighttpd.pem

Die Prozedur mit der Erstellung verläuft so:

Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:$deinbundesland
Locality Name (eg, city) []:$deinestadt
Organization Name (eg, company) [Internet Widgits Pty Ltd]:$deinebezeichnung(firma etc)
Organizational Unit Name (eg, section) []:$gruppenname
Common Name (eg, YOUR name) []:mail.meinedomain.tld
Email Address []:$mailadmin@mainedomain.tld

Sourcen des Lighty beziehen:

cd /usr/src/
wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.gz
wget http://download.nixhelp.de/sonstiges/lighttpd-1.4.7.tar.gz

Dateien entpacken und zum kompilieren vorbereiten

tar zxf lighttpd-1.4.18.tar.gz
tar zxf lighttpd-1.4.7.tar.gz
cp -R lighttpd-1.4.7/debian lighttpd-1.4.18/
cd lighttpd-1.4.18/

Danach erstellst du diese lighttpd.conf

| debian/lighttpd.conf
cat > /usr/src/lighttpd-1.4.18/debian/lighttpd.conf << "EOF"
server.username = "lighty"
server.groupname = "lighty"
server.document-root = "/var/www/domain/htdocs/"
server.chroot = "/var/lighttpd"
server.pid-file = "/var/run/lighttpd.pid"
server.errorlog = "/var/log/lighttpd/error.log"
accesslog.filename = "/var/log/lighttpd/access.log"
server.stat-cache-engine = "simple"
server.event-handler = "linux-sysepoll"
server.name = "www.meinedomain.de"
server.max-fds = 2048
server.follow-symlink = "enable"
server.dir-listing = "disable"
server.max-keep-alive-idle = 10
compress.cache-dir = "/tmp/"
compress.filetype = ("text/plain", "text/html")
server.modules = ( 
  "mod_access", 
  "mod_status", 
  "mod_cgi",
  "mod_alias",
  "mod_auth",
  "mod_evasive",
  "mod_fastcgi",
  "mod_compress",
  "mod_accesslog" 
)
server.indexfiles = (
  "index.xhtml",
  "index.html",
  "index.htm",
  "index.php",
)
mimetype.assign = (
 ".pdf"     => "application/pdf",
 ".sig"     => "application/pgp-signature",
 ".spl"     => "application/futuresplash",
 ".class"   => "application/octet-stream",
 ".ps"      => "application/postscript",
 ".torrent" => "application/x-bittorrent",
 ".dvi"     => "application/x-dvi",
 ".pac"     => "application/x-ns-proxy-autoconfig",
 ".swf"     => "application/x-shockwave-flash",
 ".tgz"     => "application/x-tgz",
 ".mp3"     => "audio/mpeg",
 ".m3u"     => "audio/x-mpegurl",
 ".wma"     => "audio/x-ms-wma",
 ".wax"     => "audio/x-ms-wax",
 ".ogg"     => "application/ogg",
 ".wav"     => "audio/x-wav",
 ".xbm"     => "image/x-xbitmap",
 ".xpm"     => "image/x-xpixmap",
 ".xwd"     => "image/x-xwindowdump",
 ".asc"     => "text/plain",
 ".c"       => "text/plain",
 ".h"       => "text/plain",
 ".cc"      => "text/plain",
 ".cpp"     => "text/plain",
 ".hh"      => "text/plain",
 ".hpp"     => "text/plain",
 ".conf"    => "text/plain",
 ".log"     => "text/plain",
 ".text"    => "text/plain",
 ".txt"     => "text/plain",
 ".diff"    => "text/plain",
 ".patch"   => "text/plain",
 ".ebuild"  => "text/plain",
 ".eclass"  => "text/plain",
 ".rtf"     => "application/rtf",
 ".bmp"     => "image/bmp",
 ".tif"     => "image/tiff",
 ".tiff"    => "image/tiff",
 ".ico"     => "image/x-icon",
 ".mpeg"    => "video/mpeg",
 ".mpg"     => "video/mpeg",
 ".mov"     => "video/quicktime",
 ".qt"      => "video/quicktime",
 ".avi"     => "video/x-msvideo",
 ".asf"     => "video/x-ms-asf",
 ".asx"     => "video/x-ms-asf",
 ".wmv"     => "video/x-ms-wmv",
 ".tbz"     => "application/x-bzip-compressed-tar",
 ".tar.bz2" => "application/x-bzip-compressed-tar",
 ".tar.gz"  => "application/x-tgz",
 ".bz2"     => "application/x-bzip",
 ".gz"      => "application/x-gzip",
 ".tar"     => "application/x-tar",
 ".zip"     => "application/zip",
 ".jpeg"    => "image/jpeg",
 ".jpg"     => "image/jpeg",
 ".png"     => "image/png",
 ".gif"     => "image/gif",
 ".xhtml"   => "text/html",
 ".html"    => "text/html",
 ".htm"     => "text/html",
 ".dtd"     => "text/xml",
 ".xml"     => "text/xml",
 ".css"     => "text/css",
 ".js"      => "text/javascript",
 ".deb"     => "application/x-deb",
 ".php"     => "application/x-httpd-php",
 ""         => "text/plain",
)
static-file.exclude-extensions = (
 ".pl",
 ".cgi",
 ".fcgi",
 ".php",
)
url.access-deny = (
 "~",
 ".ini",
 ".inc",
 ".cfg",
 ".tpl",
 ".bak",
 ".dist",
 ".orig",
 ".htaccess",
 ".htpasswd",
 ".example",
 ".sample",
 ".lang",
)
cgi.assign = (
 ".pl"  => "/usr/bin/perl",
 ".cgi" => "/usr/bin/perl"
)
fastcgi.server = ( ".php" =>
 ( "localhost" => 
 ( 
 "socket" => "/tmp/php-fastcgi.socket",
 "bin-path" => "/usr/bin/php5-cgi"
        )
  )
)
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/etc/lighttpd/password/download.pwd"
auth.require = ("/download/" => (
  "method"  => "basic",
  "realm"   => "admin",
  "require" => "valid-user"
))
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/ssl/lighttpd.pem"
$HTTP["host"] == "admin.meinedomain.de:443" {
server.document-root = "/var/www/admin/htdocs/"
accesslog.filename = "/var/log/lighttpd/admin.log"
status.status-url = "/server-status"
status.config-url = "/server-config"
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/etc/lighttpd/password/admin.pwd"
auth.require = ("/" => (
   "method"  => "basic",
   "realm"   => "admin",
   "require" => "valid-user"
))
     }
}
EOF

Anpassung der debian/changelog:

| debian/changelog
nano debian/changelog
 
lighttpd (1.4.18) unstable; urgency=low
 
  * updated to 1.4.18
 
 -- Dein Name <deine@mail.tld>  Wed, 30 Oct 2007 12:48:00 +0200

Anpassung debian/dirs:

| debian/dirs
cat > /usr/src/lighttpd-1.4.18/debian/dirs << "EOF"
usr/bin
usr/sbin
var/lighttpd/var/www/domain/htdocs
var/lighttpd/var/www/domain/htdocs/download
var/lighttpd/var/www/admin/htdocs
var/lighttpd/dev
var/lighttpd/tmp
var/lighttpd/usr/share
var/lighttpd/etc/lighttpd/password
var/lighttpd/var/tmp
var/lighttpd/usr/bin
var/lighttpd/var/log/lighttpd
var/lighttpd/usr/lib/php5/20060613+lfs
EOF

Wir können nun das Paket bauen und installieren!!!

dpkg-buildpackage

cd ..
dpkg -i $DEBDATEI

!!!Der Lighty wird jetzt mit Fehlermeldungen den Start abbrechen. Das ist nicht weiter schlimm, die Ursachen werden nach und nach abgearbeitet!!!

Adminpasswort erstellen:

htpasswd -cmd /var/lighttpd/etc/lighttpd/password/download.pwd $downloaduser
htpasswd -cmd /var/lighttpd/etc/lighttpd/password/admin.pwd $adminuser

Wer weitere User hinzufügen möchte, muss das 'c' weglassen, also 'htpasswd -md …'

Chroot-Käfig bauen

Chroot aus dem Docroot isolieren

mknod /var/lighttpd/dev/null  c 1 3
mknod /var/lighttpd/dev/zero  c 1 3
chmod 666 /var/lighttpd/dev/null
chmod 666 /var/lighttpd/dev/zero
chmod -R 1777 /var/lighttpd/tmp
chmod -R 1777 /var/lighttpd/var/tmp
grep lighty /etc/passwd > /var/lighttpd/etc/passwd
grep lighty /etc/group > /var/lighttpd/etc/group
cp /etc/hosts /var/lighttpd/etc/
cp /etc/nsswitch.conf /var/lighttpd/etc/
cp /etc/resolv.conf /var/lighttpd/etc/
cp /etc/services /var/lighttpd/etc/
cp /etc/localtime /var/lighttpd/etc/
chown lighty:lighty /var/lighttpd/var/www
chown lighty:lighty /var/lighttpd/var/log/lighttpd

Wir kopieren die notwendigen Dateien in das chroot:

ldd /usr/bin/php5* | awk '{if ($3 ~ /^[^ (]/) print $3}' | cpio -pdvuL /var/lighttpd
ldd /usr/bin/perl | awk '{if ($3 ~ /^[^ (]/) print $3}' | cpio -pdvuL /var/lighttpd
cp /usr/bin/php5-cgi /var/lighttpd/usr/bin/
cp /usr/bin/php-cgi /var/lighttpd/usr/bin/
cp /usr/bin/perl /var/lighttpd/usr/bin/
cp -ar /usr/share/perl /var/lighttpd/usr/share/
cp -ar /usr/lib/perl/ /var/lighttpd/usr/lib/
cd /var/lighttpd/etc/
cp -ar /etc/php5 .

cp /usr/lib/php5/20060613+lfs/pdo_mysql.so /var/lighttpd/usr/lib/php5/20060613+lfs/
cp /usr/lib/php5/20060613+lfs/pdo.so /var/lighttpd/usr/lib/php5/20060613+lfs/
cp /usr/lib/php5/20060613+lfs/mysql.so /var/lighttpd/usr/lib/php5/20060613+lfs/
cp /usr/lib/php5/20060613+lfs/mysqli.so /var/lighttpd/usr/lib/php5/20060613+lfs/
cp /lib/ld-linux.so.2 /var/lighttpd/lib/

cp /lib/libpthread.so.0 /var/lighttpd/lib/
cp /lib/tls/libpthread.so.0 /var/lighttpd/lib/tls/
cp /usr/lib/libmysqlclient.so.15 /var/lighttpd/usr/lib/
cp /lib/libncurses.so.5 /var/lighttpd/lib/

Dateiberechtigung für lighttpd.conf setzen

chmod 600 /etc/lighttpd/lighttpd.conf

Lighty neu starten… diesmal fürfte es zu keiner Fehlermeldung kommen

/etc/init.d/lighttpd restart

Chroot testen

Wir testen die Funktionalität von PHP5 + mysql sowie Perl. Bei Perl sei aber gewarnt, es sind keine Module enthalten die für deine Projekte ggf. benötigt werden. Sollte es an dem sein, müssen diese händisch in das chroot kopiert werden!

| test.php und test.pl
cat > /var/lighttpd/var/www/domain/htdocs/test.php << "EOF"
<?php
phpinfo()
?>
EOF
 
cat > /var/lighttpd/var/www/domain/htdocs/test.pl << "EOF"
#!/usr/bin/perl
print "hello world!\n"
EOF
 
chmod 755 /var/lighttpd/var/www/domain/htdocs/test.pl

Beide Skripte dürften ausgeführt werden. Bei der Ausführung des Perl Skripts muss 'hello world' erscheinen.
Wenn du das PHP Testfile aufrufst, musst du in der phpinfo die Zeile suchen wo das Docroot beschrieben wird. Die Ausgabe muss dem des internen chroots entsprechen, also:

/var/www/domain/htdocs

Steht davor noch /var/lighttpd/ hast du kein funktionierendes Chroot und musst nochmal alle Schritte durchgehen, insbesonders den Teil wo die nodes erstellt werden.
Möchtest du weitere PHP Funktionen implementieren, musst du die entsprechenden Libs in das chroot kopieren, also so vorgehen wie in diesem Howto beschrieben. Wenn eine LIB fehlt, wird sich meistens der Lighty diesbezüglich zu Wort melden und dir einen Teil der Arbeit abnehmen… aber auch nicht immer!


Zurück zum Index

howto/lighty-chrooted.txt · Zuletzt geändert: 2015/04/20 15:45 (Externe Bearbeitung)

Seiten-Werkzeuge