[
https://issues.apache.org/jira/browse/CXF-5118?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14089297#comment-14089297
]
Piotr Klimczak commented on CXF-5118:
-------------------------------------
I think that the perfect solution we are looking for is:
0. Simple
0. Clean
0. Descriptive
0. Secure
1. Provides ability to reauthenticate to get roles from JAAS Module without
password, then let the further work be done in security context
2. Provides ability to reauthenticate to get roles from JAAS Module using
technical password, then let the further work be done in security context
3. Provides ability to reauthenticate to get roles from JAAS Module using user
mapped password, then let the further work be done in security context
4. Provides ability to getroles from somewhere, to bypass invoking JAAS Login
modue, then let the further work be done in security context
5. Provides ability to chose which credentials/authentication method is more
important (if more than one supplied, which is easy to imagine), then let the
further work be done in security context
Question here: Am I missing some required functionality?
If yes, then please add them to the list (kind of check list).
All zeros ("0.") are most important, but also subjective so probably there will
be always small differences here between us.
But those 1. to 5. are simply functional requrements which are simply provided
by our solution or not.
*IN REFERENCE TO:*
https://github.com/cschneider/cxf/commit/bc436011e99084b5e2f1165b70aa4cf028a49a1a
With this solution requirements 1. to 3. it will work perfectly.
There are gaps for requirements 4. and 5.
Also number of introduced types is increasing.
Solving functional gaps will probably make JAASLoginInterceptor even more
complex and possibly even more types will be introduced OR simply we will give
up with implementing them.
(I am terribly sorry for punctiations. I do really like your code, I do really
like you, I do agree with you in lot of places, but after 4 evaluations of
code, I simply think that JAASLoginModule should not do TLS stuff because of
increasing complexity).
*GAPS*
*Requirement 4* seems to not work at all.
Requirement 4. is very important for high secure environments. Take a look at
my example scenario here:
https://issues.apache.org/jira/browse/CXF-5118?focusedCommentId=14086222&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14086222
*Requirement 5* has security problem/limitation.
Simply because amending JAASLoginInterceptor to do TLS stuff instead of
creating new interceptor. That is because one JAASLoginInterceptor can use only
one JAAS context (Login Module) at same time.
So if you want to use let's say JAAS context (Login Module) that works with
technical password for all users, then it will not let you work with user
specified password in parallel.
Scenario for this is as follow:
Let's say there is an application that let the user to login using
login/password or private key/certificate and it is up to user which he chose.
So in this scenario technical certificate might be used just to setup mutually
trusted connection and then user supplied credentials could be used to find
user roles from JAAS Login module. In parallel very same service is used to
authenticate users using personal certificate only.
The above scenario will only work with separate interceptor unless we want to
change JAASLoginModule to support 2 different Login Module in parallel but I do
not think so.
*IN REFERENCE TO*:
https://github.com/PiotrKlimczak/cxf/commit/683c575f451406bd304640e3973aecb9a1651acc
Will work for requirements 1. to 4.
*GAPS*
*Requirement 5* will work with 50% scenarios.
If user will use just TLSAuthenticationInterceptor WITH OUT
JAASLoginInterceptor, then user will be able to decide as have to write login
logic.
But if user will decide to use TLSAuthenticationInterceptor altogether with
JAASLoginInterceptor, then will not be able to figure out which authentication
is more important. Simply when TLS Auth is done and user additionally will
provide HTTP Authentication credentials, then those from HTTP Auth will be
considered to be more important, overwriting security context created by
TLSAuthenticationInterceptor.
But as an advantage would be that user can use two different JAAS Login Modules.
*Additionally:*
The problem is, that once we decide to amend JAASLoginInterceptor to handle
certificates, it will be difficult to make it a separate interceptor in future.
Simply because it will be incompatible change. So once we decide to amend
JAASLoginInterceptor, we will problably stay with it. And we will always be
forced to look for compromises between complexity and functionality instead of
being free. Unless we want to force our users to do some kind of migration from
JAASLoginInterceptor to new one somewhere in the future.
Please consider it when making a decision whether we should create new
Interceptor or reuse existing one.
Even if both of them have something to do with JAAS.
*Small update to code*
I also added some helper method to let the user do some JAAS login stuff easier.
Take a look at pull request in github.
So now user provided implementation for tech password od password less
authentication in JAAS (if user need this) may look like this:
{code}
public class MySecuritySubjectProvider extends TLSSecuritySubjectProvider {
private String techPassword;
private String contextName;
@Override
Subject getSubject(String userName, X509Certificate certificate) throws
SecurityException {
CallbackHandler handler = new NamePasswordCallbackHandler(name,
techPassword);
return login(contextName, handler);
}
}
{code}
I can also add 2 additional properties to TLSAuthenticationInterceptor, like:
jaasLoginContextName
defaultPassword
And then change the default impl. of TLSSecuritySubjectProvider to handle them
and if provided to do JAAS reauthenticatioin stuff without forcing the user to
code anything.
But not sure about that.
Just in case you want to.
Please correct me where I am wrong.
Hope you find it well.
Sorry for such a long story here.
> Create CXF interceptor which will use HTTPS client certificates to create
> JAAS SecurityContext
> -----------------------------------------------------------------------------------------------
>
> Key: CXF-5118
> URL: https://issues.apache.org/jira/browse/CXF-5118
> Project: CXF
> Issue Type: New Feature
> Components: Core
> Reporter: Sergey Beryozkin
> Assignee: Christian Schneider
>
> Use case:
> The user authenticates against the webservice using an X509 client
> certificate. In case of successful authentication the JAAS security context
> should be populated with a Subject that stores the user name and the roles of
> the user. This is necessary to support Authorization at a later stage.
> Design ideas
> The SSL transport will be configured to only accept certain client
> certificates. So we can assume that the interceptor does not have to do a
> real authentication. Instead it has to map from the subjectDN of the
> certificate to the user name and then lookup the roles of that user. Both
> then has to be stored in the subject's principles.
> The mapping could be done inside a JAASLoginModule or before. Inside will
> give the user more flexibility.
> The next step to retrieve the roles should be done in one of the standard
> JAASLoginModules as the source of the roles can be quite diverse. So for
> example the LdapLoginModule allows to retrieve the roles from Ldap. At the
> moment these modules require the password of the user though which is not
> available when doing a cert based auth.
> So I see two variants to retrieve the roles:
> 1. Change the loginmodules like the LDAP one to be configureable to use a
> fixed ldap user for the ldap connect and not require the user password. So
> the module would have two modes: a) normal authentication and group gathering
> b) use a fixed user to just retrieve roles for a given user
> 2. Store the user password somewhere (e.g. in the mapping file). In this case
> the existing LDAPLoginModule could be used but the user password would be
> openly in a text file
> 3. Create new LoginModules with the desired behaviour (fixed user and only
> lookup of roles)
--
This message was sent by Atlassian JIRA
(v6.2#6252)