/* * 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.apache.ranger.authorization.hbase; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ranger.audit.model.AuthzAuditEvent; import org.apache.ranger.plugin.audit.RangerDefaultAuditHandler; import org.apache.ranger.plugin.policyengine.RangerAccessResult; public class HbaseAuditHandlerImpl extends RangerDefaultAuditHandler implements HbaseAuditHandler { private static final Log LOG = LogFactory.getLog(HbaseAuditHandlerImpl.class); static final List<AuthzAuditEvent> _EmptyList = new ArrayList<AuthzAuditEvent>(); final List<AuthzAuditEvent> _allEvents = new ArrayList<AuthzAuditEvent>(); // we replace its contents anytime new audit events are generated. AuthzAuditEvent _mostRecentEvent = null; boolean _superUserOverride = false; @Override public AuthzAuditEvent getAuthzEvents(RangerAccessResult result) { if(LOG.isDebugEnabled()) { LOG.debug("==> HbaseAuditHandlerImpl.getAuthzEvents(" + result + ")"); } AuthzAuditEvent event = super.getAuthzEvents(result); // first accumulate last set of events and then capture these as the most recent ones if (_mostRecentEvent != null) { LOG.debug("getAuthzEvents: got one event from default audit handler"); _allEvents.add(_mostRecentEvent); } else { LOG.debug("getAuthzEvents: no event produced by default audit handler"); } _mostRecentEvent = event; if(LOG.isDebugEnabled()) { LOG.debug("==> getAuthzEvents: mostRecentEvent:" + _mostRecentEvent); } // We return null because we don't want default audit handler to audit anything! if(LOG.isDebugEnabled()) { LOG.debug("<== HbaseAuditHandlerImpl.getAuthzEvents(" + result + "): null"); } return null; } @Override public List<AuthzAuditEvent> getCapturedEvents() { if(LOG.isDebugEnabled()) { LOG.debug("==> HbaseAuditHandlerImpl.getCapturedEvents()"); } // construct a new collection since we don't want to lose track of which were the most recent events; List<AuthzAuditEvent> result = new ArrayList<AuthzAuditEvent>(_allEvents); if (_mostRecentEvent != null) { result.add(_mostRecentEvent); } applySuperUserOverride(result); if(LOG.isDebugEnabled()) { LOG.debug("<== HbaseAuditHandlerImpl.getAuthzEvents(): count[" + result.size() + "] :result : " + result); } return result; } @Override public AuthzAuditEvent getAndDiscardMostRecentEvent() { if(LOG.isDebugEnabled()) { LOG.debug("==> HbaseAuditHandlerImpl.getAndDiscardMostRecentEvent():"); } AuthzAuditEvent result = _mostRecentEvent; applySuperUserOverride(result); _mostRecentEvent = null; if(LOG.isDebugEnabled()) { LOG.debug("<== HbaseAuditHandlerImpl.getAndDiscardMostRecentEvent(): " + result); } return result; } @Override public void setMostRecentEvent(AuthzAuditEvent event) { if(LOG.isDebugEnabled()) { LOG.debug("==> HbaseAuditHandlerImpl.setMostRecentEvent(" + event + ")"); } _mostRecentEvent = event; if(LOG.isDebugEnabled()) { LOG.debug("<== HbaseAuditHandlerImpl.setMostRecentEvent(...)"); } } @Override public void setSuperUserOverride(boolean override) { if(LOG.isDebugEnabled()) { LOG.debug("==> HbaseAuditHandlerImpl.setSuperUserOverride(" + override + ")"); } _superUserOverride = override; if(LOG.isDebugEnabled()) { LOG.debug("<== HbaseAuditHandlerImpl.setSuperUserOverride(...)"); } } void applySuperUserOverride(List<AuthzAuditEvent> events) { if(LOG.isDebugEnabled()) { LOG.debug("==> HbaseAuditHandlerImpl.applySuperUserOverride(" + events + ")"); } for (AuthzAuditEvent event : events) { applySuperUserOverride(event); } if(LOG.isDebugEnabled()) { LOG.debug("<== HbaseAuditHandlerImpl.applySuperUserOverride(...)"); } } void applySuperUserOverride(AuthzAuditEvent event) { if(LOG.isDebugEnabled()) { LOG.debug("==> HbaseAuditHandlerImpl.applySuperUserOverride(" + event + ")"); } if (event != null && _superUserOverride) { event.setAccessResult((short) 1); event.setPolicyId(-1); } if(LOG.isDebugEnabled()) { LOG.debug("<== HbaseAuditHandlerImpl.applySuperUserOverride(...)"); } } }