Derby (originally Cloudscape) grew up as an embedded database with
little need to protect users from themselves. Over time, many opt-in
security features were added to Derby. For backward compatibility
reasons, these features default to being turned off. Consequently, Derby
is not a secure piece of software out of the box. In addition, it is
easy to forget to turn on all relevant opt-in security mechanisms.
Fifteen years after initial development started on this codeline, Derby
has survived into a world which is hyper-sensitive about computer
security. With alarming regularity we read how compromised personal data
leaves millions of people exposed to identity theft and other abuses.
Often these breaches result from chaining together the vulnerabilities
in many products. I am worried that one day Derby will appear in the
news as one of the products in a high-profile vulnerability chain.
I would like to discuss what it would take to make Derby secure by
default. Hopefully the community can broadly support this goal. It seems
to me that we need to explore at least two important topics:
1) What additional work needs to be done to make Derby secure by default?
2) How do we reconcile these behavioral changes with our backward
compatibility guarantees?
One approach to topic (2) would be the following:
2a) Finish up the items in (1) as opt-in features like our other
security mechanisms. We could add these features over the next (couple)
10.x release(s).
2b) When we have finished that list, produce an 11.0 release which is
not backward compatible. In 11.0, most security mechanisms would default
to being on and users would have to explicitly opt-out of security features.
2c) To ease the migration to 11.0, it might be possible to add a single
knob which lets an application opt-out of the 11.0 defaults and instead
run with the 10.x security defaults.
Concerning topic (1), it seems to me that the biggest hurdle to building
a secure-by-default Derby is our lack of user management. The BUILTIN
security mechanism has many defects which make it unsuitable for use in
production. Here is my short list of security features which I think
that we should build:
o DERBY-866: Derby User Management Enhancements
o DERBY-2133: Detect tampering of installed jar files in an encrypted
database
o DERBY-2206/DERBY-2250/DERBY-2253/DERBY-2252: Provide complete security
model for Java routines
o DERBY-2363: Add initial handshake on connection setup to determine
server's required ssl support level and avoid client side attribute
settings.
o DERBY-2436: SYSCS_IMPORT_TABLE can be used to read derby files
o DERBY-2470: No authentication required to restore a backup
o DERBY-3333: User name corresponding to authentication identifier
PUBLIC must be rejected
o DERBY-3495/DERBY-3476/DERBY-2109: Enable System Privileges checks
o DERBY-4354: Make it possible to grant java permissions to user jar
files that are stored in the database
o DERBY-5400: Toggling of network tracing should be protected by
requiring the user to specify the credentials of the system administrator.
o DERBY-5401: The NetServlet should require system administrator
credentials in order to perform its operations on a server which
requires authentication.
I would appreciate your thoughts about this proposal.
Thanks,
-Rick