Thanks Kalyan! I was thinking that if the cached privilege part does not appear in the requested "part", and if is "all", then we should skip that part and continue on to the next one. But maybe there is a better solution.
Colm. On Mon, Dec 18, 2017 at 4:06 PM, Kalyan Kumar Kalvagadda < kkal...@cloudera.com> wrote: > Colm, > > I will look closer into this today and see If i can help you out. > > -Kalyan > > On Mon, Dec 18, 2017 at 4:52 AM, Colm O hEigeartaigh <cohei...@apache.org> > wrote: > >> Hi, >> >> I've done some further analysis of the problem, and I think it is not >> directly related to SENTRY-1291. The problem manifests in >> CommonPrivilege.implies(privilege, model). My (cached) privilege looks >> like: >> >> Server=server1->Db=authz->Table=words->Column=*->action=select >> >> The "privilege" I want to check looks like: >> >> Server=server1->Db=authz->Table=words->action=select; >> >> The problem is in the "for" loop in CommonPrivilege.implies. It loops on >> the parts of the second privilege, and matches up to "action=select". Here >> it tries to compare to "Column=*" of the cached privilege and fails on >> this >> line: >> >> https://github.com/apache/sentry/blob/a4924edc79b26f937e3e5e >> a3584f0b4307dd4135/sentry-policy/sentry-policy-common/ >> src/main/java/org/apache/sentry/policy/common/CommonPrivilege.java#L86 >> >> It's clear there's a bug here somewhere, but I'm not sure where - can >> someone please advise? >> >> Thanks, >> >> Colm. >> >> On Wed, Dec 13, 2017 at 8:28 PM, Na Li <lina...@cloudera.com> wrote: >> >> > Sasha, >> > >> > sentry-1291 is helpful for the problem that sentry privilege checks >> takes >> > too long with many explicit grants, which is useful for big customers. >> > Another approach that can improve the performance is to organize the >> > privileges according to the authorization hierarchy in a tree >> structure, so >> > finding match in ResourceAuthorizationProvider.doHasAccess() is in the >> > order of log(N), not linear of N, where N is the number of privileges. >> > >> > We can wait for Colm to confirm his issue is caused by sentry-1291. If >> so, >> > it may be fixed by selecting privileges by finding if the requesting >> > authorization object is prefix of cached privileges instead of exact >> match. >> > >> > in SimplePrivilegeCache >> > >> > public Set<String> listPrivileges(Set<String> groups, Set<String> users, >> > ActiveRoleSet roleSet, >> > Authorizable... authorizationHierarchy) { >> > Set<String> privileges = new HashSet<>(); >> > Set<StringBuilder> authzKeys = getAuthzKeys(authorizationHier >> archy); >> > for (StringBuilder authzKey : authzKeys) { >> > if (cachedAuthzPrivileges.get(authzKey.toString()) != null) { >> > <- >> > instead of exact matching, add extension function to check if >> > authzKey.toString is the prefix of the key of the entries >> > in cachedAuthzPrivileges. >> > privileges.addAll(cachedAuthzPrivileges.get(authzKey. >> toString())); >> > } >> > } >> > >> > return privileges; >> > } >> > >> > Thanks, >> > >> > Lina >> > >> > On Wed, Dec 13, 2017 at 1:08 PM, Alexander Kolbasov <ak...@cloudera.com >> > >> > wrote: >> > >> > > I think that SENTRY-1291 should be just reverted - there are multiple >> > > issues with it and no one is actually using the fix. Anyone wants to >> do >> > it? >> > > >> > > - Alex >> > > >> > > On Wed, Dec 13, 2017 at 4:44 AM, Na Li <lina...@cloudera.com> wrote: >> > > >> > > > Colm, >> > > > >> > > > Glad you find the cause! >> > > > >> > > > You can revert Sentry-1291, and see if it works. If so, it is issue >> at >> > > > finding cached privileges. >> > > > >> > > > Cheers, >> > > > >> > > > Lina >> > > > >> > > > Sent from my iPhone >> > > > >> > > > > On Dec 13, 2017, at 4:58 AM, Colm O hEigeartaigh < >> > cohei...@apache.org> >> > > > wrote: >> > > > > >> > > > > Hi, >> > > > > >> > > > > I can see what the problem is (that the authorization hierarchy >> does >> > > not >> > > > > contain the column, and hence doesn't match against the cached >> > > > privilege), >> > > > > but I'm not sure about the best way to solve it. Either the way we >> > are >> > > > > creating the authorization hierarchy is incorrect (e.g. in >> > > > > HiveAuthzBindingHookBase) or else the way we are parsing the >> cached >> > > > > privilege is incorrect (e.g. in SimplePrivilegeCache/ >> > CommonPrivilege). >> > > > > >> > > > > Colm. >> > > > > >> > > > >> On Wed, Dec 13, 2017 at 5:57 AM, Na Li <lina...@cloudera.com> >> > wrote: >> > > > >> >> > > > >> Colm, >> > > > >> >> > > > >> I did not get chance to look into this issue today. Sorry about >> > that. >> > > > >> >> > > > >> You can add a e2e test case and set break point at where the >> > > > authorization >> > > > >> object hierarchy to a list of authorization objects, which is >> used >> > to >> > > do >> > > > >> exact match with cache >> > > > >> >> > > > >> Sent from my iPhone >> > > > >> >> > > > >>> On Dec 12, 2017, at 11:27 AM, Colm O hEigeartaigh < >> > > cohei...@apache.org >> > > > > >> > > > >> wrote: >> > > > >>> >> > > > >>> That would be great, thanks! >> > > > >>> >> > > > >>> Colm. >> > > > >>> >> > > > >>>> On Tue, Dec 12, 2017 at 4:36 PM, Na Li <lina...@cloudera.com> >> > > wrote: >> > > > >>>> >> > > > >>>> Colm, >> > > > >>>> >> > > > >>>> I suspect it is a bug in SENTRY-1291. I can take a look later >> > today. >> > > > >>>> >> > > > >>>> Thanks, >> > > > >>>> >> > > > >>>> Lina >> > > > >>>> >> > > > >>>> On Tue, Dec 12, 2017 at 4:32 AM, Colm O hEigeartaigh < >> > > > >> cohei...@apache.org> >> > > > >>>> wrote: >> > > > >>>> >> > > > >>>>> Hi all, >> > > > >>>>> >> > > > >>>>> I've updated some local testcases to work with Sentry 2.0.0 >> and >> > the >> > > > >> "v1" >> > > > >>>>> Hive binding (previously working fine using 1.8.0 and the "v2" >> > > > >> binding). >> > > > >>>>> >> > > > >>>>> I have a simple table called "words" (word STRING, count >> INT). I >> > am >> > > > >>>> making >> > > > >>>>> an SQL call as the user "bob", e.g. "SELECT * FROM words where >> > > count >> > > > == >> > > > >>>>> '100'". >> > > > >>>>> >> > > > >>>>> "bob" is in the "manager" group", which has the following >> role: >> > > > >>>>> >> > > > >>>>> select_all_role = >> > > > >>>>> Server=server1->Db=authz->Table=words->Column=*->action=sele >> ct >> > > > >>>>> >> > > > >>>>> Essentially, authorization is denied even though the policy is >> > > > correct. >> > > > >>>> If >> > > > >>>>> I look at the SimplePrivilegeCache, the cached privilege is: >> > > > >>>>> >> > > > >>>>> server=server1->db=authz->table=words->column=*=[Server= >> > > > >>>>> server1->Db=authz->Table=words->Column=*->action=select] >> > > > >>>>> >> > > > >>>>> However, when "listPrivileges" is called, the authorizable >> > > hierarchy >> > > > >>>> looks >> > > > >>>>> like: >> > > > >>>>> >> > > > >>>>> Server [name=server1] >> > > > >>>>> Database [name=authz] >> > > > >>>>> Table [name=words] >> > > > >>>>> >> > > > >>>>> There is no "column" here, and a match is not made against the >> > > cached >> > > > >>>>> privilege as a result. Is this a bug or am I missing some >> > > > configuration >> > > > >>>>> switch? >> > > > >>>>> >> > > > >>>>> Colm. >> > > > >>>>> >> > > > >>>>> >> > > > >>>>> -- >> > > > >>>>> Colm O hEigeartaigh >> > > > >>>>> >> > > > >>>>> Talend Community Coder >> > > > >>>>> http://coders.talend.com >> > > > >>>>> >> > > > >>>> >> > > > >>> >> > > > >>> >> > > > >>> >> > > > >>> -- >> > > > >>> Colm O hEigeartaigh >> > > > >>> >> > > > >>> Talend Community Coder >> > > > >>> http://coders.talend.com >> > > > >> >> > > > > >> > > > > >> > > > > >> > > > > -- >> > > > > Colm O hEigeartaigh >> > > > > >> > > > > Talend Community Coder >> > > > > http://coders.talend.com >> > > > >> > > >> > >> >> >> >> -- >> Colm O hEigeartaigh >> >> Talend Community Coder >> http://coders.talend.com >> > > -- Colm O hEigeartaigh Talend Community Coder http://coders.talend.com