[
https://issues.apache.org/jira/browse/DERBY-2109?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12560512#action_12560512
]
Rick Hillegas commented on DERBY-2109:
--------------------------------------
I would like to share some thoughts about the case-sensitivity of
DatabasePrincipals. It seems to me that there are at least three concepts of
identity in play here:
1) UserName - This is what is passed to the authentication service as part of
credentials checking.
2) AuthorizationID - This is the owner of a schema and the grantor and grantee
of fine-grained SQL privileges via the GRANT/REVOKE commands
3) DatabasePrincipal - This is the recipient of shutdown and createDatabase
privileges
UserName and AuthorizationID are not the same thing. Unfortunately, the spec
attached to this issue says that they are the same thing. That's just a mistake
and it needs to be cleaned up.
To illustrate the difference between UserNames and AuthorizationIDs, consider
the following: From the point of view of the authentication service, the
following are all distinct UserNames:
Edward
EdWard
EDWARD
"Edward"
"EdWard"
These, however, map to only 3 distinct AuthorizationIDs:
Edward = EdWard = EDWARD
"Edward"
"EdWard"
The practical consequence of this is that Edward and EdWard will authenticate
with different credentials but will be thrown into the same schema and will be
able to view and edit one another's data. That is, the following two connection
URLs authenticate with different credentials but are thrown into the same
schema and are treated by GRANT/REVOKE as the same person:
connect 'jdbc:derby:mydb;user=Edward;password=EdwardPassword';
connect 'jdbc:derby:mydb;user=EdWard;password=EdWardPassword';
Derby's solution to this problem is to tell the customer that they need to add
two new users to their authentication system: "Edward" and "EdWard" so that
Derby can disambiguate these users. This is frustrating to customers who want
to integrate Derby applications into company-wide processes which rely on a
single, organization-wide authentication scheme.
I suspect that this behavior goes back to the introduction of CREATE SCHEMA
long before Derby was open-sourced.
I think it would be unfortunate if we added yet another concept of identity. So
it makes sense to me that a DatabasePrincipal represents either a UserName or
an AuthorizationID. But which one?
AuthorizationID seems like a good fit once you are operating inside a database.
I have reservations about using it at the system-wide level where there are no
schemas or GRANT/REVOKE privileges.
I also have misgivings about the following scenario:
A) There is a system administrator with UserName Edward.
B) Many applications run in the system, including a Payroll application which
has a user named EdWard.
C) I want to grant shutdown privilege to Edward but not to EdWard.
I am wondering whether we should abandon the idea of using the policy file to
control database-specific privileges (other than createDatabase itself). This
would mean that in the future we plan to use GRANT/REVOKE extensions to manage
privileges once you are inside a database. The policy file would then only be
used for system-wide privileges where you do not have a database context. If we
went down this path, then we would get rid of the @ syntax and many of the
escaping cases which are proving to be so confusing. In this world, a
DatabasePrincipal would correspond to a system-wide UserName.
> System privileges
> -----------------
>
> Key: DERBY-2109
> URL: https://issues.apache.org/jira/browse/DERBY-2109
> Project: Derby
> Issue Type: New Feature
> Components: Security
> Affects Versions: 10.3.1.4
> Reporter: Rick Hillegas
> Assignee: Martin Zaun
> Attachments: DERBY-2109-02.diff, DERBY-2109-02.stat,
> derby-2109-03-javadoc-see-tags.diff, DERBY-2109-04.diff, DERBY-2109-04.stat,
> DERBY-2109-05and06.diff, DERBY-2109-05and06.stat, DERBY-2109-07.diff,
> DERBY-2109-07.stat, DERBY-2109-08.diff, DERBY-2109-08.stat,
> DERBY-2109-08_addendum.diff, DERBY-2109-08_addendum.stat,
> SystemPrivilegesBehaviour.html, systemPrivs.html, systemPrivs.html,
> systemPrivs.html, systemPrivs.html
>
>
> Add mechanisms for controlling system-level privileges in Derby. See the
> related email discussion at
> http://article.gmane.org/gmane.comp.apache.db.derby.devel/33151.
> The 10.2 GRANT/REVOKE work was a big step forward in making Derby more
> secure in a client/server configuration. I'd like to plug more client/server
> security holes in 10.3. In particular, I'd like to focus on authorization
> issues which the ANSI spec doesn't address.
> Here are the important issues which came out of the email discussion.
> Missing privileges that are above the level of a single database:
> - Create Database
> - Shutdown all databases
> - Shutdown System
> Missing privileges specific to a particular database:
> - Shutdown that Database
> - Encrypt that database
> - Upgrade database
> - Create (in that Database) Java Plugins (currently Functions/Procedures,
> but someday Aggregates and VTIs)
> Note that 10.2 gave us GRANT/REVOKE control over the following
> database-specific issues, via granting execute privilege to system
> procedures:
> Jar Handling
> Backup Routines
> Admin Routines
> Import/Export
> Property Handling
> Check Table
> In addition, since 10.0, the privilege of connecting to a database has been
> controlled by two properties (derby.database.fullAccessUsers and
> derby.database.defaultConnectionMode) as described in the security section of
> the Developer's Guide (see
> http://db.apache.org/derby/docs/10.2/devguide/cdevcsecure865818.html).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.