 ------
 Introduction
 ------
 Maria Odea Ching
 ------
 2013-07-22
 ------

 ~~ 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.

 ~~ NOTE: For help with the syntax of this file, see:
 ~~ http://maven.apache.org/doxia/references/apt-format.html


${project.name}

 Ranger is a framework to enable, monitor and manage comprehensive data security across the Hadoop platform.

 The vision with Ranger is to provide comprehensive security across the Apache Hadoop ecosystem. With the advent of  Apache YARN, the Hadoop platform can now support a true data lake architecture. Enterprises can potentially run multiple workloads, in a multi tenant environment. Data security within Hadoop needs to evolve to support multiple use cases for data access, while also providing a framework for central administration of security policies and monitoring of user access.

 Please read the {{{./faq.html}FAQs}} if you need to understand how it works over Apache Hadoop components.

* Goals Overview

   Apache Ranger has the following goals:

   * Centralized security administration to manage all security related tasks in a central UI or using REST APIs.

   * Fine grained authorization to do a specific action and/or operation with Hadoop component/tool and managed through a central administration tool

   * Standardize authorization method across all Hadoop components.

   * Enhanced support for different authorization methods - Role based access control, attribute based access control etc.

   * Centralize auditing of user access and administrative actions (security related) within all the components of Hadoop.


* Usage

  General instructions on how to use the Apache Ranger can be found on the {{{https://cwiki.apache.org/confluence/display/RANGER/Index}Wiki Page}}.

  In case you have questions regarding the Ranger' usage, please have a look at the {{{./faq.html}FAQ}} and feel
  free to contact the {{{./mail-lists.html}user mailing list}}. The posts to the mailing list are archived and could
  already contain the answer to your question as part of an older thread. Hence, it is also worth browsing/searching
  the {{{./mail-lists.html}mail archive}}.

  If you feel like the Apache Ranger is missing a feature or has a defect, you can fill a feature request or bug report in our
  {{{https://issues.apache.org/jira/browse/ranger/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary-panel}issue tracker}}. When creating a new issue, please provide a comprehensive description of your
  concern. Especially for fixing bugs it is crucial that the developers can reproduce your problem.
  
  Contributors can check out the source codefrom our
  {{{http://git.apache.org/incubator-ranger.git/}Git repository}}

* Disclaimer

   Apache RANGER is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator.
   Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, 
   communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. 
   While incubation status is not necessarily a reflection of the completeness or stability of the code, 
   it does indicate that the project has yet to be fully endorsed by the ASF.
