Author: adrianc
Date: Thu Jan 14 03:23:33 2010
New Revision: 899045
URL: http://svn.apache.org/viewvc?rev=899045&view=rev
Log:
Added security audit capability.
Added:
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java
(with props)
Modified:
ofbiz/branches/executioncontext20091231/BranchReadMe.txt
ofbiz/branches/executioncontext20091231/framework/api/config/api.properties
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
ofbiz/branches/executioncontext20091231/framework/security/entitydef/entitymodel.xml
Modified: ofbiz/branches/executioncontext20091231/BranchReadMe.txt
URL:
http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/BranchReadMe.txt?rev=899045&r1=899044&r2=899045&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/BranchReadMe.txt (original)
+++ ofbiz/branches/executioncontext20091231/BranchReadMe.txt Thu Jan 14
03:23:33 2010
@@ -12,6 +12,11 @@
The exception that is thrown exposes a flaw in the
findparty.ftl file.
+I added security audit capability. This was not in the
+design document, but it was simple to implement and might be
+useful. An artifact can be flagged as audited. Any denied
+attempts to use the artifact will be logged.
+
---------------------------------------------------
2010-01-11: The ExecutionContext implementation is fairly complete.
Modified:
ofbiz/branches/executioncontext20091231/framework/api/config/api.properties
URL:
http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/api/config/api.properties?rev=899045&r1=899044&r2=899045&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/api/config/api.properties
(original)
+++ ofbiz/branches/executioncontext20091231/framework/api/config/api.properties
Thu Jan 14 03:23:33 2010
@@ -21,12 +21,15 @@
# Apache OFBiz Framework API Settings
####
-# Class name of the ExecutionContext implementation
+# Class name of the ExecutionContext implementation.
executionContext.class=org.ofbiz.context.ExecutionContextImpl
-# Class name of the AuthorizationManager implementation
+# Class name of the AuthorizationManager implementation.
authorizationManager.class=org.ofbiz.context.AuthorizationManagerImpl
+# Enable security auditing.
+securityAudit.enabled=false
+
#-- The following properties are for development only, they will be removed
#-- when the security-aware artifact implementation is complete.
Modified:
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
URL:
http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java?rev=899045&r1=899044&r2=899045&view=diff
==============================================================================
---
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
(original)
+++
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
Thu Jan 14 03:23:33 2010
@@ -44,6 +44,10 @@
public static final String module = AccessControllerImpl.class.getName();
+ protected static boolean securityAuditEnabled() {
+ return "true".equals(UtilProperties.getPropertyValue("api.properties",
"securityAudit.enabled"));
+ }
+
/**
* The root node of the current user's permission tree.
*/
@@ -151,6 +155,9 @@
if (gatheredPermissions.implies(permission) &&
this.hasServicePermission(gatheredPermissions)) {
return;
}
+ if (securityAuditEnabled()) {
+ AuthorizationManagerImpl.logIncident(permission);
+ }
throw new
AccessControlException(ThreadContext.getUserLogin().getString("userLoginId") +
"@" + artifactPath + "[" + permission + "]");
}
Added:
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java
URL:
http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java?rev=899045&view=auto
==============================================================================
---
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java
(added)
+++
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java
Thu Jan 14 03:23:33 2010
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+package org.ofbiz.context;
+
+import org.ofbiz.context.PathNode.BranchNode;
+import org.ofbiz.api.context.ArtifactPath;
+
+public class AuditedArtifactFinder extends TreeWalker {
+
+ protected boolean artifactFound = false;
+
+ public AuditedArtifactFinder(PathNode node) {
+ super(node);
+ }
+
+ public boolean find(ArtifactPath artifactPath) {
+ this.artifactFound = false;
+ super.walkTree(artifactPath);
+ return this.artifactFound;
+ }
+
+ @Override
+ public void visit(BranchNode node) {
+ if (!this.artifactPath.hasNext()) {
+ this.artifactFound = true;
+ return;
+ }
+ super.visit(node);
+ }
+
+ @Override
+ protected void visitChildNode(PathNode node, String key) {
+ if (!this.artifactFound) {
+ super.visitChildNode(node, key);
+ }
+ }
+}
Propchange:
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java
------------------------------------------------------------------------------
svn:keywords = Date Rev Author URL Id
Propchange:
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuditedArtifactFinder.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
URL:
http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java?rev=899045&r1=899044&r2=899045&view=diff
==============================================================================
---
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
(original)
+++
ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
Thu Jan 14 03:23:33 2010
@@ -18,7 +18,9 @@
*******************************************************************************/
package org.ofbiz.context;
+import java.security.AccessControlException;
import java.security.Permission;
+import java.sql.Timestamp;
import java.util.List;
import org.ofbiz.api.authorization.AccessController;
@@ -26,12 +28,14 @@
import org.ofbiz.api.authorization.AuthorizationManagerException;
import org.ofbiz.api.authorization.BasicPermissions;
import org.ofbiz.api.context.ArtifactPath;
+import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.cache.UtilCache;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.security.OFBizSecurity;
import org.ofbiz.service.ThreadContext;
@@ -75,6 +79,30 @@
return accessController;
}
+ public static void logIncident(Permission permission) throws
AccessControlException {
+ try {
+ ThreadContext.runUnprotected();
+ PathNode node = PathNode.getInstance(ArtifactPath.PATH_ROOT);
+ TreeBuilder builder = new TreeBuilder(node);
+ Delegator delegator = ThreadContext.getDelegator();
+ List<GenericValue> auditedArtifacts =
EntityUtil.filterByDate(delegator.findList("AuditedArtifact", null, null, null,
null, true));
+ for (GenericValue auditedArtifact : auditedArtifacts) {
+ builder.build(new
ArtifactPath(auditedArtifact.getString("artifactPath")));
+ }
+ AuditedArtifactFinder finder = new AuditedArtifactFinder(node);
+ if (finder.find(ThreadContext.getExecutionPath())) {
+ Timestamp currentTime = new
Timestamp(System.currentTimeMillis());
+ String userLoginId =
ThreadContext.getUserLogin().getString("userLoginId");
+ GenericValue auditValue =
delegator.makeValidValue("SecurityAuditLog", UtilMisc.toMap("userLoginId",
userLoginId, "artifactPath", ThreadContext.getExecutionPathAsString(),
"incidentDate", currentTime, "requestedAccess", permission.toString()));
+ auditValue.create();
+ }
+ } catch (GenericEntityException e) {
+ throw new AccessControlException(e.getMessage());
+ } finally {
+ ThreadContext.endRunUnprotected();
+ }
+ }
+
protected static void processGroupPermissions(String groupId, PathNode
node, Delegator delegator) throws AuthorizationManagerException {
try {
// Process this group's memberships first
Modified:
ofbiz/branches/executioncontext20091231/framework/security/entitydef/entitymodel.xml
URL:
http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/security/entitydef/entitymodel.xml?rev=899045&r1=899044&r2=899045&view=diff
==============================================================================
---
ofbiz/branches/executioncontext20091231/framework/security/entitydef/entitymodel.xml
(original)
+++
ofbiz/branches/executioncontext20091231/framework/security/entitydef/entitymodel.xml
Thu Jan 14 03:23:33 2010
@@ -358,4 +358,28 @@
</relation>
</entity>
+ <entity entity-name="AuditedArtifact"
+ package-name="org.ofbiz.security.artifactsecurity"
+ default-resource-name="SecurityEntityLabels"
+ title="Security Component - Audited Artifact Entity">
+ <field name="artifactPath" type="id-vlong-ne"/>
+ <field name="fromDate" type="date-time"></field>
+ <field name="thruDate" type="date-time"></field>
+ <!-- Maybe add a temporal expression ID field so audits can be scheduled
-->
+ <prim-key field="artifactPath"/>
+ </entity>
+
+ <entity entity-name="SecurityAuditLog"
+ package-name="org.ofbiz.security.artifactsecurity"
+ default-resource-name="SecurityEntityLabels"
+ title="Security Component - Security Audit Log Entity">
+ <field name="userLoginId" type="id-vlong-ne"></field>
+ <field name="artifactPath" type="id-vlong-ne"/>
+ <field name="incidentDate" type="date-time"></field>
+ <field name="requestedAccess" type="description"/>
+ <prim-key field="userLoginId"/>
+ <prim-key field="artifactPath"/>
+ <prim-key field="incidentDate"/>
+ </entity>
+
</entitymodel>