<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/">
  <channel rdf:about="http://times.usefulinc.com/tagsysadmin">
    <title>Edd Dumbill's Weblog: 'sysadmin' articles</title>
    <description>Articles tagged as 'sysadmin' from Edd Dumbill, technology writer and free software hacker.</description>
    <link>http://times.usefulinc.com/tagsysadmin</link>
    <dc:date>2008-06-20T16:18:33Z</dc:date>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://times.usefulinc.com/2008/06/20-secure-ldap"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2008/06/18-cert-maint"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2008/06/16-ops-now"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2007/12/03-smartcards-osx"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2007/05/31-nslu2"/>
        <rdf:li rdf:resource="http://times.usefulinc.com/2006/06/17-agile-infrastructure"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://times.usefulinc.com/2008/06/20-secure-ldap">
    <title>Secure LDAP replication</title>
    <link>http://times.usefulinc.com/2008/06/20-secure-ldap</link>
    <description>LDAP's hard. Security's hard. Replication's hard. Here's how it went for me.</description>
    <dc:subject>linux</dc:subject>
    <dc:subject>sysadmin</dc:subject>
    <dc:subject>security</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2008-06-20T15:11:25Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;Ever the sucker for punishment, I decided to pick three difficult things and stick them all together: LDAP, SSL and replication. Here's how to make it go on Debian and Ubuntu.&lt;/p&gt;
&lt;h3&gt;The problem&lt;/h3&gt;
&lt;p&gt;You want LDAP replication to happen over the internet, and you want it to happen securely.&lt;/p&gt;
&lt;h3&gt;The caveat&lt;/h3&gt;
&lt;p&gt;I'm not going to tell you how to set up your LDAP from scratch here: I'm assuming you've reached a solution you're happy with and want to replicate it.&lt;/p&gt;
&lt;h3&gt;The solution&lt;/h3&gt;
&lt;p&gt;We're going to set up a replicating slave LDAP server, which communicates with the master
over the internet via an SSL-protected connection.&lt;/p&gt;
&lt;h4&gt;Enabling replication&lt;/h4&gt;
&lt;p&gt;First up, the master LDAP server needs to be configured to permit replication.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The key lines to add to your &lt;span style="font-style: italic;"&gt;slapd.conf&lt;/span&gt; include:&lt;/p&gt;
&lt;pre&gt;moduleload syncprov
index entryCSN,entryUUID eq
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 200&lt;/pre&gt;
&lt;p&gt;These load up the synchronization module, add indices which make sync go faster, and enable sync. &lt;a href="http://www.openldap.org/doc/admin24/slapdconfig.html#syncrepl"&gt;For more detail see the OpenLDAP site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next you need to add a replicator user to your LDAP database, give your replicator user access to passwords as well as general read access. To create the replicator user, I made this simple LDIF file and fed it to &lt;span style="font-style: italic;"&gt;ldapadd&lt;/span&gt;.&lt;/p&gt;
&lt;pre&gt;dn: cn=replicator,dc=mydomain,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: replicator
description: LDAP replicator
userPassword: TOPSEKRIT&lt;/pre&gt;
&lt;p&gt;Once this user is in your LDAP database, you should give it read access to passwords (I assume you've already given read access to authenticated users.) I have this in my &lt;span style="font-style: italic;"&gt;slapd.conf&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;access to attrs=userPassword,sambaNTPassword,sambaLMPassword
...
   by dn="cn=replicator,dc=mydomain,dc=com" read&lt;/pre&gt;
&lt;p&gt;To check that this works, try using &lt;span style="font-style: italic;"&gt;ldapsearch&lt;/span&gt; to check that the passwords are returned:&lt;/p&gt;
&lt;pre&gt;ldapsearch -x -D cn=replicator,dc=mydomain,dc=com \
  -W | grep -i password&lt;/pre&gt;
&lt;p&gt;Enter the replicator password when prompted, and you should see the encrypted passwords from your LDAP database.&lt;/p&gt;
&lt;h4&gt;Securing access&lt;/h4&gt;
&lt;p&gt;Now you've got replication enabled on the master, you will want to ensure it is available on the internet only via TLS or SSL. Here's what I added to &lt;span style="font-style: italic;"&gt;slapd.conf&lt;/span&gt; to enable this:&lt;/p&gt;
&lt;pre&gt;TLSCertificateFile      /etc/ssl/certs/ldapserver_crt.pem
TLSCertificateKeyFile   /etc/ssl/private/ldapserver_key.pem
TLSCACertificateFile    /etc/ssl/certs/myCA.pem
TLSVerifyClient         demand&lt;/pre&gt;
&lt;p&gt;As you will guess from the configuration, the first two lines set the SSL key and certificate the master uses (see "A little twist" below for an important note on key permissions.) The third line tells &lt;span style="font-style: italic;"&gt;slapd&lt;/span&gt; where to find my site-local certificate authority (CA), and the fourth line says slapd must require any connecting client to have a valid SSL certificate signed by the site-local CA. This is important, as it provides a second layer of access control: a replicating client must connect using a certificate you signed, plus the replicator password.&lt;/p&gt;
&lt;p&gt;Before this enables TLS access, we must tell slapd which network interfaces to listen on. To do this, edit the &lt;span style="font-style: italic;"&gt;SLAPD_SERVICES&lt;/span&gt; variable in &lt;span style="font-style: italic;"&gt;/etc/default/slapd&lt;/span&gt;. Here's my configuration:&lt;/p&gt;
&lt;pre&gt;SLAPD_SERVICES="ldap://127.0.0.1/ ldap://192.168.0.1/ ldaps:///"&lt;/pre&gt;
&lt;p&gt;This enables regular LDAP on the loopback and intranet network interfaces, and LDAP/SSL on all interfaces, including the public internet.&lt;/p&gt;
&lt;p&gt;So, with &lt;span style="font-style: italic;"&gt;slapd&lt;/span&gt; restarted we are at this situation: connections are now possible from the internet, as long as they are made over SSL with a certificate signed by our site-local CA.&lt;/p&gt;
&lt;p&gt;(In fact, you can make much finer-grained access restrictions in your configuration than I have done. Using LDAPS rather than TLS over regular LDAP is a rather broad precaution.&amp;nbsp;&lt;a href="http://www.openldap.org/doc/admin24/access-control.html"&gt;As explained on the OpenLDAP site&lt;/a&gt;, the &lt;span style="font-style: italic;"&gt;ssf=&lt;/span&gt; parameter can be used to require a certain level of secure connectivity on a per-user or client basis.)&lt;/p&gt;
&lt;h4&gt;Setting up the replicating server&lt;br /&gt;&lt;/h4&gt;
&lt;p&gt;Your slave server should have the same configuration as the master, except you can leave out the bits enabling replication.&lt;/p&gt;
&lt;p&gt;Firstly, you'll need add to &lt;span style="font-style: italic;"&gt;slapd.conf&lt;/span&gt; the replication configuration:&lt;/p&gt;
&lt;pre&gt;syncrepl rid=123
        provider=ldaps://ldapmaster.mydomain.com/
        type=refreshAndPersist
        searchbase="dc=mydomain,dc=com"
        filter="(objectClass=*)"
        scope=sub
        attrs="*"
        schemachecking=off
        bindmethod=simple
        binddn="cn=replicator,dc=mydomain,dc=com"
        credentials=TOPSEKRIT&lt;/pre&gt;
&lt;p&gt;Most of this I took as boilerplate from the OpenLDAP documentation. Items to note include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;span style="font-style: italic;"&gt;rid&lt;/span&gt;&amp;nbsp;is a unique 3-digit integer per slave, used to maintain sync state&lt;/li&gt;
&lt;li&gt;the &lt;span style="font-style: italic;"&gt;credentials&lt;/span&gt;&amp;nbsp;should be the password you gave the replicator user&lt;/li&gt;
&lt;li&gt;the &lt;span style="font-style: italic;"&gt;type&lt;/span&gt;&amp;nbsp;can either be &lt;span style="font-style: italic;"&gt;refreshAndPersist&lt;/span&gt;, or &lt;span style="font-style: italic;"&gt;refresh&lt;/span&gt;. The latter institutes a simple polling replication, whose interval you can vary with the &lt;span style="font-style: italic;"&gt;interval&lt;/span&gt;&amp;nbsp;parameter. In our case, we do a poll and then keep the replication search open: our client gets notified immediately when there's any new data matching the replicating search.&lt;/li&gt;
&lt;li&gt;the &lt;span style="font-style: italic;"&gt;searchbase&lt;/span&gt;&amp;nbsp;is an LDAP search matching the data we wish to be replicated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And here's the &lt;span style="font-style: italic;"&gt;/etc/default/slapd&lt;/span&gt; configuration:&lt;/p&gt;
&lt;pre&gt;SLAPD_SERVICES="ldap://127.0.0.1/"&lt;/pre&gt;
&lt;p&gt;The slave &lt;span style="font-style: italic;"&gt;slapd&lt;/span&gt;&amp;nbsp;exists only in this case to serve the local machine.&lt;/p&gt;
&lt;p&gt;Finally, there's the tricky bit! You need to configure &lt;span style="font-style: italic;"&gt;slapd&lt;/span&gt; to connect to the master server using a certificate. I'll assume you've created and signed a key and certificate pair for your slave server (see my post &lt;a href="http://times.usefulinc.com/2008/06/18-cert-maint"&gt;Low-tech SSL certificate maintenance&lt;/a&gt; for more on this.)&lt;/p&gt;
&lt;p&gt;Awkwardly, the TLS configuration in &lt;span style="font-style: italic;"&gt;slapd.conf&lt;/span&gt;&amp;nbsp;is for the server only. Replication works as a client, and thus needs separate configuration. Furthermore, you cannot configure this globally on your machine, as the SSL certificate is a per-user only parameter (see &lt;span style="font-style: italic;"&gt;man ldap.conf&lt;/span&gt;&amp;nbsp;for more information on this.)&lt;/p&gt;
&lt;p&gt;Instead, we must set it in &lt;span style="font-style: italic;"&gt;slapd&lt;/span&gt;'s environment. Add these two lines to the end of &lt;span style="font-style: italic;"&gt;/etc/default/slapd&lt;/span&gt;:&lt;/p&gt;
&lt;pre&gt;export LDAPTLS_CERT=/etc/ssl/certs/slapd.crt
export LDAPTLS_KEY=/etc/ssl/private/slapd.key&lt;/pre&gt;
&lt;p&gt;This file is sourced as a shell script by slapd's init script. Amend the path to your certificate and keys as required. Use &lt;span style="font-style: italic;"&gt;/etc/init.d/slapd restart&lt;/span&gt; and you should be good to go.&lt;/p&gt;
&lt;p&gt;Finally, we want the slave server to be certain it's talking to the real master. So we also configure client connections to verify the SSL certificate of the peer, in &lt;span style="font-style: italic;"&gt;ldap.conf&lt;/span&gt;&amp;nbsp;again:&lt;/p&gt;
&lt;pre&gt;TLS_CACERT      /etc/ssl/certs/myCA.crt
TLS_REQCERT     demand&lt;/pre&gt;
&lt;h4&gt;A little twist&lt;/h4&gt;
&lt;p&gt;One gotcha to notice with both client and server is that &lt;span style="font-style: italic;"&gt;slapd&lt;/span&gt;&amp;nbsp;runs as the &lt;span style="font-style: italic;"&gt;openldap&lt;/span&gt;&amp;nbsp;user by default on Debian. Also by default SSL keys are readable only by the &lt;span style="font-style: italic;"&gt;ssl-cert&lt;/span&gt;&amp;nbsp;group. You'll need add the &lt;span style="font-style: italic;"&gt;openldap&lt;/span&gt;&amp;nbsp;user to this group, otherwise it won't be able to access &lt;span style="font-style: italic;"&gt;/etc/ssl/private&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Related articles on this site:&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://times.usefulinc.com/2005/09/25-ldap"&gt;Turn your world LDAP-tastic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2008/06/20-secure-ldap#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2008/06/18-cert-maint">
    <title>Low-tech SSL certificate maintenance</title>
    <link>http://times.usefulinc.com/2008/06/18-cert-maint</link>
    <description>I maintain a bunch of mostly self-signed SSL certificates. Too many not to automate. Here's how I do it.</description>
    <dc:subject>linux</dc:subject>
    <dc:subject>sysadmin</dc:subject>
    <dc:subject>security</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2008-06-18T10:50:40Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;I maintain a bunch of SSL certificates, mostly signed by my own site authority. Too many not to automate, but not enough to warrant heavy machinery. Here's how I do it.&lt;/p&gt;
&lt;h3&gt;The configuration files&lt;/h3&gt;
&lt;p&gt;Each certificate needs a config to describe what's in it. I create each of these and name it with a &lt;span style="font-style: italic;"&gt;.cnf&lt;/span&gt; suffix. Here's an example:&lt;/p&gt;
&lt;pre&gt;[ req ]
prompt                  = no
distinguished_name      = server_distinguished_name

[ server_distinguished_name ]
commonName              = server.usefulinc.com
stateOrProvinceName     = England
countryName             = GB
emailAddress            = edd@usefulinc.com
organizationName        = Useful Information Company
organizationalUnitName  = Hosting

[ req_extensions ]
subjectAltName=edd@usefulinc.com
issuerAltName=issuer:copy
nsCertType            = server

[ x509_extensions ]
subjectAltName=edd@usefulinc.com
issuerAltName=issuer:copy
nsCertType            = server&lt;/pre&gt;
&lt;p&gt;Let's say this config is &lt;span style="font-style: italic;"&gt;server.cnf&lt;/span&gt;. I then just type &lt;span style="font-style: italic;"&gt;make server.pem&lt;/span&gt; to generate the corresponding certificate and key, signed by my local certificate authority. As I don't want to attend the startup of every service, I ensure the key is password-less.&lt;/p&gt;
&lt;h3&gt;The Makefile rules&lt;/h3&gt;
&lt;p&gt;Here are the makefile steps I use to generate and sign keys.&lt;/p&gt;
&lt;pre&gt;.SUFFIXES: .pem .cnf

.cnf.pem:
        OPENSSL_CONF=$&amp;lt; openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
        openssl rsa &amp;lt;tempkey.pem &amp;gt; `basename $&amp;lt; .cnf`_key.pem
        chmod 400 `basename $&amp;lt; .cnf`_key.pem
        OPENSSL_CONF=./usefulCA/openssl.cnf openssl ca -in tempreq.pem -out `basename $&amp;lt; .cnf`_crt.pem
        rm -f tempkey.pem tempreq.pem
        cat `basename $&amp;lt; .cnf`_key.pem `basename $&amp;lt; .cnf`_crt.pem &amp;gt; $@
        chmod 400 $@
        ln -sf $@ `openssl x509 -noout -hash &amp;lt; $@`.0&lt;/pre&gt;
&lt;p&gt;The resultant files are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;server.pem &lt;/span&gt;&amp;mdash; contains both certificate and key in one file&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;server_crt.pem&lt;/span&gt; &amp;mdash; certificate file&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;server_key.pem&lt;/span&gt; &amp;mdash; key file&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some notes on these steps: my site-local certificate authority is in the directory &lt;span style="font-style: italic;"&gt;usefulCA&lt;/span&gt;, along with an OpenSSL config which describes my preferences. This config was created by copying and making appropriate adjustments to the default &lt;span style="font-style: italic;"&gt;/etc/ssl/openssl.cnf&lt;/span&gt;&amp;nbsp;which ships with Debian.&lt;/p&gt;
&lt;p&gt;For generating certificate signing requests to ship to a commercial certificate authority, it's a bit simpler. I save the config files with a &lt;span style="font-style: italic;"&gt;.reqcnf&lt;/span&gt; suffix instead, and use this rule:&lt;/p&gt;
&lt;pre&gt;.SUFFIXES: .pem .cnf .reqcnf .csr

.reqcnf.csr:
        OPENSSL_CONF=$&amp;lt; openssl req -newkey rsa:1024 -keyout `basename $&amp;lt; .reqcnf`.key -keyform PEM -out `basename $&amp;lt; .reqcnf`.csr -outform PEM&lt;/pre&gt;
&lt;p&gt;And finally, a rule I use to sign incoming certificate requests from other systems:&lt;/p&gt;
&lt;pre&gt;.csr.pem:
        OPENSSL_CONF=./usefulCA/openssl.cnf openssl ca -in $&amp;lt; -out `basename $&amp;lt; .csr`_crt.pem&lt;/pre&gt;
&lt;p&gt;I offer these without warranty in the hope they might be useful to somebody. They're not much more than a transcription of a how-to into a makefile, but it's just enough technology to ensure creating certificates isn't a big nuisance.&lt;/p&gt;
&lt;h4&gt;Further reading&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;A more complete &lt;a href="http://sial.org/howto/openssl/ca/"&gt;guide to setting up a site-local certificate authority&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;p&gt;Why do I bother with a site-local CA, rather than just self-sign? It lets me bypass the annoyance of SSL warnings on clients once I've installed my own CA certificate, and gives me a coarse grained level of access control: for instance, only clients with certificates signed by my CA are allowed to access the site's LDAP server.&lt;/p&gt;
&lt;p&gt;My personal next step with this is to integrate the certificate production process with my emerging Puppet recipes for managing local infrastructure.&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2008/06/18-cert-maint#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2008/06/16-ops-now">
    <title>We're all ops people now</title>
    <link>http://times.usefulinc.com/2008/06/16-ops-now</link>
    <description>Five years ago, would you have been managing terabits and arrays of distributed services?</description>
    <dc:subject>programming</dc:subject>
    <dc:subject>linux</dc:subject>
    <dc:subject>agile</dc:subject>
    <dc:subject>sysadmin</dc:subject>
    <dc:subject>xen</dc:subject>
    <dc:subject>hosting</dc:subject>
    <dc:subject>infrastructure</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2008-06-16T10:55:22Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;Ten years ago, most of us wouldn't have dreamt we'd be managing terabits of storage, tens of megabits of bandwidth, arrays of network-distributed services. The height of a programmer's worry would likely be choice of UI toolkit or finding the right way to indent code, and the height of consumer concern deciding which room to put the new computer in.&lt;/p&gt;
&lt;p&gt;Now the problems associated with managing large networks are becoming real for everyone, right down to the consumer level. Stupendously large amounts of computing resource are available at an instant.&lt;/p&gt;
&lt;p&gt;Your household probably has more than a terabyte of storage already. Issues such as single sign-on are going to hit home over the next year, as networked computing and entertainment devices profilerate. Features such as Apple's &lt;a href="http://www.apple.com/macosx/features/timemachine.html"&gt;Time Machine&lt;/a&gt; will be increasingly vital &amp;mdash; software that makes traditionally gnarly sysadmin tasks consumer-friendly. The rebranding of .Mac into "&lt;a href="http://www.apple.com/mobileme/"&gt;Mobile Me&lt;/a&gt;" is also a step in this direction.&lt;/p&gt;
&lt;h3&gt;The impact on developers&lt;/h3&gt;
&lt;p&gt;As software developers, we also have to cope with the effects of this resource-richness. For small sums of money we can get access to &lt;a href="http://aws.amazon.com/ec2"&gt;large computing clusters&lt;/a&gt;, geographically redundant hosting services. Our programs have left the desktop and found their new home on the web. System administration issues loom large upon us, security concerns lurk auspiciously in the corners of our minds.&lt;/p&gt;
&lt;p&gt;Although the cost of infrastructure has dropped radically, other costs remain high and are going to stay that way. System administrators are not only grumpy, they demand high wages. Commercial software license fees spiral out of control: traditional per-CPU licensing models make little sense when you can quickly bring up tens of machines. The cost in power is already troubling large companies, and there's no reason to suspect the problems won't ripple down.&lt;/p&gt;
&lt;p&gt;Help is at hand from a variety of technologies. If they don't yet make massive resource management trivial, they at least make it possible. Some of these also inhabit the weird territory of being both the source of a problem and a solution at the same time: virtualization, for example.&lt;/p&gt;
&lt;h4&gt;Distributed revision control systems&lt;/h4&gt;
&lt;p&gt;Distributed revision control is a technology whose time has finally&amp;nbsp;come in popular circles, thanks in part to Linus Torvald's &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt; system. DRCS has several important impacts on today's developer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;Branching and, importantly, merging become much cheaper&lt;/span&gt;, allowing agile and flexible iterations of development.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;Loosely connected and geographically diverse development becomes much easier&lt;/span&gt;. Even within a single organization it is not uncommon to find teams spanning countries, time zones. Complex multi-site VPN setups aren't necessary when a few SSH keys can do the job.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;Revision control becomes packaging on the cheap&lt;/span&gt;. Like it or not, the mere tagging of a source tree has now become a valid option for releasing software.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All these trends lower the barrier to entry, increase collaboration and agility of development. You can the value of this as more software tools become free. Selling such tools is rapidly becoming a thing of the past, the advantages of sharing enable the developers at the sharp end to get their jobs done quicker.&lt;/p&gt;
&lt;p&gt;However, such increased agility and, well, messiness leave other problems to solve, which the next two technologies address.&lt;/p&gt;
&lt;h4&gt;Virtualization&lt;/h4&gt;
&lt;p&gt;Hardware-as-a-service, infrastructure-as-a-service, &lt;a href="http://www.roughtype.com/archives/2008/01/a_little_too_mu.php"&gt;call it what you will&lt;/a&gt;. The ability to create what we used to call entire machines, pick them up and move them around the network is revolutionary, and it's something that will have a real impact on regular developers. The benefits are at several levels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;Agile infrastructure&lt;/span&gt; &amp;mdash; a ready supply of new machines makes it a lot easier and cheaper to test different scenarios, architectures, and to separate concerns. If things go wrong, throw away the image and start over. It's all about cutting the administration load.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;A packaging solution&lt;/span&gt; &amp;mdash; the new macroeconomics of software distribution mean that distributing entire machine images which communicate exclusively via the network is now a feasible way to distribute your software. We must adjust to the notion of distributing appliances, not code. We may mourn the lost crafts of creating RPMs or installers, but let's face it, it's now a waste of time.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-style: italic;"&gt;New business models&lt;/span&gt; &amp;mdash; your application can now be delivered as a black-box appliance, circumventing compatibility issues, or as a service, with virtualization part of the solution to scaling.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Configuration management&lt;/h4&gt;
&lt;p&gt;Computing is a zero-sum game, and despite our increased ability to create and distribute software, problems still exist. We just pushed them to the next level.&lt;/p&gt;
&lt;p&gt;In good part, this next level is the problem of configuration management. We now have networks and clusters of (virtual) machines, software so agile we need six decimal places to describe its revision levels, and network and authentication paths that are starting to tangle. How do we manage that?&lt;/p&gt;
&lt;p&gt;One thing developers crave is repeatability. That's why we love our makefiles, autoconf, Ant, rake and so on. It's the one time even the most imperative-minded programmer writes declarative code. We like to say "let the world be like this."&lt;/p&gt;
&lt;p&gt;Our new sprawling world lacks this feature, and the best of our old toolkits &amp;mdash; .debs, RPMs &amp;mdash; address things only at the level of packages in a single environment.&lt;/p&gt;
&lt;p&gt;So developers must look to the world of operations, a territory we probably thought we needn't enter. In this world the new "make" is called&amp;nbsp;&lt;a href="http://reductivelabs.com/trac/puppet"&gt;Puppet&lt;/a&gt;. You write recipes to describe how things ought to be, and Puppet will make it so.&lt;/p&gt;
&lt;p&gt;I've been spending some time digging into Puppet, and feel excited by the confidence it's giving me. Now my applications exceed single source trees, and single machines, it gives me the means to tie the whole together. This article was going to be solely about Puppet, but that will have to wait now for another time.&lt;/p&gt;
&lt;p&gt;It's likely you'll have played with virtual machines and distributed revision control, but have you tried Puppet yet? Give it a spin, and let your mind wander over the benefits for your organization and development approaches.&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;For developers and users alike, our world is changing. Hardware, connectivity and increasingly software is becoming cheap or free. The solidity of the old things we put value on &amp;mdash; real things you can touch like disks &amp;mdash; is eroding.&lt;/p&gt;
&lt;p&gt;What really matters is our data, our creations, and their communication. If they don't quite yet exist in a universal "cloud" yet, they're certainly getting frisky.&lt;/p&gt;
&lt;p&gt;As vendors provide solutions for consumers to manage their new domestic infrastructure, developers must look to network-aware toolkits and operations techniques to manage and get the best from their emergent infrastructures.&lt;/p&gt;
&lt;p&gt;Also on this topic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://times.usefulinc.com/2006/06/17-agile-infrastructure"&gt;In search of agile infrastructure for web applications&lt;/a&gt;&amp;nbsp;(June 2006)&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2008/06/16-ops-now#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2007/12/03-smartcards-osx">
    <title>Smartcard authentication on Linux and Mac</title>
    <link>http://times.usefulinc.com/2007/12/03-smartcards-osx</link>
    <description>A brief wander around two-factor authentication with smartcard tokens</description>
    <dc:subject>linux</dc:subject>
    <dc:subject>sysadmin</dc:subject>
    <dc:subject>security</dc:subject>
    <dc:subject>mac</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2007-12-03T11:22:48Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;For various reasons, I need to secure access to some resources using two-factor authentication, and thus have been looking at smartcards. These little devices store digital keys and certificates, protected by a passphrase, and calculate digital signatures on-device. Hence the two factors: possession of the card, and knowledge of the password.&lt;/p&gt;&lt;p&gt;This sort of scheme is widely used by government agencies and large corporations (and largely reliant on Windows, too), but I wanted to find the low cost way in for the small operator using open source.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;OpenSC on Linux&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;The best starting point for Linux is the &lt;a href="http://www.opensc-project.org/"&gt;OpenSC project&lt;/a&gt;. It supports a reasonably broad array of devices, and is well supported by Linux distributions. Using command line tools you can create keys and certificates, as you would in OpenSSL for web servers and so on, and then upload them to the smartcard.&lt;/p&gt;&lt;p&gt;Although OpenSSH source code has support for OpenSC, it is not compiled in by default in Debian and derived distributions. Unfortunately this means a bit of recompilation to get &lt;a href="http://www.opensc-project.org/opensc/wiki/SecureShell"&gt;SSH supporting OpenSC&lt;/a&gt;. When that's done, you have an SSH implementation that can use an RSA key from your smartcard, and best of all, you can add this key to the &lt;em&gt;ssh-agent&lt;/em&gt; like you would with regular keys.&amp;nbsp;&lt;/p&gt;&lt;h3&gt;The hardware&lt;/h3&gt;&lt;p&gt;I ordered two devices, which seemed to have the best support from OpenSC, the &lt;a href="http://www.cryptoflex.com/Products/cards_32k.html"&gt;Axalto Cryptoflex E-Gate&lt;/a&gt;, and an &lt;a href="http://www.aladdin.com/etoken/"&gt;Aladdin eToken&lt;/a&gt;. I got these from &lt;a href="http://www.usasmartcard.com/"&gt;UsaSmartCard&lt;/a&gt;, who have a special section in their catalogue for Open Source compatible products. Both these cards have a USB interface built-in, I didn't want to be toting around an extra card reader in addition to the tokens themselves.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;On the Mac&lt;/h3&gt;&lt;p&gt;While both the devices worked as advertised under Linux, the experience has been a lot less fruitful under Mac OS 10.5 Leopard. There is a port of the OpenSC project for Mac OS, called &lt;a href="http://www.opensc-project.org/sca/"&gt;SCA&lt;/a&gt;. The promise of the integration is great: you can use the on-device keys with apps like Safari and Mail, but there is a change in the way that the daemon responsible for talking to the smartcards (&lt;em&gt;pcscd&lt;/em&gt;) works on Leopard, which means OpenSC won't recognise the cards.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;With some fiddling, I have managed to force the Cryptoflex device to work with Mac. Unfortunately the &lt;a href="http://www.opensource.apple.com/darwinsource/Current/OpenSSH-87/"&gt;Leopard/Darwin source for OpenSSH&lt;/a&gt; has diverged significantly enough from the upstream OpenSSH, that I couldn't apply the OpenSC patches. Not having &lt;em&gt;ssh-agent&lt;/em&gt; work with the smartcard is a significant nuisance for me, as it's the easiest way to patch in the extra security to deployment processes.&lt;/p&gt;&lt;p&gt;The Aladdin eToken just plain didn't work on Leopard. There is &lt;a href="http://thedartmouth.com/2007/11/29/news/leopard/"&gt;a report&lt;/a&gt; that Aladdin are working on Leopard drivers, however.&lt;/p&gt;&lt;p&gt;I think a small number of mainly US federal smart cards will work out of the box on Leopard, though I've seen a few complaints about these on the Apple forums. It loooks unfortunately like smartcard support slipped through the net a bit.&amp;nbsp;&lt;/p&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;Smartcard support is relatively straightforward on Linux. On Mac OS 10.5, it looks like some waiting is in order before things will work properly.&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2007/12/03-smartcards-osx#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2007/05/31-nslu2">
    <title>Small bundle of sluggy joy</title>
    <link>http://times.usefulinc.com/2007/05/31-nslu2</link>
    <description>I'm a bit late to the party, but the NSLU2 is a piece of kit you can't afford to be without.</description>
    <dc:subject>linux</dc:subject>
    <dc:subject>sysadmin</dc:subject>
    <dc:subject>hardware</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2007-05-31T11:08:54Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>     &lt;p&gt;I'm a bit late to this party, but the &lt;a href="http://www.linksys.com/servlet/Satellite?c=L_Product_C2&amp;amp;childpagename=US%2FLayout&amp;amp;cid=1115416906769&amp;amp;pagename=Linksys%2FCommon%2FVisitorWrapper"&gt;NSLU2&lt;/a&gt;&amp;mdash;affectionately known as the 'slug'&amp;mdash;is a piece of kit you can't afford to be without on your home or small office network.&lt;/p&gt;         &lt;p style="text-align: center; float: right; margin-left: 15px"&gt;&lt;img width="170" height="265" src="http://times.usefulinc.com/asset/name/36/nslu2.jpg" alt="NSLU2 image" /&gt;&lt;/p&gt;        &lt;p&gt;Not much bigger than the palm of my hand, and cheaper than a ticket for a Test at &lt;a href="http://lords.org/"&gt;Lord's&lt;/a&gt;, the NSLU2 is a small fileserver that serves files from attached USB disks.&lt;/p&gt;        &lt;p&gt;What makes it particularly special is the large amount of &lt;a href="http://www.nslu2-linux.org/"&gt;alternative firmwares&lt;/a&gt; built by Linux open source developers, which allow you to extend the functionality of the NSLU2 beyond merely serving out files via SMB (the Windows file serving protocol.)&lt;/p&gt;   &lt;h3&gt;Cheap NFS serving&amp;nbsp;&lt;/h3&gt;   &lt;p&gt;So what's the big deal for me? Well, like most laptop-slinging folks whose home network is predominantly wireless, I want my backup disks to sit on the network, available when needed.&lt;/p&gt;     &lt;p&gt;It turns out it's very difficult to find a standalone network disk that properly supports Unix file system semantics such as symbolic links. Most just support SMB file sharing, with attendant limits such as no links and no files over 2GB. (I found this out the hard way with Apple's Airport Extreme.)&lt;/p&gt;     &lt;p&gt;With the NSLU2 I was able to install the &amp;quot;Unslung&amp;quot; alternative firmware, and install good old NFS, making my backup disks available in a normal way to Linux and OS X machines alike. (How we used to complain about NFS back in the early 90s, but Windows file sharing still makes it look good!)&lt;/p&gt;     &lt;p&gt;In the great tradition of open source there are multiple choices of Linux distributions you can install. As it was my first time round, I went for Unslung, which preserves as much as possible of the official Linksys interface, but lets you extend it. Next time, with a better idea of what I'd use the box for, I'd probably plump for Debian.&amp;nbsp;&lt;/p&gt;   &lt;h3&gt;Constraints breed creativity&lt;/h3&gt;   &lt;p&gt;Inside the case, the NSLU2 is in fact a tiny Linux machine with 32MB of RAM and an Intel XScale CPU. This turns out to be plenty enough resources to serve files on a small network. Aside from my prosaic needs, the NSLU2 has been put to &lt;a href="http://www.nslu2-linux.org/wiki/Applications/HomePage"&gt;several more innovative uses&lt;/a&gt;, such as a &lt;a href="http://www.nslu2-linux.org/wiki/Applications/ITunesServer"&gt;music server&lt;/a&gt; for Apple ITunes and a 4-line home &lt;a href="http://www.nslu2-linux.org/wiki/Optware/Asterisk?from=Unslung.Asterisk"&gt;telephone exchange&lt;/a&gt;.&lt;/p&gt;     &lt;p&gt;I've been astounded at the applications people have devised for this little box. Being fairly cheap makes it a great candidate for home automation projects. It's a great example of how limiting resources fosters innovation. Remember how games on 8-bit microcomputers were so much more ingenious than those on their more well-resourced successors?&lt;br /&gt;   &lt;/p&gt;     &lt;p&gt;So, I may be a little slow in finding this little hardware gem, but I wholeheartedly recommend it.&lt;/p&gt;   &lt;p&gt;&lt;a href="http://times.usefulinc.com/2007/05/31-nslu2#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
  <item rdf:about="http://times.usefulinc.com/2006/06/17-agile-infrastructure">
    <title>In search of agile infrastructure for web applications</title>
    <link>http://times.usefulinc.com/2006/06/17-agile-infrastructure</link>
    <description>Many advances have been made in agile programming frameworks, enabling a reduction in the amount of code that needs to be written. But what about agile system infrastructure for web applications?</description>
    <dc:subject>programming</dc:subject>
    <dc:subject>linux</dc:subject>
    <dc:subject>agile</dc:subject>
    <dc:subject>sysadmin</dc:subject>
    <dc:creator>Edd Dumbill</dc:creator>
    <dc:date>2006-06-17T21:11:33Z</dc:date>
    <foaf:maker>
      <foaf:Person>
        <foaf:mbox rdf:resource="mailto:edd@usefulinc.com"/>
      </foaf:Person>
    </foaf:maker>
    <content:encoded>&lt;p&gt;Many advances have been made in &lt;a href="http://agilemanifesto.org/"&gt;agile software development&lt;/a&gt;. Frameworks such as Ruby on Rails embody agile principles by making software easy to write, easy to test, and above all, easy to change.&lt;/p&gt;&lt;p&gt;If only we could say the same for the infrastructure on which we develop and deploy web applications. Not every application can be a Rails one, especially where it's been up and running for years. The systems we deploy on often rely on configuration files scattered all over the filesystem, and can be complex results of years of change.&lt;/p&gt;&lt;p&gt;By extension, the systems we develop on often don't exactly mirror where we deploy. If we're lucky and careful, then we have a staging server which mirrors the live environment, but that's not too much of an advantage. Among other things, we need ways to evolve and refactor the live environment, and have our development environments easily track that.&lt;/p&gt;&lt;p&gt;I'd like to call such an environment &amp;quot;agile infrastructure&amp;quot;. Infrastructure that doesn't hamper developers, and allows live configurations to change and evolve. Infrastructure that allows new things to be tried with minimum cost, and can provide the best information possible to help future planning.&lt;/p&gt;&lt;p&gt;Tools enable techniques, of course. It's a lot easier to be agile if you're programming in Rails rather than plain old PHP. So what are the tools enabling agile infrastructure?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Techniques I've found useful&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;While there's a long way to go, I'd like to describe some of the techniques I've been using to help create a flexible environment for developing a sizeable PHP/MySQL application.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Operating system&lt;/em&gt;&lt;/p&gt;&lt;p&gt;An operating system must be easy to bring into a known state with minimum interference. For this, I've found Ubuntu or Debian to be an ideal choice. Two of the main reasons include the constancy of stable releases and the fact that it's rare you need to stray outside the distribution's servers to get the software you need.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Deployment&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Deploying an application shouldn't break the cleanliness of your OS build. I prefer to package deployed applications into &lt;em&gt;.deb&lt;/em&gt; files. This enables me to build on several advantages of the package management system:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;configuration file handling: deployed machines can keep individual config in /etc, which is preserved over software update.&lt;/li&gt;&lt;li&gt;no random state: you know for sure exactly the state of the deployed application, no random files left hanging around.&lt;/li&gt;&lt;li&gt;natural workflow: packages take a little bit of effort to build and deploy, which means it focuses developers on getting them right. If things do go wrong, it's very easy to roll back one version.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Source control&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The case for source control, thankfully, doesn't need making these days. Yet not every source control system is created equal. Developers shouldn't be constrained by source control, it should be cheap and easy to try new ideas and merge these in later.&lt;/p&gt;&lt;p&gt;Not only cheap branching, but also easy merging, is required to keep development agile while still retaining the benefits of source control. Many people flock to Subversion these days, predominantly because it fixes some of CVS' more egregious misfeatures. However, merging can still be pretty difficult in Subversion.&lt;/p&gt;&lt;p&gt;I prefer to use a system allowing easy merging, such as &lt;em&gt;svk&lt;/em&gt; or &lt;em&gt;bazaar&lt;/em&gt;. Because so many of us use laptops these days, disconnected operation is also a huge boon. &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar-NG&lt;/a&gt; offers both repository-oriented and completely decentralized operation, giving the best of both worlds. It also wins the competition for least setup overhead.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Virtualization&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Previously a high-powered technology, cheap virtualization is now with us. Many identical virtual machines can be quickly created to enable testing and experimentation. Deployment to virtual machines can enable hardware independence for applications, reducing another big headache.&lt;/p&gt;&lt;p&gt;Large organisations have it within their reach to bring new hardware online easily, and have invested much in management systems for it. Virtualization brings this in reach of small and one-man development teams.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Desktop-based virtualization&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Systems such as VMWare and Parallels untether developers from their desks. I use the OS X desktop daily for its productivity software, but an Ubuntu virtual machine for a large proportion of development work. A simple keypress lets me flick between the two. The advantages of multiple desktops to hand for web development are well known. (In fact, thanks to WINE and &lt;a href="http://www.tatanka.com.br/ies4linux/index-en.html"&gt;IES4Linux&lt;/a&gt; I can run Internet Explorer cheaply too from the same virtual machine).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Xen virtualization&lt;/em&gt;&lt;/p&gt;&lt;p&gt;After the initial novelty wears off, one of the most tedious tasks in the world is bringing new machines online. Combined with the tendency development environments have to get crufty as new ideas and tools are tried out, this makes for increasing disparity between the development and deployment environments.&lt;/p&gt;&lt;p&gt;Wouldn't it be nice just to take a clean machine off the shelf, check out the source, and pick up again? Using &lt;a href="http://xensource.com/products/xen/index.html"&gt;Xen&lt;/a&gt; for Linux, this cheap virtualization is possible.&lt;/p&gt;&lt;p&gt;Sadly, Xen isn't yet a packaged part of Ubuntu, but getting it up and running on Ubuntu Dapper isn't too hard. Warning: here's where things get pretty deep. Skip this bit if you're not interested in the nitty-gritty.&lt;/p&gt;&lt;p&gt;I followed these steps:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Followed &lt;a href="https://wiki.ubuntu.com/XenVirtualMachine/XenOnUbuntuDapper"&gt;instructions in the Ubuntu wiki&lt;/a&gt; to get the first domain (vm) up and running&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Installed the &lt;em&gt;xen-tools&lt;/em&gt; package, which provides wrappers for easily creating virtual machines&lt;/li&gt;&lt;li&gt;Adjusted some of the &lt;em&gt;xen-tools&lt;/em&gt; configuration (&lt;em&gt;/etc/xen-tools/hook.d/20-setup-apt&lt;/em&gt;) to set up for Ubuntu rather than Debian&lt;/li&gt;&lt;li&gt;Once the virtual machine was made, adjusted its config to allow for the kernel initrd and configure the network bridge I was using&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Getting over the DNS mountain&lt;/em&gt;&lt;/p&gt;&lt;p&gt;If you want it to be easy to bring new virtual machines up and down, you need to adopt a different approach to managing your DNS. You need to know how to predictably connect to a virtual machine. Yet it's going to get very boring and error prone to manage the IP address space manually in your DNS, or even to map the MAC addresses of your virtual machines in your DHCP configuration.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Help is at hand in the form of mDNS (also known as Rendezvous / Bonjour / ZeroConf). In the host machine, and in each virtual machine, I ensured the &lt;em&gt;avahi-daemon&lt;/em&gt; and &lt;em&gt;avahi-utils&lt;/em&gt; packages were installed, providing mDNS services. (You should also check that &lt;em&gt;mdns&lt;/em&gt; is present in the hosts entry of &lt;em&gt;/etc/nsswitch.conf&lt;/em&gt;).&lt;/p&gt;&lt;p&gt;What all this does is allow the machines (virtual or otherwise) on the network to resolve names using mDNS. So if I create 3 VMs, &lt;em&gt;alpha&lt;/em&gt;, &lt;em&gt;beta&lt;/em&gt; and &lt;em&gt;gamma&lt;/em&gt;, I can access these right away using the hostnames &lt;em&gt;alpha.local&lt;/em&gt;, &lt;em&gt;beta.local&lt;/em&gt; and &lt;em&gt;gamma.local&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Hey presto! Easily make machines appear and disappear without any need for sysadmin involvement. All the extra steps to add &lt;em&gt;avahi&lt;/em&gt; installation can be easily scripted with &lt;em&gt;xen-tools&lt;/em&gt;, to reduce the number of commands needed to birth a new machine to one.&lt;/p&gt;&lt;p&gt;With this ease of creating new machines, it's much more straightforward to experiment with server topology and conduct experiments on server environments.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Agile development is necessarily constrained by the infrastructure on which it is conducted. The infrastructure itself is constrained by the tools and platforms of choice.&lt;/p&gt;&lt;p&gt;By appropriate tool choice we can reduce the commitment and overhead of infrastructure. This enables developers to get on with the job they do best, and makes experimentation and evolution of infrastructure much simpler.&lt;/p&gt;&lt;p&gt;When programming, it's dangerous to fall in love with your code, as the best solution may often involve throwing half of it away. The same hazard exists with infrastructure, with bizarre and awkward effects propagating back into code and operations. Get yourself a low commitment, agile environment, and you'll be able to keep up with the pace.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://times.usefulinc.com/2006/06/17-agile-infrastructure#disqus_thread"&gt;Join the conversation about this post&lt;/a&gt;&lt;/p&gt;</content:encoded>
  </item>
</rdf:RDF>
