Subject: Re: PAM proposal
To: Roland Dowdeswell <elric@imrryr.org>
From: Daniel Carosone <dan@geek.com.au>
List: tech-userlevel
Date: 05/08/2005 08:25:19
--vH3HHxf962mwD/qo
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sat, May 07, 2005 at 11:22:57AM -0400, Roland Dowdeswell wrote:
> The language describing the PAM keywords is rather confusing, so
> I will construct a table of how [our] PAM works.  The four columns
> represent:
>=20
> 	continue:F	will continue on failure
> 	S		will continue on success
> 	can succeed	sets the ``can succeed'' flag

=2E.. *on success*

> 	force deny	sets the ``will be denied'' flag

=2E.. *on failure*

> requests which make it through the stack will succeed if both
> the ``can succeed'' flag is set and the ``force deny'' flag is
> not set.
>=20
> So, here is how I read our current set of keywords:
>=20
> keyword	continue:F	S	can succeed	force deny
> -------	----------	-	-----------	----------
> required	yes		yes	yes		yes
> requisite	no		yes	yes		yes
> sufficient	yes		yes	yes		no
> optional	yes		yes	no		no
> binding	yes		no	yes		yes

At last this makes sense to me!  Please add this to the documentation. =20

Well, almost: 'optional' seems like a NOP to me in this table, useless
unless it's there so the module can have some side-effects? What might
they be?

> Now, if we consider a module such as pam_nologin.so, none of
> those definitions make sense.  We really want something like:
>=20
> X		yes		yes	no		yes
>=20
> which is unrepresented in the table.

Yes! Yes!

(are there other unrepresented combinations that might be useful?)

> If a system administrator naively comments out pam_unix.so, then
> anyone can log into the system at any time---so we still have a
> system which can [sort of] fail open.

We have a security system where even smart, experienced security
experts are left scratching their heads and drawing truth tables and
wondering what will really happen, even if they think they've figured
it out.  That includes possibly failing open, but even if it doesn't
it is still not right.

> This, IMO, needs to be fixed.  So, we can take either one of two
> paths.  The first would be to come up with a PAM configuration
> syntax which has some semblence of sanity.  This would diverge from
> the standards which would be unfortunate.=20

It would. There are a lot of people using this syntax, sane or
otherwise.  I'd like to avoid that divergence too.

If the standards are broken beyond repair, we should diverge from them
without fear, but in doing so we should make it clear (perhaps by
using a different syntax entirely) that people used to other systems
should not expect the same behaviour here, otherwise we have a
different form of the same understanding problem.

One such change which would make it less confusing is to have two
columns for keywords, one to describe the four possible continuation
behaviours, another to describe the four possible flag-setting
behaviours.  This would also inherently eliminate the 'no keyword for
the behaviour I want' cases, like above.

For example, the meanings of 'required/necessary/sufficient/optional'
are much clearer if they're only encoding the 'can succeed/force deny'
columns, and some new keywords encode the continuation behaviour.

> The other would be to
> change the semantics of a keyword or add a keyword.
>=20
> I think that it might be a better idea to just extend the current
> syntax to include an additional keyword ``neccessary'' which would
> specifically not imply any kind of sufficiency.

Yep, I like this, within the current context/syntax.

> ``Necessary'' might be a bad choice of words, but at this point I
> think that all of the words except sufficient and optional are poor
> choices...

I agree with this entirely.  As I suggest above, there is too much
information encoded into a single english word. =20

If we are to diverge, either we split the encoding, or we make it more
explicit (less dependent on english interpretation).

Since I find your table quite helpful, I would be tempted to suggest
that we change the syntax to match the table and allow all
possibilities. Either by having four new columns in place of the
current 'keyword', two columns as above, or by defining a system of
names that encodes the table more directly than the english keywords,
and adding them as aliases alongside the current ones as a compatible
extension to the current syntax.

as a simple straw-man suggestion, a four-character ls-alike:

 c: continue      -: don't
 s: can succced   f: force deny

keyword            c:F  c:S  can succeed  force deny
-------            ---  ---  -----------  ----------
required   =3D ccsf  yes  yes  yes          yes
requisite  =3D -csf  no   yes  yes          yes
sufficient =3D ccs-  yes  yes  yes          no
optional   =3D cc--  yes  yes  no           no
binding    =3D c-sf  yes  no   yes          yes

I'm not sure this is great either, but at least I don't have to spend
several minutes thinking about the difference between 'required' and
'requisite', or 'requisite' and 'binding' each time - and worse, if
there are more keywords added, or I'm not a native English speaker.

--
Dan.
--vH3HHxf962mwD/qo
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (NetBSD)

iD8DBQFCfUBPEAVxvV4N66cRAr3zAKCGyajIfmJBMFE2eq/wxASj6DtxBwCfWAQX
sco2xHgXL8ojz55/Ff4myFA=
=IA5r
-----END PGP SIGNATURE-----

--vH3HHxf962mwD/qo--