Magnus Prime wrote:
If I am using an embedded DB, which will have one user only able to connect, what is the best way to do this? Should I use only a boot password?
Should I use an encrypted database?

Good question - I think the answer depends on your specific requirements.

This topic is mentioned in the Developer's Guide, in the section "Configuring security in an embedded environment", e.g. at
http://db.apache.org/derby/docs/dev/devguide/tdevcsecure81850.html.

Encryption/bootPassword is well suited to restrict unauthorized startup (boot) of the database. However, if the database is already booted, this will not help you at all because only the first connection needs to provide the boot password or encryption key. So, unless you have complete control over all connections to your database at all times, I think using authentication as well is required.

Then again, database encryption is quite easy to do, and provides an additional layer of protection of your data.

My suggestion is to start with database-level user authentication and expand with database encryption and/or authorization if needed.

Better yet, when you first create the DB, you must give it a name. Now, I want to add DB level properties for users/etc and require you connect with a username/password, how does that work, since at the time of creation, those user do not exist for that db.

First, there is no authentication enabled by default. You enable authentication by setting the derby.connection.requireAuthentication property to true. If you are using Derby's built-in authentication provider you should always define at least one user before you enable authentication (important if you use database properties only).

The requireAuthentication property is static, however, so it won't take effect until you reboot the database (when defined as a database property).

So, if you are able to create the database in a secure environment:
 - create the database without authentication enabled
 - define one or more users (as database properties)
 - enable authentication (as database property)
- configure your database to ignore system properties (set the derby.database.propertiesOnly database property), otherwise system-defined properties may override the database properties.
 - restart the application and the database

If you need to authenticate the very first database boot (creation) as well, you can define a (temporary) system-level user and require authentication as system properties before booting the embedded driver, then switch to database properties only when ready.

One more thing: If you consider using SQL authorization at some point, I believe it is wise to think through which user you specify when creating the database, since that user will become the database owner [1].

There is lots of information about this in the manuals, but it is (in my opinion) not very well organized, so don't be afraid to ask questions on this list if you can't find the information you are looking for...

[1]: http://db.apache.org/derby/docs/dev/devguide/cdevcsecureDbOwner.html


--
John



Reply via email to