Should you add MX entries for hosts in your (public) DNS?

For a long time, whenever we added a new server to our public DNS,we also added an MX entry for it (directing inbound email to ourgeneral external MX gateway). This was essentially historical habit,and I believe it came about because a very long time ago there werefar too many programs that would send out email with From: andeven To: addresses of '@.'. Adding MXentries made all of that email work.

In


Why exposing only blocking APIs are ultimately a bad idea

I recently read Marek's Socket API thoughts , whichmulls over a number of issues and ends with the remark:

But nonetheless, I very much like the idea of only blocking API'sbeing exposed to the user.

This is definitely an attractive idea. All of the various attemptsat select() style APIs have generally not gone well, high levelcallbacks give you 'callback hell', and it would be conceptuallynice to combine cheap concurrency with purely blocking APIs to haveour cake and eat it too


Some notes on ZFS per-user quotas and their interactions with NFS

In addition to quotas on filesystems themselves ( refquota ) and quotason entire trees (plain quota ), ZFS also supports per-filesystem quotason how much space users (or groups) can use. We haven't previouslyused these for various reasons, but today we had a situation with aninaccessible runaway user process eating up all the free space in onepool on our fileservers and we decided to (tryto) stop it by sticking a quota on the user. The result was reasonablyeducational and led to


Cheap concurrency is an illusion (at least on Unix)

Recently I wound up reading this article ( via ),which contains the following:

[...] this memo assumes that there already exists an efficientconcurrency implementation where forking a new lightweight processtakes at most hundreds of nanoseconds and context switch takes tensof nanoseconds. Note that there are already such concurrency systemsdeployed in the wild. One well-known example are Golang's goroutinesbut there are others available as well.

When designing APIs and similar things, it is quite important tounderstand that extremely lightweight processes


Using Certificate Transparency to monitor your organization's TLS activity

One of the obvious things that you can do with CertificateTransparency is to monitor the CT logs for bad people somehow getting a certificatefor one of your websites. If you're Paypal or Google or the Universityof Toronto, and you see a CT log entry for a 'www.utoronto.ca'certificate that isn't yours, you can ring lots of alarms. You cando this with actual infrastructure (perhaps based on the actuallogs , and seealso , andalso ), or youcan


The conflict between wildcard TLS certificates and Certificate Transparency

Certificate Transparency is anincreasingly important part of the modern TLS world, especially forwebsite certificates (which I believe are still the dominant useof TLS certificates). One part of Certificate Transparency ismonitoring for certificates issued for your own sites and domains,but that's not the only use; another one is looking for certificatesissued to suspicious names. For instance, a bunch of people wouldprobably be interested if someone issued a certificate for www.really-its-paypal-login.com or geeglemail.com


How recursively flattening a list raises a Python type question

Today I wound up reading Why it's hard for programmers to writea program to flatten a list? ( via ),where the quiz challenge put forward is to turn an input like [1,[2,3], [4, [5,6]]] into [1,2,3,4,5,6] . My immediate reactionwas that I'd do this in Python rather than in any statically typedlanguage I know, because all of them make the input


In Python, strings are infinitely recursively iterable

Yesterday I posed the side question of whathappened when you called the following code with flatten2(["abcdef",]) :

def flatten2(inlst):    olst = []    for i in inlst:        try:            it = iter(i)        except TypeError:            it = None        if it is None:            olst.append(i)        else:            olst.extend(flatten2(i))    return olst

The intent of this code is to recursively flatten iterable things.What I had expected to get


A single email message with quite a lot of different malware

This is the kind of thing where it's easier to show you the log messagesfirst and discuss them later:

1chbMp-0007UF-Jw attachment application/msword; MIME file ext: .doc; zip exts: .rels .xml[3] none1chbMp-0007UF-Jw attachment application/msword; MIME file ext: .doc; zip exts: .rels .xml[3] none1chbMp-0007UF-Jw attachment

What an actual assessment of Ubuntu kernel security updates looks like

Ubuntu recently released some of their usual not particularly helpfulkernel security update announcements and I tweeted :

Another day, another tedious grind through Ubuntu kernel securityannouncements to do the assessment that Ubuntu should be doingalready.

I have written about the general sorts of things we want to knowabout kernel security updates , but there'snothing like a specific example (and @YoloPerdiem asked ). Sohere is essentially the assessment email that I sent to my co-workers.

First, the background. We currently have Ubuntu 1