The Dark Lord has a sinister plan

Against sudo

(Slightly cut down and edited from a long comment left in a script.)

sudo really bites. There are so many problems and limitations with it!

Pattern matching in command rules is by glob rather than regexp. Glob is much more limited; regexp would be so much more useful here. Effectively, glob is useless for any kind of realistic pattern matching. But it's not even the same glob as used in bash: * and ? in sudo's glob can match spaces! This means that * effectively always means "and as many other arguments as you want". Which pretty much ruins the point of filtering arguments in sudo at all. Since you _have_ to use glob if you want to do any kind of nontrivial argument match other than a fully fixed set of arguments. (Since there's no Kleene star or Kleene plus).

Furthermore. the sudoers syntax is convoluted and squirrely. Clearly the result of many incremental hacks to jam in overly-narrow features one at a time instead of a coherent design. The result is messy and unreadable. And then, if you mess up the syntax of your sudoers file (or even just one fragment in sudoers.d) (and this is far too easy considering sudoers's horrible syntax) the result is that sudo always errors out and refuses to do anything useful! This makes it far too easy to lock yourself out of root access on your system altogether on systems where sudo is by default the only way to get to root. Which is some very popular OSs, like OS X and ubuntu. This is a nasty, nasty failure mode.

sudo's sanctioned solution to this problem seems to be that the user should always use visudo to edit a sudo config file, which does prevent this failure mode. But it's stupid to ask a user to remember something like that. And visudo seems to only be capable of changing /etc/sudoers itself, it won't handle fragments in /etc/sudoers.d/. And then there's this other command sudoedit... Why are there two commands for this one (ultra-narrow!) task? sudoedit doesn't even avoid the failure mode.

The sudo config language sucks. Yeah, it can be kinda made use of if you learn the stupid sudoers syntax and dodge around and learn to live with the various limitations. But it's more trouble than it's worth. I'm making use of it in one of my scripts, but i shouldn't have bothered.

Now let's talk about the fact that sudo preserves the $HOME of the invoking user. But no other environment by default. Why???? Maybe I'm stupid but I don't see the point of this. It's totally useless. It just causes confusion every time. This is what causes people to type commands like: sudo su -c "....". Which is just weird. At least it can be turned off, (now that i understand the problem and know how: always use the -i flag with sudo) But why is it the default?

What else? Well, the man page sucks. It's so hard to understand how to write a sudoers, you have to read the whole damn thing carefully to get anywhere. Use of bnf in the man page is not helping. I should be able to understand the basics (not every little detail, just the obvious) by looking in the first few pages, not have to dig down 12 pages to get to the essential meat.

It sucks that you have to specify the fully-qualified path to every binary that you're granting access to. That's just lame. It makes sudoers files less useful and portable and serves no realistic security purpose that I can see.

Now for the biggest issue of all: it's useless and stupid for sudo to even exist in the first place! Sudo is supposed to be a more capable and secure replacement for su, but it fails at this job entirely. The thinking goes something like this: su is bad because it requires you to type the root password all the time to do any system configuration but that's unsafe. Someone might look over your shoulder or capture it with a keylogger or something. (This is a moderately real concern. sudo doesn't solve it, tho.) Supposedly sudo doesn't require you to use the root password. Supposedly you can just use your normal user password instead. Supposedly, you don't even have to have a root password at all.

In fact, this is bunkum. If there is a password which enables root-level access to the system, then that is effectively a root password, regardless of whether you call it a user account or not. I call these accounts that "have sudo" root-equivalent accounts. Effectively, sudo is encouraging people to run everything as root, by telling them to set up root-equivalent accounts.

As far as i can see, there are 2 things sudo does above su which a slightly nice: it enables logging of commands run as sudo and root permissions revokable on a per-user basis.

Per-user revokability is a nice feature, but it can be achieved in o ther ways. Anyway, if you can't trust your admins (even former admins), to stay off machines they're no longer allowed on, then you have bigger problems. There are so many ways for a malicious admin to leave a backdoor onto a server.

I'm surprised that admins of big-server environments are willing to allow such a steaming pile of shit onto their machines at all, even less playing such an important security role. In short, the problems and annoyances of sudo are many, and the advantages are really of only limited utility in large organizations with lots of admins. Sudo makes no sense whatsoever on (either desktop or server) systems with only one or even 2 or 3 users. So, why is it pre-installed and the the default on manifestly single-user desktop systems like Ubuntu and OS X?