<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Zugschlusbeobachtungen (Entries tagged as php)</title>
    <link>http://blog.zugschlus.de/</link>
    <description>Das persönliche Blog von Marc Haber</description>
    <dc:language>en</dc:language>
    <admin:errorReportsTo rdf:resource="mailto:mh+blog-zugschlus-de@zugschlus.de" />
    <generator>Serendipity 1.5.5 - http://www.s9y.org/</generator>
    <pubDate>Thu, 19 Oct 2006 17:01:35 GMT</pubDate>

    <image>
        <url>http://blog.zugschlus.de/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Zugschlusbeobachtungen - Das persönliche Blog von Marc Haber</title>
        <link>http://blog.zugschlus.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Serendipity 1.0.2 fixes XSS vulnerability</title>
    <link>http://blog.zugschlus.de/archives/475-Serendipity-1.0.2-fixes-XSS-vulnerability.html</link>
            <category>Meta</category>
    
    <comments>http://blog.zugschlus.de/archives/475-Serendipity-1.0.2-fixes-XSS-vulnerability.html#comments</comments>
    <wfw:comment>http://blog.zugschlus.de/wfwcomment.php?cid=475</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.zugschlus.de/rss.php?version=2.0&amp;type=comments&amp;cid=475</wfw:commentRss>
    

    <author>mh+blog-zugschlus-de@zugschlus.de (Marc 'Zugschlus' Haber)</author>
    <content:encoded>
    &lt;p&gt;
Hallo &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2123&amp;amp;entry_id=475&quot;  onmouseover=&quot;window.status=&#039;http://www.deimeke.net/dirk/blog/index.php?/archives/558-Serendipity-1.0.2-....html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;  title=&quot;externer
Link zu Dirk Deimeke&quot;&gt;Dirk,&lt;/a&gt; zu Deinem Artikel möchte ich noch hinzufügen, dass &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=2124&amp;amp;entry_id=475&quot;  onmouseover=&quot;window.status=&#039;http://blog.s9y.org/archives/147-Serendipity-1.0.2-and-1.1-beta5-released.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;  title=&quot;externer Link zum
s9y-Blog&quot;&gt;Serendipity 1.0.2&lt;/a&gt; ein Security-Update ist, das &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url=aHR0cDovL3d3dy5oYXJkZW5lZC1waHAubmV0L2Fkdmlzb3J5XzExMjAwNi4xMzYuaHRtbA==&amp;amp;entry_id=475&quot;  onmouseover=&quot;window.status=&#039;http://www.hardened-php.net/advisory_112006.136.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;  title=&quot;externer Link zum Advisory von Stefan Esser&quot;&gt;XSS
Vulnerabilities&lt;/a&gt; behebt.
&lt;/p&gt;
&lt;p&gt;
Man möchte dieses Update also nicht verzögern, sondern unverzüglich installieren!
&lt;/p&gt;
  
    </content:encoded>

    <pubDate>Thu, 19 Oct 2006 19:01:35 +0200</pubDate>
    <guid isPermaLink="false">http://blog.zugschlus.de/archives/475-guid.html</guid>
    <category>advisory</category>
<category>php</category>
<category>s9y</category>
<category>security</category>
<category>xss</category>

</item>
<item>
    <title>What is REQUEST_URI supposed to be?</title>
    <link>http://blog.zugschlus.de/archives/441-What-is-REQUEST_URI-supposed-to-be.html</link>
            <category>Freie Software</category>
    
    <comments>http://blog.zugschlus.de/archives/441-What-is-REQUEST_URI-supposed-to-be.html#comments</comments>
    <wfw:comment>http://blog.zugschlus.de/wfwcomment.php?cid=441</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://blog.zugschlus.de/rss.php?version=2.0&amp;type=comments&amp;cid=441</wfw:commentRss>
    

    <author>mh+blog-zugschlus-de@zugschlus.de (Marc 'Zugschlus' Haber)</author>
    <content:encoded>
    &lt;p&gt;
While evaluating &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2089&amp;amp;entry_id=441&quot;  onmouseover=&quot;window.status=&#039;http://gallery.menalto.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;  title=&quot;External Link to gallery.menalto.com&quot;&gt;Gallery,&lt;/a&gt; I
noticed that my test web server generates wrong links inside the web application. After getting some help on the Gallery
Forum, I was told that this was because my setup was miscreating REQUEST_URI to contain the entire URI, consisting of
scheme, host name and path, while Gallery expects that variable to be only the path portion of the URI.
&lt;/p&gt;
 &lt;p&gt;
Since REQUEST_URI is fine when I ask the web server running the application directly from the host in question, while
accessing it from my local machine through an ssh tunnel (since the application web server is not going to be publicly
visible on the Internet) yields the full URI in REQUEST_URI
&lt;/p&gt;
&lt;p&gt;
Unfortunately, neither is the &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2090&amp;amp;entry_id=441&quot;  onmouseover=&quot;window.status=&#039;http://www.php.net/manual/en/reserved.variables.php&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;  title=&quot;External Link to the
PHP docs&quot;&gt;PHP Documentation&lt;/a&gt; especially verbose (it just says that REQUEST_URI is &amp;#8220;The URI which was given in
order to access this page; for instance, &amp;#8216;/index.html&amp;#8217;.&amp;#8221;) nor is the apache documentation formally
defining REQUEST_URI (the closest to a definition being &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2443&amp;amp;entry_id=441&quot;  onmouseover=&quot;window.status=&#039;http://httpd.apache.org/docs/2.0/mod/mod_setenvif.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;
 title=&quot;External link to apache httpd documentation&quot;&gt;the documentation for mod_setenvif,&lt;/a&gt; which says that REQUEST_URI
is &amp;#8220;generally the portion of the URL following the scheme and host portion without the query string&amp;#8221;).
&lt;/p&gt;
&lt;p&gt;
Did I miss a more formal documentation of apache/PHP&amp;#8217;s behavior? Pointers appreciated.
&lt;/p&gt;
&lt;p&gt;
While I was writing this blog entry, which was a lot more angry in its first version, the Gallery guys finally
acknowledged that apache and PHP are not sufficiently specifying REQUEST_URI and that I have delivered a valid example
where there is a host part in REQUEST_URI. They&amp;#8217;re going to work around this. Good news, thanks!
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
The promised fix is in gallery2 svn, I have applied the patch to my local version, and the application is fine now.
Thanks!
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
Comments to this article were closed in July 2012, this article is getting an obscene amount of spam
&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Tue, 12 Sep 2006 16:01:46 +0200</pubDate>
    <guid isPermaLink="false">http://blog.zugschlus.de/archives/441-guid.html</guid>
    <category>apache</category>
<category>debian-english</category>
<category>english</category>
<category>php</category>

</item>
<item>
    <title>Trennung von Webapplikationen mit Extrainstanzen des Apache</title>
    <link>http://blog.zugschlus.de/archives/324-Trennung-von-Webapplikationen-mit-Extrainstanzen-des-Apache.html</link>
            <category>Computer und Netze</category>
    
    <comments>http://blog.zugschlus.de/archives/324-Trennung-von-Webapplikationen-mit-Extrainstanzen-des-Apache.html#comments</comments>
    <wfw:comment>http://blog.zugschlus.de/wfwcomment.php?cid=324</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.zugschlus.de/rss.php?version=2.0&amp;type=comments&amp;cid=324</wfw:commentRss>
    

    <author>mh+blog-zugschlus-de@zugschlus.de (Marc 'Zugschlus' Haber)</author>
    <content:encoded>
    &lt;p&gt;Die Artikelreihe zum Thema &amp;#8220;Trennung von Webanwendungen untereinander&amp;#8221;, die mit &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=2413&amp;amp;entry_id=324&quot; title=&quot;http://blog.zugschlus.de/archives/286-fteastcgi.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/286-fteastcgi.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;fastcgi,&lt;/a&gt; &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1700&amp;amp;entry_id=324&quot; title=&quot;http://blog.zugschlus.de/archives/276-suphp.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/276-suphp.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;suphp&lt;/a&gt; und zwei Artikeln über das &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1701&amp;amp;entry_id=324&quot; title=&quot;http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;klassische&lt;/a&gt; &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1702&amp;amp;entry_id=324&quot; title=&quot;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;suexec&lt;/a&gt; begann, findet heute ihren
vorläufigen Abschluss mit dem Setup, für das ich mich letztendlich entschieden habe.
&lt;/p&gt;
&lt;p&gt;
Da auf dem von mir angepeilten Zielsystem nur eine Handvoll Präsenzen mit ähnlich wenigen verschiedenen Webanwendungen
ins Hosting kommen wird, könnte ich mich für eine Lösung entscheiden, deren Skalierungsverhalten sie für
&amp;#8220;richtiges&amp;#8221; Hosting uninteressant macht. Jede Webapplikation bekommt einen eigenen apache, der gleich unter
einer nicht priviligierten uid gestartet wird und auf einem hohen Port von 127.0.0.1 Verbindungen annimmt. Das Mapping
auf die &amp;#8220;offizielle&amp;#8221; IP und Port 80 übernimmt ein zentraler &amp;#8220;normaler&amp;#8221; apache als reverse
proxy.
&lt;/p&gt;
&lt;p&gt;
Dieser Artikel entstand ursprünglich im Jahr 2006. Fünf Jahre später hat auch Debian es geschafft, mehrere
apache-Instanzen &amp;#8220;ordentlich&amp;#8221; zu unterstützen, und ganz ohne gepatchte Scripts. Diese überarbeitete
Version dieses Artikels beschreibt die Vorgehensweise unter dem in 2011 aktuellen Debian squeeze.
&lt;/p&gt;
 &lt;p&gt;Das ganze Verfahren unter Debian stable mit apache2 zu implementieren war verhältnismäßig einfach. Ich habe mich
bemüht, die Arbeit der Debian-Maintainer so weit wie möglich zu nutzen, da mir das Packaging von apache2
außerordentlich gut gefällt. Also sind ein &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url=aHR0cDovL2J1Z3MuZGViaWFuLm9yZy8zNDk3MDk=&amp;amp;entry_id=324&quot; title=&quot;http://bugs.debian.org/349709&quot;  onmouseover=&quot;window.status=&#039;http://bugs.debian.org/349709&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;patch gegen &lt;font face=&quot;courier
new,courier,monospace&quot;&gt;apache2ctl&lt;/font&gt;,&lt;/a&gt; ein &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url=aHR0cDovL2J1Z3MuZGViaWFuLm9yZy8zNDk3MTY=&amp;amp;entry_id=324&quot; title=&quot;http://bugs.debian.org/349716&quot;  onmouseover=&quot;window.status=&#039;http://bugs.debian.org/349716&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;kompletter Rewrite von &lt;font
face=&quot;courier new,courier,monospace&quot;&gt;a2[en|dis][mod|site]&lt;/font&gt;&lt;/a&gt; und ein &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1703&amp;amp;entry_id=324&quot; title=&quot;http://bugs.debian.org/353450&quot;  onmouseover=&quot;window.status=&#039;http://bugs.debian.org/353450&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;severely patched initscript&lt;/a&gt; dabei rausgekommen, mit deren Hilfe das Management
der vielen verschiedenen Apaches einfach geworden ist. Debian hat meine Patches natürlich nicht 1:1 übernommen, aber
inzwischen geht es auch ohne gepatchte scripts.&lt;/p&gt;

&lt;p&gt;Auf dem Zielsystem setzen wir das Verfahren wie folgt ein:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jeder Apache bekommt einen eigenen Unix-User (&lt;font face=&quot;courier new,courier,monospace&quot;&gt;user-appname&lt;/font&gt;) mit
eigenem Homedirectory.&lt;/li&gt;
&lt;li&gt;In diesem Homedirectory kann der User &lt;u&gt;nicht&lt;/u&gt; schreiben, die Dateien dort gehören &lt;font face=&quot;courier
new,courier,monospace&quot;&gt;user:user-webapps&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;unter &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/home/user-appname/apache&lt;/font&gt; wird eine abgespeckte
Apache-Konfiguration hinterlegt, in der auch konfiguriert ist, dass der apache untr dem Account &lt;font face=&quot;courier
new,courier,monospace&quot;&gt;user-appname&lt;/font&gt; laufen und auf einem hohen Port unter 127.0.0.1 horchen soll.&lt;/li&gt;
&lt;li&gt;Diese Konfiguration wird nach &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/etc/apache2-user&lt;/font&gt; verlinkt&lt;/li&gt;
&lt;li&gt;Ein spezielles Initscript &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/etc/init.d/apache2-user&lt;/font&gt; wird aus &lt;font
face=&quot;courier new,courier,monospace&quot;&gt;/usr/share/doc/apache2.2-common/examples/secondary-init-script&lt;/font&gt; (z.B. mit
&lt;font face=&quot;courier new,courier,monospace&quot;&gt;/usr/share/doc/apache2.2-common/examples/setup-instance&lt;/font&gt;) erzeugt&lt;/li&gt;
&lt;li&gt;Mit &lt;font face=&quot;courier new,courier,monospace&quot;&gt;insserv apache2-user&lt;/font&gt; wird das Initscript aktiviert und an der
passenden Stelle in die dependency-based Bootreihenfolge eingehängt&lt;/li&gt;
&lt;li&gt;Die Applikation liegt in &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/home/user-appname/applikation&lt;/font&gt;.&lt;/li&gt;
&lt;li&gt;Apache-Module lassen sich mit dem erweiterten &lt;font face=&quot;courier new,courier,monospace&quot;&gt;a2enmod&lt;/font&gt; einfach
lokal aktivieren.&lt;/li&gt;
&lt;li&gt;Der Apache lässt sich dann mit dem erweiterten Initscript einfach unabhängig von den anderen apaches
starten.&lt;/li&gt;
&lt;li&gt;Der &amp;#8220;Haupt-Apache&amp;#8221; wird per &lt;font face=&quot;courier new,courier,monospace&quot;&gt;ProxyPass&lt;/font&gt; und &lt;font
face=&quot;courier new,courier,monospace&quot;&gt;ProxyPassReverse&lt;/font&gt; so konfiguriert, dass Zugriffe auf den entsprechenden
Namensraum zum &amp;#8220;richtigen&amp;#8221; User-apache weitergereicht werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;font face=&quot;courier new,courier,monospace&quot;&gt;mod_rpaf&lt;/font&gt; sorgt in den Applikations-Apachen dafür, dass die vom
Proxy übermittelten Client-IPs in den Logs landen und IP-basierte Auswertungsmechanismen (z.B. zur Spamabwehr)
funktionieren.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Auf diese Weise ist sichergestellt, dass die Webapplikationen getrennt voneinander laufen. Per Rechtevergabe im
Dateisystem kann man nun erreichen, dass eine Webapplikation nur dort lesen und schreiben kann, wo es unbedingt
notwendig ist. Die apache-Konfiguration kann entsprechend abgespeckt sein.&lt;/p&gt;
&lt;p&gt;Diese Lösung hat natürlich auch ein paar Nachteile, zum Beispiel den exorbitanten Speicherbedarf duch die wirlich
vielen apache-Prozesse im Speicher und die Tatsache, dass manche Webapplikationen sich herausgefordert fühlen, wenn
plötzlich Portnummern in den URLs stehen und der Client mit anderen URIs kommt als man selbst weggeschickt hat. Weitere
Nachteile sind mir in den fünf Jahren, die das Setup auf dem Zielsystem so bereits in Verwendung ist, bis heute nicht
aufgefallen.&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Wenn die Applikation Cookies benutzt, ist zu beachten, dass die Applikation ihre Cookies mit einer Domain versieht, und
zwar in der Regel mit 127.0.0.1:x, weil der Applikations-Apache nicht weiß, unter welchem Domainnamen der Server
letztendlich läuft. Das hat mich mit meinem Blog einige Tage Debuggingarbeit gekostet, und ohne die Hilfe von Garvin,
Isotopp, Rince und anderem wäre das niemals erfolgreich gewesen.
&lt;/p&gt;
&lt;p&gt;
Die Lösung ist in der Konfiguration des Reverse Proxy:
&lt;blockquote&gt;
&lt;pre&gt;
ProxyPassReverseCookieDomain 127.0.0.1:1312 blog.zugschlus.de 
ProxyPassReverseCookieDomain 127.0.0.1 blog.zugschlus.de 
&lt;/pre&gt;
&lt;/blockquote&gt;
Der doppelte ProxyPassReverseCookieDomain ist nötig, weil aus irgendwelchen gründen manche Cookies mit und manche ohne
Portnummer gesendet werden. 
&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Sat, 18 Feb 2006 16:21:24 +0100</pubDate>
    <guid isPermaLink="false">http://blog.zugschlus.de/archives/324-guid.html</guid>
    <category>apache</category>
<category>php</category>
<category>security</category>
<category>webapps</category>

</item>
<item>
    <title>fastcgi</title>
    <link>http://blog.zugschlus.de/archives/286-fastcgi.html</link>
            <category>Freie Software</category>
    
    <comments>http://blog.zugschlus.de/archives/286-fastcgi.html#comments</comments>
    <wfw:comment>http://blog.zugschlus.de/wfwcomment.php?cid=286</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>http://blog.zugschlus.de/rss.php?version=2.0&amp;type=comments&amp;cid=286</wfw:commentRss>
    

    <author>mh+blog-zugschlus-de@zugschlus.de (Marc 'Zugschlus' Haber)</author>
    <content:encoded>
    &lt;p&gt;In Fortsetzung der &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2156&amp;amp;entry_id=286&quot; title=&quot;http://blog.zugschlus.de/archives/276-suphp.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/276-suphp.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; onclick=&quot;window.open(this.href,
&#039;_blank&#039;); return false;&quot;&gt;Artikelreihe&lt;/a&gt; zur &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=2157&amp;amp;entry_id=286&quot; title=&quot;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; onclick=&quot;window.open(this.href, &#039;_blank&#039;);
return false;&quot;&gt;Entfernung&lt;/a&gt; von &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2158&amp;amp;entry_id=286&quot; title=&quot;http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;
onclick=&quot;window.open(this.href, &#039;_blank&#039;); return false;&quot;&gt;PHP-Scripts&lt;/a&gt; aus dem Accountkontext des Webservers ist
heute FastCGI an der Reihe.&lt;/p&gt;

&lt;p&gt;Kurzzusammenfassung aus der Theorie: Es ist vermutlich performanter als suexec und suphp, bringt aber weder
Erleichterung in der Handhabung noch in der Sicherheit.&lt;/p&gt;

&lt;p&gt;In diesem Artikel bekommt auch das debianhowto.de apache2-php-fcgi-HOWTO sein Fett weg.&lt;/p&gt;

 &lt;p&gt;Auf der Suche nach Dokumentation zu diesem Thema landet man recht schnell beim&lt;br /&gt;
&lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2159&amp;amp;entry_id=286&quot; title=&quot;http://www.debianhowto.de/de:howtos:sarge:apache2_php-fcgi&quot;  onmouseover=&quot;window.status=&#039;http://www.debianhowto.de/de:howtos:sarge:apache2_php-fcgi&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; onclick=&quot;window.open(this.href, &#039;_blank&#039;); return
false;&quot;&gt;debianhowto.de HOWTO für apache2 mit PHP 4/5 als FastCGI&lt;/a&gt;. Mit den Jungs von Debianhowto bin ich ja &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url=aHR0cDovL2Jsb2cuenVnc2NobHVzLmRlL2FyY2hpdmVzLzI1Ny1QZXJzb25hbGx5LWRyb3BwaW5nLXN1cHBvcnQtZm9yLXVzZXJzLW9mLWRlYmlhbmhvd3RvLmRlLWV4aW0tY29uZmlndXJhdGlvbi5odG1s&amp;amp;entry_id=286&quot; title=&quot;http://blog.zugschlus.de/archives/257-Personally-dropping-support-for-users-of-debianhowto.de-exim-configuration.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/257-Personally-dropping-support-for-users-of-debianhowto.de-exim-configuration.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;in
der Vergangenheit&lt;/a&gt;&lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url=aHR0cDovL2Jsb2cuenVnc2NobHVzLmRlL2FyY2hpdmVzLzI1Ny1QZXJzb25hbGx5LWRyb3BwaW5nLXN1cHBvcnQtZm9yLXVzZXJzLW9mLWRlYmlhbmhvd3RvLmRlLWV4aW0tY29uZmlndXJhdGlvbi5odG1s&amp;amp;entry_id=286&quot; title=&quot;http://blog.zugschlus.de/archives/257-Personally-dropping-support-for-users-of-debianhowto.de-exim-configuration.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/257-Personally-dropping-support-for-users-of-debianhowto.de-exim-configuration.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;
onclick=&quot;window.open(this.href, &#039;_blank&#039;); return false;&quot;&gt;&lt;/a&gt; schon einmal aneinander geraten, aber im Vergleich zu
diesem Machwerk ist das exim4-vexim-HOWTO gerade noch harmlos.&lt;/p&gt;

&lt;p&gt;Das HOWTO ist ein reines HOWTO im &amp;#8220;übelsten&amp;#8221; Sinne: Es wird mit kaum einem Wort erklärt, was die 1:1
abtippbaren Dinge überhaupt machen. Damit mag man vielleicht schnell ans Ziel kommen, aber sobald man aus irgend
welchen Gründen vom Weg des HOWTO abweichen muss, wird man mangels Hintergrundwissen auf die Schnauze fallen. Einige
Fallen sind zwar im HOWTO erwähnt, aber ich finde es sportlich, dass man davon ausgeht, dass jeder, der jemals in
Zukunft mit dem so eingerichteten System arbeiten wird, auch mit dem HOWTO vertraut ist.&lt;/p&gt;

&lt;p&gt;Vorteile von PHP per FastCGI:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;PHP mit FastCGI ist thread safe, das apache2 worker-mpm wird einsetzbar.&lt;/li&gt;&lt;li&gt;Dadurch, dass - wie bei mod_php
- der PHP-Interpreter geladen bleibt, ist die Performanz besser als bei suexec oder suphp, wo der PHP-Interpeter als CGI
läuft und für jeden Aufruf neu geladen und initialisiert werden muss. Bei FastCGI erfolgt dies allerdings nicht auf
einer per-Webserver, sondern auf einer per-Vhost-Basis, so dass die geladenen Interpreter mit den richtigen
Benutzerrechten laufen können.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Nachteile&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;mod_fastcgi steht unter einer seltsamen Lizenz, die im Debian-Projekt unter non-free geführt wird. Das
bedeutet, dass es für mod_fastcgi nicht den aus Debian gewöhnten guten Support gibt.&lt;/li&gt;&lt;li&gt; Der
Benutzerkontextwechsel wird mit mod_suexec erreicht und hat somit alle Nachteile, die suexec mit sich bringt.&lt;/li&gt;&lt;li&gt;
mod_fastcgi ist in der Version 2.4.2 (Debian stable, testing, unstable, Stand 2005/12) fehlerhaft und funktioniert nicht
mit apache. Es ist also derzeit der Einsatz eines Development-Snapshots notwendig. Wirklich maintained sieht mod_fastcgi
ausserdem nicht aus, der letzte Release ist aus dem Jahr 2003, der &amp;#8220;aktuelle&amp;#8221; Development-Snapshot aus dem
April 2004.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Probleme, die ich mit dem HOWTO sehe&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Die Zusammenhänge werden so gut wie gar nicht erklärt.
&lt;/li&gt;
&lt;li&gt;
Ebenso wird nicht erklärt, was die einzelnen Konfigurationsschritte nun wirklich tun.
&lt;/li&gt;
&lt;li&gt;
Es wird genau erklärt, wie man sich ein eigenes PHP5 baut, ohne dass darauf hingewiesen wird, dass man auf diese Weise
den Support von Debian verliert.  Immerhin wird der User dazu angehalten, sein lokales PHP nach $HOME zu installieren,
und bei der Anleitung zur Installation der &lt;a href=&quot;http://blog.zugschlus.de/exit.php?url_id=2160&amp;amp;entry_id=286&quot; title=&quot;http://people.debian.org/~dexter&quot;  onmouseover=&quot;window.status=&#039;http://people.debian.org/~dexter&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;inoffiziellen PHP5-Pakete&lt;/a&gt;
fehlt auch der Hinweis auf den mangelnden Security-Support nicht.
&lt;/li&gt;
&lt;li&gt;
Die Aussage, dass es kein fcgi-enabletes php4-cgi in Debian sarge gibt, halte ich für falsch. Zumindest erhalte ich
beim Aufruf von php4-cgi -i auf einem Debian sarge die Ausgabe &amp;#8220;ServerAPI: CGI/FastCGI&amp;#8221;.
&lt;/li&gt;
&lt;li&gt;Der &amp;#8220;aktuelle&amp;#8221; Development-Snapshot wird von den HOWTO-Usern ohne Sonderprefix unter Umgehung des
Packagesystems direkt nach /usr geballert.
&lt;/li&gt;
&lt;li&gt;
Weiter unten wird erwähnt, dass es in Debian sarge ein libapache2-mod-fastcgi gibt. Das ist allerdings genau die
fehlerhafte Version 2.4.2, die laut der Aussage zwei Bildschirmseiten weiter oben &amp;#8220;nicht funktioniert&amp;#8221;,
leider ohne weitere Erklärung des Fehlverhaltens.
&lt;/li&gt;
&lt;li&gt;
Von a2enmod und a2ensite scheint der HOWTO-Autor nix zu wissen
&lt;/li&gt;
&lt;li&gt;Später wird mit dem Immuteable-Bit hantiert, und hier wird&amp;#8217;s dann vollends gefährlich.
&lt;ul&gt;
&lt;li&gt; Arbeitet man auf einem Filesystem, das das Immuteable-Bit unterstützt, ist die Aktion noch halbwegs sauber.
&lt;/li&gt;
&lt;li&gt;
Böse Falle für Leute, die später das System in die Hand bekommen ist, dass Kopieren des Dateibaums des virtuellen
Hosts das Immuteable-Bit nicht mitkopiert. Sprich: In einem simpel mit cp -a kopierten Baum fehler dieses Bit auf den
betroffenen Dateien, was ein riesengroßes Sicherheitsloch aufreißt. Das ist zwar im HOWTO klar erklärt, aber wie
gesagt - derjenige, der den Dateibaum kopiert, muss nicht notwendigerweise das HOWTO gelesen oder gar verstanden haben.
&lt;/li&gt;
&lt;li&gt;
Für Filesysteme, die das immuteable-Bit nicht unterstützen, legt das HOWTO dem Benutzer nahe, suexec zu patchen, und
liefert eine idiotensichere Anleitung mit, wie das getan werden kann. Dabei werden zwar die Debian-Sourcen verwendet,
aber das entstehende Binary wird natürlich wieder manuell an die passende Stelle im Dateisystem geschoben - erneut
unter Umgehung des Packagesystems. Ich möchte kein System in die Finger bekommen, das auf diese Weise so verhunzt
wurde. Übel. Immerhin - das neu gebaute, unsicherere suexec wird nicht benutzt um das &amp;#8220;Original-suexec&amp;#8221; zu
überschreiben, sondern erhält einen eigenen Dateinamen, suexec-fcgi, was den Knieschusseffekt dieser Operation
wenigstens etwas dämpft.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Ich würde mich wundern, wenn die Verwendung von Documentroots ausserhalb /var/www für die Benutzer dieses HOWTOs
funktioniert. Das Debian-suexec ist relativ strikt übersetzt, und dieser Fall ist im HOWTO mit keinem Wort erwähnt.
Für Newbies - mithin die Hauptzielgruppe des HOWTO - ist das eine böse Falle.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bitte, bitte, bitte. Lest Eure Texte bevor ihr sie veröffentlicht. Schreibt kurze, prägnante Sätze, vermeidet
Umgangssprache, schreibt Zahlen zwischen eins und zwölf als Worte. Technische Dokumentation verdient besseres
Deutsch!&lt;/p&gt;

&lt;p&gt;Fazit: Debianhowto.de ist in meiner Achtung wieder ein Stück gesunken, die von mir erhoffte Standardlösung für ein
Standardproblem habe ich immer noch nicht gefunden.&lt;/p&gt;

&lt;p&gt;Demnächst in diesem Theater: Für jede PHP-Applikation einen eigenen Apache.&lt;/p&gt;

 
    </content:encoded>

    <pubDate>Fri, 30 Dec 2005 14:18:31 +0100</pubDate>
    <guid isPermaLink="false">http://blog.zugschlus.de/archives/286-guid.html</guid>
    <category>apache</category>
<category>fastcgi</category>
<category>php</category>
<category>security</category>
<category>webapps</category>

</item>
<item>
    <title>suphp</title>
    <link>http://blog.zugschlus.de/archives/276-suphp.html</link>
            <category>Computer und Netze</category>
    
    <comments>http://blog.zugschlus.de/archives/276-suphp.html#comments</comments>
    <wfw:comment>http://blog.zugschlus.de/wfwcomment.php?cid=276</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>http://blog.zugschlus.de/rss.php?version=2.0&amp;type=comments&amp;cid=276</wfw:commentRss>
    

    <author>mh+blog-zugschlus-de@zugschlus.de (Marc 'Zugschlus' Haber)</author>
    <content:encoded>
    &lt;p&gt;Schon bei den Vorarbeiten zu &lt;a onclick=&quot;window.open(this.href, &#039;_blank&#039;); return false;&quot;
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1717&amp;amp;entry_id=276&quot; title=&quot;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;diesem&lt;/a&gt; und &lt;a
onclick=&quot;window.open(this.href, &#039;_blank&#039;); return false;&quot;
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1718&amp;amp;entry_id=276&quot; title=&quot;http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;diesem&lt;/a&gt; Artikel hat man mir sehr nahegelegt,
&lt;a onclick=&quot;window.open(this.href, &#039;_blank&#039;); return false;&quot; href=&quot;http://blog.zugschlus.de/exit.php?url_id=1719&amp;amp;entry_id=276&quot; title=&quot;http://www.suphp.org/&quot;  onmouseover=&quot;window.status=&#039;http://www.suphp.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;suphp&lt;/a&gt; anzugucken. Das habe
ich heute getan.&lt;/p&gt;

 &lt;p&gt;Suphp kommt als Apache-Modul in der Debian-Package &lt;a
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1720&amp;amp;entry_id=276&quot; title=&quot;http://packages.debian.org/libapache2-mod-suphp&quot;  onmouseover=&quot;window.status=&#039;http://packages.debian.org/libapache2-mod-suphp&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;libapache2-mod-suphp&lt;/a&gt; daher. In Sarge ist eine 0.5-Version; in
sid eine 0.6.0-Version, die zur Laufzeit flexibler konfigurierbar ist. Upstream hat vor zwei Wochen eine 0.6.1 released,
die bisher noch nicht ihren Weg nach Debian gefunden hat.&lt;/p&gt;

&lt;p&gt;suphp tut auf Anhieb das, was man von ihm erwartet: Das php-Script läuft mit den Rechten des Dateiinhabers. Die
Überraschungen sind im Detail, und ich weiss noch nicht genau, was ich darüber denken soll.&lt;/p&gt;

&lt;p&gt;suphp ist wie suexec ein suid root laufendes Binary, das seine Rootrechte - wie suexec - zuerst zum Zieluser fallen
lässt, und dann den php4-Interpreter aufruft. Daraus folgt:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Der PHP-Interpreter läuft nicht als
Apache-Modul&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;font face=&quot;courier new,courier,monospace&quot;&gt;libapache2-mod-php&lt;/font&gt; kann raus.
Beziehungsweise: Es muss raus, denn der Parallelbetrieb von mod-php und suphp ist nicht unterstützt. Es kann laut
Aussage des Upstreams alles passieren. Also lieber nicht machen.&lt;/li&gt;&lt;/ul&gt;suphp ist erheblich weniger pingelig als
suexec. Das erleichtert zwar die Arbeit erheblich, weil es sofort so tut wie erwartet, aber über den damit
eingehandelten Sicherheitskompromiss muss ich mir erstmal klar werden.&lt;p&gt;Die bei suphp 0.5 mitgelieferte Dokumentation
ist die vom Upstream, die davon ausgeht, dass das Modul mit &lt;font face=&quot;courier
new,courier,monospace&quot;&gt;--with-setid-mode=force&lt;/font&gt; oder &lt;font face=&quot;courier new,courier,monospace&quot;&gt;=paranoid&lt;/font&gt;
übersetzt wurde. Die Debian-Package ist aber mit &lt;font face=&quot;courier
new,courier,monospace&quot;&gt;--with-setid-mode=owner&lt;/font&gt; gebaut. In der Folge führt die Beachtung der Anleitung zu einem
nicht mehr startenden Apache, weil das mit &lt;font face=&quot;courier new,courier,monospace&quot;&gt;=owner&lt;/font&gt; gebaute apache-Modul
die Direktive &lt;font face=&quot;courier new,courier,monospace&quot;&gt;suPHP_UserGroup&lt;/font&gt; nicht kennt und einem somit spontan um
die Ohren fliegt wenn man die Anleitung befolgt.&lt;/p&gt;&lt;p&gt; suphp 0.6 ist zur Laufzeit besser konfigurierbar, was eventuell
einen weiteren Sicherheitskompromiss bedeutet. Außerdem kann suphp 0.6 auch &amp;#8220;normale&amp;#8221;; CGI-Scripts
ausführen und mutiert somit zum nahezu vollwertigen suexec-Ersatz.&lt;/p&gt;&lt;p&gt; Als Debian-Packages daherkommende
Applikationen werden eher schwer unter suphp einsatzfähig sein, weil man die Dateien an einen anderen Benutzer
&amp;#8220;verschenken&amp;#8221; muss. Ob das mit &lt;font face=&quot;courier new,courier,monospace&quot;&gt;dpkg-statoverride&lt;/font&gt; einfach
machbar ist, werden Experimente mit Dokuwiki in den nächsten Tagen zeigen.&lt;/p&gt;&lt;p&gt;Wie gut suphp für
&amp;#8220;normale&amp;#8221; CGI-Scripts tut, werden Experimente mit munin-cgi-graph in den nächsten Tagen zeigen.&lt;/p&gt;

&lt;p&gt;Momentan tendiere ich dazu, auch auf den sarge-Webservern einen Backport von suphp 0.6 einzusetzen, weil mir die
Konfigurationsmöglichkeiten sexy erscheinen. Vielleicht komme ich irgendwann auch mal zu einer Meinung bezüglich der
Sicherheitskompromisse. Jedenfalls steht die Kommentarfunktion dieses Artikels bereit, und ich freue mich auf Eure
Meinungen.&lt;/p&gt;&lt;hr width=&quot;100%&quot; size=&quot;2&quot; /&gt;&lt;p&gt;&lt;/p&gt;&lt;h5&gt;Nachtrag&lt;/h5&gt;&lt;p&gt;Nachdem ich Ende Dezember einige Fragen auf der
suphp-Mailingliste gestellt habe, und diese Fragen genauso wie die explizite Nachfrage beim Autor drei Wochen später
unbeantwortet verhallten, habe ich die Experimente mit suphp abgebrochen.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 11 Dec 2005 21:59:38 +0100</pubDate>
    <guid isPermaLink="false">http://blog.zugschlus.de/archives/276-guid.html</guid>
    <category>apache</category>
<category>php</category>
<category>security</category>
<category>suphp</category>
<category>webapps</category>

</item>
<item>
    <title>suexec, die nächste</title>
    <link>http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html</link>
            <category>Security</category>
    
    <comments>http://blog.zugschlus.de/archives/252-suexec,-die-naechste.html#comments</comments>
    <wfw:comment>http://blog.zugschlus.de/wfwcomment.php?cid=252</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.zugschlus.de/rss.php?version=2.0&amp;type=comments&amp;cid=252</wfw:commentRss>
    

    <author>mh+blog-zugschlus-de@zugschlus.de (Marc 'Zugschlus' Haber)</author>
    <content:encoded>
    &lt;p&gt;In Fortsetzung von &lt;a onclick=&quot;window.open(this.href, &#039;_blank&#039;); return false;&quot;
href=&quot;http://blog.zugschlus.de/exit.php?url_id=1739&amp;amp;entry_id=252&quot; title=&quot;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&quot;  onmouseover=&quot;window.status=&#039;http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;suexec my php, baby^wapache&lt;/a&gt;&lt;span
style=&quot;text-decoration: underline;&quot;&gt; &lt;/span&gt;habe ich gestern suexec auf dem ersten Produktivsystem verfügbar gemacht,
und einige Unzulänglichkeiten im Debian-Setup gefunden.&lt;/p&gt;

 &lt;p&gt;Die Umstellung des Zielsystems von apache auf apache2 ging erschreckend schmerzfrei vonstatten. Die einzige Falle
dabei war, dass einige Dinge (z.B. der &lt;font face=&quot;courier new,courier,monospace&quot;&gt;ScriptAlias&lt;/font&gt; auf &lt;font
face=&quot;courier new,courier,monospace&quot;&gt;/usr/lib/cgi-bin&lt;/font&gt;) bei apache in der Serverkonfiguration steht, bei apache2
aber (IMO sinnvollerweise) in den virtual host geschrieben werden muss. Es waren also minimale Änderungen an der
kopierten virtual-host-Konfiguration notwendig.&lt;/p&gt;

&lt;div align=&quot;left&quot;&gt;Dann suexec. Ich bin natürlich &lt;u&gt;wieder&lt;/u&gt; in die Falle getappt, dass ich erwartet habe, dass das
cgi mit den Rechten des Fileowners läuft, und ich habe &lt;u&gt;wieder&lt;/u&gt; übersehen, dass suexec ein eigenes Log (&lt;font
face=&quot;courier new,courier,monospace&quot;&gt;/var/log/apache2/suexec.log&lt;/font&gt;) schreibt. Als nächstes musste ich die
userbezogenen virtuellen Hosts von &lt;font face=&quot;courier new,courier,monospace&quot;&gt;~user/.www/www.virthost.example&lt;/font&gt;
nach &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/var/www/virtual-hosts/user/www.virthost.example&lt;/font&gt; verschieben, da
Debians suexec nur cgi-bins aus &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/var/www&lt;/font&gt; suexecen mag. &lt;font
face=&quot;courier new,courier,monospace&quot;&gt;/var/www/virtual-hosts&lt;/font&gt; muss man dann in der Konfiguration für den default
virtual host auf &amp;#8220;deny from all&amp;#8221; setzen, damit man die Inhalte der virtual hosts nicht zusätzlich noch
über den default virtual host erreichen kann. Das ist auch der Grund für die dazwischen eingeschobene
Verzeichnisebene.&lt;/div&gt;

&lt;p&gt;So weit, so gut, für die cgi-bins der Benutzer.&lt;/p&gt;

&lt;p&gt;Nun möchte ich allerdings, wenn ich schon suexec am Start habe, auch gerne die aus Debian-Packages kommenden
cgi-Scripts suexecen. Und das ist ein Punkt, wo ich vorerst bei einem knackingen &amp;#8220;geht nicht&amp;#8221; angekommen
bin.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;suexec suexect nur, was in &lt;font face=&quot;courier new,courier,monospace&quot;&gt;/var/www&lt;/font&gt; liegt. Debian-Packages
werfen ihre cgi-scrips aber nach &lt;font face=&quot;courier
new,courier,monospace&quot;&gt;/usr/lib/cgi-bin&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;suexec kann für jeden Virtual Host nur auf einen User
suexecen. Bei den Scripts aus Debian-Packages wäre es aber sinnvoll, unterschiedliche Scripte auf unterschiedliche User
zu mappen.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Also wird man wohl in den sauren Apfel beissen und sich darauf verlassen müssen, dass das, was aus Debian-Packages
kommt, hinreichend sicher ist, dass man es mit den Rechten des Webservers laufen lassen kann. Auch wenn das bedeutet,
dass einige Logs für &lt;font face=&quot;courier new,courier,monospace&quot;&gt;www-data&lt;/font&gt; writeable sein müssen, was ich
persönlich so richtig ätzend finde.&lt;/p&gt;

 
    </content:encoded>

    <pubDate>Sun, 27 Nov 2005 11:27:02 +0100</pubDate>
    <guid isPermaLink="false">http://blog.zugschlus.de/archives/252-guid.html</guid>
    <category>apache</category>
<category>php</category>
<category>security</category>
<category>suexec</category>
<category>webapps</category>

</item>
<item>
    <title>suexec my php, baby^wapache2</title>
    <link>http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html</link>
            <category>Security</category>
    
    <comments>http://blog.zugschlus.de/archives/211-suexec-my-php,-babywapache2.html#comments</comments>
    <wfw:comment>http://blog.zugschlus.de/wfwcomment.php?cid=211</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://blog.zugschlus.de/rss.php?version=2.0&amp;type=comments&amp;cid=211</wfw:commentRss>
    

    <author>mh+blog-zugschlus-de@zugschlus.de (Marc 'Zugschlus' Haber)</author>
    <content:encoded>
    &lt;p&gt;Von einem der auszog, seine PHP-Scripts nicht mehr als www-data laufen zu sehen.&lt;/p&gt;

&lt;p&gt;Auf der Suche nach einer Lösung für ein Standardproblem&lt;/p&gt;

 &lt;p&gt;Während meiner ISP-Zeit habe ich es nur in zwei Bereichen geschafft, den Rat eines Kollegen (&amp;#8220;Du kannst Dich
nicht mit allem auskennen&amp;#8221;) zu beherzigen: Webserver und RADIUS. Der bewusste Verzicht auf RADIUS-Kenntnisse wäre
heute im ISP-Bereich ein Hindernis, und Webserver-Knowhow versuche ich derzeit durch kleinere private Projektchen
aufzubauen.&lt;/p&gt;

&lt;p&gt;Eins dieser Projektchen war der Bau eines Webservers, bei dem PHP-Scripts nicht mit den Rechten des Webservers
laufen, sondern mit den Rechten des Benutzers. Auf Servern, bei denen die Betreiber der virtuellen Server sich nicht
gegenseitig vertrauen, ist das eine Grundanforderung, die gar nicht &lt;u&gt;sooo&lt;/u&gt; leicht zu befriedigen ist. Apache bringt
zwar schon seit geraumer Zeit suexec mit, das eigentlich genau diese Aufgabe erledigen soll. Allerdings arbeiten die
großen Hoster teilweise aus historischen Gründen mit grotesk gepatschtem suexec, so dass man die Berichte, die man aus
diesen Ecken bekommt, für ein privates Feldwaldundwiesenprojekt nicht umsetzbar sind. Die im Web ergooglebaren
Dokumentationen sind allesamt durchwachsen, und nicht selten so voller Widersprüche, dass man am besten mit dem Lesen
aufhört, ehe man völlig verwirrt ist.&lt;/p&gt;

&lt;p&gt;Kurze Recherche zeigt, dass suexec sowieso ein Auslaufmodell ist. Irgendwann wird apache2 mit dem perchild threaded
model so weit sein, dass für jeden virtuellen Host ein eigener Apache-Prozess mit den entsprechenden Rechten läuft,
was alle heuten Probleme lösen dürfte. Aber, &amp;#8220;This MPM is not currently expected to work correctly, if at
all.&amp;#8221; Also lieber erstmal die Finger weg. Den Spezialfall PHP bekommt man heute mit suphp erschlagen, aber das ist
ein Projekt für die nächsten Tage. Mein aktuelles Vorhaben war, die Geschichte von der Pike auf zu lernen, und das
heißt definitiv klassisches suexec.&lt;/p&gt;

&lt;p&gt;suexec ist ein Wrapper für CGI-Scripts, der vom Apache aufgerufen dank suid root erstmal seine Privilegien
eskaliert, nach Prüfung einer ganzen Latte von Preconditions seine Rechte auf die des &amp;#8220;target users&amp;#8221;
reduziert und schließlich endlich das CGI-Script aufruft. Nun, wenn ich hier von CGI spreche, meine ich auch CGI. Da
perl und php normalerweise als Apache-Modul gerufen werden, kann man da nicht mit suexec eingreifen. Also muss man die
Scripts als CGI aufrufen, was zu einem Performanceverlust führt. Das machen die großen Hoster auch nicht anders, also
ist dieser Weg so verkehrt nicht.&lt;/p&gt;

&lt;p&gt;Also: mod_php raus, php4-cgi installiert und die (einfache) Konfiguration für &amp;#8220;PHP als CGI&amp;#8221;
durchgeführt.&lt;br /&gt;
Dabei fällt schon auf, dass die apache2-Packages von Debian ziemlich schlau gebaut sind: Jede Apache-Erweiterung bringt
in ihrer Package entsprechende Konfigschnipsel mit, die der Administrator mit den Scripts a2{en|dis}{mod|site} ein- und
ausschalten kann. Gute Arbeit, das fühlt sich &lt;u&gt;viel&lt;/u&gt; besser an als die wilden Debconf-Orgien
(&amp;#8220;Pondering....... Doing Magic......&amp;#8221;) der apache-1.3-Packages. Ist halt wieder eine typische
Debian-Geschichte mit vielen kleinen Dateien, die apache aber dank seines flexiblen Konfig-Parsers automatisch
zusammenstellen kann; update-apache2.conf gibt es - glücklicherweise - nicht. Kris wird dieses Setup sicher nicht
gefallen, ich mag es. Schön finde ich auch, dass suexec, das sehr stark zur compilezeit konfiguriert wird, in der
Debian-Package sinnvoll parametriert daherkommt.&lt;/p&gt;

&lt;p&gt;Die CGIs im Userdir ~/public_html laufen auf Anhieb unter meinem User. Allerdings ist&amp;#8217;s etwas komplexer, das
auch ausserhalb des Userdirs hinzubekommen. Ursache dafür ist, dass ich mir selbst ein Bein gestellt hatte. Ich ging
fälschlicherweise davon aus, dass auch ausserhalb des Userdirs suexec seine Rechte auf die des Users fallen lässt, dem
die Datei gehört, in dem das CGI-Script steht; sozusagen ein auf den Webserver übertragenes suid-bit. Das stimmt aber
nicht: Für suexec ausserhalb des Userdirs muss man innerhalb der Definition des virtual hosts explizit mit der
Direktive SuexecUserGroup einen Target-User und eine Target-Group angeben, sonst fällt suexec transparent und
kommentarlos auf den Fallbackuser zurück, der www-data heißt und man somit der Meinung ist, dass das suexec gar nicht
aufgerufen würde. Nachdem dies endlich verstanden war, war der Weg zum ersten als mh laufenden CGI aus /var/www nicht
mehr weit.&lt;/p&gt;

&lt;p&gt;PHP als CGI unter suexec ist ein bisschen schwieriger. Bei einem über eine Action aufgerufenen php zählt nicht der
Ablageort des PHP-Scripts, sondern der Ablageort des PHP-Binaries - und das liegt natürlich bei Debian weder innerhalb
des Webspaces, noch gehört es dem richtigen User. Also wird man für jeden User, der PHP verwenden wird, ein eigenes
PHP-Binary innerhalb des Webspaces brauchen, das obendrein auch noch dem richtigen User gehören muss. Ausserdem
braucht&amp;#8217;s wohl noch eine passende Action-Direktive für jeden Virtuellen Host; das hab ich allerdings noch nicht
ausprobiert, weil ich immer nur mit einem virtuellen Host gearbeitet habe. Kaum macht man&amp;#8217;s richtig,
funktioniert&amp;#8217;s auch schon, und mein passthru(&amp;#8220;id&amp;#8221;) sagte ordentlich id=1001(mh). Erfolgserlebnis.&lt;/p&gt;

&lt;p&gt;Was lernen wir daraus: Auch wenn man erwartet, zu wissen was in der Doku steht, kostet Querlesen gerne mal einen Tag
Zeit, weil man die wichtigen Informationen mehrfach überliest. de.comm.software.webserver ist für Fragen dieser
Gewichtsklasse überfordert, ausser Bastian Blank hat sich niemand zur Antwort auf meine Fragen motivieren
können.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
Dasselbe gilt für #apache in Freenode, dessen Niveau bedauernswert niedrig ist und wo die Leute größtenteils nicht
einmal wussten, was suexec ist. Das beste Debugging-Tool ist nach wie vor strace, weil man damit dem Prozess so weit auf
die Finger gucken kann, dass man irgendwann mal zu dem Schluß kommt &amp;#8220;das ist aber nicht so wie ichs aus der Doku
erinnere, lasst mal lieber genau nachlesen&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Nächste Projekte: suphp, und dann endlich die erste eigene s9y-Testinstallation.&lt;/p&gt;

 
    </content:encoded>

    <pubDate>Sat, 08 Oct 2005 01:47:00 +0200</pubDate>
    <guid isPermaLink="false">http://blog.zugschlus.de/archives/211-guid.html</guid>
    <category>apache</category>
<category>php</category>
<category>security</category>
<category>suexec</category>
<category>webapps</category>

</item>

</channel>
</rss>