[ http://issues.apache.org/jira/browse/DERBY-928?page=all ]

Sunitha Kambhampati updated DERBY-928:
--------------------------------------

    Attachment: Derby928.diff.txt
                Derby928.stat.txt

This patch(Derby928.diff.txt) includes the following changes:

1. Adds a new property derby.drda.securityMechanism. This property can take in 
the following valid values
USER_ONLY_SECURITY, 
CLEAR_TEXT_PASSWORD_SECURITY,ENCRYPTED_USER_AND_PASSWORD_SECURITY.

The secmec value mapping of these values is as follows:
USER_ONLY_SECURITY maps to USRIDONL
CLEAR_TEXT_PASSWORD_SECURITY mapts to USRIDPWD
ENCRYPTED_USER_AND_PASSWORD_SECURITY to EUSRIDPWD

Changes for this in Property.java to add the property name. 
Added get and set methods to NetworkServerControlImpl, add a new variable 
allowOnlySecurityMechanism to store the secmec (int value) that is mapped from 
the string value set by this property.  This value is initialized to -1 to 
represent either an invalid value or a case where the value is not set. 
An error is thrown when starting the server if this value is not set correctly. 

2.When server sees ACCSEC command,  and if this property is set, then the 
server will check if the secmec value requested by client is the same security 
mechanism set by this property. If yes, then an appropriate reply data is 
generated for the requested security mechanism, else the server will return 
just the security mechanism set by this property to represent the security 
mechanisms that the server supports/accepts. 
Modified code in following methods in DRDAConnThread

client sends ACCSEC with a SECMEC value indicating the security mechanism to 
use. Server parses the ACCSEC command in parseACCSEC method and reads the 
SECMEC value

parseACCSEC:
When server reads the SECMEC value from the client, the following check is 
added.
 -- check if the derby.drda.securityMechanism property has been set.
        A)if property is set,  then check if the client sent secmec value is 
the same as this property value. If so, then continue with the processing of 
that security mechanism.
        B)if property is set and property value is not same as the client sent 
secmec value, then set the security checkcode to 
CodePoint.SECCHKCD_NOTSUPPORTED. This will be sent across to the client on a 
ACCSECRD.
        
 -- If the derby.drda.securityMechanism has not been set, in that case the 
server does the processing as before.
(Note: since an if condition was added because of the check in #A, the previous 
code that did the processing of various security mechanisms show up in the diff 
but that code has not been changed
except for the increased indentation as a result of the code being put in an 
else clause)

writeACCSECRD
--  in case B in parseACCSEC, if security check code is SECCHKCD_NOTSUPPORTED 
and if the derby.drda.securityMechanism property has been set, then the secmec 
value that the server supports will be sent to the client. 

Note: there is another jira entry 926 - protocol error when sending invalid 
security mechanism. This is because per the DDM manual, the response in 
ACCSECRD should be of form SECMEC (value{value..}). We currently send 3 secmec 
codepoints instead of sending a list with the secmec codepoint. 

3. Added test case scenarios in  testSecMec.java and updated master files in 
both DerbyNet and DerbyNetClient.
- Start server with different values for derby.drda.securityMechanism and test 
with the connection urls using drivermanager and datasource. 
 
+    private static String[] derby_drda_securityMechanism = {
+            null, //not set
+            "USER_ONLY_SECURITY",
+            "CLEAR_TEXT_PASSWORD_SECURITY",
+            "ENCRYPTED_USER_AND_PASSWORD_SECURITY",
+            "INVALID_VALUE",
+            ""
+    };

Note: the code changes include putting the entire testSecMec test in a loop to 
test with the different derby.drda.securityMechanism value.  Because of the 
addition of the loop, the indentation of the original test in the main method 
changed and hence the diff shows up. 
Only change was to catch the exception on starting the server for invalid 
values of derby.drda.securityMechanism.

I ran derbyall on sun jdk142 with classes on win2k OK. wisconsin test failed 
but I think that is not related to my changes. 
I have run the testSecMec.java test with ibm142, jdk142, jdk15 in both DerbyNet 
and DerbyNetClient frameworks ok.

M      java\engine\org\apache\derby\iapi\reference\Property.java
M      java\drda\org\apache\derby\impl\drda\NetworkServerControlImpl.java
M      java\drda\org\apache\derby\impl\drda\DRDAConnThread.java
M      
java\testing\org\apache\derbyTesting\functionTests\tests\derbynet\testSecMec.java
M      
java\testing\org\apache\derbyTesting\functionTests\master\DerbyNet\testSecMec.out
M      
java\testing\org\apache\derbyTesting\functionTests\master\DerbyNetClient\testSecMec.out

4. In case of the tests, the test wont be able to run in the remote host 
environment, because it requires the server to be restarted with the different 
values, whereas in remote host testing - the server is only started once 
separately from the test harness. I'll look more and see if there is a way to 
restart the server on remote host and if so address it as a followup patch 

-------------

Currently we are not testing valid encrypted userid and password security 
mechanisms in our tests because the encryption algorithm needed by drda will 
not work with Sun JCE , will only work with the IBM JCE. It would be nice to 
add valid cases for encrypted userid password for atleast ibm jce, which I will 
try to address as a followon patch. I did test valid cases with encrypted 
userid and password using sample program with the ibm jce and it works ok.

I'd appreciate it if someone can review these changes. Thanks.

> Add ability to network server to accept connections with a certain security 
> mechanism.
> --------------------------------------------------------------------------------------
>
>          Key: DERBY-928
>          URL: http://issues.apache.org/jira/browse/DERBY-928
>      Project: Derby
>         Type: New Feature
>   Components: Network Server
>     Reporter: Sunitha Kambhampati
>     Assignee: Sunitha Kambhampati
>      Fix For: 10.2.0.0
>  Attachments: Derby928.diff.txt, Derby928.stat.txt
>
> Currently the network server has support for the following security mechanisms
> 1) USRIDONL (userid only),
> 2) USRIDPWD (clear text userid and password),
> 3) EUSRIDPWD (encrypted userid and password).
> Thus the #3 encrypted userid and password security mechanism is secure with 
> respect to the userid/password sent across the wire.  Currently there is no 
> way to setup the network server to ensure that it accepts connections coming 
> in at a certain security mechanism.   It seems reasonable & useful to have a 
> server want to accept connections from clients with a particular security 
> mechanism (e.g  lets say encrypted userid/password and reject usridpwd ie 
> clear text userid and password)
> This jira will add support for this by adding a property to enable the server 
> to be able to accept connections from clients with a certain security 
> mechanism.
> --------------------
> I actually couldnt find if a rank was given to the security mechanisms in the 
> drda spec.  If it were so, then maybe a property for setting the minimum 
> security mechanism accepted by the server would be appropriate.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to