Installation Apache2, PHP5 und MySQL

Dieser Artikel widmet sich der Installation eines Apache2 mit Mod-PHP und MySQL auf einem Ubuntu 12.04-Server.
Um einen Webserver von Grund auf zu installieren, gibt es zwei Möglichkeiten. Apache2 mit Mod-PHP oder Lighttpd mit PHP-FPM.
Die Installation eines Lighty mit allem drum und dran ist im Beitrag „Installation Lighttpd mit PHP-FPM und MySQL“ ausführlich beschrieben.

Weiterlesen»

Installation Lighttpd mit PHP-FPM und MySQL

Lighttpd a.k.a. Lighty ist die schlanke Variante eines Webservers. Er hält sich mit Loggings zurück und verzichtet auf nützliche aber performance-killende Gimmicks wie das Parsen von .htaccess-Dateien usw.
Dadurch ist er gerade für umfangreiche Webauftritte die ideale Lösung.

Diese Anleitung zeigt am Beispiel eines Ubuntu 12.04-Servers, wie man den Lighty installiert, konfiguriert und mit den nötigen Modulen wie PHP-FPM, Rewrite-Funktionen und MySQL-Unterstützung versieht.

Weiterlesen»

ProFTPd mit mySQL-Anbindung auf Ubuntu einsetzen

ProFTPd ist einer der meistgenutzten FTP-Server auf Ubuntu-Systemen. Aus der Dose kann er jedoch nur mit Systembenutzern umgehen, was mitunter einen recht großen Pflegeaufwand mit sich bringt. Daher erfreut sich die MySQL-basierte Variante großer Beliebtheit. Noch einfacher in der Bedienung wird es, wenn man dem ProFTPd gleich die GID und UID des Webservers (meistens Apache2) übergibt, sodass die Dateirechte von Anfang an stimmen. Die Installation ist mit wenigen Schritten durchgeführt: Schritt 1: Die benötigten Pakete installieren

sudo apt-get install proftpd-basic proftpd-mod-mysql

Schritt 2: Apassungen in /etc/proftpd/proftpd.conf I.d.R. verlangt ProFTPd Systembenutzer, diese Abhängigkeit muss aufgelöst und ProFTPd der Umgang mit MySQL beigebracht werden. Dazu müssen die folgenden Zeilen in der mitgelieferten Konfiguration einkommentiert werden.

DefaultRoot ~
Include /etc/proftpd/sql.conf
RequireValidShell off

# SQLMinID legt die kleinste mögliche ID fest. Um ProFTPd mit dem Apache2 zu verknüpfen und dessen GID und UID meistens "33" lautete, muss dieser Wert 
# explizit definiert werden, Standard = 999. Ohne diesen Eintrag wären Uploads und Änderungen nicht möglich das sie zu Fehlern in der Berechtitigung führen würden und nur
# über ein chmod 777 umgangen werden könnten
SQLMinID 33

Schritt 3: Die Datenbank vorbereiten Man legt nun eine MySQL-Datenbank an, z.B. „proftpd“

CREATE DATABASE `proftp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

In dieser Datenbank werden zwei Tabellen angelegt, eine für die Benutzergruppen, eine für die Benutzer selbst

CREATE TABLE IF NOT EXISTS `ftpgroup` (
  `groupname` varchar(16) NOT NULL DEFAULT '',
  `gid` smallint(6) NOT NULL DEFAULT '33',
  `members` varchar(16) NOT NULL DEFAULT '',
  KEY `groupname` (`groupname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ProFTP Benutzergruppen';
CREATE TABLE IF NOT EXISTS `ftpuser` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` varchar(32) NOT NULL DEFAULT '',
  `passwd` varchar(32) NOT NULL DEFAULT '',
  `uid` smallint(6) NOT NULL DEFAULT '33',
  `gid` smallint(6) NOT NULL DEFAULT '33',
  `homedir` varchar(255) NOT NULL DEFAULT '',
  `shell` varchar(16) NOT NULL DEFAULT '/sbin/nologin',
  `count` int(11) NOT NULL DEFAULT '0',
  `accessed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` timestamp NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `userid` (`userid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='ProFTP user table' AUTO_INCREMENT=3 ;

Sinnvollerweise definiert man für die soeben angelegte Datenbank einen exklusiven Benutzer, z.B. „proftpd“ Schritt 4: Module in ProFTPd einbinden In /etc/proftpd/modules.conf müssen nun die folgenden Zeilen einkommentiert werden

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c

Es ist in diesem Schritt ebenfalls sinnvoll, die Zeile

#LoadModule mod_copy.c

auszukommentieren, da sich in diesem Modul eine Anfälligkeit für den „Propane“-Exploit versteckt, die Funktionalität dieses Moduls jedoch so gut wie nie genutzt wird.

Schritt 5: ProFTPd die Kommunikation mit MySQL beibringen In der Modulkonfiguration /etc/proftpd/sql.conf (diese enthält bei einer Installation aus dem Repository schon jede Menge auskommentierte Einträge, die man getrost ignorieren kann) werden nun innerhalb des Abschnitts […] die notwendigen Optionen definiert:

SQLBackend mysql
SQLAuthTypes Crypt
SQLConnectInfo [Datenbankname]@localhost [Benutzername] [Passwort]
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
# Den Zeitpunkt des letzten Logins aktualisieren
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

Schritt 6: Benutzer anlegen Die beiden Tabellen mit einer Benutzergruppe und einem Benutzer füllen (hier am Beispiel des Benutzers www-data für den Apache2).

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('www-data', 33, 'www-data');
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES ('', 'ftpuser', ENCRYPT('password'), 33, 33, '/var/www/default/', '/sbin/nologin', 0, '', '');

Damit kann sich der Benutzer „ftpuser“ nun mit dem Passwort „password“ anmelden und erhält Zugriff auf /var/www/default/ und dessen Unterverzeichnisse. Schritt 7: ProFTPd neu starten

sudo /etc/init.d/proftpd restart

Sollte ProFTPd nicht neu starten, kann man es mithilfe von

proftpd -nd6

manuell starten. So erhält man Debug-Informationen die einem bei der Ursachenforschung helfen können. Ansonsten sind auch die Einträge im ProFTPd-Log unter

/var/log/proftpd/proftpd.log

mitunter sehr hilfreich.

MySQL FROM_UNIXTIME und negative Timestamps

Seit der MySQL-Version 4 liefert die Funktion FROM_UNIXTIME([UNIX-Timestamp) für negative UNIX-Timestamps „NULL“ zurück. Das ist natürlich unschön, da manche Datums-Funktionen über MySQL wesentlich schneller und einfacher zu realisieren sind als bspw. mit PHP.

Abhilfe schafft hier ein kleiner Umweg über die Funktion DATE_ADD(). Diese ermöglicht es, einem beliebigen Datum eine zu definierende Zeitspanne hinzuzuaddieren.

Statt nun also der Funktion FROM_UNIXTIME() die Spalte mit dem UNIX-Timestamp als Parameter zu übergeben, kann man mit

DATE_ADD(FROM_UNIXTIME(0),INTERVAL [Spalte mit dem UNIX-Timestamp] SECOND)

dafür sorgen, dass man stets den korrekten Wert auch für Daten vor dem 01.01.1970 erhält.

SSH Fingerprint neu generieren lassen

Bei der Installation des SSH-Servers wird ein SSH Fingerprint generiert. Leider bleibt dieser beim kopieren/klonen von Maschinen bestehen. Um diesen Umstand zu beseitigen hier die Vorgehensweise anhand eines Ubuntu 12.04 LTS:

apt-get remove openssh-server

rm -f /etc/ssh/*

apt-get install openssh-server

Somit sollte der Server nun einen neuen Fingerprint haben.