When deploying nodes in a Djinn, how do you currently manage your
security policies? How secure is your environment?
Java can use URL based policies, but this is subject to spoof attacks
and the URL cannot change without reconfiguring clients.
Currently the way the Java policy system works by reading in (parsing)
policy files, with the local policy provider.
Java policy's are permissive, which means you start with only the jre
and extensions having permissions, you then grant permission by
CodeSource, Certificates and Principals in policy files.
Once security is relaxed, to tighten it requires a restart, impractical
for a distributed environment, in reality it's designed for a local jvm.
A security policy service could be used by a codebase admin to restrict
download permissions. An admin might also like to be able to put a
limit on download size to avoid DOS and Domain spoofing attacks. In
addition a ClassLoadingPermission would be useful to restrict class
loading of CodeSource's to those signed with approved Certificates of
trusted developers or partners. The admin might also determine what
GrantPermission's can be made by different Principals.
Requirements of a distributed Security Policy Service:
1. The security policy's need to be manageable in one location for
administrators managing a number of nodes.
2. There may be several security policy services in a single djinn,
belonging to different cooperating entities, more than one
administrator http://nighthacks.com/roller/jag/resource/Fallacies.html
3. All nodes belonging to an entity are configured to lookup the
security service based on identity with secure InvocationConstraints.
4. Nodes are configured to register with a SecurityPolicy service
that can authenticate with an administrator subject.
5. Nodes retrieve a current policy from the SecurityPolicy service
6. The SecurityPolicy service notifies with a RemoteEvent when the
security policy has been updated.
7. Nodes update their security policies when notified of change.
8. Security policies must be idempotent, when a change is made to the
policy, clients must update the entire policy, they cannot make
incremental sequenced or ordered changes.
9. The SecurityPolicy service can only provide policy advise based on
CodeSource, Certificate's and Principals. They cannot make proxy
trust decisions or provide policy advise for Proxy's (ClassLoader
based dynamic permission grants), other than GrantPermission's
which are those that a local Subject has permission to grant to
proxy's.
10. Client nodes must update their security policy without shutting
down, a restart would cause all clients to do so at the same time
which creates issues with multicast packet storms, so the policy
must be capable of removing grants absent from the updated policy
without restarting.
11. A SecurityPolicy service would supplement the existing dynamic
grants used for Proxy's, it's important to realise that dynamic
proxy permission grants are a local concern and are granted to the
proxy's ClassLoader. Cleaning of grants deleted from the policy
made by the SecurityPolicy service must not remove dynamic grants
made to proxy's.
One important thing to remember regarding policy updates, some
permission grants even though they have been removed (depending on the
type of permission granted) fundamentally allow references to escape
after a security check is made, so once a reference to a security
sensitive object has been released, the SecurityManager has no further
control over it. DelegatePermission's and Delegate's are intended to
address this issue, using Li Gong's method guard pattern (Li Gong:
Inside Java 2 Platform Security, 2nd Edition, Page 176, 2nd last
paragraph ISBN: 0201787911). Programming with method guards in this
fashion also eliminates references escaping, making it easier to audit
code for security. To do so without degrading performance requires the
new InternetSecurityManager and DynamicConcurrentPolicyProvider
currently under development.
I'm also contemplating the possibility of a LoginModule service.
Cheers,
Peter.