[ 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)