On 26.09.2012 03:42, Alex Rousskov wrote:
On 09/25/2012 03:19 AM, Amos Jeffries wrote:
On 25/09/2012 4:49 p.m., Alex Rousskov wrote:
On 09/24/2012 05:40 PM, Amos Jeffries wrote:
On 25.09.2012 10:06, Alex Rousskov wrote:
     I would like to add support for explicit OR ACLs:

# ACL name will match if and only if any of its acl* ACLs match.
# The first matching acl (left-to-right) stops evaluation.
acl name or acl1 acl2 ...
Any objections to this new feature?

Only to agree with Robert that exposing this functionality adds too much
difficulty to explain.

Your experience and expertise in this area exceed mine, but I have a hard time imagining a person who can understand current Squid ACLs and yet requires some kind of very difficult explanations to understand an OR ACL. What is so special about an OR ACL that makes it difficult to
explain?

We already have "acl" documented as an OR set of value to be tested.

OK, so no change here.

Plus a series of http_access allow/deny lines in a row is also an OR set.

OK, so no change here.

  Plus now an "or" type ACL.

What do you mean by "plus"? This is already covered by your first "OR
set of values to be tested" point, is not it?


Today I'm almost constantly correcting/optimizing slow configurations
like this:

 acl me src 127.0.0.1
 acl you src 127.0.0.2
 acl bob src 127.0.0.3

 http_access allow me
 http_access allow you
 http_access allow bob


We also still have complaints that Squid wont work when they configured
(only):

 acl me src 127.0.0.1
 acl you src 127.0.0.2
 acl bob src 127.0.0.3


I do not understand how either of the above two examples are relevant to
this discussion. You will continue to "correct/optimize slow
configurations" and we will "still have complaints that Squid wont work" whether we add OR ACLs or not. What we will not have is 120-rule config
where 20 rules would suffice.


IMHO, any additional explanations would be restricted to the new ACL
type, which is true for any new ACL type, and has no global
implications. It does _not_ change how one reads http_access or other
ACL rules.

That is part of the problem. This makes three ways to configure OR
operation, depending on exactly what one wants to do. Config simplicity,
power or performance.

The number of ways does not increase.

"
Sure, there are often many ways to express configuration rules. And my
  proposal will increase the number of ways some configurations can be
  written,
"

We just added one more ACL type,
which has the same overall semantics as most other existing ACL types: one of the ACL parameters has to match for the whole named ACL to match.
There is nothing really new here.

As for offering a "simplicity vs power vs performance" choice, I think
we should be excited about being able to offer such choice!


FWIW, here is how one could explain the new OR acl type in
squid.conf.documented:

         acl aclname or aclName1 aclName2 ...
             # Matches if any of the specified ACLs match
             # (evaluation stops at the first match).
             # Mismatches if all of the specified ACLs mismatch.

What is so complex about this?


As with all outwardly simple things, the problem is in context and
verbiage ...

 acl me src 127.0.0.1
 acl you src 127.0.0.2
 acl bob src 127.0.0.3

acl users or me you bob

... with "you", "me", "bob" definitions never mentioned again. Whats
wrong? how do you explain that and why it matters.

Nothing is wrong AFAICT. As you mentioned, this config can be optimized
a little at the expense of configuration clarity and simplicity, but
that is admin's choice. It is good to give admins a real choice. Most
admins do not (or should not) care about 2% extra efficiency and prefer (or should prefer) clear, easily readable, updatable, and documentable configuration files. This who need those extra 2%, ought to learn how to
optimize (or hire folks like you to help them).

This applies to hand-written and generated configuration files BTW.


... and all the wiki documentation which is going to have to go in will
be about how this differs from sequential access lines, and when you
should choose one over the other. Example cases for when it should and
should not be used. etc, etc.

Why do we suddenly require in-depth wiki tutorials for new ACL types?

Because this has stepped 'acl' directive scope from matching particular a traffic meta data. To abstracting an entire policy. If it is to be useful we need to document it for people to find easily and understand better.

Sure, there are often many ways to express configuration rules. And my
proposal will increase the number of ways some configurations can be
written, but why is that a bad thing, and do we really want to make such
explanations a precondition for feature acceptance?

We already do. A feature description page in the wiki outlining whet use-cases it is for and why/when people want to use it.



User group membership is the wrong thing to hard-code into any software configuration file. For exactly the reason you point at about botched membership updates. Remember that all these users are also recorded in
an external authentication database along with a independent group
hierarchy and set management. Most of the tools for that work far better
than Squid manual configuration ever will.

I agree that authentication ACLs are better generated from some user
database, but OR ACLs do not apply just to user authentication. I can
construct the above example using src dstdomain or other ACLs.

And, the script generating configurations can benefit from having access
to OR ACLs, just like a human config writer.


Together, these new ACLs can accomplish almost everything that Robert
specified as a long-term goal of reusable ACLs.

Do additional explanations, whatever they are, really outweigh these
benefits?


Now you are adding "AND" acls into the mix. The RFC was about OR alone I
thought.


Yes, it was. AND is just a natural next step, of course. If I can get OR without AND, I would rather have that than nothing. However, most of my arguments and examples apply or can be massaged to apply to AND ACLs as
well.


OR makes sence as acl type since all ACLs are OR sets of
values, that one just happens to be value of other ACL results.

Glad we are in agreement on that.


I understand; you want to move the entirety of the *_access line
semantics into "acl" directive.

No, I do not! I just want to allow admins to write natural, efficient, reusable configurations using basic logic building blocks. I do not want
an admin to create a 120+ rule set where 20 rules will do. There is
currently an artificial barrier in Squid ACL expressions. I want to
remove it.

But, but. That is what will happen as a direct downstream result of these additions.

AND and OR semantics move into a tree of ACL definitions. No more need for multiple ACL names on one http_access line. No more multiple allow/deny lines in a row (one 'or' ACL line does that whole listing). ==> *_access become just a list of things allowed/denied and the ordering of which action applies first. Then we make teh leaf node produce the action itself... and bye-bye *_access.



Such that one "acl" name can represent
an entire permission policy and testing procedure.

Yes, but that is not really a primary motivation behind this proposal. Natural, compact expression of configuration ideas and their reuse are.


And yes it does make a lot of sense to combine it all and drop the
*_access semantics short of allow/deny into the acl directive tree.
However, this only makes sense being explicit user-visible types IFF
both AND and OR are to be used.

I agree that if OR is added, there is little reason to resist adding
AND. However, I think this should not be used as an argument against
adding OR (and OR is valuable on its own).


NOTE: I'm mindful though of the proposals and projects already workign towards making allow/deny/authenticate/other results be retruend by ACL
tests, not just the match/non-match/async-pending tristate.

I do not think OR or AND ACLs will affect any of that because we already have to deal with ORed and ANDed ACLs, whether we allow explicit named
groupings or not.


I'm thinking the reverse. These will need re-design later for how we merge sub-ACL results when two of the list are producing different specialty actions and the grouping 'and' ACL can only return one object. Not that its a problem, just something to keep in mind for long-terms affects this is going to have on the config usability.



If we must make these types exposed to users I would at least like to avoid "or" and "and" names. In your above examples they look very out of
place.

Agreed. I just did not want to suggest that we change the overall ACL
syntax as well as add a new ACL type. I wanted to keep the proposal
focused on the essentials.


If we used them inline where one would expect booleans to be
sure, but not as prefix on a whole line of values. I'm sure we can come up with better names. "one-of"/ "any-of" / "match-one" and "all-of" / "match-all" seem to make more visual sense when plugged into your above
examples.

Using a different ACL typename is fine with me. Alternatively, we can do
this if you prefer:

    acl myAcl is acl1 or acl2 or acl3 or acl4

or

    acl myAcl = acl1 or acl2 or acl3 or acl4

This will make the expression very explicit.

True. but, I don't prefer it. KISS / Baby steps etc. Getting the type(s) available and people comfortable with them is enough for now.


No parenthesis and no "and/or" mix would be allowed on a single ACL line (for now) but this will ease transition to more flexible expressions later.


That is a slight problem and probably good cause for avoiding that syntax for now.


So, if we change the name to "any/one-of/first-of/etc" or use the "is/="
syntax above, will you be OK with adding OR ACLs?

Does 'is' mean OR or AND or IF or equals ?

Does '=' means OR or AND or assignment ?

Please consider names that provide you with easily distinguishable set of types that still match the underlying semantics. "one-of"/"all-of" at least hint at the OR/AND set semantics.


To summarise: Yes I'm okay with adding OR type. Provided the larger picture is considered when adding them.

You may as well add the AND type as well, since they only differ in match() strategy. Then you have grounds for adding a Conditional.h/cc to src/acl which defines these and any future boolean node types.

Amos

Reply via email to