<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-957512843806722900</id><updated>2011-04-21T21:54:28.615Z</updated><category term='cosign openid apache'/><category term='thunderbird'/><category term='gaim'/><category term='kerberos'/><title type='text'>Simon's Computing Blog</title><subtitle type='html'>Discussion of issues in deploying and managing Kerberos (and related technologies) at a medium sized academic site.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-6243913134383265495</id><published>2008-04-04T14:23:00.001Z</published><updated>2008-04-04T14:26:03.001Z</updated><title type='text'>GSSAPI Key Exchange for OpenSSH 5.0</title><content type='html'>It's that time again! There's been another OpenSSH release, and once again, I'm pleased to announce the availability of my GSSAPI Key Exchange patch for it.&lt;br /&gt;&lt;br /&gt;Whilst OpenSSH contains support for GSSAPI user authentication, this still relies upon SSH host keys to authenticate the server to the user. For sites with a deployed Kerberos infrastructure this adds an additional, unnecessary, key management burden. GSSAPI key exchange allows the use of security mechanisms such as Kerberos to authenticate the server to the user, removing the need for trusted ssh host keys, and allowing the use of a single security architecture.&lt;br /&gt;&lt;br /&gt;This patch adds support for the RFC4462 GSSAPI key exchange mechanisms to OpenSSH, along with adding some additional, generic, GSSAPI features. It implements&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;gss-group1-sha1-*, gss-group14-sha1-* and gss-gex-sha1-* key  exchange mechanisms. (#1242)&lt;br /&gt;&lt;li&gt;Support for the null host key type (#1242)&lt;br /&gt;&lt;li&gt;Support for CCAPI credentials caches on Mac OS X (#1245)&lt;br /&gt;&lt;li&gt;Support for better error handling when an authentication exchange fails due to server misconfiguration (#1244)&lt;br /&gt;&lt;li&gt;Support for GSSAPI connections to hosts behind a round-robin  load balancer (#1008)&lt;br /&gt;&lt;li&gt;Support for GSSAPI connections to multi-homed hosts, where each  interface has a unique name (#928)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;(bugzilla.mindrot.org bug numbers are in brackets)&lt;br /&gt;&lt;br /&gt;This release fixes a problem where the GSSAPIStrictAcceptorCheck option was always enabled.&lt;br /&gt;&lt;br /&gt;As usual, the code is available from &lt;a href="http://www.sxw.org.uk/computing/patches/openssh.html"&gt;http://www.sxw.org.uk/computing/patches/openssh.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;In addition, with this release I'm pleased to be able to announce an additional patch which implements cascading credential support. This allows credentials provided via key exchange to be cascaded through a set of ssh connections, so that a once a user reauthenticates on their workstation, the new credentials are available on all machines to which they are currently connected. This is controlled via the new options GSSAPIRenewalForcesReKey and GSSAPIStoreCredentialsOnRekey. A pam stack, 'sshd-rekey' may be defined to trigger renewal of additional credentials, such as X509 certificates or AFS tokens, when credentials are renewed on a particular machine. Cascading credential support is implemented using the standard ssh protocol.&lt;br /&gt;&lt;br /&gt;The cascading credentials patch is also available from the above website. Whilst it has been extensively tested, it has received less peer-review than the rest of the GSSAPI code. Reports of both success, and failure, would be greatly appreciated! If anyone would like to provide face-to-face feedback, I will be at the AFS &amp; Kerberos Best Practices Workshop in May.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-6243913134383265495?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/6243913134383265495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=6243913134383265495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/6243913134383265495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/6243913134383265495'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2008/04/gssapi-key-exchange-for-openssh-50.html' title='GSSAPI Key Exchange for OpenSSH 5.0'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-4819148178551819639</id><published>2008-01-30T14:50:00.001Z</published><updated>2008-01-30T15:40:28.383Z</updated><title type='text'>HTTP Authentication for Wordpress MU</title><content type='html'>I've been experimenting recently with deploying Wordpress MU as a blogging solution. As we use cosign for all of our web authentication, we wanted wordpress MU to be able to accept the contents of the REMOTE_USER variable to authenticate users, rather than relying upon Wordpress's internal authentication solution.&lt;br /&gt;&lt;br /&gt;Much web searching found a number of people asking similar questions, and the &lt;a href="http://dev.webadmin.ufl.edu/~dwc/2005/03/10/http-authentication-plugin/"&gt;HTTP Authentication plugin&lt;/a&gt; for a single user Wordpress install.  Unfortunately, this plugin didn't work "out-of-the-box" with Wordpress MU, so I ended up patching it. The modified plugin is available from &lt;a href="http://www.sxw.org.uk/computing/software/wordpress-mu-http-auth.tar.gz"&gt;http://www.sxw.org.uk/computing/software/wordpress-mu-http-auth.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's still tailored to my needs. There's no support for automatic blog creation, for example, although that would be trivial to add. I haven't looked at its integration with Wordpress in much detail yet, either.&lt;br /&gt;&lt;br /&gt;To use it, you need to protect your wp-login.php and wp-signup.php files with something like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Files wp-login.php&amp;gt;&lt;br /&gt;CosignProtected On&lt;br /&gt;AuthType Cosign&lt;br /&gt;Require valid-user&lt;br /&gt;&amp;lt;/files&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Files wp-signup.php&amp;gt;&lt;br /&gt;CosignProtected On&lt;br /&gt;AuthType Cosign&lt;br /&gt;Require group web/blog/create&lt;br /&gt;&amp;lt;/files&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And your wp-admin directory with:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CosignProtected On&lt;br /&gt;AuthType Cosign&lt;br /&gt;require valid-user&lt;br /&gt;&lt;/pre&gt;This also checks group membership before permitting blog creation.&lt;div&gt;&lt;br class="webkit-block-placeholder"&gt;&lt;/div&gt;&lt;div&gt;To install the plugin, copy the file into your &lt;tt&gt;wp-content/mu-plugins&lt;/tt&gt; directory, and configure using the HTTP Authentication tab in your Site Admin menu.&lt;/div&gt;&lt;div&gt;&lt;br class="webkit-block-placeholder"&gt;&lt;/div&gt;&lt;div&gt;If you install this, please let me know how you get on!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We've also got an additional patch for wordpress MU which makes it use an HTTPS site for blogs, rather than HTTP - I'm happy to share that on request.&lt;/div&gt;&lt;div&gt;&lt;br class="webkit-block-placeholder"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-4819148178551819639?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/4819148178551819639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=4819148178551819639' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/4819148178551819639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/4819148178551819639'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2008/01/http-authentication-for-wordpress-mu.html' title='HTTP Authentication for Wordpress MU'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-5679028115849093744</id><published>2007-10-10T07:14:00.000Z</published><updated>2007-10-10T12:58:36.388Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cosign openid apache'/><title type='text'>OpenID IdP for Cosign</title><content type='html'>I've been following OpenID's progress for a while - whilst there still aren't any "killer" applications making use of it, it is a very promising example of federated identity for the 'real' world. One of the potentials of running an internal authentication system is to use that to bootstrap an OpenID based on, so that whilst you're logged in to your organisation's system you can make use of an OpenID without requiring any additional authentication steps.&lt;br /&gt;&lt;br /&gt;I spent a bit of time yesterday looking at the OpenID servers which are currently available. There isn't a huge amount of freely available server code - the easiest to modify appeared to be &lt;a href="http://www.openidenabled.com/php-standalone-openid-server"&gt;JanRain's PHP server&lt;/a&gt;, which is built on top of their general purpose PHP OpenID library. This server supports OpenID authentication, along with XRDS (a method for performing attribute exchange with OpenID enabled applications). However, it's designed to use an internal password database.&lt;br /&gt;&lt;br /&gt;I've produced some patches to add a number of new features, allowing fallback against an enterprise authentication scheme.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;When the &lt;tt&gt;ENTERPRISE_AUTHENTICATION&lt;/tt&gt; define is set, if the web server provides a &lt;tt&gt;REMOTE_USER&lt;/tt&gt; variable and the user exists in the local database, authenticate the user.&lt;br /&gt;&lt;li&gt;When the &lt;tt&gt;ENTERPRISE_AUTHENTICATION&lt;/tt&gt; define is set, if &lt;tt&gt;REMOTE_USER&lt;/tt&gt; is not set, remove any cached authentication information&lt;br /&gt;&lt;li&gt;When the &lt;tt&gt;AUTOMATIC_REGISTRATION&lt;/tt&gt; define is set, and a &lt;tt&gt;REMOTE_USER&lt;/tt&gt; doesn't exist in the local database, add them&lt;br /&gt;&lt;li&gt;When the login page is called, but a user has already logged in, just pass them on to the next stored action.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The patch is available from &lt;a href="http://www.sxw.org.uk/computing/patches/PHP-OpenID-server-enterpriseauth.patch"&gt;http://www.sxw.org.uk/computing/patches/PHP-OpenID-server-enterpriseauth.patch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The problem with this server is that it is all implemented through a single script. It isn't immediately apparent from the script which actions are expected to require authentication, and which are not. So, the scripts existing workflow is preserved. Cosign (our web authentication solution of choice) is configured so that it will provide &lt;tt&gt;REMOTE_USER&lt;/tt&gt; information to the script where that is available, but won't prompt the user where it is not. This means that those portions of the script which should work for unauthenticated users will continue to do so, whilst those which require authentication redirect to the script's &lt;br /&gt;&lt;tt&gt;?action=login&lt;/tt&gt; handler. Secondly, Apache is configured using &lt;tt&gt;mod_rewrite&lt;/tt&gt; so that requests for &lt;tt&gt;?action=login&lt;/tt&gt; are redirected to a Cosign protected location which always requires authentication. This triggers the usual Cosign authentication process, which eventually redirects back to the script itself. The change to the login page to accept pre-authenticated users then kicks in, and the script continues processing as usual.&lt;br /&gt;&lt;br /&gt;The Apache configuration magic that accomplishes all of this is as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Alias           /iVouch/        /var/www/openid/src/&lt;br /&gt;    Alias           /iVouch-login/  /var/www/openid/src/&lt;br /&gt;    php_value       session.save_path /var/openid-session/&lt;br /&gt;&lt;br /&gt;    &amp;lt;Location /iVouch-login&amp;gt;&lt;br /&gt;      CosignProtected On&lt;br /&gt;      CosignGetKerberosTickets On&lt;br /&gt;    &amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;Location /iVouch&amp;gt;&lt;br /&gt;      CosignProtected On&lt;br /&gt;      CosignAllowPublicAccess On&lt;br /&gt;    &amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;br /&gt;    RewriteEngine On&lt;br /&gt;    RewriteCond %{QUERY_STRING} ^$&lt;br /&gt;    RewriteCond %{LA-U:REMOTE_USER} ^$&lt;br /&gt;    RewriteRule ^/iVouch/$ /iVouch-login/ [PT]&lt;br /&gt;&lt;br /&gt;    RewriteCond %{QUERY_STRING} action=login&lt;br /&gt;    RewriteRule ^/iVouch/$ /iVouch-login/ [PT]&lt;br /&gt;&lt;br /&gt;    RewriteCond %{QUERY_STRING} action=logout&lt;br /&gt;    RewriteRule ^/iVouch/$ https://weblogin.inf.ed.ac.uk/cosign-bin/logout [R]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This all assumes that the OpenID server is sitting under /iVouch/ on the web server - we'll probably move this to the top level if it ever goes into production. The first set of rewrite rules mean that if you go to the front page of the script you will get logged in. The second set of rules force a login when the scripts &lt;tt&gt;login&lt;/tt&gt; action is performed. The third rule calls the central cosign &lt;tt&gt;logout&lt;/tt&gt; function when the scripts &lt;tt&gt;logout&lt;/tt&gt; action is reached.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-5679028115849093744?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/5679028115849093744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=5679028115849093744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/5679028115849093744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/5679028115849093744'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/10/openid-idp-for-cosign.html' title='OpenID IdP for Cosign'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-7388172097273279355</id><published>2007-10-09T09:00:00.000Z</published><updated>2007-10-09T08:03:42.324Z</updated><title type='text'>kx509, kerberos and cosign</title><content type='html'>One of the things I've been doing over the summer is working on implementing some additions for our web authentication system. I thought I'd take a few moments to discuss these changes, and to describe the way that we're using them.&lt;br /&gt;&lt;br /&gt;Historically, we used client certificates for web authentication. Generally speaking, these client certificates were obtained using the University of Michigan's kx509 system run transparently from the PAM stack at user login. When it worked, our users were unaware of a seperate authentication step to use web applications and all was well. However, we were (and are) seeing an increasing demand to provide web applications to clients that aren't under our control. These clients don't have the kx509 utilities installed, and don't have PAM (let alone having fancy things integrated into the stack). We implemented a solution which would download client certificates into the browser, but pretty soon ran up against the fact the most browsers have incredibly poor user interfaces for dealing with certificate expiry, selection and expiry. Implementing a replacement has been on the cards for years, but we'd limped along (using a locally developed kx509 implementation that worked with the Mac OS X keyring, to allow Safari to download credentials, and the new kx509 plugin for NIM developed by Secure Endpoints)&lt;br /&gt;&lt;br /&gt;We decided upon Cosign (again from the University of Michigan) as a replacement web authentication system, and others set about building a production system around this for our environment. However, Cosign has the major drawback that it requires users to authenticate! Rather than our existing system, where web authentication occurs transparently (as long as the user uses a supported browser on a managed platform ...), they had to explicitly authenticate to the Cosign portal. Initial investigations looked at using x509 certificates (delivered by the kx509 mechanism) to authenticate users with those certificates to Cosign, and then allow Cosign to authenticate the user to the application. However, we'd always had the problem with kx509 that it wasn't possible to perform certificate delegation, without running a service called 'kct' on the KDCs. We'd always been a little wary of kct's code quality and, in fact, had never deployed it in production. This lack of delegation appeared to rule out kx509-based Cosign for many of the web applications we were interested in building, all of which seemed to benefit from some form of credentials delegation. I'll talk more about those later.&lt;br /&gt;&lt;br /&gt;So, despite the fact that, ironically, Cosign had been originally chosen because of its kx509 support, we had to look elsewhere. The NegotiateAuth HTTP authentication mechanism allows browsers to perform Kerberos authentication, and was a promising fit. We control the installation settings of Firefox on all of our managed machines, so we could ensure that NegotiateAuth was enabled for our weblogin servers (one problem with Firefox's NegotiateAuth mechanism is that it's configuration settings aren't exposed in any UI, and are therefore hard to modify). This minimal support would ensure that our local user experience was no worse than that with kx509. So, I spent a few days implementing NegotiateAuth support (the new &lt;tt&gt;negotiate&lt;/tt&gt; directive) in Cosign's login script. This was relatively straightforwards, especially compared to the issues with arranging for transparent fallback that followed.&lt;br /&gt;&lt;br /&gt;The fallback issues are, as with most things on the web, down to the differences in browser behaviour and UI. The simplest way to achieve fallback is to present the page to the browser with the required headers, and let the browser render the failure text if it can't perform the authentication. However, the way that browsers react, firstly if they don't support NegotiateAuth, secondly if they're not configured to support NegotiateAuth for that domain, and thirdly if they don't have credentials is highly variable, and often suboptimal. Usability testing fairly rapidly showed that this wouldn't be a viable option across the set of browsers we needed to support for remote users. So, we started looking for a mechanism to allow 'testing' for NegotiateAuth support, without alerting the browser.&lt;br /&gt;&lt;br /&gt;The solution we ended up with uses some Javascript, and the XMLHttpRequest method to perform a 'background' test of a NegotiateAuth protected page from the server. If this fetch succeeds, then we redirect the user's "main" login page to a NegotiateAuth protected copy of cosign.cgi, which proceeds to authenticate them based on their Kerberos credentials. This works on all of the browsers we tested (Firefox, Safari, Opera, Konqueror) with the exception of Internet Explorer. When IE is prompted to perform NegotiateAuth, and doesn't have credentials it produces a Basic login dialog box, which it then uses to try NTLM against the server. Our solution to this is to browser sniff in the redirect script, and to not even try NegotiateAuth if the browser is IE. We also disable the check for Safari, as this doesn't support credential delegation which we require later in the authentication process. The (rather clunky, I'm afraid) production version of this script is available from https://weblogin.inf.ed.ac.uk/cosign/js/redirect.js &lt;br /&gt;&lt;br /&gt;Needless to say, there are further complications. We have cosign deployed across multiple web servers for resilience, all of which answer to requests for https://weblogin.inf.ed.ac.uk/. Firstly, different browsers perform Kerberos service name lookups in different ways. Firefox always uses the canonical name of the host (that is, it uses the DNS to resolve the name in the URL, and uses the results of that resolution). Safari always uses the name entered in the URL. This means that our webservers must have keys for both HTTP/weblogin.inf.ed.ac.uk, as well as HTTP/theirhostname. Firefox then throws an additional spanner in the works. The DNS lookup is performed twice - once for Kerberos, and once to determine the IP address of the host to connect to. If the names are being allocated in a round-robin fashion, then you will end up using HTTP/host-A as the service principal, whilst connecting to host-B. So, all of our web login servers also have to have each other's keys in their keytabs. This Firefox bug is in bugzilla.mozilla.org as &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=383312"&gt;bug #383312&lt;/a&gt;. The final problem is the the Apache NegotiateAuth module mod_auth_kerb only supports authenticating against a single, chosen, key from a keytab. In our situation, we want it to use any key from the keytab. I've implemented a simple &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1809998&amp;group_id=51775&amp;atid=464526"&gt;patch&lt;/a&gt; which adds the &lt;tt&gt;KrbServiceName Any&lt;/tt&gt; directive, allowing the use of any key that's in the servers keytab.&lt;br /&gt;&lt;br /&gt;This is all now runing as a stable service. I'll talk in a future post about some of the additions we've made to this in order to support Friend or Guest accounts, and more about the need for delegation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-7388172097273279355?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/7388172097273279355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=7388172097273279355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/7388172097273279355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/7388172097273279355'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/10/kx509-kerberos-and-cosign.html' title='kx509, kerberos and cosign'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-1102819264880241415</id><published>2007-09-27T22:00:00.001Z</published><updated>2007-09-27T22:04:22.117Z</updated><title type='text'>Key Exchange for OpenSSH 4.7p1</title><content type='html'>I finally managed to make time this evening to update my GSSAPI key exchange patches to OpenSSH 4.7p1, and release them to the world. There are no functional changes with this update, just removing some code from the patch that's made it into the OpenSSH tree. I hope to be able to get some other pieces out of the patch (the GssapiTrustDNS code, in particular) before the next release.&lt;br /&gt;&lt;br /&gt;I'd also hoped to be able to announce a public release of my cascading credentials renewal code, but a colleague has discovered some problems with the server crashing when this code is enabled. The problem only seems to occur with particular versions of the MIT GSSAPI library, but I want to find out exactly what's causing this before making a public release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-1102819264880241415?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/1102819264880241415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=1102819264880241415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/1102819264880241415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/1102819264880241415'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/09/key-exchange-for-openssh-47p1.html' title='Key Exchange for OpenSSH 4.7p1'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-6416642225481076824</id><published>2007-06-15T09:27:00.000Z</published><updated>2007-06-15T09:38:15.337Z</updated><title type='text'>Python GSSAPI bindings</title><content type='html'>So, after a few blind alleys, I finally got the JWChat code working. Unfortunately, what this revealed is that the state of GSSAPI support for Python isn't that great.&lt;br /&gt;&lt;br /&gt;Esentially, there are two different sources of GSSAPI-Python bindings:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; PyGSSAPI (on Sourceforge). This is old, and unmaintained. It's written in SWIG, but the SWIG source won't compile in recent SWIGs, and the provided C source won't work with current Python&lt;br /&gt;&lt;li&gt; PyKerberos (part of Apple's CalDav server). This is a simple solution, but only provides access to an interface designed to do Negotiate-Auth. The interface isn't object oriented, nor will it garbage collect properly.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;In order to get PunJab doing what I needed, the quickest route seemed to be to add SASL support to the PyKerberos library, so I did so. This solution isn't particularly clean, nor does it interface well with situations where you're trying to do anything other than perform a SASL handshake using credentials acquired in a previous NegotiateAuth transaction.&lt;br /&gt;&lt;br /&gt;Other local projects required a way to do normal GSSAPI SASL from Python, and I really wanted to tidy up the PunJab code,so I ended up breaking and implementing my own Python bindings. Whilst not yet complete, these currently provide enough functionality to implement a GSSAPI SASL layer for the Twisted Jabber library, which solves our immediate local issue.&lt;br /&gt;&lt;br /&gt;Once I've finished documenting the library, I'll package it up and announce it more widely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-6416642225481076824?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/6416642225481076824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=6416642225481076824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/6416642225481076824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/6416642225481076824'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/06/python-gssapi-bindings.html' title='Python GSSAPI bindings'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-9132440439875896652</id><published>2007-05-22T18:19:00.000Z</published><updated>2007-06-15T09:27:00.921Z</updated><title type='text'>Adding SSO to JWChat</title><content type='html'>We're in the process of deploying a new Jabber server here, and have already got the server (jabberd2) and assorted clients (Gaim, Psi, AdiumX, Cocinella) supporting Kerberos based single signon. In my idle moments, though, I've been playing with JWChat - which doesn't support any of the WebSSO technologies, instead requiring a username and password. This limitation isn't really JWChat's fault - instead, it's a product of the way that it must be implemented. JWChat is a complete, Javascript based, Jabber client which runs in the browser - which talks XMPP encapsulated in HTTP (using either HTTP-Binding, or HTTP-Polling) via a proxy, back to your Jabber server. The fact that it's implemented in the browser means that it doesn't have access to anything useful, like a password store, let alone a Kerberos credentials cache. The fact that the proxy just passes XMPP packets blindly to the server, means that you can't use authentication to the proxy as a way of securely authenticating to the Jabber server.&lt;br /&gt;&lt;br /&gt;So, here's a cunning plan. There's already a Man-In-The-Middle (the proxy). This is already &lt;i&gt;slightly&lt;/i&gt; active at moments during the session. My plan is to make this proxy a little more active when connection establishment is being performed. In particular ...&lt;br /&gt; *) Use the EXTERNAL SASL mechanism to indicate that the authentication is happening over an external channel.&lt;br /&gt; *) The proxy runs at a URL which is optionally protected by some form of proxiable authentication (the one I'm interested in here is Kerberos, but other options are possible). &lt;br /&gt; *) If the user has successfully authenticated to the proxy, then it looks out for the stream:features packet at the start of the XMPP handshake. It intercepts this packet, and adds EXTERNAL to the _start_ of the list of supported SASL mechanisms.&lt;br /&gt; *) The client then picks which authentication mechanism to use. If it is a hacked version of JWChat, it will try EXTERNAL&lt;br /&gt; *) The proxy looks out for an attempt at doing EXTERNAL. If there is one, it doesn't forward this packet to the server. Instead, it starts its own GSSAPI based authentication, using the current user's credentials. It talks directly to the XMPP server (without returning any packets to the client) until the GSSAPI handshake is complete. It then fakes success or failure to the client as coming from the EXTERNAL mechanism.&lt;br /&gt;&lt;br /&gt;This should all work, with a few caveats. We can't establish security layers (unless the proxy becomes really clever). The proxy needs to know about a Kerberised authentication mechanism (in our case, probably NegotiateAuth), and about how to do the SASL GSSAPI mechanism. The proxy needs to decode, and encode, XMPP packets by itself.&lt;br /&gt;&lt;br /&gt;I'm going to have a go at implementing this using Punjab as the proxy (as Python is slightly less unfamiliar than Java at the moment, and there is at least a free SPNEGO / NegotiateAuth plugin for Twisted available in the Apple CalDav source)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-9132440439875896652?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/9132440439875896652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=9132440439875896652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/9132440439875896652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/9132440439875896652'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/05/adding-sso-to-jwchat.html' title='Adding SSO to JWChat'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-3267276601932932653</id><published>2007-05-13T23:53:00.000Z</published><updated>2007-10-10T18:47:58.236Z</updated><title type='text'>AFS &amp; Kerberos Workshop</title><content type='html'>Sitting in Atlanta waiting for a delayed flight on my way back from the AFS &amp; Kerberos Best Practices Workshop at SLAC. &lt;br /&gt;&lt;br /&gt;The conference was a little lower-key this year, as accounting restrictions presented commercial sponsorship &amp; the provision of food at meal breaks. Whilst this perhaps reduced the amount of mingling that took place, it didn't really reduce the quality of the talks - which were another strong mixture of case-studies and development reports. Another great effort from Derrick, Jeff, Russ,Tracy, Alf (and the sadly missing Moose).&lt;br /&gt;&lt;br /&gt;The talks from the workshop are up on their web pages at http://www.pmw.org/afsbpw07/. Of particular interest to us are Kristen's talk on NDMP, Russ's talk on his pam modules (which I hope we'll be able to migrate to using before our next client platform release), Love's description of rxgk, Matt and Marcus's byte range locking, and Derrick's version of hostafsd.&lt;br /&gt;&lt;br /&gt;There was also some talk of testing and build farms, which I hope I'll be able to find a way to help with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-3267276601932932653?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/3267276601932932653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=3267276601932932653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/3267276601932932653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/3267276601932932653'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/05/afs-kerberos-worksat-hop.html' title='AFS &amp; Kerberos Workshop'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-7902349062808311481</id><published>2007-03-13T23:19:00.001Z</published><updated>2007-03-13T23:23:38.479Z</updated><title type='text'>GSSAPI Key Exchange for OpenSSH 4.6</title><content type='html'>Just a quick note that I finally managed to get it together enough to produce a GSSAPI Key exchange patch for the new OpenSSH 4.6p1 release. Patch is available, as always, from http://www.sxw.org.uk/computing/patches/openssh.html&lt;br /&gt;&lt;br /&gt;I'm also working on a patch to allow propagation of rekeys over the key exchange handshake. In theory, this means that if you are sitting at a workstation and renew your credentials on that machine all of the machines that you've forwarded tickets to over ssh will also get renewed credentials.&lt;br /&gt;&lt;br /&gt;This promises to be really quite funky for people who work like me - with a single, desktop login at home, and many many ssh connections to machines at work. Being able to have all those connections 'magically' end up with valid Kerberos tokens just because I renew my ticket at home will greatly save on typing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-7902349062808311481?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/7902349062808311481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=7902349062808311481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/7902349062808311481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/7902349062808311481'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/03/gssapi-key-exchange-for-openssh-46.html' title='GSSAPI Key Exchange for OpenSSH 4.6'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-3897609222909763257</id><published>2007-02-26T19:52:00.000Z</published><updated>2007-02-26T20:07:46.938Z</updated><title type='text'>Shifting to Jabberd2.1.1</title><content type='html'>I'm in the process of migrating our development Jabber service from an FC3 platform, where it's running a heavily patched version of jabberd2.0, to the newly revitalised jabberd2.1. 2.1 already has our local Cyrus SASL patches included, so we can drop those from the patch set, along with a large number of other improvements. In addition, I'm taking the opportunity to improve our support for non-local clients.&lt;br /&gt;&lt;br /&gt;In the earlier incarnation, our service would only accept GSSAPI connections - it didn't support any form of password based authentication. It was repeatedly pointed out to me that this was a pain! Clients such as iChat just wouldn't work, Adium, Gaim and Psi all had to be used in a locally patched form, and it was not particularly usable. So, I've suspended my concerns about people caching their Kerberos passwords in their chat clients, and added support for doing password based authentication. This has required some reconfiguration (we now use pam for auth checking, rather than LDAP), and some code changes to jabberd2.1&lt;br /&gt;&lt;br /&gt;The PAM authreg module that ships with jabberd2.1 has some strange ideas about what a username looks like - it uses the full JID of the user when calling into the PAM stack (so you get usernames of the form user@example.com). This doesn't work well with a conventional PAM stack, so I've &lt;a href="http://bugs.xiaoka.com/task/41"&gt;patched the code&lt;/a&gt; to disable this behaviour.&lt;br /&gt;&lt;br /&gt;I also wanted to be able to restrict password authentication to SSL connections, whilst still providing GSSAPI on insecure connections. Previously, jabberd2.1 didn't support having two different sets of supported SASL mechanisms, so I coded up a &lt;a href="http://bugs.xiaoka.com/task/40"&gt;quick patch&lt;/a&gt; to implement this. It's worth noting that clients such as iChat, which use pre-standardisation authentication mechanisms submit their password despite the server telling them not to. This means that the password will be exposed, regardless of the server setting. Ho hum.&lt;br /&gt;&lt;br /&gt;Next step is creating a migration script for the user rosters (as we're moving from machine.example.org =&gt; example.org for JIDs)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-3897609222909763257?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/3897609222909763257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=3897609222909763257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/3897609222909763257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/3897609222909763257'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/02/shifting-to-jabberd211.html' title='Shifting to Jabberd2.1.1'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-7208973913403135689</id><published>2007-02-25T10:59:00.000Z</published><updated>2007-02-25T10:59:52.884Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaim'/><category scheme='http://www.blogger.com/atom/ns#' term='kerberos'/><title type='text'>Gaim, Kerberos and Cyrus SASL</title><content type='html'>Some time ago, I added Cyrus SASL support to Gaim, so that it could do Kerberos authentication to Jabber servers. As we've developed our Jabber service locally some issues with this support has emerged.&lt;br /&gt;&lt;br /&gt;Firstly, there's been a bug introduced which causes connections to hang if a security layer is negotiated. The &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1663061&amp;group_id=235&amp;atid=300235"&gt;fix for this&lt;/a&gt; is in the Gaim patch tracker.&lt;br /&gt;&lt;br /&gt;Secondly, the code uses the user's domain name as the server name when establishing a SASL connection. This doesn't affect the 'normal' DIGEST-MD5 and PLAIN mechanisms, and also has no effect in situations where the hostname matches the domain of the user. It does, however, cause GSSAPI connections to fail when contact a server whose hostname is different from the user's domain (for example, servers that are located through SRV, rather than A records). Again, there's a &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1663064&amp;group_id=235&amp;atid=300235"&gt;fix for this&lt;/a&gt; in the Gaim patch tracker.&lt;br /&gt;&lt;br /&gt;The final change is a functionality change. When I originally wrote my patch, I changed the Jabber protocol definition to indicate that passwords were optional. Whilst this stopped Gaim from prompting for a password whilst doing GSSAPI authentication, it broke any other mechanism that actually required passwords. That bit of the change was quickly reverted! However, it is useful to not have to enter a password when authenticating using a mechanism that doesn't require it.&lt;br /&gt;&lt;br /&gt;It turns out that if you don't register a password calllback with Cyrus SASL, it will not attempt any mechanisms that require passwords. Using this, it's possible to prompt for passwords as required, rather than mandate them for a connection. This allows both GSSAPI usage without a password, with fallback to password prompting for other mechanisms. I've just uploaded the &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1668289&amp;group_id=235&amp;atid=300235"&gt;patch for this&lt;/a&gt; to the Gaim tracker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-7208973913403135689?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/7208973913403135689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=7208973913403135689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/7208973913403135689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/7208973913403135689'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/02/gaim-kerberos-and-cyrus-sasl.html' title='Gaim, Kerberos and Cyrus SASL'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957512843806722900.post-8501007839334889909</id><published>2007-02-25T00:01:00.000Z</published><updated>2007-02-25T11:00:38.750Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='kerberos'/><category scheme='http://www.blogger.com/atom/ns#' term='thunderbird'/><title type='text'>GSSAPI support in Thunderbird</title><content type='html'>The GSSAPI support in Thunderbird has never returned particularly great error messages. In particular, if the server offers GSSAPI, and nothing else, you'll get told that the server doesn't support secure authentication when login fails.&lt;br /&gt;&lt;br /&gt;For some reason, this error message seems to annoy people ...&lt;br /&gt;&lt;br /&gt;We can't give 'real' error messages whenever GSSAPI fails, because we try GSSAPI  &lt;b&gt;whenever&lt;/b&gt; the server offers it, and there are lots of broken Linux installations out there which offer GSSAPI whenever the appropriate libraries are installed, regardless of whether the server has suitable key material or not.&lt;br /&gt;&lt;br /&gt;So, it looks like Thunderbird needs to have some &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370178"&gt;UI to say whether GSSAPI is supported or not&lt;/a&gt;. Of course,  Jeff Altman said as much &lt;a href="http://www.opensubscriber.com/message/kerberos@mit.edu/2125698.html"&gt;back in 2005&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957512843806722900-8501007839334889909?l=orthrus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orthrus.blogspot.com/feeds/8501007839334889909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957512843806722900&amp;postID=8501007839334889909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/8501007839334889909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957512843806722900/posts/default/8501007839334889909'/><link rel='alternate' type='text/html' href='http://orthrus.blogspot.com/2007/02/gssapi-support-in-thunderbird.html' title='GSSAPI support in Thunderbird'/><author><name>sxw</name><uri>http://www.blogger.com/profile/10123417989091884779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
