<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Aconiac Security Group Blog &#187; Apache</title>
	<atom:link href="http://blog.aconiac.com/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aconiac.com</link>
	<description>The official Aconiac company blog</description>
	<lastBuildDate>Wed, 19 May 2010 16:12:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>How to: Protect your server from insecure php scripts</title>
		<link>http://blog.aconiac.com/2009/07/03/how-to-protect-your-server-from-insecure-php-scripts/</link>
		<comments>http://blog.aconiac.com/2009/07/03/how-to-protect-your-server-from-insecure-php-scripts/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 23:39:27 +0000</pubDate>
		<dc:creator>Michael Lind Mortensen</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.aconiac.com/?p=246</guid>
		<description><![CDATA[If you&#8217;ve ever programmed anything in PHP before, you&#8217;ve probably had situations where you needed to be careful with your scripts to make sure they were secure. (and if you haven&#8217;t, you probably have but just haven&#8217;t noticed) Making secure code is often times not as easy as you would hope, and while PHP does [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve ever programmed anything in PHP before, you&#8217;ve probably had situations where you needed to be careful with your scripts to make sure they were secure. (and if you haven&#8217;t, you probably have but just haven&#8217;t noticed)</p>
<p>Making secure code is often times not as easy as you would hope, and while PHP does provide certain methods to help you in your task, it still lets much of the hassle be up to you as the programmer. This construction, combined with the amount of PHP sites out there, leads to the sad fact that many insecure websites are written in PHP. And while your own website may be totally secure, perhaps because you read guides like <a href="http://phpsec.org/projects/guide/">PHP Security Guide</a> from PHP Security Consortium, there is absolutely no guarantee hosting users on your hosting server will do the same &#8211; so you need to protect yourself!</p>
<p>Protecting your server, and more importantly the users on it, is really a matter of several things. You need to make sure only the services you need are running, you need to secure access routes to the server (ssh, vnc, rdp etc.), you need to put in surveillance and detection systems (Nagios, Tripwire, Snort etc.), you need to make sure the data is backed up at all times, you need a proper firewall and tons of other things. Covering all these topics is way beyond this simple post however, so we&#8217;ll only focus on protecting yourself against badly coded PHP-scripts.</p>
<p>If a hosting user has a website on your server, say <a href="http://www.example.org/">http://www.example.org/</a>, and on this site he creates some PHP script that loads in a file and displays this in some way. Now this is obviously a stupid example, because when would you actually need this functionality? None the less, including files like this is sadly often times done indirectly, making it possible for an attacker to load in arbitrary files and gain full or partial access to the file content. In this example however we&#8217;ll simply look at a scheme like the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>www.example.org<span style="color: #000000; font-weight: bold;">/</span>script.php?<span style="color: #007800;">filename</span>=test.txt</pre></div></div>

<p>Where this script then loads in the content from test.txt.</p>
<p>This kind of setup is very problematic, because an attacker can easily take the request above and change it to load other files like:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>www.example.org<span style="color: #000000; font-weight: bold;">/</span>script.php?<span style="color: #007800;">filename</span>=..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>www.example.org<span style="color: #000000; font-weight: bold;">/</span>script.php?<span style="color: #007800;">filename</span>=..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>vhosts<span style="color: #000000; font-weight: bold;">/</span>someothersite.com<span style="color: #000000; font-weight: bold;">/</span>secretfile.php</pre></div></div>

<p>Where the first one loads the password file on the server (it actually only includes usernames, passwords are in another file &#8211; but you get the point) and the second one could be perhaps a configuration file for another hosting user&#8217;s blog. This way the attacker could gain access to a complete list of users and some login information for another customer.</p>
<p>Both these situations are obviously unacceptable, and while you can&#8217;t protect your users from themselves (at least not easily), you can protect your good users from your more reckless users.</p>
<p>One way of doing this is by utilizing what&#8217;s called a chroot. Chrooting basically means taking an application and forcing it to do it&#8217;s work solely within a given directory, so that i.e. Apache was only allowed to function inside &#8220;/chroot/apache&#8221; and nowhere else. This prevents websites running on Apache from reading (and writing) files outside this chroot, so that an attacker can&#8217;t use the above attack to read the password file. Setting up such chroots aren&#8217;t always that easy, since everything Apache uses during runtime needs to be available in the chroot. One project has however attempted to make chrooting Apache much easier. This project is the Web Application Firewall Mod-Security, which can be found <a href="http://modsecurity.org/">here</a>. They use the so called <em>SecChroot</em> option to easily chroot your Apache.</p>
<p>Chrooting doesn&#8217;t however prevent a site in the chroot from reading data in another site stored in the same chroot. To prevent this kind of attack, you&#8217;d have to logically separate each running virtual host, by either setting up a dedicated Apache chroot for each virtual host (a bad solution) or use something called <em>suPHP</em>. By means of<em> suPHP</em>, which can be found <a href="http://www.suphp.org/">here</a>, we can make Apache run PHP scripts under the permissions of the owners of the scripts, instead of the normal Apache user which is shared between all virtual hosts. By doing this, we effectively make each virtual host able to only read/write files in its own directory and not spy on other virtual hosts data (assuming these have set correct permissions).</p>
<p>But what if we don&#8217;t trust this is enough? What if we want to be completely sure, that even if users set wrong permissions, a given user could still never read or write in another users virtual host? This can be accomplished by means of the php<em> open_basedir</em> option. The <em>open_basedir</em> option can be used to control in which directory the PHP scripts of a virtual host can work. This effectively means we&#8217;re actually chrooting the PHP scripts! The way you do this, is that you open up your virtual host configuration (which is probably stored somewhere like &#8220;/etc/apache2/vhosts/somevhostcom.conf&#8221;) and you then add the following within the &lt;VirtualHost&gt;&lt;/VirtualHost&gt; pair:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">php_admin_value open_basedir <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>chroot<span style="color: #000000; font-weight: bold;">/</span>apache<span style="color: #000000; font-weight: bold;">/</span>vhosts<span style="color: #000000; font-weight: bold;">/</span>somevhost.com</pre></div></div>

<p>Where &#8220;/var/chroot/apache/vhosts/somevhost.com&#8221; is the location of the virtual host directory. (be aware: If you&#8217;ve chrooted Apache, this path needs to be relative to the chroot and not the actual system).</p>
<p>Using <em>open_basedir</em> is not without it&#8217;s problems though. By making the PHP scripts run in what is effectively a chroot, they can&#8217;t i.e. write to the /tmp directory, which basically means file uploads won&#8217;t work. Be aware that chrooting in general can often lead to these types of issues, which is also why many server administrators just simply choose to take the risk and run Apache without chrooting.</p>
<p>Last but not least you can also use Mod-Security as what it was created as &#8211; a Web Application Firewall. A Web Application Firewall is a software firewall placed onto Apache, which then uses a complicated rule set to analyze traffic to the server and identify what kind of traffic is an attack and what is just normal use. These rules however have to be written, at least to some extent, manually and there are issues regarding making rules that catch illegal behavior but never stops legal requests &#8211; usually you have to accept some level of false-positives in attack detection if you want to be as secure as you can be.</p>
<p>That&#8217;s it! We hope you&#8217;ve become a bit more informed now and can get on with making your server secure against bad php scripts. Until next time &#8211; Keep safe!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aconiac.com/2009/07/03/how-to-protect-your-server-from-insecure-php-scripts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Removing X-Powered-By header for mod_rails</title>
		<link>http://blog.aconiac.com/2009/03/03/removing-x-powered-by-header-for-mod_rails/</link>
		<comments>http://blog.aconiac.com/2009/03/03/removing-x-powered-by-header-for-mod_rails/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 21:47:09 +0000</pubDate>
		<dc:creator>Michael Lind Mortensen</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://blog.aconiac.com/?p=61</guid>
		<description><![CDATA[NOTE: This is a technical post regarding Apache on Linux with support for Ruby on Rails. Basic understanding of these concepts is necessary! Normally you want to make sure your server doesn&#8217;t give out any information about service versions, however mod_rails doesn&#8217;t provide any easy way of doing this within the module itself. There is [...]]]></description>
			<content:encoded><![CDATA[<p><strong>NOTE: This is a technical post regarding Apache on Linux with support for Ruby on Rails. Basic understanding of these concepts is necessary! </strong></p>
<p>Normally you want to make sure your server doesn&#8217;t give out any information about service versions, however mod_rails doesn&#8217;t provide any easy way of doing this within the module itself. There is however a fairly easy solution. Simply use mod_headers to remove the headers in Apache.</p>
<p>So how is it done? Very simple, just enable the module mod_headers and add the snippet below to httpd.conf or another included configuration file in Apache. Both actions have to be done as root of course.</p>
<p>Enable the mod_headers module <em>(This example is Linux Debian &#8211; it might be different for your system)</em></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># cd /etc/apache2/mods-available/</span>
<span style="color: #666666; font-style: italic;"># a2enmod headers</span></pre></div></div>

<p>Add these lines to httpd.conf</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Header always <span style="color: #7a0874; font-weight: bold;">unset</span> <span style="color: #ff0000;">&quot;X-Powered-By&quot;</span>
Header always <span style="color: #7a0874; font-weight: bold;">unset</span> <span style="color: #ff0000;">&quot;X-Runtime&quot;</span></pre></div></div>

<p>Restart the Apache server <em>(Again &#8211; this is Debian! It might be different for you)</em></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># apache2ctl restart</span></pre></div></div>

<p>And there you go. Try making e.g. a Nikto scan on the server and see if the headers aren&#8217;t there any more.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aconiac.com/2009/03/03/removing-x-powered-by-header-for-mod_rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
