[JDEV] Passwords, zero-K and storage
Iain Shigeoka
iainshigeoka at yahoo.com
Fri Jun 15 20:35:45 CDT 2001
Glad you brought up this point. I've been wondering about highly related
issues that might as well get thrown in.
At 11:52 PM 6/15/2001 +0100, DJ Adams wrote:
>there was a question in the jdev room about how to avoid storing usernames
>and passwords in the <username>.xml files on the server.[1]
>
>I blurted out 'zero-K!' for half the answer - a way of "removing the
>liability of storing password on the server"[2]. This was followed by
>another answer a couple of mins later which contradicted me. I tried
>it out on my server, and sure enough, even when the mod_auth_plain and
>mod_auth_digest modules were commented out of JSM's load list, a password
>in plain text was stored on the server as well as the zero-K stuff.
... [snip]
>Anyway, I would suggest that the snippet of code in mod_register_new()
>shown above is both redundant and wrong, and should be removed. The
>purpose of this code is served by mod_auth_plain and / or mod_auth_0k.
>
>Of course, I'm ready to be contradicted again; I'd like to hear what
>others think. I've tried this out (removing the snippet) on my test
>server and it solves the problem and doesn't cause any others, as far
>as my minimal testing has shown.
Note: my comments are from a general server design standpoint and not
specific to jabberd.
I've been playing around with these issues and from a modular standpoint,
the system seems a bit incomplete. Theoretically, when you plug in a new
auth module, you should be able to use it to immediately authenticate new
and existing accounts (accounts established and authenticated against older
user records). For instance, I should be able to unplug digest and plug in
0k and keep on chugging.
It would seem that the only real way of doing this is to store the
plaintext password and user name _somewhere_ so you can move records from
one authentication system to another. (storing plain passwords, hashes, or
0k sequences). At least with the current system. Now the implementation
may encrypt all these passwords so only the server can access them, or
perhaps a migration utility in the server, etc... but at some point,
somewhere, the plaintext passwords will need to exist. Otherwise, when you
plug in a next generation authentication system, you'll need to have
everyone re-send or regenerate their password info.
Am I missing something?
This of course assumes that we need to worry about new auth protocols. If
the existing 2 and a half (see side note at bottom) auth protocols are
pretty much it, then I guess there's not much of an issue here. However,
since I doubt that this is true, it seems to be a serious problem for
upgrading existing servers that may have thousands of user accounts. I
guess what I'm trying to say is, I would like to see the auth system build
to support secure _and_ seamless upgrades of authentication systems.
Method 1: My thought is either we establish a standard server-side
password data "format" other than plaintext to provide a common "seed"
password that can be used to generate passwords in whatever module we are
using. So when we install a new module and the existing user accounts
don't have password data in their format, they can ask the server, "hey,
give me a seed for this user", and use the data to generate its data. The
reason we need it standardized is so that future auth algorithms can be
designed to be compatible with the data. To avoid plaintext, we store the
password in a way that the data displays certain mathematical properties
that can be exploited for generating new passwords in new systems while
preventing their use to generate current passwords with current
systems. Probably not a trivial task.
Method 2: Another approach is to establish yet another protocol to allow
clients to authenticate with an existing auth module, then once logged in,
generate new information with a new auth module to "upgrade" to that
authentication scheme. This protocol can be very simple (e.g. force the
client to auth twice: first with one module then with another) but the
clients need to know about this in a standard (otherwise, only client A
will work with server A). This approach is basically a "let the client
worry about it" strategy. The client must know the plain text password,
and can authenticate against both systems using it. The worry is that
client's will have a lot of auth bloat having to be able to support all
auth systems in order to seamlessly access any jabber server (versus only
needing to know about one auth method and use it on any jabber server if
the server's are responsible for making these conversions).
So far this has not been an issue because we've always had the plaintext
password on the server which served as the common data format for password
information (method 1 with plaintext being the special password storage
format... ha ha ha). It was easy to upgrade to 0k because we could upgrade
people on the server using the plaintext password. However, I expect that
many/most would like to use the 0k advantage of no plaintext password at
all on the server. If this is the case, then the next auth protocol (if
there will be one) is in for some trouble if we don't address things
sometime.
<side note>It would be nice nice for server's to be backward compatible and
still support digest if not plaintext passwords. In this case, the
plaintext password still needs to be stored on the server even if 0k is
used. I am curious to know how many are dumping backward compatibility for
the sake of security (pure 0k), and how many are using both or all three
(but since they store passwords on the server, what is the advantage of
0k?). How many clients support 0k when the spec isn't finished or
"approved"?</side node>
>[2] http://docs.jabber.org/draft-proto/html/zerok.html
<side note>I would really like to see someone (whoever implemented it in
jabberd) take a whack at updating this doc. I figure they could do it
much easier than having one of us reverse engineer the protocol or grunt
through the server code. The whole "bootstrap" process of the
authentication algorithm is left out and really should be specified... From
a "clean room" server implementation standpoint (someone not working or
looking at jabberd) the current omission makes 0k pretty much useless. I
suppose we should wait until the Foundation/JEP/JIG etc is all settled
first... *sigh*</side note>
-iain
ps - sorry for the rant.
_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com
More information about the JDev
mailing list