| separation of authentication and authorization |
|
Because of the way SSH implementations have developed, the
authentication and authorization functions are hopelessly entangled,
making the software much less flexible than it could be. The most glaring
example of this are the restrictions available in the authorized_keys
file. Using options such as host=... and command=...,
you can restrict the source hosts allowed to connect using a particular
key, or force a certain program to be run instead of allowing the client
to specify one. But because they're implemented in the authorized_keys
file, these authorization features are availble only when using
public-key authentication -- even though they make perfect sense to use as
retrictions to the account, regardless of what method was used to
authenticate the client!
The result is that you may be forced to use public-key authentication,
even when another method would be more appropriate, just in order to get
sufficient control. Perhaps you'd like to use trusted-host authentication
for a batch job, or Kerberos because your computing environment supports
it -- but the weak authorization controls available for them force you to
use public-key anyway. Or perhaps you'd like to bar access to your account
via password authentication -- but you can't do that without turning off
password authentication for the server as a whole, even though you
can prevent access by public-key simply by having no
authorized_keys file.
As SSH develops and acquires support for more varied authentication
methods, this becomes an ever more annoying hindrance. We suggest that
the various authorized_keys, .rhosts, .shosts, .klogin, etc. files should
be dropped in favor of a more flexible mechanism that covers all the
possible access combinations in a single, convenient place. One might
come up with an SSH-specific syntax, or perhaps it would be better to use
an existing one (the OpenSSH people are advocating KeyNote, which is used
in OpenBSD IPSec software).