<?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>Anchor Web Hosting Blog &#187; security</title>
	<atom:link href="http://www.anchor.com.au/blog/tag/security/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.anchor.com.au/blog</link>
	<description>A view into the Anchor Engineroom</description>
	<lastBuildDate>Wed, 08 Feb 2012 00:51:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>For the lulz (Building Secure Websites)</title>
		<link>http://www.anchor.com.au/blog/2011/06/building-secure-websites/</link>
		<comments>http://www.anchor.com.au/blog/2011/06/building-secure-websites/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 07:23:54 +0000</pubDate>
		<dc:creator>Chris Collins</dc:creator>
				<category><![CDATA[FTW]]></category>
		<category><![CDATA[pwned]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sql injection]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=1652</guid>
		<description><![CDATA[With all of the #antisec love going around, we felt was a good time to discuss some of the key principles in writing secure webcode. Today&#8217;s topic is unsanitised input. A great piece of philosophy for designing secure systems is that any piece of information that comes from an external source is inherently untrustworthy. This [...]]]></description>
			<content:encoded><![CDATA[<p>With all of the #antisec love going around, we felt was a good time to discuss some of the key principles in writing secure webcode. Today&#8217;s topic is unsanitised input.</p>
<p>A great piece of philosophy for designing secure systems is that any piece of information that comes from an external source is inherently untrustworthy. This applies quite strongly to the web &#8211; every detail in a web request comes from a user somewhere, and can easily be forged and specially crafted to manipulate poorly written code.</p>
<p>This is particularly notable in languages like PHP, where there is a low barrier to entry for writing code, but doesn&#8217;t often provide good frameworks or assistance to avoid being caught out by these problems.</p>
<p><strong>Validate All Input</strong></p>
<p>The first rule is to validate all input.  You can&#8217;t trust anything that comes in from the request to conform to a certain format.</p>
<p>Just because your pretty HTML form only allows certain values to be sent back doesn&#8217;t mean that some nasty cracker somewhere can&#8217;t craft up a request to your webserver that doesn&#8217;t conform to this.</p>
<p>The way we deal with this is to clean these parameters, always.  If we expect the parameter to be an integer, we ensure that the parameter only contains an integer, and treat everything else as an error.  If it&#8217;s a string, we have to assume we don&#8217;t know how long that string is, or what sort of characters it may contain.</p>
<p>Now, I know some of you are thinking &#8220;Ah, but we can avoid all of this by using javascript to validate our forms!&#8221;.  That doesn&#8217;t work as the javascript has no bearing on requests sent by our crafty cracker &#8211; they can only influence the result from a user using a web browser in the way you intended.</p>
<p><strong>Tread with Care</strong></p>
<p>With strings in particular, filtering the contents is not always an option &#8211; in these cases, we need to ensure that when we use the string elsewhere, its contents do not interfere with the other operation.</p>
<p>One of the most common places where this gets fouled up is in SQL queries.</p>
<p>A common (erroneous) construct you&#8217;ll find used is:</p>
<pre class="brush: php; title: ; notranslate">
$query = sprintf(&quot;SELECT * FROM articles WHERE id=&quot;%s&quot;', $_REQUEST['id']);
$myresults = mysql_query($query);

// do stuff with $myresults...
</pre>
<p>The problem with this is that $id is joined verbatim with the rest of the SQL query.  If $id contains characters with special significance in SQL, such as the &#8221; (double-quote) character, they will be interpreted as such.</p>
<p>If Little Johnny Cracker were to send our PHP page a request with id set to:
<pre class="brush: sql; title: ; notranslate">&quot;; DELETE FROM articles; --</pre>
<p>the next thing we know, our DB server no longer has anything in its articles table!</p>
<div id="attachment_1671" class="wp-caption alignright" style="width: 676px"><a href="http://xkcd.com/327/"><img src="http://www.anchor.com.au/blog/wp-content/uploads/2011/06/exploits_of_a_mom.png" alt="" title="Exploits of a Mum" width="666" height="205" class="size-full wp-image-1671" /></a><p class="wp-caption-text">Copyright &copy; Randall Munroe - xkcd.com</p></div>
<p>We can protect against this by modifying the string so that characters that are special to SQL are appropriately &#8220;escaped&#8221;.  In this specific instance, there is a mysql_real_escape_string function to do this for us, but most other database libraries and other languages offer different ways to perform this important task.</p>
<p>If we amend our example above, the code becomes:</p>
<pre class="brush: php; title: ; notranslate">
$query = sprintf('SELECT * FROM articles WHERE id=&quot;%s&quot;',
            mysql_real_escape_string($_REQUEST['id'])) ;
$myresults = mysql_query($query) ;

// do stuff with $myresults...
</pre>
<p>This ensures that the contents of id will be interpreted correctly as part of the string being compared to id, and won&#8217;t contain characters that could be interpreted as part of the SQL command.</p>
<p><strong>But this seems all too hard/too manual!</strong></p>
<p>Now, you&#8217;re all bound to say, &#8220;There must be an easier way!&#8221;, and there usually is.</p>
<p>There are plenty of libraries and wrappers available which are aware of the problem with trying to prepare safe SQL queries and provide simple, convenient, parameter escaping to ensure that user input can be safely combined with your queries.</p>
<p>In PHP, there is the PEAR MDB library which can do the above safely. An example:</p>
<pre class="brush: php; title: ; notranslate">
$sth = $db-&gt;prepare('SELECT * FROM articles WHERE id=?') ;
$myresult = $db-&gt;execute($sth, $_REQUEST['id']) ;

// do stuff with $myresults...
</pre>
<p>Other languages, such as Ruby, Python and Perl, all have their own safe and convenient methods for doing this too.</p>
<p><strong>In Summary</strong></p>
<p>Don&#8217;t trust the input into your web code.  Make sure you never mix input with strings you&#8217;re handing off elsewhere, such as via exec, eval or to a database.  And finally, use convenience methods for correcting/filtering user input when possible to make your life easy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2011/06/building-secure-websites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementing proper trust relationships in backup systems</title>
		<link>http://www.anchor.com.au/blog/2011/06/implementing-proper-trust-relationships-in-backup-systems/</link>
		<comments>http://www.anchor.com.au/blog/2011/06/implementing-proper-trust-relationships-in-backup-systems/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 07:19:40 +0000</pubDate>
		<dc:creator>Keiran Holloway</dc:creator>
				<category><![CDATA[FTW]]></category>
		<category><![CDATA[backups]]></category>
		<category><![CDATA[redundancy]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=1636</guid>
		<description><![CDATA[As many people may have read today, a certain web hosting company which operates in Australia suffered an attack which resulted in significant amounts of data loss. Not only was their live production data lost, but all backups were also unrecoverably lost in the process. Whilst significant technical details have yet to be released as [...]]]></description>
			<content:encoded><![CDATA[<p>As many people may have read today, a certain web hosting company which operates in Australia suffered an attack which resulted in significant amounts of data loss.  Not only was  their live production data lost, but all backups were also unrecoverably lost in the process.</p>
<p>Whilst significant technical details have yet to be released as to the nature of these attacks,  now is an opportunity as good as ever to explain how the trust relationships exist between the backup server and the system being backed up across our entire server infrastructure.</p>
<p>Our backup servers are separated with there being a minimal trust relationship between the backup server and the system being backed up:</p>
<li>All backups happen on an independent network which is inaccessible from the Internet.</li>
<li>The backup server can only read data from the machine being backed up (and not alter it).</li>
<li>The machine being backed up can only send new data and not alter  the data that is already backed up.</li>
<p>Using this methodology should protect any attacks from the public, customer facing servers from damaging the independently stored backups.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2011/06/implementing-proper-trust-relationships-in-backup-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Secure encrypted storage for your hosted server, VM, VPS, cloud server or $BUZZ_WORD</title>
		<link>http://www.anchor.com.au/blog/2011/03/secure-encrypted-storage-for-your-hosted-server-vm-vps-cloud-server-or-buzz_word/</link>
		<comments>http://www.anchor.com.au/blog/2011/03/secure-encrypted-storage-for-your-hosted-server-vm-vps-cloud-server-or-buzz_word/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 17:12:15 +0000</pubDate>
		<dc:creator>egalanos</dc:creator>
				<category><![CDATA[FTW]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssd]]></category>
		<category><![CDATA[storage]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=1604</guid>
		<description><![CDATA[So you&#8217;ve just provisioned your shiny new OS instance with your host of choice, loaded in your confidential data and away you go without a worry in the world right? If your data consists only of captioned photos of cute furry animals, then all is well. Perhaps however, your data is worth just a wee bit [...]]]></description>
			<content:encoded><![CDATA[<p>So you&#8217;ve just provisioned your shiny new OS instance with your host of choice, loaded in your confidential data and away you go without a worry in the world right? If your data consists only of captioned photos of cute furry animals, then all is well. Perhaps however, your data is worth just a wee bit more than that (not that we don&#8217;t ♥ cute furry animals!).</p>
<p>Depending on your host and product used, your data could be sitting on anywhere from locally attached disks, a NAS/SAN or some clustered distributed block device/filesystem with no way to easily determine who has access to it, what snapshots exist, what will happen to failed media, etc. For certain customers with certain sensitive applications, that is simply not an acceptable risk.</p>
<p>To protect your data at rest, the most reassuring option is to utilise <a href="http://en.wikipedia.org/wiki/Disk_encryption">disk encryption</a> <em>within</em> your operating system where <strong>only you possess the key</strong>. Whilst this can present a bit of an operational challenge (i.e. how does the key get entered if the server is rebooted), the show stopper question is going to be <em>&#8220;Can I actually run a production database with heavy I/O load on encrypted storage?&#8221;</em>. This post seeks to answer that question or to at least help you figure it out for your circumstances.</p>
<h2>Database server</h2>
<p>Our test server is a Dell PowerEdge R410 with:</p>
<ul>
<li>2 × <a title="Intel Xeon E5620 CPUs" href="http://ark.intel.com/Product.aspx?id=47925" target="_blank">Intel ﻿Xeon E5620</a> CPUs</li>
<li>16 GB of RAM</li>
<li>Dell PERC H700 hardware RAID controller</li>
<li>2 × <a title="Dell 50GB SSD" href="http://accessories.ap.dell.com/sna/productdetail.aspx?c=sg&amp;l=en&amp;s=dhs&amp;cs=sgdhs1&amp;sku=400-19119#Overview" target="_blank">Dell 50GB SSDs</a> in a hardware RAID 1 array for the database</li>
<li>2 × 300GB 15K SAS in a hardware RAID 1 array for the operating system</li>
<li>Red Hat Enterprise Linux Server 6.0 (kernel 2.6.32-71.18.1.el6.x86_64)</li>
</ul>
<p>The interesting thing to note in this setup is that the CPUs contain hardware accelerated <a title="AES" href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard" target="_blank">AES</a> encryption via the <a title="AES instruction set" href="http://en.wikipedia.org/wiki/AES_instruction_set" target="_blank">AES instruction set</a> (Intel&#8217;s marketing name is <a title="AES-NI" href="http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-instructions-aes-ni/" target="_blank">AES-NI</a>). You can check if your CPU and kernel support this feature by running at the command line:</p>
<pre style="padding-left: 30px;">grep aes /proc/cpuinfo</pre>
<p>if you get output, then congratulations, you have the feature supported!</p>
<h2><span>Encrypted storage</span></h2>
<p>The recommended way to do block device level encryption under Linux is to use the <a title="device-mapper" href="http://sourceware.org/dm/" target="_blank">device mapper</a> target <a title="dm-crypt" href="http://www.saout.de/misc/dm-crypt/" target="_blank">dm-crypt</a>. This is a straightforward component that is built-in to the Linux kernel and well supported in all modern Linux distributions. To set up full disk encryption, you should use your distribution&#8217;s installer when you initially provision your server. If you are not encrypting your entire OS (sans <em>/boot</em>) and data, then you will need to use the utility <em>cryptsetup</em> on the storage device you want to encrypt. For our testing, we are just encrypting the SSDs as follows:</p>
<pre style="padding-left: 30px;">cryptsetup luksFormat /dev/sdb -c aes-xts-plain -s 512</pre>
<p>This command formats the storage device with a <a title="LUKS" href="http://en.wikipedia.org/wiki/Linux_Unified_Key_Setup" target="_blank">LUKS</a> meta-data header. This header contains useful information including:</p>
<ul>
<li>the fact that it contains encrypted data (rather than just random data)</li>
<li>a <a title="UUID" href="http://en.wikipedia.org/wiki/Uuid" target="_blank">UUID</a></li>
<li><a title="UUID" href="http://en.wikipedia.org/wiki/Uuid" target="_blank"></a>the  algorithm used</li>
<li>the key size</li>
<li>the key (securely encrypted with a <strong>passphrase</strong> that you provide at format time)</li>
<li>checksums and other useful bits</li>
</ul>
<p>For high security, we are using a 512 bit AES key in an <a title="XTS" href="http://en.wikipedia.org/wiki/Disk_encryption_theory#XTS" target="_blank">XTS</a> cipher mode (requires kernel &gt;= 2.6.24). A small word of warning: whilst <em>cryptsetup</em> allows you to setup encryption on devices without any sort of identifying meta-data header, <strong>DON&#8217;T</strong> ever do that. If you need to hide the fact that you are using encryption there are better ways to do that. Contact us for details if you really want to go down that path.</p>
<p>Once you have formatted the device, you then need to activate it by running the command:</p>
<pre style="padding-left: 30px;">cryptsetup luksOpen /dev/sdb testing</pre>
<p>this will then make the unencrypted block device ready for you to use (i.e mkfs) as <em>/dev/mapper/testing</em>. To have the operating system setup the device at boot, you will need to put an entry into <em>/etc/crypttab</em>. Check the man page for details.</p>
<p>Finally, for best performance you want the implementation of AES that is most optimised for your hardware. You can check <em>/proc/crypto</em> to see which algorithms and drivers are available and their priority (highest priority number indicates higher priority). In order of performance, you want AES-NI, AES-x86_64 and the generic AES implementation last. The highest priority crypto implementation at the time of an encrypted block device being activated (via <em>cryptsetup luksOpen</em>) is used. Higher priority drivers installed into a running kernel have no effect on active devices.</p>
<h2>Benchmarking</h2>
<p>The simple benchmark tool <a title="zcav" href="http://www.coker.com.au/bonnie++/zcav/" target="_blank">zcav</a> is fine for our purposes. It only measures the sustained read/write speed. For an I/O device, this benchmark would normally be of limited value as the device bottleneck is usually with the rate of I/O requests that can be handled. For an encrypted block device, the bottleneck is instead in the throughput (i.e. the sustained read/write speeds) as the higher the throughput, the more work that the CPU has to do.</p>
<h2>Results</h2>
<p>The output from zcav was fed into gnuplot to generate the following graphs:</p>
<p style="text-align: center;"><img class="size-full wp-image-1607 aligncenter" title="zcav-read" src="http://www.anchor.com.au/blog/wp-content/uploads/2011/03/zcav-read.png" alt="Read benchmark results" width="1024" height="480" /></p>
<p>The obvious thing to note in this diagram is that the new AES instructions make a huge difference to performance. The impact of the encryption is relatively low and should be quite acceptable for a production system. An interesting thing to note is the relatively low performance of the RAID array. Being RAID 1, the RAID controller should have been able to balance the read requests over both drives to get about double what it is getting. I haven&#8217;t looked into the RAID settings though to see if this can be tuned.</p>
<p style="text-align: center;"><img class="size-full wp-image-1608 aligncenter" title="zcav-write" src="http://www.anchor.com.au/blog/wp-content/uploads/2011/03/zcav-write.png" alt="Write benchmark results" width="1024" height="480" /></p>
<p>The throughput here with the AES instructions in use is almost identical.</p>
<h2>Conclusion</h2>
<p>The results certainly look promising for even relatively high end work loads. One thing that is not measured here is the latency difference. It should be relatively straightforward to calculate the latency that will be added to every I/O request.</p>
<p>The numbers above can also be massively improved upon with a newer kernel featuring the <a title="dm-crypt scalability patch" href="https://lwn.net/Articles/409410/" target="_blank">dm-crypt scalability patches</a> (the benchmark above was limited to using 1 core out of 8!).</p>
<p>The nice thing about using the built-in dm-crypt solution is that you can use it on physical as well as virtual machines. If you are after something a bit more turn-key, you may wish to look at a system with drives (and a controller and BIOS) that support <a title="full disk encryption" href="http://en.wikipedia.org/wiki/Hardware-based_full_disk_encryption" target="_blank">self encrypting drives</a> as an alternative.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2011/03/secure-encrypted-storage-for-your-hosted-server-vm-vps-cloud-server-or-buzz_word/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DIY RFID security system</title>
		<link>http://www.anchor.com.au/blog/2010/12/diy-rfid-security-system/</link>
		<comments>http://www.anchor.com.au/blog/2010/12/diy-rfid-security-system/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 05:55:58 +0000</pubDate>
		<dc:creator>egalanos</dc:creator>
				<category><![CDATA[FTW]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[diy]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[RFID]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=1590</guid>
		<description><![CDATA[We just moved office last week to much larger premises! Whilst our office building already has excellent security as it houses a credit union, an additional security layer for our office floor can&#8217;t hurt (this is unrelated to our servers; they are housed in the secure Global Switch data centre). Now sure, we could easily [...]]]></description>
			<content:encoded><![CDATA[<p>We just <a href="http://www.anchor.com.au/about-us/contact-us/">moved office</a> last week to much larger premises!</p>
<p>Whilst our office building already has excellent security as it houses a <a href="http://www.sgecu.com.au/">credit union</a>, an additional security layer for our office floor can&#8217;t hurt (this is unrelated to our servers; they are housed in the secure <a href="http://www.globalswitch.com/en/locations/sydney-data-center">Global Switch data centre</a>). Now sure, we could easily just get a commercial off the shelf alarm system and be done with it, but  it can be pretty fun and interesting to get your hands dirty and do a bit of DIY hacking.</p>
<p>Using some simple components, we can quickly and easily build a basic <a href="http://en.wikipedia.org/wiki/Radio-frequency_identification">RFID</a> security system. One of the advantages of doing it ourselves (besides the fun!) is that we can integrate it into our standard monitoring and internal chat systems. The parts list for this project come from the excellent Australian electronics store <a href="http://www.littlebirdelectronics.com/">Little Bird Electronics</a>. The parts:</p>
<ul>
<li><a href="http://www.littlebirdelectronics.com/products/Freetronics-TwentyTen.html">Freetronics TwentyTen</a> (Arduino compatible)</li>
<li><a href="http://www.littlebirdelectronics.com/products/Ethernet-Shield-With-PoE.html">Ethernet Shield with PoE</a></li>
<li><a href="http://www.littlebirdelectronics.com/products/4-Channel-Power-over-Ethernet-Midspan-Injector.html">Power over Ethernet injector</a></li>
<li><a href="http://www.littlebirdelectronics.com/products/125Khz-RFID-module-%252d-UART-.html">RFID module</a></li>
<li><a href="http://www.littlebirdelectronics.com/products/Passive-Infrared-Detector-SE%252d10.html">Passive Infra-red Detector</a></li>
<li>Misc parts like a power supply, LEDs, buzzer</li>
</ul>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1592" title="RFID alarm system" src="http://www.anchor.com.au/blog/wp-content/uploads/2010/12/20101213_0011.jpg" alt="" width="695" height="438" /></p>
<p><strong>UPDATE 7th March 2011</strong>:</p>
<p>We thought it would be good to re-use the proximity cards we already carry around with us for this project, but we couldn&#8217;t get any of them to work with this reader.  There are a lot of proprietary standards out there and documentation on compatibility is really quite poor.  We are currently sourcing another reader that can handle a wider range of 125kHz proximity cards.</p>
<p>For the curious, <a title="Indala FlexCard" href="http://www.hidglobal.com/technology.php?tech_cat=8&amp;subcat_id=10" target="_blank">Indala FlexCard cards by HID Global</a> use a totally <a href="http://code.google.com/p/proxmark3/wiki/RunningPM3#Supported_tag_types" target="_blank">proprietary air interface</a>.</p>
<p>Whilst doing some research, an awesome open source hackers RFID module, the <a title="Proxmark3" href="http://www.proxmark3.com/" target="_blank">Proxmark3</a> was discovered. A very nice learning tool.</p>
<p>More posts to follow with details as the project progresses&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2010/12/diy-rfid-security-system/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP on shared hosting &#8211; doing it better</title>
		<link>http://www.anchor.com.au/blog/2010/09/php-on-shared-hosting-doing-it-better/</link>
		<comments>http://www.anchor.com.au/blog/2010/09/php-on-shared-hosting-doing-it-better/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 00:47:48 +0000</pubDate>
		<dc:creator>Barney Desmond</dc:creator>
				<category><![CDATA[FTW]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cgi]]></category>
		<category><![CDATA[mod_php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[shared hosting]]></category>
		<category><![CDATA[suexec]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=1497</guid>
		<description><![CDATA[Large scale shared hosting with an out-of-the-box install of apache and PHP is a recipe for security-disaster; this is not news. The solution is to run each website&#8217;s code separately so they can&#8217;t affect each other. This is pretty common nowadays but it wasn&#8217;t always the case with many providers. Anchor&#8217;s been doing this for [...]]]></description>
			<content:encoded><![CDATA[<p>Large scale shared hosting with an out-of-the-box install of apache and PHP is a recipe for security-disaster; this is not news. The solution is to run each website&#8217;s code separately so they can&#8217;t affect each other. This is pretty common nowadays but it wasn&#8217;t always the case with many providers.</p>
<p>Anchor&#8217;s been doing this for what must be about ten years now. That&#8217;s way longer than I&#8217;ve been employed here, but what with our tech-director-and-co-founder being busy stuntjumping his scooter over rows of parked cars, it&#8217;s fallen to me to write this one up.</p>
<p><a href="http://www.anchor.com.au/hosting/support/How-Anchor-runs-PHP-as-CGI-on-shared-hosting">We use apache&#8217;s mod_suexec to run PHP scripts as though they&#8217;re CGI scripts</a>, and it works great. There&#8217;s lots of guides out there about how to do this for yourself, but for us one of the most important things when deploying a solution is to ensure that it <em>Just Works</em>, for everyone. When we do it right, nothing breaks and noone notices a thing, because it works exactly as everyone expects. That&#8217;s what we&#8217;ve done.</p>
<p>It&#8217;s also one of the reasons that apache isn&#8217;t going anywhere in a hurry. Newer tech like nginx is an absolute performance-demon compared to apache, but the barrier to entry is way too high if your goal is &#8220;throw the site on the server and make it work&#8221;. Everyone writes apps assuming they&#8217;ll be deployed to apache. As a hosting company, if you&#8217;re not offering something compatible you&#8217;d better have a good ace up your sleeve.</p>
<p>So, we give you a rundown on <a href="http://www.anchor.com.au/hosting/support/How-Anchor-runs-PHP-as-CGI-on-shared-hosting">how Anchor does PHP; it&#8217;s secure and it just works</a>. There are many others like it, but this one is ours. If you&#8217;re an existing customer, we hope you&#8217;ve never had to think about it. If you&#8217;ve got any questions we&#8217;d love to hear them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2010/09/php-on-shared-hosting-doing-it-better/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Securing your codez from the wily exploit injectors</title>
		<link>http://www.anchor.com.au/blog/2009/11/securing-your-codez-from-the-wily-exploit-injectors/</link>
		<comments>http://www.anchor.com.au/blog/2009/11/securing-your-codez-from-the-wily-exploit-injectors/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 12:47:49 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[FTW]]></category>
		<category><![CDATA[attack]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[vulnerability]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=1379</guid>
		<description><![CDATA[Remember the good old days, when Melissa and ILOVEYOU were the major virus threats, spreading via e-mail and causing all sorts of embarrassing conversations at work? Or maybe even earlier than that, when the only way you could get a virus was by engaging in risky sex? (I mean Software EXchange, of course&#8230; get your [...]]]></description>
			<content:encoded><![CDATA[<p>Remember the good old days, when Melissa and ILOVEYOU were the major virus threats, spreading via e-mail and causing all sorts of embarrassing conversations at work?  Or maybe even earlier than that, when the only way you could get a virus was by engaging in risky sex?  (I mean Software EXchange, of course&#8230; get your mind out of the gutter)</p>
<p>These days, anti-virus protection for e-mail is fairly thorough, and nobody&#8217;s really swapping floppies full of 16 colour games at recess.  Malware authors have moved on to new and more fertile ground &#8212; embedding their junk in web pages, and relying on browser exploits to gain access to computers.  Of course, with this method, you can only get infected if you actually visit a page that has an infestation, so the malware authors have two options: either entice you to visit their sites, or modify existing websites that users will visit in the course of their day &#8212; legitimate sites that people know and trust, but with a little added infection.</p>
<p>Enticing people to a whole dodgy site is usually just a matter of providing something people love to look at and sticking it in search engines.  Since the attacker has to have a stable, identifiable presence for the search engines to direct users to, that can also be used by anti-malware lists like <a href="http://stopbadware.org">stopbadware.org</a> to protect web users, so this isn&#8217;t a particularly effective means of attack, and is waning somewhat in popularity.  Far more effective is infecting a legitimate website with some form of malware.  How does it happen, though?  In our experience, there are four vectors for infection:</p>
<ol>
<li>
Brute-force password guessing, where the attacker has a botnet they control to just repeatedly try lots and lots of usernames and passwords.  They&#8217;re bound to get lucky sooner or later.
</li>
<li>
Some sort of web-based exploit, typically a vulnerability in the web application that allows the attacker to run code of their choosing; this is then either used directly to edit files, or bootstrapped into sufficient access to edit files via another method.
</li>
<li>
Password &#8220;scraping&#8221;, where the attacker gets direct access to the FTP password for your site.  This can either be some sort of malware on the workstation of the web developer (or someone else related to the management of the website) that gets the password off the local machine (in a saved password file, or via a keylogger), or else via the &#8220;lost password&#8221; functionality provided by the hosting provider.  Once the attacker has the FTP password for the site, they are free to login to the live site and make whatever changes they like.
</li>
<li>
Direct modification of the website code on the client-side computer, relying on the developer not to notice it and then upload the compromised content to the live site.  We recently had our first &#8220;confirmed&#8221; case of this (where the web developer found the malicious modifications in their local copy), and they swear blind they didn&#8217;t download the HTML from the live site (which would bring the &#8220;infection&#8221; onto the local machine from the infected live site &#8212; which we&#8217;ve seen before, and categorise under vectors 1 and/or 2).
</li>
</ol>
<p>The countermeasures required to combat all these vectors boil down to a few simple precautions.</p>
<ul>
<li>
<b>Use strong passwords</b>.  (Protects against vector 1)  Yes, they&#8217;re a pain to manage, but a weak password is just an open invitation to getting repeatedly and painfully owned.  Of course, the strongest password is a keypair, which leads us to&#8230;
</li>
<li>
<b>Don&#8217;t use FTP</b>.  (Protects against vectors 1 and 3)  The list of reasons for this is long, but for securing your website, FTP is a pain because you can <em>only</em> use passwords[<a href="#exploit_fn_1"><a name="exploit_fn_1_src">1</a></a>].  Switch to using SFTP (the file transfer component of the SSH protocol) and you can use public keys, which are, for all practical purposes, unguessable.  You should also encrypt your keys with a passphrase, which means that even if the attacker does get access to your workstation and copies the key, it&#8217;ll be useless to them &#8212; unless they keylog your passphrase, which brings us to&#8230;
</li>
<li>
<b>Keep your workstation secure</b>.  (Vectors 3 and 4)  It seems that attackers have realised that the weakest link in the website security chain is <em>still</em> the Windows desktop, and they&#8217;re increasingly hitting it as the first step in taking over websites (if you get the right workstation, you can get the credentials to hundreds or thousands of websites, because one web developer often works on many different sites).  So, on any machine you connect to webservers from, you need to be doubly, triply sure that it&#8217;s rock solid &#8212; and that&#8217;s just a matter of following all the good advice out on the web.  Antivirus, antispyware and firewall software, constantly running, well-configured, and kept up to date; keep up to date with your application patches, especially for your web browser, e-mail client, and core OS; don&#8217;t visit dodgy web sites; and so on.
</li>
<li>
<b>Protect your e-mail</b>.  (Vector 3)  If someone can get access to your e-mail, they can also get access to your website, by using the password recovery feature (or impersonating you to your hosting company).  If they delete the e-mails that are coming in before you notice them, you&#8217;ll never know what&#8217;s going on, and all the password changes and workstation security in the world won&#8217;t help you.
</li>
<li>
<b>Don&#8217;t use shared hosting</b>.  (Vectors 1 and 3).  This might seem an odd thing to say, given that we sell shared hosting, but it is a legitimate way to reduce your vulnerability.  If you use a <a href="http://www.anchor.com.au/dedicated-hosting/dedicated-servers.py">dedicated server</a> (including a <a href="http://www.anchor.com.au/vps/virtual-private-server.py">VPS</a>), you (or we) can configure it to only allow logins from certain IP addresses, rather than the entire Internet.  This means that even if an attacker does get your password (or SSH key), via brute force or sniffing it off your workstation, they can&#8217;t login from their own machine because it won&#8217;t have an authorized IP address.  On shared hosting, this configuration is impractical, because hundreds of people have legitimate access to the server, from a great many different IP addresses.
</li>
<li>
<b>Code responsibly</b>.  (Vector 2)  It is said that &#8220;PHP is great, because its ease of use means that any idiot can produce a security hole &#8212; and most of them do&#8221;.  Whilst this is a little derogatory to the many (several?  few?  one?  PLEASE?) good PHP programmers out there, it is certainly fair to say that the capabilities of many people who write dynamic code aren&#8217;t up to the challenge of writing code that is exposed to the extremely hostile conditions that are the public Internet.</p>
<p>Thus, if you are not familiar with the common security practices and problems with the language or environment that you are developing for, <em>stop right now</em> and go learn a little.  There&#8217;s plenty of good information out there on the Internet from people who have learnt the lessons the hard way.  Celebrate the benefits of literacy by learning from their mistakes rather than having to educate yourself by cleaning up an infected website.  If you feel that isn&#8217;t something you can commit to, then please, for the sake of the Internet, find someone else to write the code.
</li>
<li>
<b>Keep your web applications patched</b>.  (Vector 2)  Whilst some sites do use custom-built web applications, many sites choose to use a standard CMS or other application to manage their website.  This is great, because hopefully someone else is taking a bit of responsibility for the security of the software, but that doesn&#8217;t do you any good if you don&#8217;t <em>keep it up-to-date</em>.  Far, far too many people install a CMS once, then forget about it.  Almost all of these applications have a vulnerability at some point, and not keeping them up to date is absolutely fatal, because once a vulnerability is found in a piece of software, an attacker can typically use Google to find all of the publicly-available instances of the vulnerable software, and quickly attack them all.</p>
<p>This means that you need to keep yourself well-informed of any security updates for your off-the-shelf web applications.  Subscribe to a relevant security announcements mailing list, or ensure that your vendor sends them to you.  (If your commercial CMS vendor doesn&#8217;t have this ability, find a new CMS vendor).
</li>
</ul>
<p>Websites get compromised all the time, by a variety of methods.  You should reinforce your defences, lest you&#8217;re the next target.</p>
<hr />
<p><a href="#exploit_fn_1_src"><a name="exploit_fn_1">1</a></a>. The first person to mention Kerberos or other unused-in-practice authentication schemes in a comment gets a free laughing at.  If you think SFTP and SCP aren&#8217;t supported in widely used web development programs, try finding something that supports GSSAPI&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2009/11/securing-your-codez-from-the-wily-exploit-injectors/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>On the importance of knowing how to pick secure passwords</title>
		<link>http://www.anchor.com.au/blog/2009/05/on-the-importance-of-knowing-how-to-pick-secure-passwords/</link>
		<comments>http://www.anchor.com.au/blog/2009/05/on-the-importance-of-knowing-how-to-pick-secure-passwords/#comments</comments>
		<pubDate>Thu, 28 May 2009 06:36:57 +0000</pubDate>
		<dc:creator>Barney Desmond</dc:creator>
				<category><![CDATA[WTF]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=959</guid>
		<description><![CDATA[We&#8217;ve already got solid advice on picking half decent passwords, but this advice from Zebra really takes the cake.]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve already got solid <a href="http://www.anchor.com.au/hosting/dedicated/Securing_Remote_Access_via_SSH_and_Server_Security#head-025b770729909ef2b953fec11f75f55933e78af3">advice on picking half decent passwords</a>, but this advice from Zebra really takes the cake.</p>
<p><a href="http://www.anchor.com.au/blog/wp-content/uploads/2009/05/zebrasafepassword.png"><img class="alignnone size-medium wp-image-960" src="http://www.anchor.com.au/blog/wp-content/uploads/2009/05/zebrasafepassword-300x252.png" alt="zebrasafepassword" width="300" height="252" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2009/05/on-the-importance-of-knowing-how-to-pick-secure-passwords/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developers, you can stop your crap authentication schemes now. Please.</title>
		<link>http://www.anchor.com.au/blog/2009/05/developers-you-can-stop-your-crap-authentication-schemes-now-please/</link>
		<comments>http://www.anchor.com.au/blog/2009/05/developers-you-can-stop-your-crap-authentication-schemes-now-please/#comments</comments>
		<pubDate>Fri, 22 May 2009 00:05:39 +0000</pubDate>
		<dc:creator>Barney Desmond</dc:creator>
				<category><![CDATA[FTW]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=925</guid>
		<description><![CDATA[I really like cryptography and security. I was lucky enough to take it as a subject at UNSW before I graduated. I found this earlier this evening; it&#8217;s a little old (~18 months), but that doesn&#8217;t make it any less relevant, so it&#8217;s a good read. There&#8217;s the odd inaccuracy here and there, but it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I really like cryptography and security. I was lucky enough to <a href="http://www.cse.unsw.edu.au/~cs3441/">take it as a subject at UNSW</a> before I graduated.</p>
<p>I found this earlier this evening; it&#8217;s a little old (~18 months), but that doesn&#8217;t make it any less relevant, so it&#8217;s a good read. There&#8217;s the odd inaccuracy here and there, but it&#8217;s solid stuff, and relevant to anyone writing webapp code to handle authentication.<br />
<a href="http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/"> http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/</a></p>
<p>The article focuses heavily on one particular authentication methodology, because it&#8217;s something a lot of people do. After you read it, you&#8217;ll understand that it&#8217;s something a lot of people do <em>poorly</em>. It assumes a reasonable degree of knowledge about what you&#8217;re doing (ay, there&#8217;s the rub), but the best lesson to be learnt there is that <em><strong>you</strong> shouldn&#8217;t be writing that code!</em> Just stop! Someone&#8217;s already done it better than you, and it&#8217;s been checked by a lot more people than you and your colleague, who reckons it &#8220;looks pretty secure&#8221;. If you&#8217;ve got time to read all the comments on the article you&#8217;ll find a rollercoaster of people saying, &#8220;wouldn&#8217;t it be secure if I just..?&#8221; Just don&#8217;t do it. <span style="text-decoration: line-through;">Don&#8217;t write my security code, bro!</span></p>
<p>Just using a proper authentication mechanism means you can spend your valuable time on more important things.</p>
<ul>
<li>Like not building SQL queries in a piecemeal manner, using unsanitised user-supplied data</li>
<li>Like not making your whole site world-writeable so you can handle file uploads (you don&#8217;t have to do this on <strong>our</strong> <a href="http://www.anchor.com.au/web-hosting/website-hosting.py">shared hosting</a> servers)</li>
<li>Like fixing your newsletter signup process so it requires <a href="http://www.anchor.com.au/hosting/support/BulkEmailMarketing/BeforeYouStart">double opt-in</a>, saving you from filling your database with spurious accounts and causing massive headaches when you do a campaign mailout</li>
<li>Like <a href="http://www.anchor.com.au/hosting/dedicated/SQL_Query_Optimisation">optimising your database schema for bitchin&#8217; performance</a> &#8211; do you retain a DBA on a six-figure salary to do this for you? Nah I didn&#8217;t think so, this is cheaper and much more fun</li>
<li>Like checking that your code doesn&#8217;t spew 14 PHP Warns/Errors to the apache logs for every page access, and fill the partition</li>
<li>Like trying to get nice round corners on your page elements <img src='http://www.anchor.com.au/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2009/05/developers-you-can-stop-your-crap-authentication-schemes-now-please/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title># mysql_secure_installation&#8230; Ya-ha-! (and ~/.my.cnf)</title>
		<link>http://www.anchor.com.au/blog/2009/03/mysql_secure_installation-ya-ha-and-mycnf/</link>
		<comments>http://www.anchor.com.au/blog/2009/03/mysql_secure_installation-ya-ha-and-mycnf/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 03:19:33 +0000</pubDate>
		<dc:creator>Barney Desmond</dc:creator>
				<category><![CDATA[WTF]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql_secure_installation]]></category>
		<category><![CDATA[option file]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=634</guid>
		<description><![CDATA[I was setting up mysql-server for a customer recently and noticed something interesting &#8211; there&#8217;s a helpful script included with mysql called mysql_secure_installation. We thought about that for a moment and had a chuckle. Okay, that was a little unfair; it&#8217;s no secret that we prefer to use Postgres wherever possible, but the idea of [...]]]></description>
			<content:encoded><![CDATA[<p>I was setting up mysql-server for a customer recently and noticed something interesting &#8211; there&#8217;s a helpful script included with mysql called <code>mysql_secure_installation</code>. We thought about that for a moment and had a chuckle. Okay, that was a little unfair; it&#8217;s <a href="http://www.anchor.com.au/hosting/dedicated/mysql_vs_postgres">no secret that we prefer to use Postgres</a> wherever possible, but the idea of having a &#8220;make it all secure&#8221; script isn&#8217;t too bad an idea, as long as it doesn&#8217;t produce a false sense of security.</p>
<p><span id="more-634"></span></p>
<p>The script does good things, but MySQL could probably be doing things better to begin with &#8211; make it more secure out-of-the-box, and the <strong>last</strong> thing they should be doing is shipping it with an empty root password. &gt;_&lt; It pains me to say it, but I think MSSQL probably comes with a more-secure initial configuration. Things like no remote connections, and no test database unless you explicitly ask for it.</p>
<p>The <a href="http://dev.mysql.com/doc/refman/5.0/en/mysql-secure-installation.html">documentation for <code>mysql_secure_installation</code></a> is brief but functional. One of the things I thought it was doing was writing out a convenient .my.cnf file for the user, but it turns out it just deletes it once it&#8217;s finished. This is a shame, because the per-user config file is really cool.</p>
<p>If you&#8217;re not already taking advantage of them, you should. <a href="http://dev.mysql.com/doc/refman/5.0/en/option-files.html">MySQL calls them &#8220;option files&#8221;</a>, and it lets you set default parameters for the client apps you use at the command line, like <code>mysql</code> and <code>mysqldump</code>, etc. We use them to store root&#8217;s login credentials so we don&#8217;t have to lookup the password for a given machine, then mess around with mysql&#8217;s asinine option-handling.</p>
<p>It&#8217;s best to at least read up briefly on option files before using them, but they&#8217;re pretty straightforward: you have &#8220;groups&#8221; of options in the file written as <code>[groupname]</code>, then one option on each line after that. An instructive example:</p>
<blockquote><p><code>[mysql]<br />
database=mysql<br />
</code></p>
<p><code><br />
[client]<br />
user=root<br />
password=verySecurePassword<br />
</code></p></blockquote>
<p>If you&#8217;re going to keep your password here, you <strong>must</strong> make sure the file is adequately protected from other users who might try to view it.</p>
<p>The group-names I mentioned correspond to the client program that will use the options. <code>[client]</code> is a special case; those options will be used by all the mysql client programs, so it&#8217;s the ideal place for your username and password.</p>
<p>Having the database option in the <code>[mysql]</code> group means you&#8217;re automatically connected to a database once you start the mysql command-line client. We don&#8217;t put this in the <code>[client]</code> group because it would affect other utilities like <code>mysqldump</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2009/03/mysql_secure_installation-ya-ha-and-mycnf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SaaS (Security-scanning as a Service)</title>
		<link>http://www.anchor.com.au/blog/2008/12/saas-security-scanning-as-a-service/</link>
		<comments>http://www.anchor.com.au/blog/2008/12/saas-security-scanning-as-a-service/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 02:46:15 +0000</pubDate>
		<dc:creator>Barney Desmond</dc:creator>
				<category><![CDATA[WTF]]></category>
		<category><![CDATA[compliance]]></category>
		<category><![CDATA[pcidss]]></category>
		<category><![CDATA[scanning]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.anchor.com.au/blog/?p=132</guid>
		<description><![CDATA[We&#8217;ve had some enquiries from customers recently regarding security compliance scans, the most popular of which is the PCI DSS. For those not in the know, this stands for the Payment Card Industry Data Security Standard. It is of course a fascinating topic, covering best-practice standards for processing and storage of customer information. The enquiries [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve had some enquiries from customers recently regarding security compliance scans, the most popular of which is the PCI DSS. For those not in the know, this stands for the <a title="Wikipedia article for the PCIDSS" href="http://en.wikipedia.org/wiki/PCI_DSS"><em>Payment Card Industry Data Security Standard</em></a>. It is of course a fascinating topic, covering best-practice standards for processing and storage of customer information.</p>
<p>The enquiries we get relate to a security scan carried out by an Approved Scanning Vendor (ASV). The usual report format is a list of potential &#8220;vulnerabilities&#8221; detected, with a severity rating of 1 to 5 assigned to each. Anchor&#8217;s <a href="http://www.anchor.com.au/web-hosting/website-hosting.py">shared hosting</a> servers never have any problems with this, so the report reads like a missal of mundanity.</p>
<p><strong>TCP port 21 is open, an FTP service appears to be running!</strong> Crazy, I know&#8230;</p>
<p>The thing is, this scan is really just one small part of a much larger framework. The core requirements of the PCIDSS don&#8217;t specify at all how the scan should be performed; it&#8217;s really about secure storage and transmission of data, and accountability and auditing.</p>
<p>Do our customers&#8217; applications really encrypt the data they store in the database? I don&#8217;t know, but it sure isn&#8217;t checked as part of the scan. Requirement 6 is &#8220;Develop and maintain secure systems and applications&#8221;. Mm-hmm, that&#8217;s a good idea&#8230;</p>
<p>Security is really a commodity nowadays, a fact highlighted most perfectly in the vending of SSL certificates. In case you hadn&#8217;t guessed, the PCIDSS scans we&#8217;ve seen can proudly join the ranks. Thankfully there are scanners who really know where their towel is, looks good to me!</p>
<p><a href="http://www.scanlesspci.com/">http://www.scanlesspci.com/</a></p>
<p><a href="http://blogs.zdnet.com/security/?p=1114">http://blogs.zdnet.com/security/?p=1114</a></p>
<p><a href="http://jeremiahgrossman.blogspot.com/2008/04/my-blog-is-pci-certified-by-scanless.html">http://jeremiahgrossman.blogspot.com/2008/04/my-blog-is-pci-certified-by-scanless.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.anchor.com.au/blog/2008/12/saas-security-scanning-as-a-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

