.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright © 2017 AT&T Intellectual Property. All rights reserved.

Security Architecture
=====================
Communicating
-------------
When one compute process needs to communicate to another, it does so with networking.

The service side is always compute process, but the client can be of two types:
 * People (via browser, or perhaps command line tool)
 * Compute process talking to another computer process.

In larger systems, it is atypical to have just one connection, but will the call initiated by the initial actor will cause additional calls after it.  Thus, we demonstrate both a client call, and a subsequent call in the following:

Thus, the essential building blocks of any networked system is made up of a caller and any subsquent calls.

.. image:: images/SecurityArchBasic_1.svg
   	:width: 70%
	:align: center


Communicating *Securely*
------------------------
Whenever two processing entities exist that need to communicate securely, it is *essential* that 
 * The communications between the two are encrypted
 * The identities of the caller and callee are established (authentication)
 * The caller must be allowed to do what it is asking to do (authorization)


**Encryption**

Encryption is provided by HTTP/S with the TLS 1.2+ protocol. Lesser protocols can also be added, but it is highly recommended that the protocol go no lower than TLS 1.1

.. image:: images/SecurityArchBasic_TLS.svg
   	:width: 70%
	:align: center

**Establishing Identity**

*Client Side*

In order to be secure of the Server Identity, the client will:
 * Carefully select the Endpoint for the server (URL)
 * The Service side Certificate chain obtained by TLS must ultimately be signed by a Certificate Authority that is trusted.

*Server Side*

The server side is a little harder to accomplish, because, while a client can choose carefully whom he contacts, the server, ultimately, might be contacted by literally anyone.

To solve this difficult problem, the CADI Framework Filter is attached to the incoming transaction before any code by Application 1 or Application 2 is invoked. The CADI Framework does the following:
 A) Establishes the claimed Identity (this differs by Protocol)

   i) The Identity needs to be a Fully Qualified Identity (FQI), meaning it has

    #) An ID approved by Organization (such as bob)
    #) A Domain establishing where the Credential is defined (ex: @bobs.garage.com)
    #) FQI Example: bob@bobs.garage.com

 B) Validates the credential of the FQI ( *Authentication* )

   i) Basic Auth (User/Password) is validated against the system supporting the domain
   ii) AAF Certman can create a fine-grained X509 certificate, which can derive FQI
   iii) If the FQI fails the Credential test in any way, the transaction is terminated

 C) Obtain *Authorization* information

   i) This might include a call to AAF which will return all the Permissions of the User per Application Context
   ii) This might involve pulling these from Cache
   iii) This also might be pulled from Token

.. image:: images/SecurityArchCADI.svg
   	:width: 70%
	:align: center

Enabling the Client to Send Securely
------------------------------------

Once a secure scenario is in place, the client must provide more information, or he will be rejected by the secured server.

 * FQI (Fully Qualified Identity)
 * Credential
   * If User/Password, then the client must send via "BasicAuth" Protocol
   * If two-way X509 identity, then the client must load the Cert and Private Key into the Client Software outside of the calling process.
   * If Token based Identity, such as OAuth2, the token must be placed on the call in just the right way.
 * Upstream Identity
   * Application Two might well want to process Authorizations based on the *end-user*, not the current caller.  In this scenario, Application One must provide the End User FQI in addition to its own before Application Two will accept.

In order to do this efficiently, ONAP services will use the CADI Client, which includes
  * Connection Information by Configuration
  * Encryption of any sensitive information in Configuration, such as Password, so that Configuration files will have no clear-text secrets.
  * Highly scalable Endpoint information (at the very least, of AAF components)
  * The ability to propogate the Identity of originating Caller (User One) 

Obtaining Security Information
------------------------------

In order for the client and server to perform securely, the need information they can trust, including
 * TLS needs X509 Certificate for the Server and any Client wishing to authenticate using Certificates
 * Any User/Password Credentials need to be validated real time
 * The server needs comprehensible Authorization information, preferably at the Application Scope
 * The client needs to find a server, even if the server must be massively geo-scaled

The AAF Suite provides the following elements:
 * AAF Service
	This service provides fine-grained Authorization information, and can, if required, also provide specialized Passwords for Applications (that allow for configuration migrations without a maintainance window)
 * OAuth
	AAF provides Token and Introspection service, but can also delegate to Organizatinally defined OAuth Services as well.
 * Locator
	Provides machine and port information by geo-location for massively scalable services.  This is optional for ONAP services, but required for AAF as part of its reliability and scalability solution.
 * GUI
	AAF provides a GUI for managing Namespaces (for Applications), Roles, Permissions and Credentials.
 * Certificate Manager
	Since AAF has fine-grained information about Identities, it can provide Certificates with FQIs embedded.  CADI Framework understands when and how to trust these FQIs.  When used, these Certificates provide enhanced speed and additional resiliency to the system, as they do not require network connections to validate.

.. image:: images/SecurityArchAAF.svg
   	:width: 30%
	:align: center

The Organization
----------------

AAF is only a tool to reflect the Organization it is setup for.  AAF does not, for instance, know what IDs are acceptable to a particular company.  Every Organization (or Company) will also likely have its own Certificate Authority and DNS. Most importantly, each Organzation will have a hierarchy of who is responsible for any give person or application. 

 * AAF's Certman connects to the Organization's CA via SCEP protocol (Others can be created as well)
 * AAF ties into the Organizational hierarchy.  Currently, this is through a feed of IDs and relationships.
 * AAF can process some Passwords, but delegate off others based on domain.  

.. image:: images/SecurityArchAAFOrg.svg
   	:width: 70%
	:align: center

The Whole Picture
-----------------

CADI is a framework that enforces validations of Identities, and uses those Identities to obtain Authorization information for the Server.  The CADI client ensures that the right information is passed during secure connections.

AAF provides essential information based on the Organization to services in order to enable secure transactions between components.  It also provides sustaining processing capabilities to ensure that Credentials and Authorization relationships are maintained.

.. image:: images/SecurityArchFull.svg
   	:width: 90%
	:align: center


