<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/blog/templates/default/atom.css" type="text/css" ?>

<feed 
   xmlns="http://www.w3.org/2005/Atom"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    
    <link href="http://blog.godshell.com/blog/feeds/atom.xml" rel="self" title="Technological Musings" type="application/atom+xml" />
    <link href="http://blog.godshell.com/blog/"                        rel="alternate"    title="Technological Musings" type="text/html" />
    <link href="http://blog.godshell.com/blog/rss.php?version=2.0"     rel="alternate"    title="Technological Musings" type="application/rss+xml" />
    <title type="html">Technological Musings</title>
    <subtitle type="html">Musings, ramblings, rants ...</subtitle>
    <icon>http://blog.godshell.com/blog/templates/default/img/s9y_banner_small.png</icon>
    <id>http://blog.godshell.com/blog/</id>
    <updated>2012-01-26T04:01:56Z</updated>
    <generator uri="http://www.s9y.org/" version="1.6">Serendipity 1.6 - http://www.s9y.org/</generator>
    <dc:language>en</dc:language>

    <entry>
        <link href="http://blog.godshell.com/blog/archives/306-Contemplating-the-Future.html" rel="alternate" title="Contemplating the Future" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2012-01-26T04:01:53Z</published>
        <updated>2012-01-26T04:01:56Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=306</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=306</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/306-guid.html</id>
        <title type="html">Contemplating the Future</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                In 2005 I obtained a job at a regional <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/ILEC']);"  href="https://en.wikipedia.org/wiki/ILEC">ILEC</a> as a Data Operations Technician.  As part of this job, I took over development of one of the tools we used to diagnose customer DSL connections.  Problem was, this tool was written in PHP, a programming language I was, as yet, unfamiliar with.<br />
<br />
At the same time, I was also looking for a web-based tool I could use to keep track of various tasks.  While there were a few open-source tools I could use, none had the features I was looking for.  So I decided to write one myself, and to write it in PHP so I could learn the language better.  In the end, I'm glad I did as PHP has become indispensable for writing web-based tools.<br />
<br />
The tool I wrote was a web-based todo manager called <a onclick="_gaq.push(['_trackPageview', '/extlink/phptodo.godshell.com/']);"  href="http://phptodo.godshell.com/">phpTodo</a>.  Since the alpha release in 2005, I have released 7 more versions.  Work on phpTodo has ebbed and lowed with time, often interrupted by work and life in general.  In fact, the last formal release was made almost 5 years ago, bringing the current version up to 0.8.1.  In 2009, I <a href="http://blog.godshell.com/blog/archives/199-phpTodo-...-In-Fedora!!.html">found out</a> that phpTodo was being packaged and released with Fedora as well.<br />
<br />
After releasing 0.8.1, I decided to switch from using categories to using tags, similar to how the blogging system I use, <a onclick="_gaq.push(['_trackPageview', '/extlink/s9y.org/']);"  href="http://s9y.org/">Serendipity</a>, uses them.  This required rewriting a good deal of the back end of the system, as well as making extensive changes to the front end.  I also started using the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.prototypejs.org/']);"  href="http://www.prototypejs.org/">Prototype</a> and <a onclick="_gaq.push(['_trackPageview', '/extlink/script.aculo.us/']);"  href="http://script.aculo.us/">Scriptaculous</a> Javascript frameworks, and then later switched to <a onclick="_gaq.push(['_trackPageview', '/extlink/jquery.com/']);"  href="http://jquery.com/">jQuery</a>.  In all, a great deal of code has been rewritten.<br />
<br />
I'm quite happy with the general feel of the new version I've been working on.  While there is a good deal more code to be written, I'm confident there will be a code release soon enough.<br />
<br />
I've been thinking a lot about the future of phpTodo and where I want to take it.  When I originally started, I wrote the system such that I could see my todo list items via an RSS feed.  At the time, I had a Blackberry phone and this worked brilliantly.  Of course, this was purely a one-way feed with no way to update any todo items on the go.  Since that time, I started working on a mobile view for the system, but stopped quickly after I realized how horrible working with <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/Wireless_Application_Protocol']);"  href="https://en.wikipedia.org/wiki/Wireless_Application_Protocol">WAP</a> was.  Fortunately, technology has progressed quickly since that time and WAP is no longer necessary.  So, I'm considering working on a mobile version again.<br />
<br />
A mobile version brings new challenges, however.  It should be trivial to develop a mobile view that can be used while online, but my hope was to have an offline version as well that can be synchronized with the online version.  One possibility is to develop an app that can be loaded onto a phone.  That, of course, severely limits the platforms it can be run on.  Another possibility is an HTML5 version, though that brings challenges of its own.<br />
<br />
Another thought was to build a web service into phpTodo.  The basic premise is an XML generator that, given a set of parameters, can supply an XML feed for external systems to use as input.  And an XML parser that can receive data from external systems in order to update phpTodo data.  I believe this can be used as the interface for the mobile view.<br />
<br />
A web service can also be used to power another idea I had.  I stumbled across the website of <a onclick="_gaq.push(['_trackPageview', '/extlink/brettterpstra.com']);"  href="http://brettterpstra.com">Brett Terpstra</a> a while back and found a treasure trove of interesting ideas and useful code snippets.  Among these is an obsession for recording notes to keep track of projects, interesting ideas, and helpful code snippets.  Brett uses a number of custom scripts and software packages, most of which are exclusive to his platform of choice, OS X.  To be honest, I find this incredibly intriguing, and potentially useful.  So, I've been thinking about developing a command-line tool I can use to interact with phpTodo.  A web service could make this a great deal easier.<br />
<br />
I have no plans to stop working on the project, and, in fact, I'm eager to keep moving forward.  As I continue to rely on phpTodo itself for my daily work, I rely on improvements I can make to the system.  So overall, the future of phpTodo is bright. 
            </div>
        </content>
        <dc:subject>phptodo</dc:subject>
<dc:subject>programming</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/305-Mega-Fail.html" rel="alternate" title="Mega Fail" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2012-01-20T18:46:50Z</published>
        <updated>2012-01-20T18:48:27Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=305</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=305</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/305-guid.html</id>
        <title type="html">Mega Fail</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                So… this happened :<br />
<br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/www.usatoday.com/tech/news/story/2012-01-19/megaupload-feds-shutdown/52678528/1']);"  href="http://www.usatoday.com/tech/news/story/2012-01-19/megaupload-feds-shutdown/52678528/1">Popular file-sharing website Megaupload shut down</a><br /><br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/arstechnica.com/tech-policy/news/2012/01/megaupload-shut-down-by-feds-seven-charged-four-arrested.ars']);"  href="http://arstechnica.com/tech-policy/news/2012/01/megaupload-shut-down-by-feds-seven-charged-four-arrested.ars">Megaupload shut down by feds, seven charged, four arrested</a><br /><br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/news.cnet.com/8301-31001_3-57362609-261/megaupload-assembles-worldwide-criminal-defense/']);"  href="http://news.cnet.com/8301-31001_3-57362609-261/megaupload-assembles-worldwide-criminal-defense/">Megaupload assembles worldwide criminal defense</a><br /><br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/venturebeat.com/2012/01/20/department-of-justice-doj-dept-of-justice-megaupload-piracy-sopa-pipa/']);"  href="http://venturebeat.com/2012/01/20/department-of-justice-doj-dept-of-justice-megaupload-piracy-sopa-pipa/">Department of Justice shutdown of rogue site MegaUpload shows SOPA is unnecessary</a><br /><br />
And then..  This happened :<br />
<br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/www.cbsnews.com/8301-501465_162-57362764-501465/megaupload-anonymous-hacker-retaliation-nobody-wins/']);"  href="http://www.cbsnews.com/8301-501465_162-57362764-501465/megaupload-anonymous-hacker-retaliation-nobody-wins/">Megaupload Anonymous hacker retaliation, nobody wins</a><br />
<br />
And, of course, the day before all of this happened was the <a href="http://blog.godshell.com/blog/archives/304-Who-turned-the-lights-out.html">SOPA/PIPA protest</a>.<br />
<br />
Wow..  The government, right?  SOPA/PIPA isn't even on the books, people are up in arms over it, and then they go and seize one of the largest file sharing websites on the planet!  We should all band together and immediately protest this illegal seizure!<br />
<br />
But wait..  hang on..  Since when does jumping to conclusions help?  Let's take a look and see what exactly is going on here..  According to the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.justice.gov/opa/pr/2012/January/12-crm-074.html']);"  href="http://www.justice.gov/opa/pr/2012/January/12-crm-074.html">indictment</a>, this case went before a grand jury before any takedown was performed.  Additionally, this wasn't an all-of-a-sudden thing.  Megaupload had been contacted in the past about copyright violations and failed to deal with them as per established law.<br />
<br />
There are a lot of people who are against this action.  In fact, the hacktivist group, Anonymous, decided to display their dictate by performing DDoS attacks against high profile sites such as the US DoJ, MPAA, and RIAA.  This doesn't help things and may actually hurt the SOPA/PIPA protest in the long run.<br />
<br />
Now I'm not going to say that the takedown was right and just, there's just not enough information as of yet, and it may turn out that the government was dead wrong with this action.  But at the moment, I have to disagree with those that point at this as an example of an illegal takedown.  As a friend of mine put it, if the corner market is selling illegal bootleg videos, when they finally get raided, the store gets closed.  Yes, there were legal uses of the services on the site, but the corner store sold milk too.<br />
<br />
There are still many, many copyright and piracy issues to deal with.  And it's going to take a long time to deal with them.  We need to be vigilant, and protesting when necessary does work.  But jumping to conclusions like this, and then attacking sites such as the DoJ are not going to help the cause.  There's a time and a place for that, and I don't believe we're there yet. 
            </div>
        </content>
        <dc:subject>law</dc:subject>
<dc:subject>politics</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/304-Who-turned-the-lights-out.html" rel="alternate" title="Who turned the lights out?" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2012-01-18T20:19:35Z</published>
        <updated>2012-01-18T20:38:47Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=304</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=304</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/304-guid.html</id>
        <title type="html">Who turned the lights out?</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                You may have noticed that a number of websites across the Internet today have modified their look a bit.  In many cases, the normal content of that site is unreachable.  Why would they do such a thing, you may ask?  Well, there are two proposed laws, SOPA and PIPA, that threaten what we, today, enjoy as the Internet.  The short version of these laws is that, basically, if you're found to have any material on your website that infringes copyright, you face having your website shut down, without due process, all of your advertising pulled, being stricken from search engines, and possible jail time.  Pretty draconian.  There are a number of places that can explain, in more detail, what the full text of the legislation says.  If you're interested, check out <a onclick="_gaq.push(['_trackPageview', '/extlink/americancensorship.org/']);"  href="http://americancensorship.org/">americancensorship.org</a> or <a onclick="_gaq.push(['_trackPageview', '/extlink/blacklist.eff.org/']);"  href="https://blacklist.eff.org/">eff.org</a>.<br />
<br />
Or, you can check out this video, from <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ted.com/']);"  href="http://www.ted.com/">ted.com</a>, that explains the legislation and why it's so bad.<br />
<br />
<object width="400" height="284"><br />
<param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><br />
<param name="allowFullScreen" value="true" /><br />
<param name="allowScriptAccess" value="always"/><br />
<param name="wmode" value="transparent"></param><br />
<param name="bgColor" value="#ffffff"></param><br />
<param name="flashvars" value="vu=http://video.ted.com/talk/stream/2012S/Blank/ClayShirky_2012S-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/ClayShirky_2012S-embed.jpg&vw=512&vh=288&ap=0&ti=1329&lang=en&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=defend_our_freedom_to_share_or_why_sopa_is_a_bad_idea;year=2012;theme=master_storytellers;theme=media_that_matters;event=TEDSalon+NY2012;tag=Business;tag=Technology;tag=creativity;tag=media;tag=politics;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><br />
<embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="400" height="284" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2012S/Blank/ClayShirky_2012S-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/ClayShirky_2012S-embed.jpg&vw=512&vh=288&ap=0&ti=1329&lang=en&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=defend_our_freedom_to_share_or_why_sopa_is_a_bad_idea;year=2012;theme=master_storytellers;theme=media_that_matters;event=TEDSalon+NY2012;tag=Business;tag=Technology;tag=creativity;tag=media;tag=politics;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;"></embed><br />
</object><br />
<br />
If you're coming here after the 18th of January, here are some images of the protesting.<br />
<br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/www.google.com']);"  href="http://www.google.com">Google</a><br /><br />
<br />
<a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/google-sopa.png"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.godshell.com/blog/uploads/google-sopa.png" alt="Google" title="google-sopa.png" border="0" width="300" height="225" /></a><br />
<br />
<br /><br />
<br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/www.wikipedia.org']);"  href="http://www.wikipedia.org">Wikipedia</a><br /><br />
<br />
<a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/wikipedia-sopa.png"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.godshell.com/blog/uploads/wikipedia-sopa.png" alt="Wikipedia" title="wikipedia-sopa.png" border="0" width="300" height="219" /></a><br />
<br />
<br /><br />
<br />
<a onclick="_gaq.push(['_trackPageview', '/extlink/www.wired.com']);"  href="http://www.wired.com">Wired.com</a><br /><br />
<br />
<a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/wired-sopa.png"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.godshell.com/blog/uploads/wired-sopa.png" alt="Wired Magazine" title="wired-sopa.png" border="0" width="300" height="897" /></a> 
            </div>
        </content>
        <dc:subject>politics</dc:subject>
<dc:subject>SOPA</dc:subject>
<dc:subject>technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/303-Blacklisted!.html" rel="alternate" title="Blacklisted!" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2012-01-12T21:28:22Z</published>
        <updated>2012-01-12T21:28:23Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=303</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=303</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/303-guid.html</id>
        <title type="html">Blacklisted!</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Back in October of 2011, a bill was introduced in the House of Representatives called <a onclick="_gaq.push(['_trackPageview', '/extlink/thomas.loc.gov/cgi-bin/query/z?c112:H.R.3261:']);"  href="http://thomas.loc.gov/cgi-bin/query/z?c112:H.R.3261:">HR.3261</a>, or the "Stop Online Privacy Act (SOPA)."  Go take a look, I'll wait.  It's a relatively straightforward bill, especially compared to others I've looked at.  Hell, it's only 15 pages long!  And it's going to kill the Internet.<br />
<br />
Ok,ok.. It won't *KILL* the Internet, but it has the potential to ruin what we consider to be the Internet.  Personally, I believe that if this passes, it has the potential to turn the Internet into nothing more than a collection of business websites, at least in the US.<br />
<br />
So how does this thing work?  Well, it's actually pretty straightforward.  If your website is suspected of infringing on copyrighted material, your website is taken down, any advertising you have on your site is cut, and you are removed from search engines.  But so what, you deserve it!  You were breaking copyright law!<br />
<br />
Not so fast.  This applies to *any* content on your website.  So if someone comments on a blog entry, or you innocently link to a website that infringes copyright, or other situations out of your control, you're responsible.  Basically, you have to police every single comment, link, etc. that appears on your website.<br />
<br />
It's even worse for service providers since they have to do the blocking.  Every infringing site is blocked via DNS.  And since the US doesn't have control of all of DNS, and some infringing sites are not located in the US, this means we move into the realm of having DNS blacklist files.  The ISP becomes the responsible party if they fail to block these sites, which in turn means more overhead for the ISP.  Think you pay a lot for Internet access now?<br />
<br />
So what can you do?  Well, for one, you can <a onclick="_gaq.push(['_trackPageview', '/extlink/www.eff.org/deeplinks/2012/01/stop-blacklist-legislation-guide-person-meetings']);"  href="https://www.eff.org/deeplinks/2012/01/stop-blacklist-legislation-guide-person-meetings">contact your representative</a> and tell them how insane this whole idea is.  And you can protest SOPA itself by putting up a protest overlay on your site.  There's a <a onclick="_gaq.push(['_trackPageview', '/extlink/github.com/lpar/KillSOPA']);"  href="https://github.com/lpar/KillSOPA">github project</a> with all of the source code you need to add an overlay to your website.  Or, if you have a Serendipity web blog, you can download the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.godshell.com/software']);"  href="http://www.godshell.com/software">Stop SOPA plugin</a> I've written.<br />
<br />
Get out there and protest! 
            </div>
        </content>
        <dc:subject>Politics</dc:subject>
<dc:subject>Programming</dc:subject>
<dc:subject>SOPA</dc:subject>
<dc:subject>Technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/302-Bringing-Social-To-The-Kernel.html" rel="alternate" title="Bringing Social To The Kernel" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2012-01-07T05:04:45Z</published>
        <updated>2012-01-08T03:15:46Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=302</wfw:comment>
    
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=302</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/302-guid.html</id>
        <title type="html">Bringing Social To The Kernel</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Imagine a world where you can login to your computer once and have full access to all of the functionality in your computer, plus seamless access to all of the web sites you visit on a daily basis.  No more logging into each site individually, your computer's operating system takes care of that for you.<br />
<br />
That world may be coming quicker than you realize.  I was listening to a <a onclick="_gaq.push(['_trackPageview', '/extlink/pauldotcom.com/2012/01/pauldotcom-security-weekly-epi-232.html']);"  href="http://pauldotcom.com/2012/01/pauldotcom-security-weekly-epi-232.html">recent episode</a> of the PaulDotCom security podcast today.  In this episode, they interviewed <a onclick="_gaq.push(['_trackPageview', '/extlink/www.sans.org/windows-security/author/jfossen']);"  href="http://www.sans.org/windows-security/author/jfossen">Jason Fossen</a>, a SANS Security Faculty Fellow and instructor for SEC 505: Securing Windows.  During the conversation, Jason mentioned some of the changes coming to the next version of Microsoft's flagship operating system, Windows 8.  What he described was, in a word, horrifying…<br />
<br />
Not much information is out there about these changes yet, but it's possible to piece together some of it.  Jason mentioned that Windows 8 will have a broker system for passwords.  Basically, Windows will store all of the passwords necessary to access all of the various services you interact with.  Think something along the lines of <a onclick="_gaq.push(['_trackPageview', '/extlink/agilebits.com/onepassword']);"  href="https://agilebits.com/onepassword">1Password</a> or <a onclick="_gaq.push(['_trackPageview', '/extlink/lastpass.com/']);"  href="https://lastpass.com/">LastPass</a>.  The main difference being, this happens in the background with minimal interaction with the user.  In other words, you never have to explicitly login to anything beyond your local Windows workstation.<br />
<br />
Initially, Microsoft won't have support for all of the various login systems out there.  They seem to be focusing on their own service, Windows Live, and possibly Facebook.  But the API is open, allowing third-parties to provide the necessary hooks to their own systems.<br />
<br />
I've spent some time searching for more information and what I'm finding seems to indicate that what Jason was talking about is, in fact, the plan moving forward.  TechRadar has a story about the Windows 8 <a onclick="_gaq.push(['_trackPageview', '/extlink/www.techradar.com/news/software/operating-systems/how-windows-8-helps-remember-passwords-1051876']);"  href="http://www.techradar.com/news/software/operating-systems/how-windows-8-helps-remember-passwords-1051876">Credential Vault</a>, where website passwords are stored.  The credential vault appears to be a direct competitor to 1Password and LastPass.  As with other technologies that Microsoft has integrated in the past, this may be the death knell for password managers.<br />
<br />
ReadWriteWeb has a story about the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.readwriteweb.com/cloud/2011/09/build-2011-windows-azure-tackl.php']);"  href="https://www.readwriteweb.com/cloud/2011/09/build-2011-windows-azure-tackl.php">Windows Azure Access Control Service</a> that is being used for Windows 8.  Interestingly, this article seems to indicate that passwords won't be stored on the Windows 8 system itself, but in a centralized "cloud" system.  A system called the Access Control Service, or ACS, will store all of the actual login information, and the Windows 8 Password Broker will obtain tokens that are used for logins.  This allows users to access their data from different systems, including tablets and phones, and retain full access to all of their login information.<br />
<br />
Microsoft is <a onclick="_gaq.push(['_trackPageview', '/extlink/msdn.microsoft.com/en-us/magazine/gg490345.aspx']);"  href="http://msdn.microsoft.com/en-us/magazine/gg490345.aspx">positioning</a> Azure ACS as a complete <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/Claims-based_identity']);"  href="https://en.wikipedia.org/wiki/Claims-based_identity">claims-based identity system</a>.  In short, this allows ACS to become a one-stop shop for single sign-on.  I log into Windows and immediately have access to all of my accounts across the Internet.<br />
<br />
Sounds great, right?  In one respect, it is.  But if you think about it, you're making things REALLY easy for attackers.  Now they can, with a single login and password, access every system you have access to.  It doesn't matter that you've used different usernames and passwords for your bank accounts.  It doesn't matter that you've used longer, more secure passwords for those sensitive sites.  Once an attacker gains a foothold on your machine, it's game over.<br />
<br />
Jason also mentioned another chilling detail.  You'll be able to login to your local system using your Windows Live ID.  So, apparently, if you forget your password for your local user, just login with your Windows Live ID.  It's all tied together.  According to the TechRadar story, "<em>if you forget your Windows password you can reset it from another PC using your Windows Live ID, so you don't need to make a password restore USB stick any more</em>."  They go on to say the following :<br />
<br />
<blockquote>You'll also have to prove your identity before you can 'trust' the PC you sync them to, by giving Windows Live a second email address or a mobile number it can text a security code to, so anyone who gets your Live ID password doesn't get all your other passwords too – Windows 8 will make you set that up the first time you use your Live ID on a PC.<br />
<br />
You can always sign in to your Windows account, even if you can't get online – or if there's a problem with your Live ID – because Windows 8 remembers the last password you signed in with successfully (again, that's encrypted in the Password Vault).</blockquote><br />
<br />
With this additional tidbit of information, it would appear that an especially crafty attacker could even go as far as compromising your entire system, without actually touching your local machine.  It may not be easy, but it looks like it'll be significantly easier than it was before.<br />
<br />
Federated identity is an interesting concept.  And it definitely has its place.  But, I don't think tying everything together in this manner is a good move for security.  Sure, you can use your Facebook ID (or Twitter, Google, OpenID, etc) already as a single login for many disparate sites.  In fact, these companies are betting on you to do so.  This ties all of your activity back to one central place where the data can be mined for useful and lucrative bits.  And perhaps in the realm of a social network, that's what you want.  But I think there's a limit to how wide a net you want to cast.  But if what Jason says is true, Microsoft may be building the equivalent of the <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/One_ring']);"  href="https://en.wikipedia.org/wiki/One_ring">One Ring</a>.  ACS will store them all, ACS will verify them, ACS will authenticate them all, and to the ether supply them. 
            </div>
        </content>
        <dc:subject>Microsoft</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>technology</dc:subject>
<dc:subject>Windows</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/301-The-Zero-Day-Conundrum.html" rel="alternate" title="The Zero-Day Conundrum" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-12-13T00:43:09Z</published>
        <updated>2011-12-13T00:43:14Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=301</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=301</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/301-guid.html</id>
        <title type="html">The Zero-Day Conundrum</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Last week, another "zero-day" vulnerability was reported, this time in Adobe's Acrobat PDF reader.  Anti-virus company, Symantec, <a onclick="_gaq.push(['_trackPageview', '/extlink/www.eweek.com/c/a/Security/Adobe-ZeroDay-Exploit-Targeted-Defense-Contractors-383203/']);"  href="http://www.eweek.com/c/a/Security/Adobe-ZeroDay-Exploit-Targeted-Defense-Contractors-383203/">reports</a> that this vulnerability is being used as an attack vector against defense contractors, chemical companies, and others.  Obviously, this is a big deal for all those being targeted, but is it really something you need to worry about?  Are "zero-days" really something worth defending against?<br />
<br />
What is a zero-day anyway?  Wikipedia has this to say:<br />
<br />
<blockquote>A zero-day (or zero-hour or day zero) attack or threat is a computer threat that tries to exploit computer application vulnerabilities that are unknown to others or the software developer. Zero-day exploits (actual software that uses a security hole to carry out an attack) are used or shared by attackers before the developer of the target software knows about the vulnerability.</blockquote><br />
<br />
So, in short, a zero-day is an unknown vulnerability in a piece of software.  Now, how do we defend against this?  We have all sorts of tools on our side, surely there's one that will catch these before they become a problem, right?  IDS/IPS systems have heuristic filters for detecting anomalous activity.  Of course, you wouldn't want your IPS blocking arbitrary traffic, so that might not be a good idea.  Anti-virus software also has heuristic filters, so that should help, right?  Well…  When's the last time your heuristic filter caught something that wasn't a false positive?  So yeah, that's probably not going to work either.  So what's a security engineer to do?<br />
<br />
My advice?  Don't sweat it.  Don't get me wrong, zero-days are dangerous and can cause all sorts of problems, but unless you have an unlimited budget with an unlimited amount of time, trying to defend against an unknown attack is a pointless exercise in futility.  But don't despair, there is hope.<br />
<br />
Turns out, if you spend your time securing your network properly, you'll defend against most attacks out there.  Let's look at this latest attack, for instance.  Let's assume you've spent millions and have the latest and greatest hardware with all the cutting edge signatures and software.  Someone sends the CEO's secretary an innocuous PDF, which she promptly opens, and all that hard work goes out the window.<br />
<br />
On the other hand, let's assume you spent the small budget you have defending the critical data you store and spend the time you've saved not decoding those advanced heuristics manuals on training the staff.  This time the CEO's secretary looks twice, realizes this is an unsolicited email, and doesn't open the PDF.  No breach, the world is saved.<br />
<br />
Seriously, though, spending your time and effort safe-guarding your data and training your staff will get you much further than worrying about every zero-day that comes along.  Of course, you should be watching for these sorts of reports.  In this case, for instance, you can alert your staff that there's a critical flaw in this particular software and that they need to be extra careful.  Or, if the flaw is in a web application, you can add the necessary signatures to look for it.  But in the end, it's very difficult, if not impossible, to defend against something you're not aware of.  Network and system security is complex and difficult enough without having to worry about the unknown. 
            </div>
        </content>
        <dc:subject>security</dc:subject>
<dc:subject>technology</dc:subject>
<dc:subject>zero-day</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/300-Reflections-on-DerbyCon.html" rel="alternate" title="Reflections on DerbyCon" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-10-11T02:11:20Z</published>
        <updated>2011-10-15T03:19:26Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=300</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=300</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/300-guid.html</id>
        <title type="html">Reflections on DerbyCon</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                On September 30th, 2011, over 1000 people from a variety of backgrounds descended on Louisville, Kentucky to attend the first <a onclick="_gaq.push(['_trackPageview', '/extlink/www.derbycon.com']);"  href="http://www.derbycon.com">DerbyCon</a>.  DerbyCon is a security conference put together by three security professionals, <a onclick="_gaq.push(['_trackPageview', '/extlink/www.secmaniac.com/']);"  href="http://www.secmaniac.com/">Dave Kennedy</a>, <a onclick="_gaq.push(['_trackPageview', '/extlink/twitter.com/#!/purehate_']);"  href="https://twitter.com/#!/purehate_">Martin Bos</a>, and <a onclick="_gaq.push(['_trackPageview', '/extlink/www.irongeek.com/']);"  href="http://www.irongeek.com/">Adrian Crenshaw</a>.  Along with a sizable crew of security and administrative staff, they hosted an absolutely amazing conference.<br />
<br />
During the three day conference, DerbyCon sported amazing speakers such as <a onclick="_gaq.push(['_trackPageview', '/extlink/secure.wikimedia.org/wikipedia/en/wiki/Mitnick']);"  href="https://secure.wikimedia.org/wikipedia/en/wiki/Mitnick">Kevin Mitnick</a>, <a onclick="_gaq.push(['_trackPageview', '/extlink/secure.wikimedia.org/wikipedia/en/wiki/HD_Moore']);"  href="https://secure.wikimedia.org/wikipedia/en/wiki/HD_Moore">HD Moore</a>, <a onclick="_gaq.push(['_trackPageview', '/extlink/www.linkedin.com/in/nickersonlares']);"  href="http://www.linkedin.com/in/nickersonlares">Chris Nickerson</a>, and others.  Talks covered topics such as physical penetration testing, lock picking, and network defense techniques.  There were training sessions covering Physical Penetration, <a onclick="_gaq.push(['_trackPageview', '/extlink/metasploit.com/']);"  href="http://metasploit.com/">Metasploit</a>, Social Engineering, and more.  A lock pick village was available to both learn and show off your skills, as well as a hardware village where you could learn how to solder among other things.  And, of course, there were late-night parties.<br />
<br />
For me, this was my first official security conference.  By all accounts, I couldn't have chosen a better conference.  All around me I heard unanimous praise for the conference, how it was planned, and how it was run.  There were a few snafus here and there, but really nothing worth griping about.<br />
<br />
The presentations I was able to attend were incredible and I came home with a ton of knowledge and new ideas.  During the closing of the conference, Dave mentioned some ideas for next years conference such as a newbie track.  This has inspired me to think about possibly presenting at next years conference.  I have an idea already, something I've started working on.  If all goes well, I'll have something to present.<br />
<br />
DerbyCon was definitely one of the highlights of my year.  I'm already eager to return next year. 
            </div>
        </content>
        <dc:subject>conference</dc:subject>
<dc:subject>education</dc:subject>
<dc:subject>security</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/299-In-Memorium-Steve-Jobs-1955-2011.html" rel="alternate" title="In Memorium - Steve Jobs - 1955-2011" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-10-06T11:37:36Z</published>
        <updated>2011-10-06T11:37:36Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=299</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=299</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/299-guid.html</id>
        <title type="html">In Memorium - Steve Jobs - 1955-2011</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Somewhere in the early 1980's, my father took me to a bookstore in Manhattan.  I don't remember why, exactly, we were there, but it was a defining moment in my life.  On display was a new wonder, a Macintosh computer.<br /><br />Being young, I wasn't aware of social protocol.  I was supposed to be awed by this machine, afraid to touch it.  Instead, as my father says, I pushed my way over, grabbed the mouse, and went to town.  While all of the adults around me looked on in horror, I quickly figured out the interface and was able to make the machine do what I wanted.<br /><br />It would be over 20 years before I really became a Mac user, but that first experience helped define my love of computers and technology.<br /><br />Thank you, Steve.<br /> 
            </div>
        </content>
        <dc:subject>apple</dc:subject>
<dc:subject>personal computers</dc:subject>
<dc:subject>Technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/298-Audit-Insanity.html" rel="alternate" title="Audit Insanity" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-08-16T03:31:06Z</published>
        <updated>2011-08-16T03:31:20Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=298</wfw:comment>
    
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=298</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/298-guid.html</id>
        <title type="html">Audit Insanity</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <strong>&lt;RANT&gt;</strong><br />
<br />
It's amazing, but the deeper I dive into security, the more garbage security theater I uncover.  Sure, there's insanity everywhere, but I didn't expect to come across some of this craziness…<br />
<br />
One of the most recent activities I've been party to has been the response to an independent audit.  When I inquired as to the reasoning behind the audit, the answer I've received has been that this is a recommended yearly activity.  It's possible that this information is incorrect, but I suspect that it's truer than I'd like to believe.<br />
<br />
Security audits like this are standard practice all over the US and possibly the world.  Businesses are led to believe that getting audited is a good thing and that they should be repeated often.  My main gripe here is that while audits can be good, they need to be done for the right reasons, not just because someone tells you they're needed.  Or, even better, the audits that are forced on a company by their insurance company, or their payment processor.  These sorts of audits are there to pass the blame if something bad happens.<br />
<br />
Let's look a little deeper.  The audit I participated in was a typical security audit.  An auditor contacts you with a spreadsheet full of questions for you to answer.  You will, of course, answer them truthfully.  Questions included inquiries about the password policy, how security policies are distributed, and how logins are handled.  They delve into areas such as logging, application timeouts, IDS/IPS use, and more.  It's fairly in-depth, but ultimately just a checklist.  The auditor goes through their list, interpreting your answers, and applying checkmarks where appropriate.  The auditor then generates a list of items you "failed" to comply with and you have a chance to respond.  This is all incorporated into a final report which is presented to whoever requested the audit.<br />
<br />
Some audits will include a scanning piece as well.  The one I'm most familiar with in this aspect is the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.securitymetrics.com/']);"  href="https://www.securitymetrics.com/">SecurityMetrics</a> PCI scan.  Basically, you fill out a simplified yes/no questionnaire about your security and then they run a <a onclick="_gaq.push(['_trackPageview', '/extlink/www.tenable.com/products/nessus']);"  href="http://www.tenable.com/products/nessus">Nessus</a> scan against whatever IP(s) you provide to them.  It's a completely brain-dead scan, too.  Here's a perfect example.  I worked for a company who processed credit cards.  The system they used to do this was on a private network using outbound NAT.  There were both IDS and firewall systems in place.  For the size of the business and the frequency of credit card transactions, this was considerable security.  But, because there was a payment card processor in the mix, they were required to perform a quarterly PCI scan.  The vendor of choice, SecurityMetrics.<br />
<br />
So, the security vendor went through their checklist and requested the IP of the server.  I explained that it was behind a one-way NAT and inaccessible from the outside world.  They wanted the IP of the machine, which I provided to them.  10.10.10.1.  Did I mention that the host in question was behind a NAT?  These "security professionals" then loaded that IP into their automated scanning system.  And it failed to contact the host.  Go figure.  Again, we went around and around until they finally said that they needed the IP of the device doing the NAT.  I explained that this was a router and wouldn't provide them with any relevant information.  The answer?  We don't care, we just need something to scan.  So, they scanned a router.  For years.  Hell, they could still be doing it for all I know.  Like I said, brain dead security.<br />
<br />
What's wrong with a checklist, though?  The problem is, it's a list of "common" security practices not tailored to any specific company.  So, for instance, the audit may require that a company uses hardware-based authentication devices in addition to standard passwords.  The problem here is that this doesn't account for non-hardware solutions.  The premise here is that <a onclick="_gaq.push(['_trackPageview', '/extlink/secure.wikimedia.org/wikipedia/en/wiki/Two-factor_authentication']);"  href="https://secure.wikimedia.org/wikipedia/en/wiki/Two-factor_authentication">two-factor authentication</a> is more secure than just a username and password.  Sure, I whole-heartedly agree.  But, I would argue that <a onclick="_gaq.push(['_trackPageview', '/extlink/secure.wikimedia.org/wikipedia/en/wiki/Public-key_cryptography']);"  href="https://secure.wikimedia.org/wikipedia/en/wiki/Public-key_cryptography">public key authentication</a> provides similar security.  It satisfies the "What You Have" and "What You Know" portions of two-factor authentication.  But it's not hardware!  Fine, put your key on a USB stick.  (No, really, don't.  That's not very secure.)<br />
<br />
Other examples include the standard "Password Policy" crap that I've been hearing for years.  Basically, you should expire passwords every 90 days or so, passwords should be "strong", and you should prevent password reuse by remembering a history of passwords.  So let's look at this a bit.  Forcing password changes every 90 days results in bad password habits.  The reasoning is quite simple, and there have been studies that show this.  This <a onclick="_gaq.push(['_trackPageview', '/extlink/www.cs.unc.edu/~yinqian/papers/PasswordExpire.pdf']);"  href="http://www.cs.unc.edu/~yinqian/papers/PasswordExpire.pdf">paper</a> (pdf) from the University of North Carolina is a good example.  Another decent write up is <a onclick="_gaq.push(['_trackPageview', '/extlink/www.cryptosmith.com/node/218']);"  href="http://www.cryptosmith.com/node/218">this article</a> from Cryptosmith.  Allow me to summarize.  Forcing password expiration results in people making simpler passwords, writing passwords down, or using simplistic algorithms to generate "complex" passwords.  In short, cracking these "fresh" passwords is often easier than well thought out ones.<br />
<br />
The so-called "strong" password problem can be summarized by a rather <a onclick="_gaq.push(['_trackPageview', '/extlink/www.xkcd.com/936/']);"  href="https://www.xkcd.com/936/">clever XKCD comic</a>.  The long and short here is that truly complex passwords that cannot be easily cracked are either horribly complex mishmashes of numbers, letters, and symbols, or they're long strings of generic words.  Seriously, "correct horse battery staple" is significantly stronger than using a completely random 11 digit string.<br />
<br />
<a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/password_strength.png"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.godshell.com/blog/uploads/password_strength.png" alt="Password strength" title="Password strength" border="0" width="300" height="243" /></a><br />
<br />
And, of course, password history.  This sort of goes hand-in-hand with password expiration, but not always.  If it's used in conjunction with password expiration, then it generally results in single character variation in passwords.  Your super-secure "complex" password of "Password1" (seriously, it meets the criteria..  Uppercase, lowercase, number) becomes a series of passwords where the 1 is changed to a 2, then 3, then 4, etc. until the history is exceeded and the user can return to 1 again.  It's easier to remember that way and the user doesn't have to do much extra work.<br />
<br />
So even the standard security practices on the checklist can be questioned.  The real answer here is to tweak each audit to the needs of the requestor of the audit, and to properly evaluate the responses based on the security posture of the responder.  There do need to be baselines, but they should be sane baselines.  If you don't get all of the checkmarks on an audit, it may not mean you're not secure, it may just mean you're securing your network in a way the auditor didn't think of.  There's more to security than fancy passwords and firewalls.  A lot more.<br />
<br />
<strong>&lt;/RANT&gt;</strong> 
            </div>
        </content>
        <dc:subject>insanity</dc:subject>
<dc:subject>rant</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/296-Much-Ado-About-Lion.html" rel="alternate" title="Much Ado About Lion" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-08-07T17:16:05Z</published>
        <updated>2011-08-07T21:50:24Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=296</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=296</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/2-Technology" label="Technology" term="Technology" />
    
        <id>http://blog.godshell.com/blog/archives/296-guid.html</id>
        <title type="html">Much Ado About Lion</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <a onclick="_gaq.push(['_trackPageview', '/extlink/www.apple.com']);"  href="https://www.apple.com">Apple</a> released the latest version of it's OS X operating system, <a onclick="_gaq.push(['_trackPageview', '/extlink/www.apple.com/macosx/']);"  href="https://www.apple.com/macosx/">Lion</a>, on July 20th.  With this release came a myriad of changes in both the UI and back-end systems.  Many of these features are denounced by critics as Apple slowly killing off OS X in favor of iOS.  After spending some time with Lion, I have to disagree.<br />
<br />
Many of the new UI features are very iOS-like, but I'm convinced that this is not a move to dumb down OS X.  I believe this is a move by Apple to make the OS work better with the hardware it sells.  Hear me out before you declare me a fanboy and move on.<br />
<br />
Since the advent of the unibody Macbook, Apple has been shipping buttonless input devices.  The Macbook itself has a large touchpad, sans button.  Later, they released the magic mouse, sort of a transition device between mice and trackpads. I'm not a fan of that particular device.  And finally, they're shipping the trackpad today.  No buttons, lots of room for gestures.  Just check out the copy direct from their <a onclick="_gaq.push(['_trackPageview', '/extlink/www.apple.com/macosx/whats-new/gestures.html']);"  href="https://www.apple.com/macosx/whats-new/gestures.html">website</a>.<br />
<br />
<a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/Multitouch - Apple Website.jpg"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.godshell.com/blog/uploads/Multitouch - Apple Website.jpg" alt="Multitouch Disclaimer" title="Multitouch - Apple Website.jpg" border="0" width="300" height="107" /></a><br />
<br />
If you look at a lot of the changes made in Lion, they go hand-in-hand with new gestures.  Natural scrolling allows you to move the screen in the same direction your fingers are moving.  Swipe three fingers to the left and right, the desktop you're on moves along with it.  Explode your fingers outwards and Launchpad appears, a quick, simple way to access your applications folder.  Similar gestures are available for the Magic Mouse as well.<br />
<br />
<a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/whatsnew_launchpad_screen.jpg"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.godshell.com/blog/uploads/whatsnew_launchpad_screen.jpg" alt="Launchpad" title="whatsnew_launchpad_screen.jpg" border="0" width="300" height="187" /></a><br />
<br />
These gestures allow for quick and simple access to many of the more advanced features of Lion.  Sure, iOS had some of these features first, but just because they've moved to another platform doesn't mean that the platforms are merging.<br />
<br />
Another really interesting feature in Lion is one that has been around for a while in iOS.  When Apple first designed iOS, they likely realized that standard scrollbars chew up a significant amount of screen real estate.  Sure, on a regular computer it may be a relatively small percentage, but on a small screen like a phone, it's significant.  So, they designed a thinner scrollbar, minus the arrows normally seen at the top and bottom, and made it auto-hide when the screen isn't being scrolled.  This saved a lot of room on the screen.<br />
<br />
<a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/OSX-Lion-Scrollbar.png"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.godshell.com/blog/uploads/OSX-Lion-Scrollbar.png" alt="OSX Lion Scrollbar" title="OSX-Lion-Scrollbar.png" border="0" width="300" height="227" /></a><br />
<br />
Apple has taken the scrollbar feature and integrated it into the desktop OS.  And the effect is pretty significant.  The amount of room saved on-screen is quite noticeable.  I have seen a few complaints about this new feature, however, mostly complaining that it's difficult to grab the scrollbar with the mouse pointer, or that the arrow buttons are gone.  I think the former is just a general "they changed something" complaint while the latter is truly legitimate.  There have been a few situations where I've looked for the arrow buttons and their absence was noticeable.,  I wonder, however, whether this is a function of habit, or if their use is truly necessary.  I've been able to work around this pretty easily on my Macbook, but after I install Lion on my Mac Pro, I expect that I'll have a slightly harder time.  Unless, that is, I buy a trackpad.  As I said, I believe Apple has built this new OS with their newer input devices in mind.<br />
<br />
On the back end, Lion is, from what I can tell, completely 64-bit.  They have removed Java and Flash, and, interestingly, banned both from their online App Store.  No apps that require Java or Flash can be sold there.  Interesting move.  Additionally, Rosetta, the emulation software that allows older PowerPC software to run, has been removed as well.<br />
<br />
Overall, I'm enjoying my Lion experience.  I still have the power of a unix-based system with the simplicity of a well thought out GUI interface.  I can still do all of the programming I'm used to as well as watch videos, listen to music, and play games.  I think I'll still keep a traditional multi-button mouse around for gaming, though. 
            </div>
        </content>
        <dc:subject>apple</dc:subject>
<dc:subject>lion</dc:subject>
<dc:subject>os x</dc:subject>
<dc:subject>technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/295-Fixing-the-Serendipity-XMLRPC-plugin.html" rel="alternate" title="Fixing the Serendipity XMLRPC plugin" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-06-26T16:19:01Z</published>
        <updated>2011-06-26T16:19:07Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=295</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=295</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/3-Programming" label="Programming" term="Programming" />
    
        <id>http://blog.godshell.com/blog/archives/295-guid.html</id>
        <title type="html">Fixing the Serendipity XMLRPC plugin</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                A while ago I purchased a copy of <a onclick="_gaq.push(['_trackPageview', '/extlink/blogpressapp.com/']);"  href="http://blogpressapp.com/">BlogPress</a> for my iDevices..  It's pretty full-featured, and seems to work pretty well.  Problem was, I couldn't get it to work with my <a onclick="_gaq.push(['_trackPageview', '/extlink/www.s9y.org']);"  href="http://www.s9y.org">Serendipity</a>-based blog.  Oh well, a wasted purchase.<br />
<br />
But not so fast!  Every once in a while I go back and search for a possible solution.  This past week I finally hit paydirt.  I came across <a onclick="_gaq.push(['_trackPageview', '/extlink/board.s9y.org/viewtopic.php?f=4&amp;amp;t=17387']);"  href='http://board.s9y.org/viewtopic.php?f=4&amp;t=17387'>this</a> post on the s9y forums.<br />
<br />
This explained why BlogPress was crashing when I used it.  In short, it was expecting to see a categoryName tag in the resulting XML from the Serendipity XMLRPC plugin.  Serendipity, however, used description instead, likely because Serendipity has better support for the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.xmlrpc.com/metaWeblogApi']);"  href="http://www.xmlrpc.com/metaWeblogApi">MetaWeblog API</a>.<br />
<br />
Fortunately, fixing this problem is very straightforward.  All you really need to do is implement both APIs and return all of the necessary data for both APIs at the same time.  To fix this particular problem, it's a single line addition to the <strong>serendipity_xmlrpc.inc.php</strong> file located in <strong>$S9YHOME/plugins/serendipity_event_xmlrpc</strong>.  That addition is as follows :<br />
<br />
<pre><code>
if ($cat['categoryid']) $xml_entries_vals[] = new XML_RPC_Value(
    array(
      'description'   => new XML_RPC_Value($cat['category_name'], 'string'),
      // XenoPhage: Add 'categoryName' to support mobile publishing (Thanks PigsLipstick)
      'categoryName'  => new XML_RPC_Value($cat['category_name'], 'string'),
      'htmlUrl'       => new XML_RPC_Value(serendipity_categoryURL($cat, 'serendipityHTTPPath'), 'string'),
      'rssUrl'        => new XML_RPC_Value(serendipity_feedCategoryURL($cat, 'serendipityHTTPPath'), 'string')
    ),
    'struct'
);
</code></pre><br />
<br />
And poof, you now have the proper category support for <a onclick="_gaq.push(['_trackPageview', '/extlink/developer.typepad.com/']);"  href="http://developer.typepad.com/">Movable Type</a>. 
            </div>
        </content>
        <dc:subject>blogging</dc:subject>
<dc:subject>programming</dc:subject>
<dc:subject>serendipity</dc:subject>
<dc:subject>technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/294-Evaluating-a-Blogging-Platform.html" rel="alternate" title="Evaluating a Blogging Platform" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-06-23T16:00:00Z</published>
        <updated>2011-06-24T03:17:46Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=294</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=294</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/2-Technology" label="Technology" term="Technology" />
    
        <id>http://blog.godshell.com/blog/archives/294-guid.html</id>
        <title type="html">Evaluating a Blogging Platform</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I've been pondering my choices lately, determining if I should stay with my current blogging platform or move to another one.  There's nothing immediate forcing me to change, nor is there anything overly compelling to the platform I'm currently using.  This is an exercise I seem to go through from time to time.  It's probably for the better as it keeps me abreast of what else is out there and allows me to re-evaluate choices I've made in the past.<br /><br />So, what is out there?  Well, <a onclick="_gaq.push(['_trackPageview', '/extlink/www.s9y.com']);"  href="http://www.s9y.com">Serendipity</a> has grown quite a bit as a blogging platform and is quite well supported.  That, in its own right, makes it a worthy choice.  The plugin support is quite vast and the API is simple enough that creating new plugins when the need arises is a quick task.<br /><br />There are some drawbacks, however.  Since it's not quite as popular as some other platforms, interoperability with some things is difficult.  For instance, the offline blogging tool I'm using right now, BlogPress, doesn't work quite right with Serendipity.  I believe this might be due to missing features and/or bugs in the Serendipity XMLRPC interface.  Fortunately, someone in the community had already debugged the problem and provided a fix.<br /><br /><a onclick="_gaq.push(['_trackPageview', '/extlink/www.wordpress.com']);"  href="http://www.wordpress.com">Wordpress</a> is probably one of the more popular platforms right now.  Starting a Wordpress blog can be as simple as creating a new account at <a onclick="_gaq.push(['_trackPageview', '/extlink/www.wordpress.com']);"  target="_blank" href="http://www.wordpress.com">wordpress.com</a>.  There's also the option of downloading the Wordpress distribution and hosting it on your own.  As with Serendipity, Wordpress also has a vibrant community and a significant plugin collection.  From what I understand, Wordpress also has the ability to be used as a static website, though that's less of an interest for me.  Wordpress has wide support in a number of offline blogging tools, including custom applications for iPad and iPhone devices.<br /><br />There are a number of &quot;cloud&quot; platforms as well.  Examples include <a onclick="_gaq.push(['_trackPageview', '/extlink/www.tumblr.com']);"  href="http://www.tumblr.com">Tumblr</a>, <a onclick="_gaq.push(['_trackPageview', '/extlink/www.livejournal.com']);"  href="http://www.livejournal.com">Live Journal</a>, and <a onclick="_gaq.push(['_trackPageview', '/extlink/www.blogger.com']);"  href="http://www.blogger.com">Blogger</a>.  These platforms have a wide variety of interoperability with services such as <a onclick="_gaq.push(['_trackPageview', '/extlink/www.twitter.com']);"  href="http://www.twitter.com">Twitter</a> and <a onclick="_gaq.push(['_trackPageview', '/extlink/www.flickr.com']);"  href="http://www.flickr.com">Flickr</a>, but you sacrifice control.  You are at the complete mercy of the platform provider with very little alternative.  For instance, if a provider disagrees with you, they can easily block or delete your content.  Or, the provider can go out of business, leaving you without access to your blog at all.  These, in my book, are significant drawbacks.<br /><br />Another possible choice is <a onclick="_gaq.push(['_trackPageview', '/extlink/www.drupal.org']);"  href="http://www.drupal.org">Drupal</a>.  I've been playing around with Drupal quite a bit, especially since it's the platform of choice for a lot of projects I've been involved with lately.  It seems to fit the bill pretty well and is incredibly extensible.  In fact, it's probably the closest I've come to actually making a switch up to this point.  The one major hurdle I have at the moment is lack of API support for blogging tools.  Yes, I'm aware of the BlogAPI module, but according to the project page for it, it's incomplete, unsupported, and the author isn't working on it anymore.  While I was able to install it and initially connect to the Drupal site, it doesn't seem that any of the posting functionality works at this time.  Drupal remains the strongest competitor at this point and has a real chance of becoming my new platform of choice.<br /><br />For the time being, however, I'm content with Serendipity.  The community remains strong, there's a new release on the horizon, and, most important, it just works.<br /><br /> 
            </div>
        </content>
        <dc:subject>blogging</dc:subject>
<dc:subject>serendipity</dc:subject>
<dc:subject>technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/293-Technology-in-the-here-and-now.html" rel="alternate" title="Technology in the here and now" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-06-22T16:00:00Z</published>
        <updated>2011-06-24T03:15:56Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=293</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=293</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/2-Technology" label="Technology" term="Technology" />
    
        <id>http://blog.godshell.com/blog/archives/293-guid.html</id>
        <title type="html">Technology in the here and now</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I'm writing this while several thousand feet up in the air, on a flight from here to there.  I won't be able to publish it until I land, but that seems to be the exception these days rather than the norm.<br /><br />And yet, while preparing for takeoff, the same old announcements are made.  Turn off cell phones and pagers, disable wireless communications on electronic devices.  And listening around me, hurried conversations between passengers as they ensure that all of their devices are disabled.  As if a stray radio signal will cause the airplane to suddenly drop from the sky, or prevent it from taking off to begin with.<br /><br />Why is it that we, as a society, cannot get over these simple hurdles.  Plenty of studies have shown that these devices don't interfere with planes.  In fact, some airlines are offering in-flight wireless access.  Many airlines have offered in-flight telephone calls.  Unless my understanding of flight is severely limited, I'm fairly certain that all of these functions use radio signals to operate.  And yet we are still told that stray signals may cause planes to crash, may cause interference with the pilots instrumentation.<br /><br />We need to get over this hurdle.  We need to start spending our time looking to the future, advancing our technology, forging new paths.  We need to stop clinging to outdated ideas.  Learning from our past mistakes is one thing, and there's merit in understanding history.  But lets spend our energy wisely and make the simple things we take for granted even better.<br /><br /> 
            </div>
        </content>
        <dc:subject>flying</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>security theater</dc:subject>
<dc:subject>technology</dc:subject>
<dc:subject>tsa</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/291-Helpful-Rules-for-OSSEC.html" rel="alternate" title="Helpful Rules for OSSEC" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-06-17T00:50:48Z</published>
        <updated>2011-06-17T01:38:47Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=291</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=291</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/4-Networking" label="Networking" term="Networking" />
    
        <id>http://blog.godshell.com/blog/archives/291-guid.html</id>
        <title type="html">Helpful Rules for OSSEC</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>OSSEC has quickly become a primary weapon in my security toolkit.  It's flexible, fast, and very easy to use.  I'd like to share a few rules I've found useful as of late.</p><p>I primarily use OSSEC in a server/client setup.  One side effect of this is that when I make changes to the agent's configuration, it takes some time for it to push out to all of the clients.  Additionally, clients don't restart automatically when a new agent config is received.  However, it's fairly easy to remedy this.</p><p>First, make sure you have syscheck enabled and that you're monitoring the OSSEC directory for changes.  I recommend monitoring all of /var/ossec and ignoring a few specific directories where files change regularly.  You'll need to add this to both the ossec.conf as well as the agent.conf.</p><br />
<pre>&lt;directories check_all="yes"&gt;/var&lt;/directories&gt;
&lt;ignore type="sregex"&gt;^/var/ossec/queue/&lt;/ignore&gt;
&lt;ignore type="sregex"&gt;^/var/ossec/logs/&lt;/ignore&gt;
&lt;ignore type="sregex"&gt;^/var/ossec/stats/&lt;/ignore&gt;</pre><br />
<p>The first time you set this up, you'll have to manually restart the clients after the new config is pushed to them.  All new clients should work fine, however.</p><p>Next, add the following rules to your local_rules.xml file (or whatever scheme you're using).</p><br />
<pre>&lt;rule level="12" id="100005"&gt;
   &lt;if_matched_group&gt;syscheck&lt;/if_matched_group&gt;
   &lt;description&gt;agent.conf changed, restarting OSSEC&lt;/description&gt;
   &lt;match&gt;/var/ossec/etc/shared/agent.conf&lt;/match&gt;
&lt;/rule&gt;</pre><br />
<p>This rule looks for changes to the agent.conf file and triggers a level 12 alert.  Now we just need to capture that alert and act on it.  To do that, you need to add the following to your ossec.conf file on the server.</p><br />
<pre>&lt;command&gt;
    &lt;name&gt;restart-ossec&lt;/name&gt;
    &lt;executable&gt;restart-ossec.sh&lt;/executable&gt;
    &lt;expect&gt;srcip&lt;/expect&gt;
    &lt;timeout_allowed&gt;no&lt;/timeout_allowed&gt;
&lt;/command&gt;</pre><br />
<pre>&lt;active-response&gt;
    &lt;command&gt;restart-ossec&lt;/command&gt;
    &lt;location&gt;local&lt;/location&gt;
    &lt;rules_id&gt;100005&lt;/rules_id&gt;
&lt;/active-response&gt;</pre><br />
<p>You need to add this to the top of your active response section, above any other rules.  OSSEC matches the first active-response block and ignores any subsequent ones.  The restart-ossec.sh script referenced in the command section should exist already in your active-response/bin directory as it's part of the distribution.</p><p>And that's all there is to it.  Whenever the agent.conf file changes on a client, it'll restart the OSSEC agent, reading in the new configuration.</p><br />
<p>Next up, a simple DoS prevention rule for apache web traffic.  I've had a few instances where a single IP would hammer away at a site I'm responsible for, eating up resources in the process.  Generally speaking, there's no real reason for this.  So, one solution is to temporarily block IPs that are abusive.</p><p>Daniel Cid, the author of OSSEC, helped me out a little on this one.  It turned out to be a little less intuitive than I expected.</p><p>First, you need to group together all of the "normal" error response codes.  The actual error responses (400/500 errors) are handled with other, more aggressive rules, so you can ignore most of them.  For our purposes, we want to trigger on 200/300/400 error codes.</p><br />
<pre>&lt;rule id="131105" level="1"&gt;
      &lt;if_sid&gt;31101, 31108, 31100&lt;/if_sid&gt;
      &lt;description&gt;Group of all "normal" 200/300/400 error codes.&lt;/description&gt;
&lt;/rule&gt;</pre><br />
<p>Next, we want to create a composite rule that will fire after a set frequency and time limit.  In short, we want this rule to fire if X matches are made in Y seconds.</p><br />
<pre>&lt;rule id="131106" level="10" frequency="500" timeframe="60"&gt;
      &lt;if_matched_sid&gt;131105&lt;/if_matched_sid&gt;
      &lt;same_source_ip /&gt;
      &lt;description&gt;Excessive access, Temporary block&lt;/description&gt;
&lt;/rule&gt;</pre><br />
<p>That should be all you need provided you have active response already enabled.  You can also add a specific active response for this rule that blocks for a shorter, or longer, period of time.  That's the beauty of OSSEC, the choice is in your hands.</p><br />
<p>I hope you find these rules helpful.  If you have any questions or comments, feel free to post them below.</p> 
            </div>
        </content>
        <dc:subject>networking</dc:subject>
<dc:subject>ossec</dc:subject>
<dc:subject>security</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/283-Hey-KVM,-youve-got-your-bridge-in-my-netfilter....html" rel="alternate" title="Hey KVM, you've got your bridge in my netfilter..." />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-04-18T18:02:00Z</published>
        <updated>2011-04-18T18:05:59Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=283</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=283</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/2-Technology" label="Technology" term="Technology" />
    
        <id>http://blog.godshell.com/blog/archives/283-guid.html</id>
        <title type="html">Hey KVM, you've got your bridge in my netfilter...</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>It's always interesting to see how new technologies alter the way we do things.&#160; Recently, I worked on firewalling for a KVM-based virtualization platform.&#160; From the outset it seems pretty straightforward.&#160; Set up iptables on the host and guest and move on.&#160; But it's not that simple, and my google-fu initially failed me when searching for an answer.</p> <br />
<p>The primary issue was that when iptables was enabled on the host, the guests became unavailable.&#160; If you enable logging, you can see the traffic being blocked by the host, thus never making it to the guest.&#160; So how do we do this?&#160; Well, if we start with a generic iptables setup, we have something that looks like this:</p> <br />
<blockquote> <br />
# Firewall configuration written by system-config-securitylevel<br /># Manual customization of this file is not recommended.<br />*filter<br />:INPUT ACCEPT [0:0]<br />:FORWARD ACCEPT [0:0]<br />:OUTPUT ACCEPT [0:0]<br />:RH-Firewall-1-INPUT - [0:0]<br />-A INPUT -j RH-Firewall-1-INPUT<br />-A FORWARD -j RH-Firewall-1-INPUT<br />-A RH-Firewall-1-INPUT -i lo -j ACCEPT<br />-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT<br />-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br />-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT<br />-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited<br />COMMIT<br />
</blockquote> <br />
<p>Adding logging to identify what's going on is pretty straightforward.&#160; Add two logging lines, one for the INPUT chain and one for the FORWARD chain.&#160; Make sure these are added as the first rules in the chain, otherwise you'll jump to the RH-Firewall-1-INPUT chain and never make it to the log.</p> <br />
<blockquote> <br />
-A INPUT -j LOG --log-prefix &quot;Firewall INPUT: &quot;<br />-A FORWARD -j LOG --log-prefix &quot;Firewall FORWARD: &quot;<br />
<p>&#160;</p> <br />
</blockquote> <br />
<p>Now, with this in place you can try sending traffic to the domU.&#160; If you tail /var/log/messages, you'll see the blocking done by netfilter.&#160; It should look something like this:</p> <br />
<blockquote> <br />
<p>Apr 18 12:00:00 example kernel: Firewall FORWARD: IN=br123 OUT=br123 PHYSIN=vnet0 PHYSOUT=eth1.123 SRC=192.168.1.2 DST=192.168.1.1 LEN=56 TOS=0x00 PREC=0x00 TTL=64 ID=18137 DF PROTO=UDP SPT=56712 DPT=53 LEN=36<br />
</p><br />
</blockquote> <br />
<p>There are a few things of note here.&#160; First, this occurs on the FORWARD chain only.&#160; The INPUT chain is bypassed completely.&#160; Second, the system recognizes that this is a bridged connection.&#160; This makes things a bit easier to fix.</p> <br />
<p>My attempt at resolving this was to put in a rule that allowed traffic to pass for the bridged interface.&#160; I added the following:</p> <br />
<blockquote> <br />
-A FORWARD -i br123 -o br123 -j ACCEPT<br />
</blockquote> <br />
<p>This worked as expected and allowed the traffic through the FORWARD chain, making it to the domU unmolested.&#160; However, this method means I have to add a rule for every bridge interface I create.&#160; While explicitly adding rules for each interface should make this more secure, it means I may need to change iptables while the system is in production and running, not something I want to do.</p> <br />
<p>A bit more googling led me to <a onclick="_gaq.push(['_trackPageview', '/extlink/www.cyberciti.biz/faq/freebsd-opebsd-running-in-kvm-virtulization-ftp-firewall/']);"  href="http://www.cyberciti.biz/faq/freebsd-opebsd-running-in-kvm-virtulization-ftp-firewall/">this post</a> about KVM and iptables.&#160; In short it provides two additional methods for handling this situation.&#160; The first is a more generalized rule for bridged interfaces:</p> <br />
<blockquote> <br />
-A FORWARD -m physdev --physdev-is-bridged -j ACCEPT<br />
</blockquote> <br />
<p>Essentially, this rule tells netfilter to accept any traffic for bridged interfaces.&#160; This removes the need to add a new rule for each bridged interface you create making management a bit simpler.&#160; The second method is to completely remove bridged interfaces from netfilter.&#160; Set the following sysctl variables:</p> <br />
<blockquote> <br />
net.bridge.bridge-nf-call-ip6tables = 0<br />net.bridge.bridge-nf-call-iptables = 0<br />net.bridge.bridge-nf-call-arptables = 0<br />
</blockquote> <br />
<p>I'm a little worried about this method as it completely bypasses iptables on dom0.&#160; However, it appears that this is actually a more secure manner of handling bridged interfaces.&#160; According to <a onclick="_gaq.push(['_trackPageview', '/extlink/bugzilla.redhat.com/show_bug.cgi?id=512206']);"  href="https://bugzilla.redhat.com/show_bug.cgi?id=512206">this bugzilla report</a> and <a onclick="_gaq.push(['_trackPageview', '/extlink/lists.gnu.org/archive/html/qemu-devel/2009-07/msg01592.html']);"  href="http://lists.gnu.org/archive/html/qemu-devel/2009-07/msg01592.html">this post</a>, allowing bridged traffic to pass through netfilter on dom0 can result in a possible security vulnerability.&#160; I believe this is somewhat similar to <a onclick="_gaq.push(['_trackPageview', '/extlink/secure.wikimedia.org/wikipedia/en/wiki/Hash_collision']);"  href="https://secure.wikimedia.org/wikipedia/en/wiki/Hash_collision">cryptographic hash collision</a>.&#160; Attackers can take advantage of netfilter entries with similar IP/port combinations and possibly modify traffic or access systems.&#160; By using the sysctl method above, the traffic completely bypasses netfilter on dom0 and these attacks are no longer possible.</p> <br />
<p>More testing is required, but I believe the latter method of using sysctl is the way to go.&#160; In addition to the security considerations, bypassing netfilter has a positive impact on throughput.&#160; It seems like a win-win from all angles.</p> 
            </div>
        </content>
        <dc:subject>iptables</dc:subject>
<dc:subject>kvm</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>virtualization</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/282-Meltdown.html" rel="alternate" title="Meltdown" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-03-15T03:19:00Z</published>
        <updated>2011-03-15T03:21:25Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=282</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=282</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/2-Technology" label="Technology" term="Technology" />
    
        <id>http://blog.godshell.com/blog/archives/282-guid.html</id>
        <title type="html">Meltdown</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Back when the Chernobyl nuclear reactor in the Ukraine melted down, I was in grade school.  That disaster absolutely fascinated me and I spent a bit of time researching nuclear power, drawing diagrams of reactor designs, and dreaming about being a nuclear scientist.</p> <br />
<p> <!-- s9ymdb:2 --><img width="94" height="110" class="serendipity_image_left" src="http://blog.godshell.com/blog/uploads/Chernobyl_Reactor.serendipityThumb.jpg" alt="Chernobyl Reactor" />One thing that stuck with me about that disaster was the sheer power involved.  I remember hearing about the roof of the reactor, a massive slab of concrete, having been blown off the building.  From what I remember it was tossed many miles away, though I'm having trouble actually confirming that now.  No doubt there was a lot of misreporting done at the time.</p> <br />
<p>The reasons behind the meltdown at Chernobyl are still a point of contention ranging from operator error to design flaws in the reactor.  Chances are it is more a combination of both.  There's a really detailed report about what happened <a onclick="_gaq.push(['_trackPageview', '/extlink/www.martinfrost.ws/htmlfiles/chernobyl1.html']);"  href="http://www.martinfrost.ws/htmlfiles/chernobyl1.html">here</a>.  Additional supporting material can be found on <a onclick="_gaq.push(['_trackPageview', '/extlink/secure.wikimedia.org/wikipedia/en/wiki/Chernobyl_disaster']);"  href="https://secure.wikimedia.org/wikipedia/en/wiki/Chernobyl_disaster">Wikipedia</a>.</p> <br />
<p> <!-- s9ymdb:3 --><img width="110" height="46" class="serendipity_image_left" src="http://blog.godshell.com/blog/uploads/fukushima_reactor.serendipityThumb.jpg" alt="Fukushima Reactor" />Today we have the disaster at the Fukushima power plants in Japan.  Of course the primary difference from the get-go is that this situation was caused by a natural disaster rather than design flaws or operator error.  Honestly, when you get hit with a massive earthquake immediately followed by a devastating tsunami, you're pretty much starting at screwed.</p> <br />
<p>From what I understand, there are 5 reactors at two plants that are listed as critical.  In two instances, the containment structure has suffered an explosion.  Whoa!  An explosion?  Yes, yes, calm down.  It's not a nuclear explosion as most people know it.  Most people equate a nuclear explosion with images of mushroom clouds, thoughts of nuclear fallout, and radiation sickness.  The explosion we're talking about in this instance is a hydrogen explosion resulting from venting the inner containment chamber.  Yes, it's entirely possible that radiation was released, but nothing near the high dosages most people equate with a nuclear bomb.</p> <br />
<p>And herein lies a major problem with nuclear power.  Not many people understand it, and a large majority are afraid of the consequences.  Yes, we have had a massive meltdown as is the case with Chernobyl.  We've also had a partial meltdown as is the case with <a onclick="_gaq.push(['_trackPageview', '/extlink/secure.wikimedia.org/wikipedia/en/wiki/Three_Mile_Island_accident']);"  href="https://secure.wikimedia.org/wikipedia/en/wiki/Three_Mile_Island_accident">Three Mile Island</a>.  Currently, the disaster in Japan is closer to Three Mile Island than it is to Chernobyl.  That, of course, is subject to change.  It's entirely possible that the reactor in Japan will go into a full core meltdown.</p> <br />
<p>But if you look at the overall effects of nuclear power, I believe you can argue that it is cleaner and safer than many other types of power generation have been.  Coal power massively pollutes the atmosphere and leaves behind some rather nasty byproducts that we just don't have a method of dealing with.  Oil and gas also cause pollution in both the atmosphere as well as the area surrounding where the oil and gas are mined.  Water, wind, and sun power are, generally speaking, clean, but you have to have massive amounts of each to generate sufficient power.</p> <br />
<p>Nuclear power has had such a negative stigma for such a long period of time that research dollars are not being spent on improving the technology.  There are severe restrictions on what scientists can research with respect to nuclear power.  As a result, we haven't advanced very far as compared to other technologies.  If we were to open up research we would be able to develop reactors that are significantly safer.</p> <br />
<p>Unfortunately, I think this disaster will make things worse for the nuclear power industry.  Despite the fact that this disaster wasn't caused by design flaws, nor was there operator error, the population at large will question the validity of this technology they know nothing about.  Personally, I believe we could make the earth a much cleaner, safer place to live if we were to switch to nuclear power and spend time and effort on making it safer and more efficient.</p> <br />
<p>And finally, a brief note.  I'm not a nuclear physicist or engineer, but I have done some background research.  I strongly encourage you to do your own research if you're in doubt about anything I've stated.  And if I'm wrong about something, please, let me know!  I'll happily make edits to fix incorrect facts.</p> 
            </div>
        </content>
        <dc:subject>disaster</dc:subject>
<dc:subject>nuclear power</dc:subject>
<dc:subject>technology</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/281-When-DRM-Goes-Bad-....html" rel="alternate" title="When DRM Goes Bad ..." />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2011-02-20T20:56:03Z</published>
        <updated>2011-02-20T20:56:04Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=281</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=281</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/281-guid.html</id>
        <title type="html">When DRM Goes Bad ...</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I've been using a blog editor called <a onclick="_gaq.push(['_trackPageview', '/extlink/drinkbrainjuice.com/blogo']);"  href="http://drinkbrainjuice.com/blogo">Blogo</a> for a while now.  It's fairly simplistic, but works quite well.  However, I've experienced a few problems in the recent months that I believe are related to updates of server software and probably a few bugs.  I reported the problems both through direct contact via email as well as crash reports generated by the system.<br />
<br />
And I've waited.  And waited.<br />
<br />
Where I used to receive responses within 24-48 hours from the company that makes Blogo, I have yet to receive a response to any of my reports or emails from that past few months.  Their website hasn't been updated since September, 2010.  By all accounts, it appears that this company and its software have become abandonware.<br />
<br />
So where does the DRM part come in ?  Well, I did some more digging earlier today and came across a <a onclick="_gaq.push(['_trackPageview', '/extlink/davekeys.com/wp/blogo-software-not-working-and-why/']);"  href="http://davekeys.com/wp/blogo-software-not-working-and-why/">report</a> about the licensing scheme that Blogo uses.  Blogo phones home every time you start it up and verifies that the license you have is valid.  If it cannot contact the licensing server, apparently it disables itself.  This is obviously a huge problem if the Blogo servers go offline as they apparently did two weeks ago.<br />
<br />
Another problem that will eventually crop up is that Blogo licensing is limited to a number of installations before it's disabled.  Previously I was able to contact the company and get this taken care of, but again, if the servers go offline, it won't be possible to reinstall.<br />
<br />
I understand what the developers of Blogo are trying to do with their licensing scheme.  Piracy can be a pretty big issue if you develop a popular piece of software.  Some developers try to solve this with what can be viewed as fairly draconian licensing systems.  Unfortunately, they can turn on the users and prevent perfectly legitimate users from accessing the software they legally purchased.  And, of course, all the pirates that downloaded a cracked version of the software that doesn't check in anymore are still up and running and probably aren't aware of any problems.<br />
<br />
I'm not sure if there's a better solution out there, but it really sucks when the software you rely on doesn't work because of a licensing issue you have no control over.  I very much like Blogo and I'd love to see the bugs I've encountered fixed.  I want to see Blogo updated and continue to be a viable blogging platform.  But, until the developers start talking again, I suppose I'll have to look elsewhere for a solution.  So the search is on again for a decent blog editor.  For now I'm using <a onclick="_gaq.push(['_trackPageview', '/extlink/www.red-sweater.com/marsedit/']);"  href="http://www.red-sweater.com/marsedit/">MarsEdit</a>.  I'm not a huge fan, but who knows, maybe it will grow on me. 
            </div>
        </content>
        <dc:subject>blogo</dc:subject>
<dc:subject>drm</dc:subject>
<dc:subject>editor</dc:subject>
<dc:subject>licensing</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/104-MegaDuck!.html" rel="alternate" title="MegaDuck!" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2007-08-19T14:06:48Z</published>
        <updated>2011-01-23T06:12:44Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=104</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=104</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/104-guid.html</id>
        <title type="html">MegaDuck!</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>So, my wife was watching <a onclick="_gaq.push(['_trackPageview', '/extlink/boomerang.cartoonnetwork.com/']);"  href="http://boomerang.cartoonnetwork.com/" title="Boomerang Home Page">Boomerang</a> with the kids last night.&#160; <a onclick="_gaq.push(['_trackPageview', '/extlink/www.cartoonnetwork.com/tv_shows/duckdodgers/']);"  href="http://www.cartoonnetwork.com/tv_shows/duckdodgers/" title="Cartoon Network - Duck Dodgers and the 24th and 1/2 Century">Duck Dodgers</a> was on, which is always great for a few laughs.&#160; Well, she saw this particular episode and decided to rewind it for me to watch..&#160; Well worth it.&#160; I've seen the end before and was astonished..&#160; The joining of two greats...&#160; <a onclick="_gaq.push(['_trackPageview', '/extlink/www.megadeth.com']);"  href="http://www.megadeth.com" title="Megadeth Home Page">Megadeth</a> is one of my all time favorite bands, and <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/Daffy_Duck']);"  href="http://en.wikipedia.org/wiki/Daffy_Duck" title="Wikipedia - Daffy Duck">Daffy Duck</a>&#160;is just hysterical..&#160;&#160; So, without further ado, &quot;<strong>MEGADUCK</strong>!&quot;</p> <script src="/flowplayer/flowplayer.min.js"></script> <br />
<div id="player" style="display: block; width: 425px; height: 300px; margin: auto;"></div> <script><br />
flowplayer("player", "/flowplayer/flowplayer.swf", { clip : { autoPlay: false, autoBuffering: true, url: 'http://blog.godshell.com/media/dave_mustaine_duck_dodgers.flv' }, plugins: { controls: { url: '/flowplayer/flowplayer.controls.swf', playlist: false, tooltips: { buttons: true, fullscreen: 'Enter Fullscreen mode' } } } });<br />
</script> 
            </div>
        </content>
        <dc:subject>flash</dc:subject>
<dc:subject>music</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/279-Tis-the-Season.html" rel="alternate" title="Tis the Season" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-11-12T01:15:47Z</published>
        <updated>2010-11-12T01:28:49Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=279</wfw:comment>
    
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=279</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/1-Games" label="Games" term="Games" />
    
        <id>http://blog.godshell.com/blog/archives/279-guid.html</id>
        <title type="html">Tis the Season</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="text-align: center; "> <a onclick="_gaq.push(['_trackPageview', '/extlink/www.childsplaycharity.org']);"  class="serendipity_image_link" title="Child's Play Charity" href="http://www.childsplaycharity.org"><!-- s9ymdb:1 --><img class="serendipity_image_center" width="468" height="60" src="http://blog.godshell.com/blog/uploads/cp468.gif" title="Child's Play Charity" alt="Child's Play Charity" /></a></p> <br />
<p><a onclick="_gaq.push(['_trackPageview', '/extlink/www.childsplaycharity.org']);"  class="serendipity_image_link" title="Child's Play Charity" href="http://www.childsplaycharity.org"></a>It's that time of year again.&#160; Child's Play is an incredible charity dedicated to &quot;dedicated to improving the lives of children with toys and games in our network of over 60 hospitals worldwide.&quot;&#160; It's an organization started by the guys from Penny Arcade and supported by you.&#160; I encourage you to open your heart and support the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.childsplaycharity.org']);"  href="http://www.childsplaycharity.org">Child's Play Charity</a>. </p> 
            </div>
        </content>
        <dc:subject>charity</dc:subject>
<dc:subject>child's play</dc:subject>
<dc:subject>christmas</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/278-WoO-Day-7-Tidbits.html" rel="alternate" title="WoO Day 7 : Tidbits" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-10-23T04:01:25Z</published>
        <updated>2010-10-25T23:45:01Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=278</wfw:comment>
    
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=278</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/278-guid.html</id>
        <title type="html">WoO Day 7 : Tidbits</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both"><a   rel="lightbox" href="http://blog.godshell.com/blog/uploads/ossec_logo.jpg" class="image-link"><img class="linked-to-original" src="http://blog.godshell.com/blog/uploads/ossec_logo-thumb.jpg" height="81" align="left" width="191" style=" display: inline; float: left; margin: 0 10px 10px 0;" /></a>And so a week of fun comes to an end. But before we part company, there are a few more items to discuss. There are portions of OSSEC that are often overlooked because they require little or no configuration, and they "just work." Other features are either more involved, or require external products. Let's take a look at a few of these.</p><p style="clear: both"><strong>Rootkit Detection</strong></p><p style="clear: both">First up, rootkit detection. OSSEC ships with a set of rules and "signatures" designed to detect common rootkits. The default OSSEC installation uses two files, rootkit_files.txt and rootkit_trojans.txt, as the base of the rootkit detection.</p><p style="clear: both">The rootkit_files.txt file contains a list of files commonly found with rootkit infections. Using various system calls, OSSEC tries to detect if any of these files are installed on the machine and sends an alert if they are found. Multiple system calls are used because some rootkits hide themselves by altering system binaries and sometimes by altering system calls.</p><p style="clear: both">The rootkit_trojans.txt file contains a list of commonly trojaned files as well as patterns found in those files when they have been compromised. OSSEC will scan each file and compare it to the list of patterns. If a match is found, an alert is sent to the administrator.</p><p style="clear: both">There are also additional rootkit files shipped with OSSEC. For Windows clients there are three files containing signatures for common malware, signatures to detect commonly banned software packages, and signatures for checking windows policy settings. On the Linux side are a number of files for auditing system security and adhering to CIS policy. CIS policy auditing will be covered later.</p><p style="clear: both">Rootkit detection also goes beyond these signature-based methods. Other detection methods include scanning /dev for unusual entries, searching for hidden processes, and searching for hidden ports. Rootkit scanning is pretty in-depth and more information can be found in the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/manual/rootcheck/index.html']);"  href="http://www.ossec.net/doc/manual/rootcheck/index.html" title="OSSEC Manual - Rootcheck">OSSEC Manual</a>.</p><p style="clear: both"><strong>CIS Auditing</strong></p><p style="clear: both">CIS, the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.cisecurity.com']);"  href="http://www.cisecurity.com" title="The Center for Internet Security">Center for Internet Security</a>, publishes a benchmark tool for auditing system security on various operating systems. OSSEC can assist with compliance to the CIS guidelines by monitoring systems for non-conformity and alerting as necessary. Shipped by default with OSSEC are three cis-based signature sets for Redhat Linux and Debian. Creating new tests is fairly straightforward and the existing tests can be adapted as needed.<br /><br /><strong>OSSEC Splunk</strong></p><p style="clear: both">One thing that OSSEC lacks is an easy way to pour through the OSSEC logs, get visual information on alerts, etc. There was a project, the OSSEC-WUI, that aimed to resolve this, but that project has mostly died. Last I heard, there were no plans to revive this project.</p><p style="clear: both">There is an alternative, however. A commercial product, <a onclick="_gaq.push(['_trackPageview', '/extlink/www.splunk.com']);"  href="http://www.splunk.com" title="Splunk">Splunk</a>, can handle the heavy lifting for you. Yes, yes, Splunk is commercial. But, good news! They have a free version that can do the same thing on a smaller scale, without all of the extra shiny. There is a plugin for Splunk, specifically designed to handle OSSEC as well. It's worth checking out, you can find it over at <a onclick="_gaq.push(['_trackPageview', '/extlink/www.splunkbase.com']);"  href="http://www.splunkbase.com" title="SplunkBase">splunkbase</a>.</p><p style="clear: both"><strong>Alert Logging</strong></p><p style="clear: both">And finally, alert logging. Because OSSEC is tightly secured, it can sometimes be a challenge to deal with alert logs. For instance, what if you want to put the logs in an alternate location outside of /var/ossec? There are alternatives, though. For non-application specific output you can use syslog or database output. OSSEC also supports output to <a onclick="_gaq.push(['_trackPageview', '/extlink/www.prelude-technologies.com']);"  href="http://www.prelude-technologies.com" title="Prelude SIEM">Prelude</a> and beta support exists for <a onclick="_gaq.push(['_trackPageview', '/extlink/www.wallinfire.net/picviz/']);"  href="http://www.wallinfire.net/picviz/" title="PicViz">PicViz</a>. I believe you can use multiple output methods if you desire, though I'd have to test that out to be sure.</p><p style="clear: both">The configuration for syslog output is very straightforward. You can define both the destination syslog server as well as the level of the alerts to send. Syslog output is typically what you would use in conjunction with Splunk.</p><p style="clear: both">Database configuration is a bit more in-depth and requires that OSSEC be compiled with certain options enabled. Both MySQL and PostgreSQL are supported. The database configuration block in the ossec.conf ile contains all of the options you would expect, database name, username and password, and hostname of the database server. Additionally you need to specify the database type, MySQL or PostgreSQL.</p><p style="clear: both">Prelude and PicViz support have their own specific configuration parameters. More information on this support can be found in the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/manual/output/index.html']);"  href="http://www.ossec.net/doc/manual/output/index.html" title="OSSEC Manual - Output and Alert options">OSSEC Manual</a>.</p><p style="clear: both"><strong>Final Thoughts</strong></p><p style="clear: both">OSSEC is an incredible security product. I still haven't reached the limits of what it can do and I've been learning new techniques for using it all week. Hopefully the information provided here over the last 7 days proves to be helpful to you. There's a lot more information out there, though and an excellent place to start is the OSSEC home page. There's also the OSSEC mailing list where you can find a great deal of information as well as a number of very knowledgeable, helpful users.</p><p style="clear: both">The best way to get started is to get a copy of OSSEC installed and start playing. Dive right in, the water's fine.</p><br class='final-break' style='clear: both' /> 
            </div>
        </content>
        <dc:subject>ossec</dc:subject>
<dc:subject>Security</dc:subject>
<dc:subject>week of ossec</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/274-WoO-Day-3-Meet-the-agent.html" rel="alternate" title="WoO Day 3 : Meet the agent" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-10-19T04:01:12Z</published>
        <updated>2010-10-19T13:34:32Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=274</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=274</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/274-guid.html</id>
        <title type="html">WoO Day 3 : Meet the agent</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both;"><a   rel="lightbox" href="http://blog.godshell.com/blog/uploads/ossec_logo.jpg" class="image-link"><img width="191" height="81" align="left" class="linked-to-original" src="http://blog.godshell.com/blog/uploads/ossec_logo-thumb.jpg" style="display: inline; float: left; margin: 0pt 10px 10px 0pt;" /></a>Now that you have a functional OSSEC installation it's time to start configuring it. Proper configuration is really the heart and soul of OSSEC and will be the primary focus for the next few days. The primary OSSEC configuration files use an XML format. If you're not familiar with XML, don't worry too much. It's a pretty easy format to wrap your head around, as you'll see.</p> <br />
<p style="clear: both;">The primary configuration file is the /var/ossec/etc/ossec.conf file. The only exception to this is when you are using <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/manual/agent/agent-configuration.html']);"  href="http://www.ossec.net/doc/manual/agent/agent-configuration.html" title="OSSEC Manual - Centralize Agent Configuration">centralized agent configuration</a>, which I highly recommend for large deployments. For a centralized setup, the server configuration is located in ossec.conf and the agent configuration is located in /var/ossec/etc/shared/agent.conf. All agents are configured using a single agent.conf file. I'll explain how this works in a bit.</p> <br />
<p style="clear: both;">Before I get to the standard configuration options available to ossec.conf and agent.conf, let's talk briefly about agents and centralized agent configurations. When using a centralized configuration, I recommend minimizing what you place in the agent's ossec.conf file. The centralized agent.conf file overrides any conflicting option listed in the agent's ossec.conf file. Besides, lingering configuration options in the agent's ossec.conf can result in confusion when you're not aware of those settings. To make general configuration simple and straightforward, the only option that should be present in the agent's ossec.conf is the address of the server or servers to use.</p> <br />
<blockquote style="clear: both;"> &lt;ossec_config&gt;<br />&#160;&#160; &lt;client&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;server-ip&gt;192.168.0.1&lt;/server-ip&gt;<br />&#160;&#160; &lt;/client&gt;<br />&lt;/ossec_config&gt;</blockquote> <br />
<p style="clear: both;">The agent.conf file contains all of the configuration for every agent in the network. An agent will receive all of the configuration information relevant to that specific agent. The agent.conf file is actually sent to every agent in the network and each agent parses the file looking for configuration settings relevant to that local agent. This means that you can define an initial &quot;generic&quot; configuration block that will apply to all agents, and then use successive configuration blocks to define additional configuration options. Note: Configurations are cumulative.</p> <br />
<p style="clear: both;">It's a bit easier to look at a simple configuration as an example. For now, don't worry too much about what these options do, instead, concentrate on seeing how the agent builds its configuration.</p> <br />
<blockquote style="clear: both;">&lt;agent_config&gt;<br />&#160;&#160; &lt;syscheck&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;!-- Frequency that syscheck is executed -- default every 2 hours --&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;frequency&gt;7200&lt;/frequency&gt;<br /><br />&#160;&#160;&#160;&#160;&#160; &lt;!-- Directories to check (perform all possible verifications) --&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;!-- Files/directories to ignore --&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;directories check_all=&quot;yes&quot;&gt;/etc&lt;/directories&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;ignore&gt;/etc/adjtime&lt;/ignore&gt;<br />&#160;&#160; &lt;/syscheck&gt;<br />&lt;/agent_config&gt;<br />&lt;agent_config name=&quot;agent1&quot;&gt;<br />&#160;&#160; &lt;syscheck&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;directories check_all=&quot;yes&quot;&gt;/usr/agent1&lt;/directories&gt;<br />&#160;&#160; &lt;/syscheck&gt;<br />&lt;/agent_config&gt;&#160;<br />
</blockquote> <br />
<p style="clear: both;">The above configuration is *very* tiny and very basic. However, it should help to illustrate how the agent config works. The first agent_config block defines a generic configuration that will be used for every agent in the network. The subsequent agent_config block defines an additional directory to check for agent1. So agent1 will run with the primary configuration from the first block, plus the configuration from the second block.</p> <br />
<p style="clear: both;">Each agent_config block can be defined specifically for an agent or os using the agent and os attributes. The agent attribute is simple the name (or names separates by a |) of the agent(s) to apply that agent_config block to. The os attribute is based on the uname of the agent operating system. Some examples include Linux, FreeBSD, Windows, and Darwin.</p> <br />
<p style="clear: both;">The only other real difference between a standalone or server config and an agent config is that there are some options that belong in the server config as opposed to the agent config. For instance, when we talk about active response later in the week, the active response settings are placed in the server config. Likewise, the rules are detailed in the server config and not in the agent config. This will make more sense when we cover these topics. For now, if you're unsure as to where a particular configuration option belongs, be sure to check the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/']);"  href="http://www.ossec.net/doc/" title="OSSEC Manual">OSSEC manual</a>. </p> <br />
<p style="clear: both;">That's all for now. Check in tomorrow when we'll make OSSEC do something more than just sit there!</p><br class="final-break" style="clear: both;" /> 
            </div>
        </content>
        <dc:subject>ossec</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>week of ossec</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/277-WoO-Day-6-Layin-Down-The-Law.html" rel="alternate" title="WoO Day 6 : Layin' Down The Law" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-10-22T04:01:33Z</published>
        <updated>2010-10-18T17:26:50Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=277</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=277</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/277-guid.html</id>
        <title type="html">WoO Day 6 : Layin' Down The Law</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both;"><a   rel="lightbox" href="http://blog.godshell.com/blog/uploads/ossec_logo.jpg" class="image-link"><img width="191" height="81" align="left" class="linked-to-original" src="http://blog.godshell.com/blog/uploads/ossec_logo-thumb.jpg" style="display: inline; float: left; margin: 0pt 10px 10px 0pt;" /></a>In a previous entry we discussed OSSEC Decoders and how they work. Decoders are only the first step in the log analysis train, though. Once log entries have been decoded, we need to do something with the results. That something is to match them up with rules so that OSSEC sends alerts and/or provides the proper response.</p> <br />
<p style="clear: both;">OSSEC rules ultimately determine what log entries will be reported and what entries will trigger active responses. And, as with decoders, rules can build upon one another. You can also chain rules together to alter the ultimate response based on conditions such as frequency and time. So let's take a look at a simple rule.</p> <br />
<blockquote style="clear: both;"><br />
&lt;rule noalert=&quot;1&quot; level=&quot;0&quot; id=&quot;5700&quot;&gt;<br />&#160;&#160; &lt;decoded_as&gt;sshd&lt;/decoded_as&gt;<br />&#160;&#160; &lt;description&gt;SSHD messages grouped.&lt;/description&gt;<br />&lt;/rule&gt; </blockquote> <br />
<p style="clear: both;">This is one of the default rules that ships with OSSEC. Each rule is defined with a unique ID. To prevent custom rules from interfering with core rules, the developers have reserved a range of IDs for custom rules. That said, there is nothing preventing you from using whatever ID numbering you desire. Just keep in mind that if you use an ID that is reserved for something else by the developers, new versions of OSSEC may interfere.</p> <br />
<p style="clear: both;">Also listed in the rule tag is a level and a noalert attribute. The noalert attribute is pretty straightforward, this rule won't send an alert when it's matched. Typically, the noalert tag is used on rules that are designed to be built upon. The level tag determines what level alert this rule will trigger when matched. Because we're combining it with the noalert tag, the level ends up not meaning a whole lot.</p> <br />
<p style="clear: both;">The decoded_as tag identifies the parent decoder for which this rule is written. Only rules with a decoded_as tag matching the decoder used to decode the current log entry will be scanned for a match. This prevents OSSEC from having to scan every rule for a match.</p> <br />
<p style="clear: both;">The description tag is a human readable description of what the rule is. When you receive and alert, or when the alert is added to the OSSEC log, this description is added along with it. In the case of this rule, the description identifies its purpose. This rule was defined purely to group together sshd alerts. The intention is that other rules will handle the alerts for any alert-worthy ssh log entries that are detected.</p> <br />
<p style="clear: both;">Now let's look at something that builds on this basic rule. Again, choosing a rule from the default ruleset, we have this:</p> <br />
<blockquote style="clear: both;"> <br />
&lt;rule id=&quot;5702&quot; level=&quot;5&quot;&gt;<br />&#160;&#160; &lt;if_sid&gt;5700&lt;/if_sid&gt;<br />&#160;&#160; &lt;match&gt;^reverse mapping&lt;/match&gt;<br />&#160;&#160; &lt;regex&gt;failed - POSSIBLE BREAK&lt;/regex&gt;<br />&#160;&#160; &lt;description&gt;Reverse lookup error (bad ISP or attack).&lt;/description&gt;<br />&lt;/rule&gt; </blockquote> <br />
<p style="clear: both;">The first thing to note about this rule is the if_sid tag. The if_sid tag says if the rule number defined in this tag has already matched the incoming log entry, then we want to see if this rule matches. In other words, this rule is a child of the rule identified in the if_sid tag.</p> <br />
<p style="clear: both;">The match tag defines a string we're looking for within the log entry. The regex tag also defines a string we're trying to match, but regex can use the full set of regular expressions that OSSEC supports. If both the match and the regex are found in the log entry, then this rule matches and will alert at a level of 5.</p> <br />
<p style="clear: both;">Finally, let's look at a more advanced rule. This rule also builds on the previous rules mentioned, but contains a few extras that make it even more powerful.</p> <br />
<blockquote style="clear: both;"> <br />
&lt;rule timeframe=&quot;360&quot; frequency=&quot;4&quot; level=&quot;10&quot; id=&quot;5703&quot;&gt;<br />&#160;&#160; &lt;if_matched_sid&gt;5702&lt;/if_matched_sid&gt;<br />&#160;&#160; &lt;description&gt;Possible breakin attempt &lt;/description&gt;<br />&#160;&#160; &lt;description&gt;(high number of reverse lookup errors).&lt;/description&gt;<br />&lt;/rule&gt; </blockquote> <br />
<p style="clear: both;">The intention of this rule is to identify repeated log entries that point at a more severe problem than a simple error. In this case we have multiple incoming ssh connections with bad reverse DNS entries. The frequency and timeframe attributes define how many times within a specific timespan a particular rule has to fire before this rule will kick in.</p> <br />
<p style="clear: both;">Notice that instead of the if_sid tag, we're using the if_matched_sid tag. This is because we're not necessarily making this rule a child of another, but instead making it a composite rule. In other words, this rule is fired if another rule fires multiple times based on the setting within this rule. As a result, this rule fires with a level of 10.</p> <br />
<p style="clear: both;">But now that we have rules and alerts being generated, what else can we do? The answer is that we can trigger active responses based on those rules. Generally, an active response fires when an alert comes in with a level equal to or higher than the alert level of the active response definition. There are ways to alter this, but let's keep things simple for now.</p> <br />
<p style="clear: both;">To configure active response, first you need to define the commands that active-response will use. Note: All command and active-response configuration is placed in the ossec.conf on the server.</p> <br />
<blockquote style="clear: both;"> <br />
&lt;command&gt;<br />&#160;&#160; &lt;name&gt;firewall-drop&lt;/name&gt;<br />&#160;&#160; &lt;executable&gt;firewall-drop.sh&lt;/executable&gt;<br />&#160;&#160; &lt;expect&gt;srcip&lt;/expect&gt;<br />&#160;&#160; &lt;timeout_allowed&gt;yes&lt;/timeout_allowed&gt;<br />&lt;/command&gt; </blockquote> <br />
<p style="clear: both;">This snippet defines a command called firewall-drop. The command depends on an executable called firewall-drop.sh. This file must exist on all agents that will run this command. Unfortunately, there is currently no mechanism to push these files out to agents automatically, but perhaps there will be in the future? (*HINT*)</p> <br />
<p style="clear: both;">Th expect tag determines what variables are required from the alert in order to fire this command. Since this particular command adds a block rule to the server firewall, the srcip is required. And finally, timeout_allowed tells OSSEC that this command supports a timeout option. In other words, the firewall block is added and then removed after a given timeout.</p> <br />
<p style="clear: both;">Once the command is in place you need to set up the active response itself.</p> <br />
<blockquote style="clear: both;"> <br />
&lt;active-response&gt;<br />&#160;&#160; &lt;command&gt;firewall-drop&lt;/command&gt;<br />&#160;&#160; &lt;location&gt;local&lt;/location&gt;<br />&#160;&#160; &lt;level&gt;6&lt;/level&gt;<br />&#160;&#160; &lt;timeout&gt;3600&lt;/timeout&gt;<br />&lt;/active-response&gt; </blockquote> <br />
<p style="clear: both;">The active-response block identifies the command that will be run as well as the level at which it will fire. For this example, the firewall-drop command is run for any alert with a level of 6 or higher. We have also specified a timeout of 3600 which tells OSSEC that the command needs to be run again after 3600 seconds to remove the firewall-drop.</p> <br />
<p style="clear: both;">Also included is a location tag. This tells OSSEC where to run the command. Here we have specified local, which may be slightly confusing. This means that firewall-drop is run on the local agent that triggered the alert. So, if agent 002 triggers an ssh alert with a level of 6, then OSSEC tells agent 002 to run the firewall-drop command with a timeout of 3600 seconds.</p> <br />
<p style="clear: both;">You can also specify other options for location that allow you to run commands on the server or on specific agents. For instance, what if you want to block an IP at the edge whenever you get an alert of level 10 or higher. Perhaps you create a command called edge-block and it connects to your edge router to update an ACL located on the router. Running this on every agent is unwieldy at best and probably constitutes a significant security threat. Instead, you can have this script run on the server, or even a specific agent designed to handle this connection.</p> <br />
<p style="clear: both;">And that covers the basics for rules. I encourage you to write your own rules and test them out with the ossec-logtest program located in /var/ossec/bin. Learning to write rules is essential to running and tuning an OSSEC installation.</p> <br />
<p style="clear: both;">Tune in tomorrow for the final wrap-up of this year's Week of OSSEC!</p> 
            </div>
        </content>
        <dc:subject>ossec</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>week of ossec</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/273-WoO-Day-2-In-The-Beginning-....html" rel="alternate" title="WoO Day 2 : In The Beginning ..." />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-10-18T04:01:53Z</published>
        <updated>2010-10-18T04:01:53Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=273</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=273</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/273-guid.html</id>
        <title type="html">WoO Day 2 : In The Beginning ...</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both"><a   rel="lightbox" href="http://blog.godshell.com/blog/uploads/ossec_logo.jpg" class="image-link"><img class="linked-to-original" src="http://blog.godshell.com/blog/uploads/ossec_logo-thumb.jpg" height="81" align="left" width="191" style=" display: inline; float: left; margin: 0 10px 10px 0;" /></a>As it turns out, before you can play with OSSEC and begin learning the intricacies of host-based intrusion detection, you need to install the software. Installation itself is pretty easy and fairly straightforward, provided you know how you want to install and run the system.</p><p style="clear: both">What do I mean by this? Well, there are three ways to install the OSSEC software. It can be installed as standalone, as a server, or as an agent. These are pretty much what they sound like. A standalone installation is generally used when you're administering a single machine, or when circumstances prevent you from running a centralized server. A server/agent installation is for larger installations with centralized management.</p><p style="clear: both">For both installation types you need to start with the raw source. From there you can run the install script and choose the type of installation you want. Alternatively, if you're installing on a linux distribution that uses RPM for package management, you can grab a copy of the source RPM for the latest version <a onclick="_gaq.push(['_trackPageview', '/extlink/www.godshell.com/software']);"  href="http://www.godshell.com/software" title="Godshell Enterprises - Software Packages">here</a>. The RPM version only supports the server/agent type, though you can probably run the server as a standalone install. Note: I make no guarantees about the RPMs I provide, you are expected to know what you are installing and take appropriate precautions such as verifying what you have downloaded.</p><p style="clear: both">If you're going with the raw source, grab a copy <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/main/downloads/']);"  href="http://www.ossec.net/main/downloads/" title="OSSEC - Downloads">here</a>. The current release as of this writing is version 2.5. Download the source, unpack it, and run the installation script. The installation script must be run as root. You probably want to check the md5 and/or sha1 sum prior to installation, just to make sure that the code is original.</p><p style="clear: both"># wget http://www.ossec.net/files/ossec-hids-2.5.tar.gz<br /># sha1sum ossec-hids-2.5.tar.gz<br />3da46b493f0e50b2453c43990b46ba43e61648bf<br /># tar zxvf ossec-hids-2.5.tar.gz<br /><snip><br /># cd ossec-hids-2.5<br /># ./install.sh</p><p style="clear: both">Just follow the prompts an the installer will take care of the rest, including compiling the software.</p><p style="clear: both">The RPM install is simplified a bit as you only have to compile the code once per server architecture you want to support. In other words, if you have both 32-bit and 64-bit installations, you'll likely want to compile the software twice. Once compiled, you have three packages, ossec-hids, ossec-hids-server, and ossec-hids-client (client = agent). The ossec-hids package is installed on every system while the server and client packages go on the appropriate systems.</p><p style="clear: both">In order for the agents to talk to the server, you must have port 1514 open. Additionally, you need to register the agents with the server. This is a pretty simple process, though it has to be repeated for every agent. Detailed instructions can be found <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/main/manual/manual-manage_agents-tool/']);"  href="http://www.ossec.net/main/manual/manual-manage_agents-tool/" title="OSSEC - Managing Agents">here</a>. The short and simple version is as follows:</p><p style="clear: both">1) Run /var/ossec/bin/manage_agents and choose to add a new agent. Follow the prompts and enter the appropriate data.<br />2) While still in manage_agents, select the option to extract the agent authentication key. Copy this key as you need to paste it into the agent.<br />3) On the agent, run /var/ossec/bin/manage_agents. Choose to import the server key. Paste in the key you copied previously.</p><p style="clear: both">And that's all there is to adding a new agent. There are ways to script this, but they are a bit out of scope for an introduction article. If you're interested in scripting this process, please check the OSSEC mailing list for more details.</p><p style="clear: both">Finally, after installation comes configuration! Tune in tomorrow for more details!</p><br class='final-break' style='clear: both' /> 
            </div>
        </content>
        <dc:subject>ossec</dc:subject>
<dc:subject>Security</dc:subject>
<dc:subject>week of ossec</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/272-WoO-Day-1-Introduction.html" rel="alternate" title="WoO Day 1 : Introduction" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-10-17T04:01:48Z</published>
        <updated>2010-10-17T19:09:32Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=272</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=272</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/272-guid.html</id>
        <title type="html">WoO Day 1 : Introduction</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both;">Today marks the first day of the Week of OSSEC. What is OSSEC you ask? Well, I'm glad you asked. Allow me to explain.</p> <br />
<p style="clear: both;"><a   rel="lightbox" href="http://blog.godshell.com/blog/uploads/ossec_logo.jpg" class="image-link"><img width="191" height="81" class="linked-to-original" src="http://blog.godshell.com/blog/uploads/ossec_logo-thumb.jpg" style="text-align: center; display: block; margin: 0pt auto 10px;" /></a>According to the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/']);"  href="http://www.ossec.net/" title="OSSEC">OSSEC home page</a>, OSSEC is :</p> <br />
<blockquote style="clear: both;"> <br />
<p style="clear: both;">OSSEC is an Open Source Host-based Intrusion Detection System. It performs log analysis, file integrity checking, policy monitoring, rootkit detection, real-time alerting and active response.</p>  <br />
<p style="clear: both;">It runs on most operating systems, including Linux, MacOS, Solaris, HP-UX, AIX and Windows.</p> <br />
</blockquote> <br />
<p style="clear: both;">But you have an IDS already, right? One of those big fancy all-in-one units that protects your network, has tons of signatures, and spits out endless reams of data. Or maybe you're on the Open Source track and you're using Snort combined with some fancy OSS front end for reporting.</p> <br />
<p style="clear: both;">Well, OSSEC is a bit different. It's a <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/Host-based_intrusion_detection_system']);"  href="http://en.wikipedia.org/wiki/Host-based_intrusion_detection_system" title="Wikipedia - Host-based Intrusion Detection System">HIDS</a>, not an <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/Intrusion_detection_system']);"  href="http://en.wikipedia.org/wiki/Intrusion_detection_system" title="Wikipedia - Intrusion Detection System">IDS</a>. In short, this means that OSSEC is designed to monitor a single host and react to events occurring on that host. While this doesn't sound very useful from the outset, I assure you that this is significantly more useful than you think.</p> <br />
<p style="clear: both;">For instance, let's look at a typical brute-force attack. Your average IDS will allow the traffic through the network as perfectly valid traffic. There is nothing unusual happening at a network layer, so the IDS is content with passing the traffic as normal. Once it hits the server, however, the attack makes itself clear, trying to brute force its way into the server. You can ignore this and hope your password policies are strong enough to cope, but if an attacker is persistent enough, they may eventually worm their way in. Another way to deal with this is through session throttling via the server's firewall. OSSEC deals with this by identifying the attack and blocking the attacker's IP.</p> <br />
<p style="clear: both;">Sure, fail2ban and other packages offer similar capabilities, but can they also be used to monitor file integrity? How about rootkit detection? Can you centralize their capabilities, using a single host to push out configurations to remote systems? Can they be used in an agentless configuration where a host is monitored without having to install software on it?</p> <br />
<p style="clear: both;">OSSEC is extremely powerful and is gaining more capabilities over time. It is in active development with no signs of slowing. In fact, version 2.5 was just released on September 27th.</p> <br />
<p style="clear: both;">Over the next week I'll be explaining some of OSSEC's capabilities. Ultimately, I suggest you install it on a development system and start poking at it yourself. You can also join the OSSEC <a onclick="_gaq.push(['_trackPageview', '/extlink/groups.google.com/group/ossec-list']);"  href="http://groups.google.com/group/ossec-list" title="Google Groups - OSSEC Mailing List">mailing list</a> and join in the various on-going conversations.</p><br class="final-break" style="clear: both;" /> 
            </div>
        </content>
        <dc:subject>hids</dc:subject>
<dc:subject>ossec</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>week of ossec</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/276-WoO-Day-5-Decoders-Unite!.html" rel="alternate" title="WoO Day 5 : Decoders Unite!" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-10-21T04:01:49Z</published>
        <updated>2010-10-16T04:30:24Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=276</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=276</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/276-guid.html</id>
        <title type="html">WoO Day 5 : Decoders Unite!</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both;"><a  class="image-link"  rel="lightbox" href="http://blog.godshell.com/blog/uploads/ossec_logo.jpg"><img width="191" height="81" align="left" style="display: inline; float: left; margin: 0pt 10px 10px 0pt;" src="http://blog.godshell.com/blog/uploads/ossec_logo-thumb.jpg" class="linked-to-original" /></a>One of the strongest features of OSSEC is its log analysis engine. The log collector process monitors all of the specified logs and passes each log entry off to the analysis engine for decoding and rule matching. For agents, the log entries are transmitted to the server for processing.</p> <br />
<p style="clear: both;">There are multiple steps to identifying actionable matches starting with the decoding of each log entry. First, pre-decoding breaks apart a single log entry into manageable pieces. Decoders are then used to identify specific programs and log entry types. Decoders can build on one another allowing the operator to target specific patterns within a log entry with ease.</p> <br />
<p style="clear: both;">Let's take a look at a simple example first. The following is a sample log entry from a typical /var/log/secure log. This log uses the syslog format for log entries.</p> <br />
<blockquote style="clear: both;"> <br />
<p>Oct 21 00:01:00 dev sshd[31409]: Failed password for invalid user postfix from 189.126.97.181 port 57608 ssh2</p> <br />
</blockquote> <br />
<p style="clear: both;">Pre-decoding breaks apart the syslog format into three pieces, the hostname, program_name, and log. Using the ossec-logtest program provided with OSSEC, we can view the process OSSEC goes through for decoding and then rule matching. Pre-decoding this log entry produces the following :</p> <br />
<blockquote style="clear: both;"> <br />
<p>[root@dev bin]# ./ossec-logtest <br />2010/10/21 00:01:00 ossec-testrule: INFO: Reading local decoder file.<br />2010/10/21 00:01:00 ossec-testrule: INFO: Started (pid: 1106).<br />ossec-testrule: Type one log per line.<br /> <br />Oct 21 00:01:00 dev sshd[31409]: Failed password for invalid user postfix from 189.126.97.181 port 57608 ssh2<br /><br />**Phase 1: Completed pre-decoding.<br /> full event: 'Oct 21 00:01:00 dev sshd[31409]: Failed password for invalid user postfix from 189.126.97.181 port 57608 ssh2'<br /> hostname: 'dev'<br /> program_name: 'sshd'<br /> log: 'Failed password for invalid user postfix from 189.126.97.181 port 57608 ssh2'</p> <br />
</blockquote> <br />
<p style="clear: both;">As you can see, the log entry ends up with three parts. Further decoding uses pattern matching on these three parts to further identify and categorize log entries.</p> <br />
<blockquote style="clear: both;">&lt;decoder name=&quot;sshd&quot;&gt;<br />&#160;&#160; &lt;program_name&gt;^sshd&lt;/program_name&gt;<br />&lt;/decoder&gt;<br /></blockquote> <br />
<p style="clear: both;">This is about as simple as a decoder can get. The decoder block starts with an attribute identifying the name of the decoder. In this case, that name is sshd. Within the decoder block is a program_name tag that contains a regular expression used to match against the program_name from pre-decoding. If the regex matches, OSSEC will use that decoder to match against any defined rules.</p> <br />
<p style="clear: both;">As I mentioned before, however, decoders can build on each other. The first decoder above reduces the number of subsequent decoders that need to be checked before decoding is complete. For example, look at the following decoder definition :</p> <br />
<blockquote style="clear: both;"> <br />
&lt;decoder name=&quot;ssh-invfailed&quot;&gt;<br />&#160;&#160; &lt;parent&gt;sshd&lt;/parent&gt;<br />&#160;&#160; &lt;prematch&gt;^Failed \S+ for invalid user|^Failed \S+ for illegal user&lt;/prematch&gt;<br />&#160;&#160; &lt;regex offset=&quot;after_prematch&quot;&gt;from (\S+) port \d+ \w+$&lt;/regex&gt;<br />&#160;&#160; &lt;order&gt;srcip&lt;/order&gt;<br />&lt;/decoder&gt;<br /></blockquote> <br />
<p style="clear: both;">This decoder builds on the first as can be seen via the parent tag. Decoders work on a first match basis. In other words, the first decoder to match is used to find secondary decoders (children of the first), the first secondary decoder is used to find tertiary (children of the second), etc. If the matching decoder has no children, then that decoder is the final decoder and the decoded information is passed on to rules processing.</p> <br />
<p style="clear: both;">There are three other tags within this decoder block worth looking at. First, the prematch tag. Prematch is used as a quick way to determine if the rest of the decoder should be run. Prematches should be written so that the portion of the entry they match can be skipped by the rest of the decoder. For instance, in the decoder example above, the prematch will match the phrase &quot;Failed password for invalid user&quot; in the log entry. This portion of the log contains enough information to identify the type of log entry without requiring us to parse it again to extract information. The remaining part of the log entry has the information we want to capture.</p> <br />
<p style="clear: both;">Which brings us to the regex. The regex, or regular expression, is a string used to match and pull apart a log entry. The regex expression in the example is used to extract the source ip address from the log so we can use it in an active response later. The order tag identifies what the extracted information is.</p> <br />
<p style="clear: both;">Now, using these two decoders, let's run ossec-logtest again :</p> <br />
<blockquote style="clear: both;"> <br />
<p style="clear: both;">2010/10/21 00:01:00 ossec-testrule: INFO: Reading local decoder file. <br />2010/10/21 00:01:00 ossec-testrule: INFO: Started (pid: 28358).<br />ossec-testrule: Type one log per line.<br /><br />Oct 21 00:01:00 dev sshd[31409]: Failed password for invalid user postfix from 189.126.97.181 port 57608 ssh2<br /><br />**Phase 1: Completed pre-decoding.<br /> full event: 'Oct 21 00:01:00 dev sshd[31409]: Failed password for invalid user postfix<br />from 189.126.97.181 port 57608 ssh2'<br /> hostname: 'dev'<br /> program_name: 'sshd'<br /> log: 'Failed password for invalid user postfix from 189.126.97.181 port 57608 ssh2'<br /><br />**Phase 2: Completed decoding.<br /> decoder: 'sshd'<br /> srcip: '189.126.97.181'</p> <br />
</blockquote> <br />
<p style="clear: both;">As you can see, the decoding phase has identified the decoder as sshd. The logtest program reports the name of the parent decoder used, rather than the ultimate matching decoder.</p> <br />
<p style="clear: both;">Hopefully this has given you enough information to start writing your own decoders. The decoder.xml file that comes with OSSEC is a great place to look at examples of how to craft decoders. This is a more advanced task, however, and the existing decoders cover most of the standard log entries you'll see on a Linux or Windows machine.</p> <br />
<p style="clear: both;">For more information on decoders, please see the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/manual/rules-decoders/index.html']);"  title="OSSEC Manual - Rules and Decoders" href="http://www.ossec.net/doc/manual/rules-decoders/index.html">OSSEC manual</a>. You might also check out chapter 4 of the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.amazon.com/gp/product/159749240X?ie=UTF8&amp;amp;tag=technolmusing-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=159749240X']);"  title="Amazon.com - OSSEC HIDS" href="http://www.amazon.com/gp/product/159749240X?ie=UTF8&amp;tag=technolmusing-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=159749240X">OSSEC book</a>. The book is a little outdated now, but the information within is still quite accurate. Syngress released a few chapters of the book that you can download <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/main/week-of-ossec-2woo-oct-17-23']);"  title="OSSEC - Week of OSSEC (2WoO) - Oct 17-23" href="http://www.ossec.net/main/week-of-ossec-2woo-oct-17-23">here</a>.</p><br style="clear: both;" class="final-break" /> 
            </div>
        </content>
        <dc:subject>ossec</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>week of ossec</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/275-WoO-Day-4-Spot-the-Difference.html" rel="alternate" title="WoO Day 4 : Spot the Difference" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-10-20T04:01:20Z</published>
        <updated>2010-10-16T04:28:05Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=275</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=275</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/5-Security" label="Security" term="Security" />
    
        <id>http://blog.godshell.com/blog/archives/275-guid.html</id>
        <title type="html">WoO Day 4 : Spot the Difference</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both;"><a   rel="lightbox" href="http://blog.godshell.com/blog/uploads/ossec_logo.jpg" class="image-link"><img width="191" height="81" align="left" class="linked-to-original" src="http://blog.godshell.com/blog/uploads/ossec_logo-thumb.jpg" style="display: inline; float: left; margin: 0pt 10px 10px 0pt;" /></a>One of the simplest functions that OSSEC can perform is integrity monitoring. The premise is pretty simple, let the admin know if a file has changed. More often than not, the admin will already know that the file has changed because the admin is the one that changed it. But sometimes files change because of problems in the system that the admin doesn't know about. Or, the files may change because the server has been compromised by an outside party that has installed rogue software. Either way, the admin needs this information.</p> <br />
<p style="clear: both;">OSSEC can be configured to look at a few different aspects of a file in order to determine if it has changed or not, depending on how you configure it. But before we get to that, let's configure OSSEC to send us alerts to begin with.</p> <br />
<p style="clear: both;">There are a number of ways OSSEC can send alerts. Alerts can be sent via syslog, email, stored in a database, or sent to third-party programs such as <a onclick="_gaq.push(['_trackPageview', '/extlink/www.prelude-technologies.com/en/welcome/index.html']);"  href="http://www.prelude-technologies.com/en/welcome/index.html" title="Prelude SIEM">Prelude</a> and <a onclick="_gaq.push(['_trackPageview', '/extlink/www.wallinfire.net/picviz/']);"  href="http://www.wallinfire.net/picviz/" title="Picviz">Picviz</a>. To make things a bit simpler, I'm only detailing how to set up email. If you're interested in other alert setups, please check the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/manual/output/index.html']);"  href="http://www.ossec.net/doc/manual/output/index.html" title="OSSEC Manual - Output and Alert Options">OSSEC manual</a>.</p> <br />
<p style="clear: both;">Setting up email alerts is as simple as adding two sections of configuration to the ossec.conf file. This configuration is set on the server, or on a standalone installation. In a server/agent setup, the server sends all alerts, including those for agents.</p> <br />
<blockquote style="clear: both;">&lt;global&gt;<br />&#160;&#160; &lt;email_notification&gt;yes&lt;/email_notification&gt;<br />&#160;&#160; &lt;email_to&gt;myaddress@example.com&lt;/email_to&gt;<br />&#160;&#160; &lt;smtp_server&gt;smtp.example.com&lt;/smtp_server&gt;<br />&#160;&#160; &lt;email_from&gt;ossec@example.com&lt;/email_from&gt;<br />&lt;/global&gt;<br /></blockquote> <br />
<p style="clear: both;">This first bit of configuration defines the To: and From: addresses as well as the SMTP server address. This configuration goes into the global config section which has a number of <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/syntax/head_ossec_config.reports.html#ossec-config-global']);"  href="http://www.ossec.net/doc/syntax/head_ossec_config.reports.html#ossec-config-global" title="OSSEC Manual - Global Options">other options</a> as well.</p> <br />
<blockquote style="clear: both;">&lt;alerts&gt;<br />&#160;&#160; &lt;log_alert_level&gt;1&lt;/log_alert_level&gt;<br />&#160;&#160; &lt;email_alert_level&gt;6&lt;/email_alert_level&gt;<br />&lt;/alerts&gt; <br /></blockquote> <br />
<p style="clear: both;">This portion of the configuration defines what level alerts should be sent via email and what level alerts should be logged. Don't worry too much about what a level is, you'll learn this in a later blog entry when we discuss rules and active response. For now, the config as shown above is enough.</p> <br />
<p style="clear: both;">Now that we'll receive alerts that OSSEC generates, let's set something up to send an alert!</p> <br />
<p style="clear: both;">As I mentioned before, integrity monitoring is pretty straightforward. OSSEC uses a number of different characteristics to identify when a file changes. It's pretty easy to determine that a file has changed if the owner, permissions, or size changes. OSSEC can also be configured to check the sha1 and/or md5 hash values as well. Hashing is a way of producing a &quot;signature&quot; for a file that is mostly unique. It is possible to create another file with the same hash, but it's very difficult. Combining all of these checks together makes it very improbable that an intruder can replace a file without you knowing.</p> <br />
<p style="clear: both;">Enabling syscheck is done on a per-host basis. What I mean by this is that the config is added to the ossec.conf file for server or standalone systems, and the config is added to the agent.conf for agents. As with other agent configurations, you can specify syscheck blocks for all agents as well as cumulatively for specific agents.</p> <br />
<blockquote style="clear: both;">&lt;syscheck&gt;<br />&#160;&#160; &lt;frequency&gt;7200&lt;/frequency&gt;<br /><br />&#160;&#160; &lt;directories check_all=&quot;yes&quot;&gt;/etc&lt;/directories&gt;<br />&#160;&#160; &lt;ignore&gt;/etc/adjtime&lt;/ignore&gt;<br />&lt;/syscheck&gt;<br /></blockquote> <br />
<p style="clear: both;">The above config is an example of how to enable syscheck. The frequency block specifies the time, in seconds, between syscheck runs. The example above runs syscheck every 2 hours. Moving further down in the config is the directories tag. Simply put, this tag identifies what directories syscheck should be checking. The directories tag can define multiple directories, separated by a comma. The check_all attribute indicates that all of the previously mentioned checks should be run. The <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/manual/syscheck/index.html']);"  href="http://www.ossec.net/doc/manual/syscheck/index.html" title="OSSEC Manual - Syscheck">OSSEC manual</a> details what other attributes are available. One other attribute worth mentioning is the realtime attribute. This attribute directs OSSEC to use inotify to alert when files changes, in real time, for quicker notification. Linux is the only OS, that I am aware of, that supports this option. Please check the manual for more information on realtime use.</p> <br />
<p style="clear: both;">There are times when you want to ignore files within a directory, or even certain subdirectories. The ignore tag allows you to accomplish this. Without defining any attributes, the ignore tag must define an exact match. For instance, in the example above, the file /etc/adjtime will be ignored. However, /etc/adjtime.new or /etc/adjtime0 will not be. To ignore these files, you will need to either add explicit ignore blocks for them, or you can use a regular expression to grab them all. The type attribute allows you to specify that this tag contains a regular expression. For instance :</p> <br />
<blockquote style="clear: both;">&lt;ignore type=&quot;sregex&quot;&gt;^/etc/adjtime&lt;/ignore&gt;</blockquote> <br />
<p style="clear: both;">This ignore block will drop any file (including path) that starts with /etc/adjtime. Information on the regular expression syntax is in the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.ossec.net/doc/syntax/regex.html']);"  href="http://www.ossec.net/doc/syntax/regex.html" title="OSSEC Manual - Regular Expressions">OSSEC Manual</a>.</p> <br />
<p style="clear: both;">There are a number of other tags available for syscheck that you can find in the manual. Among these are some more useful ones such as alert_new_files and, if you're in a Windows environment, windows_registry. I encourage you to check out these options and identify which, if any, would benefit your environment.</p> <br />
<p style="clear: both;">When OSSEC detects that a file has changed, it will send an alert. Alerts will be reported via the alert mechanism you have defined within the configuration. Syscheck alerts are, by default, set to a level of 7, so our alert settings will result in an email being sent. An example alert is below :</p> <br />
<blockquote style="clear: both;"> <br />
<p style="clear: both;">OSSEC HIDS Notification.<br />2010 Oct 13 08:08:05<br /><br />Received From: (Example) 192.168.0.1-&gt;syscheck<br />Rule: 550 fired (level 7) -&gt; &quot;Integrity checksum changed.&quot;<br />Portion of the log(s):<br /><br />Integrity checksum changed for: '/etc/adjtime'<br />Old md5sum was: '7234e9b2255e62178c5650982bae9cbc'<br />New md5sum is : '01210c2018146c2a9ca89505118c42f8'<br />Old sha1sum was: 'df60021e39119b42a4ae508ad19b65019df089af'<br />New sha1sum is : '694b403b74a2aa339ba323b65a6d724aa8129e3b'<br /><br />--END OF NOTIFICATION</p> <br />
</blockquote> <br />
<p style="clear: both;">OSSEC makes some attempts at identifying false positives by automatically ignoring files that change frequently. By default, ossec will begin ignoring any file that has changed three times. You can change this behavior by creating custom rules that override the defaults. I'll be covering rules in my next blog post, so stay tuned!</p><br class="final-break" style="clear: both;" /> 
            </div>
        </content>
        <dc:subject>ossec</dc:subject>
<dc:subject>security</dc:subject>
<dc:subject>week of ossec</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/271-Sort-By-Sound.html" rel="alternate" title="Sort By Sound ?" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-09-20T01:53:58Z</published>
        <updated>2010-09-20T01:53:58Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=271</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=271</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/271-guid.html</id>
        <title type="html">Sort By Sound ?</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both">I ran across <a onclick="_gaq.push(['_trackPageview', '/extlink/www.geek.com/articles/geek-cetera/sorting-algorithms-quite-boring-until-you-add-sound-effects-20100819/']);"  href="http://www.geek.com/articles/geek-cetera/sorting-algorithms-quite-boring-until-you-add-sound-effects-20100819/" title="Geek.com - Sorting algorithms quite boring until you add sound effects">this</a> a few weeks ago and I thought it was simply brilliant. Sorting algorithms are, for better or worse, one of the most used algorithms in a programmers toolbox. For many, sorting is just something you need to learn to pass a computer science course. For others, they devote their lives to researching them.</p><p style="clear: both">The following two videos show an interesting view of sorting. An enterprising programmer decided to add a bit of sound to the sorting. There are endless ways the initial data can be arranged, so these sounds don't represent how every sort of that type will sound. But the sound coupled with the visual representation of the sort make these videos worth a glance.</p><p style="clear: both"><span style=" text-align: center; display: block; margin: 0 auto 10px;"><object height="261" width="435"><param name="movie" value="http://www.youtube.com/v/t8g-iYGHpEA&color1=0xb1b1b1&color2=0xd0d0d0&hl=en_GB&feature=player_embedded&fs=1" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.youtube.com/v/t8g-iYGHpEA&color1=0xb1b1b1&color2=0xd0d0d0&hl=en_GB&feature=player_embedded&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="261" width="435"></embed></object></span></p><p style="clear: both"><span style=" text-align: center; display: block; margin: 0 auto 10px;"><object height="261" width="435"><param name="movie" value="http://www.youtube.com/v/iXAjiDQbPSw&color1=0xb1b1b1&color2=0xd0d0d0&hl=en_GB&feature=player_embedded&fs=1" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.youtube.com/v/iXAjiDQbPSw&color1=0xb1b1b1&color2=0xd0d0d0&hl=en_GB&feature=player_embedded&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="261" width="435"></embed></object></span></p><br class='final-break' style='clear: both' /> 
            </div>
        </content>
        <dc:subject>algorithms</dc:subject>
<dc:subject>programming</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/270-Desensitization.html" rel="alternate" title="Desensitization" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-09-17T20:53:45Z</published>
        <updated>2010-09-17T20:53:45Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=270</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=270</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/270-guid.html</id>
        <title type="html">Desensitization</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Video games are incredibly fun to play. There are those out there, however, that argue that game players are being de-sensitized to violence by playing these games. For a very long time, I've argued against this, citing games as a cathartic activity rather than a damaging one. My view has changed, however, due to this image that I stumbled across recently.<div><br /></div><p style="clear: both"><a   rel="lightbox" href="http://blog.godshell.com/blog/uploads/mario-guilt1.jpg" class="image-link"><img class="linked-to-original" src="http://blog.godshell.com/blog/uploads/mario-guilt1-thumb.jpg" height="570" width="334" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a>(via <a onclick="_gaq.push(['_trackPageview', '/extlink/www.wonderlandblog.com/wonderland/2010/08/super-mario-conscience.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+Wonderland+%28Wonderland%29']);"  href="http://www.wonderlandblog.com/wonderland/2010/08/super-mario-conscience.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Wonderland+%28Wonderland%29" title="Wonderland - Super Mario Conscience">Wonderland Blog</a> via <a onclick="_gaq.push(['_trackPageview', '/extlink/maneggs.com/page/2/']);"  href="http://maneggs.com/page/2/" title="Maneggs">Maneggs</a>)</p><br class='final-break' style='clear: both' /> 
            </div>
        </content>
        <dc:subject>games</dc:subject>
<dc:subject>humor</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/269-SQL-Query-Conundrum....html" rel="alternate" title="SQL Query Conundrum..." />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-08-19T02:45:49Z</published>
        <updated>2010-08-19T03:09:47Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=269</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=269</wfw:commentRss>
    
            <category scheme="http://blog.godshell.com/blog/categories/3-Programming" label="Programming" term="Programming" />
    
        <id>http://blog.godshell.com/blog/archives/269-guid.html</id>
        <title type="html">SQL Query Conundrum...</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p> </p> <br />
<p style="clear: both;">I have a brain teaser for ya.. I'm looking for a way to solve a SQL problem efficiently, specifically using <a onclick="_gaq.push(['_trackPageview', '/extlink/www.mysql.com/']);"  title="MySQL :: The world's most popular open source database" href="http://www.mysql.com/">MySQL</a>. The goal is to get a count of the number of unique rows returned for a complex query. It's actually for a <a onclick="_gaq.push(['_trackPageview', '/extlink/en.wikipedia.org/wiki/Pagination']);"  title="Wikipedia - Pagination" href="http://en.wikipedia.org/wiki/Pagination">pagination</a> system so I can determine the limits necessary to efficiently query the database for the right amount of data rather than return everything and try to brute force it.<br /><br />Let's say I have three tables as follows :</p> <br />
<p style="clear: both;"><font size="1" face="courier new,courier,monospace">mysql&gt; describe person;<br />+-------+------------------+------+-----+---------+-------+<br />| Field | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |<br />+-------+------------------+------+-----+---------+-------+<br />| id&#160;&#160;&#160; | int(10) unsigned | NO&#160;&#160; | PRI | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |<br />| first | char(15)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | YES&#160; |&#160;&#160;&#160;&#160; | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |<br />| last&#160; | char(15)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | YES&#160; |&#160;&#160;&#160;&#160; | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |<br />+-------+------------------+------+-----+---------+-------+<br />3 rows in set (0.02 sec)<br /><br />mysql&gt; describe interests;<br />+----------+------------------+------+-----+---------+-------+<br />| Field&#160;&#160;&#160; | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |<br />+----------+------------------+------+-----+---------+-------+<br />| id&#160;&#160;&#160;&#160;&#160;&#160; | int(10) unsigned | NO&#160;&#160; | PRI | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |<br />| interest | char(15)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | YES&#160; |&#160;&#160;&#160;&#160; | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |<br />+----------+------------------+------+-----+---------+-------+<br />2 rows in set (0.00 sec)<br /><br />mysql&gt; describe interest_link;<br />+-------------+------------------+------+-----+---------+-------+<br />| Field&#160;&#160;&#160;&#160;&#160;&#160; | Type&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Null | Key | Default | Extra |<br />+-------------+------------------+------+-----+---------+-------+<br />| person_id&#160;&#160; | int(10) unsigned | NO&#160;&#160; |&#160;&#160;&#160;&#160; | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |<br />| interest_id | int(10) unsigned | NO&#160;&#160; |&#160;&#160;&#160;&#160; | NULL&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160; |<br />+-------------+------------------+------+-----+---------+-------+<br />2 rows in set (0.00 sec)</font><br /></p> <br />
<p style="clear: both;">Simple enough. I'm mapping interests to people. I've entered data into these tables as follows :</p> <br />
<p style="clear: both;"><font size="1" face="courier new,courier,monospace">mysql&gt; select * from person;<br />+----+-------+----------+<br />| id | first | last&#160;&#160;&#160;&#160; |<br />+----+-------+----------+<br />|&#160; 1 | John&#160; | Doe&#160;&#160;&#160;&#160;&#160; |<br />|&#160; 2 | Bob&#160;&#160; | Jones&#160;&#160;&#160; |<br />|&#160; 3 | Joe&#160;&#160; | Smith&#160;&#160;&#160; |<br />+----+-------+----------+<br />3 rows in set (0.00 sec)<br /><br />mysql&gt; select * from interests;<br />+----+-----------+<br />| id | interest&#160; |<br />+----+-----------+<br />|&#160; 1 | Computers |<br />|&#160; 2 | Music&#160;&#160;&#160;&#160; |<br />|&#160; 3 | Food&#160;&#160;&#160;&#160;&#160; |<br />|&#160; 4 | Beer&#160;&#160;&#160;&#160;&#160; |<br />|&#160; 5 | Gaming&#160;&#160;&#160; |<br />+----+-----------+<br />5 rows in set (0.00 sec)<br /><br />mysql&gt; select * from interest_link;<br />+-----------+-------------+<br />| person_id | interest_id |<br />+-----------+-------------+<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 5 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4 |<br />+-----------+-------------+<br />9 rows in set (0.00 sec)</font><br /></p> <br />
<p style="clear: both;">So far, so good. Now, I want to do a search to find which users are interested in music. Simple enough search, I'd do this with a simple select statement as follows :</p> <br />
<p style="clear: both;"><font size="1" face="courier new,courier,monospace">mysql&gt; select * from person as p left join interest_link as il on il.person_id = p.id where interest_id = 2;<br />+----+-------+--------+-----------+-------------+<br />| id | first | last&#160;&#160; | person_id | interest_id |<br />+----+-------+--------+-----------+-------------+<br />|&#160; 1 | John&#160; | Doe&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />|&#160; 3 | Joe&#160;&#160; | Smith&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />+----+-------+--------+-----------+-------------+<br />2 rows in set (0.00 sec)</font><br /></p> <br />
<p style="clear: both;">But what if I want to find out who's interested in music *and* beer?</p> <br />
<p style="clear: both;"><font size="1" face="courier new,courier,monospace">mysql&gt; select * from person as p left join interest_link as il on il.person_id = p.id where interest_id in (2,4);<br />+----+-------+----------+-----------+-------------+<br />| id | first | last&#160;&#160;&#160;&#160; | person_id | interest_id |<br />+----+-------+----------+-----------+-------------+<br />|&#160; 1 | John&#160; | Doe&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />|&#160; 1 | John&#160; | Doe&#160;&#160;&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4 |<br />|&#160; 2 | Bob&#160;&#160; | Jones&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4 |<br />|&#160; 3 | Joe&#160;&#160; | Smith&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />|&#160; 3 | Joe&#160;&#160; | Smith&#160;&#160;&#160; |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4 |<br />+----+-------+----------+-----------+-------------+<br />5 rows in set (0.00 sec)</font><br /></p> <br />
<p style="clear: both;">That's a problem, now I have 5 rows.. How do I make this a unique list? Well, I'm merely interested in names and ids, so I can do this :</p> <br />
<p><font size="1" face="courier new,courier,monospace">mysql&gt; select p.id, p.first, p.last from person as p left join interest_link as il on il.person_id = p.id where interest_id in (2,4);<br />+----+-------+----------+<br />| id | first | last&#160;&#160;&#160;&#160; |<br />+----+-------+----------+<br />|&#160; 1 | John&#160; | Doe&#160;&#160;&#160;&#160;&#160; |<br />|&#160; 1 | John&#160; | Doe&#160;&#160;&#160;&#160;&#160; |<br />|&#160; 2 | Bob&#160;&#160; | Jones&#160;&#160;&#160; |<br />|&#160; 3 | Joe&#160;&#160; | Smith&#160;&#160;&#160; |<br />|&#160; 3 | Joe&#160;&#160; | Smith&#160;&#160;&#160; |<br />+----+-------+----------+<br />5 rows in set (0.00 sec)</font> <font size="1"><br /></font></p> <br />
<p style="clear: both;">but that's still 5 rows.. so what now?</p> <br />
<p><font size="1" face="courier new,courier,monospace">mysql&gt; select distinct p.id, p.first, p.last from person as p left join interest_link as il on il.person_id = p.id where interest_id in (2,4);<br />+----+-------+----------+<br />| id | first | last&#160;&#160;&#160;&#160; |<br />+----+-------+----------+<br />|&#160; 1 | John&#160; | Doe&#160;&#160;&#160;&#160;&#160; |<br />|&#160; 2 | Bob&#160;&#160; | Jones&#160;&#160;&#160; |<br />|&#160; 3 | Joe&#160;&#160; | Smith&#160;&#160;&#160; |<br />+----+-------+----------+<br />3 rows in set (0.00 sec)</font> <br /></p> <br />
<p style="clear: both;">Aha! perfect. That's what I need.. almost. For this particular application, I want to paginate, so I need a total number of matching rows so I can properly identify the limits as well as the upper bound on page numbers. So, I'll just replace the specific field names with a count(*) :</p> <br />
<p><font size="1" face="courier new,courier,monospace">mysql&gt; select distinct count(*) from person as p left join interest_link as il on il.person_id = p.id where interest_id in (2,4);<br />+----------+<br />| count(*) |<br />+----------+<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160; 5 |<br />+----------+<br />1 row in set (0.00 sec)</font> <font size="1"><br /></font></p> <br />
<p style="clear: both;">And here is where I'm stuck. I need the total count of DISTINCT names, not the total number of rows returned. I tried a GROUP BY, but that didn't help much :</p> <br />
<p><font size="1" face="courier new,courier,monospace">mysql&gt; select count(*) from person as p left join interest_link as il on il.person_id = p.id where interest_id in (2,4) group by p.id;<br />+----------+<br />| count(*) |<br />+----------+<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 |<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 |<br />+----------+<br />3 rows in set (0.00 sec)</font> <font size="1"><br /></font></p> <br />
<p style="clear: both;">Sure, I get 3 rows, but what I'm looking for here is a single row with the total number of items. ... So, what if I count the number of returned rows! :</p> <br />
<p><font size="1" face="courier new,courier,monospace">mysql&gt; select count(*) from (select count(*) from person as p left join interest_link as il on il.person_id = p.id where interest_id in (2,4) group by p.id) as foo;<br />+----------+<br />| count(*) |<br />+----------+<br />|&#160;&#160;&#160;&#160;&#160;&#160;&#160; 3 |<br />+----------+<br />1 row in set (0.00 sec)</font> <font size="1"><br /></font></p> <br />
<p style="clear: both;">BUT... at what cost? This seems like a rather complex query that might break down, significantly, when there's a lot of data.. And the examples above are rather simplistic. In reality, we're talking about more fields and more tables, so the simpler query gets a little complex to begin with. I'm open to ideas on how to do this properly via SQL. Yes, I am aware of indexing and how that speeds things up. I use indexing, I just eliminated it from the above example to simplify things. I'm open to ideas on how to do this properly via SQL.</p> <br />
<p style="clear: both;">I can simply return all the rows with the distinct clause, count them programmatically, and then proceed with the rest of the program, but depending on the selections made by the user, there could be a significant amount of data returned. I'm worried about both memory exhaustion on the part of the scripting language, as well as the processing and transmission time required to pass all of that data back to the program from the SQL database. Besides, this is the sort of problem that SQL was designed to solve.</p> <br />
<p style="clear: both;">I don't think this is a unique problem, so someone out there has a solution. Perhaps the subselect *is* the better solution, but I don't think so. I'm open to ideas. You can leave a comment here, or hit me up on <a onclick="_gaq.push(['_trackPageview', '/extlink/twitter.com/xenophage']);"  title="Twitter - XenoPhage" href="http://twitter.com/xenophage">twitter</a>.</p><br style="clear: both;" class="final-break" /> 
            </div>
        </content>
        <dc:subject>programming</dc:subject>
<dc:subject>sql</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/268-Code-Hunters.html" rel="alternate" title="Code Hunters" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-08-18T11:12:13Z</published>
        <updated>2010-08-18T11:19:05Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=268</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=268</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/268-guid.html</id>
        <title type="html">Code Hunters</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both"><span style=" text-align: center; display: block; margin: 0 auto 10px;"><object height="261" width="435"><param name="movie" value="http://www.youtube.com/v/D2iOcCibzUo?fs=1&hl=en_US" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/D2iOcCibzUo?fs=1&hl=en_US" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="261" width="435"></embed></object></span>Amazing short.. I definitely want to see more.</p><br class='final-break' style='clear: both' /> 
            </div>
        </content>
        <dc:subject>entertainment</dc:subject>
<dc:subject>media</dc:subject>

    </entry>
    <entry>
        <link href="http://blog.godshell.com/blog/archives/267-Playbox-Three-Sixt-Wii!.html" rel="alternate" title="Playbox Three-Sixt-Wii!" />
        <author>
            <name>Jason Frisvold</name>
                    </author>
    
        <published>2010-08-12T05:20:36Z</published>
        <updated>2010-08-12T05:20:36Z</updated>
        <wfw:comment>http://blog.godshell.com/blog/wfwcomment.php?cid=267</wfw:comment>
    
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.godshell.com/blog/rss.php?version=atom1.0&amp;type=comments&amp;cid=267</wfw:commentRss>
    
    
        <id>http://blog.godshell.com/blog/archives/267-guid.html</id>
        <title type="html">Playbox Three-Sixt-Wii!</title>
        <content type="xhtml" xml:base="http://blog.godshell.com/blog/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p style="clear: both">I was fortunate enough to obtain both a <a onclick="_gaq.push(['_trackPageview', '/extlink/www.us.playstation.com']);"  href="http://www.us.playstation.com" title="Sony Playstation 3">PlayStation 3</a> and an <a onclick="_gaq.push(['_trackPageview', '/extlink/www.xbox.com']);"  href="http://www.xbox.com" title="Microsoft Xbox 360">Xbox 360</a> recently. I've owned a <a onclick="_gaq.push(['_trackPageview', '/extlink/www.nintendo.com/wii']);"  href="http://www.nintendo.com/wii" title="Nintendo Wii">Wii</a> since it was launched back in 2006. The Wii was always relegated as a non-contender in the "next-gen" console wars. The Wuu has definitely held its own, however, effectively carving its own niche. Instead of concentrating on graphics and processor technology, they went in a completely different direction, creating a new way to play games with their innovative controller.</p><p style="clear: both">I have been a Playstation guy for a while. While I never owned the original Playstation, I did get the Playstation 2 on the day it was released. The PS2 was the clear winner in the previous generation of consoles, handily beating the Nintendo 64 and Dreamcast. Microsoft was late to the game with the original Xbox, which didn't seem to do very well. The Playstation 3 has been a powerhouse since it was released. It clearly has better graphics then any other system out there, and the processing power of the system is incredible. Games on this thing look incredible, but despite this, I don't think Sony is doing very well.</p><p style="clear: both">The Xbox 360 is a pretty decent machine, despite the <a onclick="_gaq.push(['_trackPageview', '/extlink/support.xbox.com/support/en/us/nxe/kb.aspx?id=907534&amp;lcid=1033&amp;category=hardware']);"  href="http://support.xbox.com/support/en/us/nxe/kb.aspx?id=907534&lcid=1033&category=hardware" title="Xbox.com - Three lights flash red on your Xbox 360 console">red-ring</a> issue they initially had. It doesn't have the power or graphical prowess of the PS3, but it does have a pretty strong backing. I'm not a hardcore <a onclick="_gaq.push(['_trackPageview', '/extlink/www.microsoft.com']);"  href="http://www.microsoft.com" title="Microsoft">Microsoft</a> hater, but I'm not exactly a fan either. I've essentially moved on from <a onclick="_gaq.push(['_trackPageview', '/extlink/www.microsoft.com/windows']);"  href="http://www.microsoft.com/windows" title="Microsoft Windows">Windows</a> and I use either <a onclick="_gaq.push(['_trackPageview', '/extlink/www.linux.com']);"  href="http://www.linux.com" title="Linux">Linux</a> or <a onclick="_gaq.push(['_trackPageview', '/extlink/www.apple.com/macosx/']);"  href="http://www.apple.com/macosx/" title="Apple Mac OS X">OS X</a> now. Despite this, I've been drawn to the Xbox 360 for some time now. I had avoided purchasing one, but then, I had avoided purchasing a PS3 as well. Since getting both a PS3 and an Xbox 360, however, I've noticed that I'm drawn more towards the 360 and I've grown curious as to the reasoning behind this. I think I've finally identified it.</p><p style="clear: both">If you want your platform to do well, you need to build a community around it. Microsoft's Xbox team has done this, in spades. Marketing is one thing, and there is a massive marketing force behind the 360, but community can really make or break things. The PS3 has a little bit of a community, mostly centering around the PS blog. Nintendo's community is virtually nonexistent. But the 360 community is just huge and engaging. Major Nelson and his team do an incredible job promoting the 360 while keeping their content entertaining and diverse. The 360 itself encompasses a ton of community building with a stream of new content about new games, videos, and music.</p><p style="clear: both">I think Microsoft's Xbox team has clearly won this round of the console wars. The advent of the <a onclick="_gaq.push(['_trackPageview', '/extlink/www.xbox.com/kinect']);"  href="http://www.xbox.com/kinect" title="Xbox Kinect">Kinect</a> and the <a onclick="_gaq.push(['_trackPageview', '/extlink/us.playstation.com/ps3/playstation-move']);"  href="http://us.playstation.com/ps3/playstation-move" title="Playstation Move">Move</a>, round two is clearly on its way. The Kinect seems to be out to an early lead, however, with the Move being mostly ignored as a copy of the Wii motion controllers. Nintendo doesn't seem to have a play in this latest round, though one could argue they were first to market when they initially launched.</p><p style="clear: both">I enjoy playing all three consoles, but the Xbox clearly seems to be winning in my home. Microsoft is doing an incredible job thus far with the Xbox and I'm hoping they continue they way they're going. </p><br class='final-break' style='clear: both' /> 
            </div>
        </content>
        <dc:subject>games</dc:subject>
<dc:subject>Microsoft</dc:subject>
<dc:subject>nintendo</dc:subject>
<dc:subject>playstation 3</dc:subject>
<dc:subject>Sony</dc:subject>
<dc:subject>wii</dc:subject>
<dc:subject>xbox</dc:subject>

    </entry>

</feed>
