aboutsummaryrefslogtreecommitdiffstats
path: root/docs/xacml/xacml-tutorial-enforcement.rst
blob: 0e8efc0d8675babbc0c6227361f78e9519282667 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
.. This work is licensed under a Creative Commons Attribution 4.0 International License.

.. _xacmltutorial-enforcement-label:

Policy XACML - Policy Enforcement Tutorial
##########################################

.. toctree::
   :maxdepth: 3

This tutorial shows how to build Policy Enforcement into your application. Please be sure to clone the
policy repositories before going through the tutorial. See :ref:`policy-development-tools-label` for details.

This tutorial can be found in the XACML PDP repository. `See the tutorial <https://github.com/onap/policy-xacml-pdp/tree/master/tutorials/tutorial-enforcement>`_

Policy Type being Enforced
**************************

For this tutorial, we will be enforcing a Policy Type that inherits from the **onap.policies.Monitoring** Policy Type. This Policy Type is
used by DCAE analytics for configuration purposes. Any inherited Policy Type is automatically supported by the XACML PDP for Decisions.

`See the latest example Policy Type <https://github.com/onap/policy-xacml-pdp/blob/master/tutorials/tutorial-enforcement/src/test/resources/MyAnalytic.yaml>`_

.. code-block:: java
  :caption: Example Policy Type

    tosca_definitions_version: tosca_simple_yaml_1_1_0
    policy_types:
       onap.policies.Monitoring:
          derived_from: tosca.policies.Root
          version: 1.0.0
          name: onap.policies.Monitoring
          description: a base policy type for all policies that govern monitoring provisioning
       onap.policies.monitoring.MyAnalytic:
          derived_from: onap.policies.Monitoring
          type_version: 1.0.0
          version: 1.0.0
          description: Example analytic
          properties:
             myProperty:
                type: string
                required: true

Example Policy
**************

`See the latest example policy <https://github.com/onap/policy-xacml-pdp/blob/master/tutorials/tutorial-enforcement/src/test/resources/MyPolicies.yaml>`_

.. code-block:: java
  :caption: Example Policy

    tosca_definitions_version: tosca_simple_yaml_1_1_0
    topology_template:
       policies:
         -
           policy1:
               type: onap.policies.monitoring.MyAnalytic
               type_version: 1.0.0
               version: 1.0.0
               name: policy1
               metadata:
                 policy-id: policy1
                 policy-version: 1.0.0
               properties:
                 myProperty: value1

Example Decision Requests and Responses
***************************************

For **onap.policies.Montoring** Policy Types, the action used will be **configure**. For **configure** actions, you can specify a resource by **policy-id** or **policy-type**. We recommend using **policy-type**, as a policy-id may not necessarily be deployed. In addition, your application should request all the available policies for your policy-type that your application should be enforcing.

.. code-block:: json
  :caption: Example Decision Request

    {
      "ONAPName": "myName",
      "ONAPComponent": "myComponent",
      "ONAPInstance": "myInstanceId",
      "requestId": "1",
      "action": "configure",
      "resource": {
          "policy-type": "onap.policies.monitoring.MyAnalytic"
      }
    }

The **configure** action will return a payload containing your full policy:

.. code-block: json
  :caption: Example Decision Response
    {
        "policies": {
            "policy1": {
                "type": "onap.policies.monitoring.MyAnalytic",
                "type_version": "1.0.0",
                "properties": {
                    "myProperty": "value1"
                },
                "name": "policy1",
                "version": "1.0.0",
                "metadata": {
                    "policy-id": "policy1",
                    "policy-version": "1.0.0"
                }
            }
        }
    }

Making Decision Call in your Application
****************************************

Your application should be able to do a RESTful API call to the XACML PDP Decision API endpoint. If you have code that does this already, then utilize that to do something similar to the following curl command:

.. code-block: bash
  :caption: Example Decision API REST Call using curl

    curl -k -u https://xacml-pdp:6969/policy/pdpx/v1/decision

If your application does not have REST http client code, you can use some common code available in the policy/common repository for doing HTTP calls.

.. code-block: java
  :caption: Policy Common REST Code Dependency

        <dependency>
            <groupId>org.onap.policy.common</groupId>
            <artifactId>policy-endpoints</artifactId>
            <version>${policy.common.version}</version>
        </dependency>

Also, if your application wants to use common code to serialize/deserialize Decision Requests and Responses, then you can include the following dependency:

.. code-block: java
  :caption: Policy Decision Request and Response Classes

        <dependency>
            <groupId>org.onap.policy.models</groupId>
            <artifactId>policy-models-decisions</artifactId>
            <version>${policy.models.version}</version>
        </dependency>

Responding to Policy Update Notifications
*****************************************

Your application should also be able to respond to Policy Update Notifications that are published on the Dmaap topic POLICY-NOTIFICATION. This is because if a user pushes an updated Policy, your application should be able to dynamically start enforcing that policy without restart.

.. code-block: bash
  :caption: Example Dmaap REST Call using curl

  curl -k -u https://dmaap:3904/events/POLICY-NOTIFICATION/group/id?timeout=5000

If your application does not have Dmaap client code, you can use some available code in policy/common to receive Dmaap events.

To parse the JSON send over the topic, your application can use the following dependency:

.. code-block: java
  :caption: Policy PAP Update Notification Classes

        <dependency>
            <groupId>org.onap.policy.models</groupId>
            <artifactId>policy-models-pap</artifactId>
            <version>${policy.models.version}</version>
        </dependency>
/span>: string label: Image name or ID description: Image to be used for compute instance vfw_flavor_name: type: string label: Flavor description: Type of instance (flavor) to be used public_net_id: type: string label: Public network name or ID description: Public network that enables remote connection to VNF unprotected_private_net_id: type: string label: Unprotected private network name or ID description: Private network that connects vPacketGenerator with vFirewall protected_private_net_id: type: string label: Protected private network name or ID description: Private network that connects vFirewall with vSink onap_private_net_id: type: string label: ONAP management network name or ID description: Private network that connects ONAP components and the VNF onap_private_subnet_id: type: string label: ONAP management sub-network name or ID description: Private sub-network that connects ONAP components and the VNF unprotected_private_net_cidr: type: string label: Unprotected private network CIDR description: The CIDR of the unprotected private network protected_private_net_cidr: type: string label: Protected private network CIDR description: The CIDR of the protected private network onap_private_net_cidr: type: string label: ONAP private network CIDR description: The CIDR of the protected private network vfw_private_ip_0: type: string label: vFirewall private IP address towards the unprotected network description: Private IP address that is assigned to the vFirewall to communicate with the vPacketGenerator vfw_private_ip_1: type: string label: vFirewall private IP address towards the protected network description: Private IP address that is assigned to the vFirewall to communicate with the vSink vfw_private_ip_2: type: string label: vFirewall private IP address towards the ONAP management network description: Private IP address that is assigned to the vFirewall to communicate with ONAP components vpg_private_ip_0: type: string label: vPacketGenerator private IP address towards the unprotected network description: Private IP address that is assigned to the vPacketGenerator to communicate with the vFirewall vpg_private_ip_1: type: string label: vPacketGenerator private IP address towards the ONAP management network description: Private IP address that is assigned to the vPacketGenerator to communicate with ONAP components vsn_private_ip_0: type: string label: vSink private IP address towards the protected network description: Private IP address that is assigned to the vSink to communicate with the vFirewall vsn_private_ip_1: type: string label: vSink private IP address towards the ONAP management network description: Private IP address that is assigned to the vSink to communicate with ONAP components vfw_name_0: type: string label: vFirewall name description: Name of the vFirewall vpg_name_0: type: string label: vPacketGenerator name description: Name of the vPacketGenerator vsn_name_0: type: string label: vSink name description: Name of the vSink vnf_id: type: string label: VNF ID description: The VNF ID is provided by ONAP vf_module_id: type: string label: vFirewall module ID description: The vFirewall Module ID is provided by ONAP dcae_collector_ip: type: string label: DCAE collector IP address description: IP address of the DCAE collector dcae_collector_port: type: string label: DCAE collector port description: Port of the DCAE collector key_name: type: string label: Key pair name description: Public/Private key pair name pub_key: type: string label: Public key description: Public key to be installed on the compute instance repo_url_blob: type: string label: Repository URL description: URL of the repository that hosts the demo packages repo_url_artifacts: type: string label: Repository URL description: URL of the repository that hosts the demo packages install_script_version: type: string label: Installation script version number description: Version number of the scripts that install the vFW demo app demo_artifacts_version: type: string label: Artifacts version used in demo vnfs description: Artifacts (jar, tar.gz) version used in demo vnfs cloud_env: type: string label: Cloud environment description: Cloud environment (e.g., openstack, rackspace) ############# # # # RESOURCES # # # ############# resources: random-str: type: OS::Heat::RandomString properties: length: 4 my_keypair: type: OS::Nova::KeyPair properties: name: str_replace: template: base_rand params: base: { get_param: key_name } rand: { get_resource: random-str } public_key: { get_param: pub_key } save_private_key: false unprotected_private_network: type: OS::Neutron::Net properties: name: { get_param: unprotected_private_net_id } protected_private_network: type: OS::Neutron::Net properties: name: { get_param: protected_private_net_id } unprotected_private_subnet: type: OS::Neutron::Subnet properties: network_id: { get_resource: unprotected_private_network } cidr: { get_param: unprotected_private_net_cidr } protected_private_subnet: type: OS::Neutron::Subnet properties: network_id: { get_resource: protected_private_network } cidr: { get_param: protected_private_net_cidr } # Virtual Firewall instantiation vfw_private_0_port: type: OS::Neutron::Port properties: security_groups: [] port_security_enabled: False network: { get_resource: unprotected_private_network } fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vfw_private_ip_0 }}] vfw_private_1_port: type: OS::Neutron::Port properties: security_groups: [] port_security_enabled: False network: { get_resource: protected_private_network } fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vfw_private_ip_1 }}] vfw_private_2_port: type: OS::Neutron::Port properties: network: { get_param: onap_private_net_id } fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vfw_private_ip_2 }}] vfw_0: type: OS::Nova::Server properties: image: { get_param: vfw_image_name } flavor: { get_param: vfw_flavor_name } name: { get_param: vfw_name_0 } key_name: { get_resource: my_keypair } networks: - network: { get_param: public_net_id } - port: { get_resource: vfw_private_0_port } - port: { get_resource: vfw_private_1_port } - port: { get_resource: vfw_private_2_port } metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }} user_data_format: RAW user_data: str_replace: params: __dcae_collector_ip__ : { get_param: dcae_collector_ip } __dcae_collector_port__ : { get_param: dcae_collector_port } __repo_url_blob__ : { get_param: repo_url_blob } __repo_url_artifacts__ : { get_param: repo_url_artifacts } __demo_artifacts_version__ : { get_param: demo_artifacts_version } __install_script_version__ : { get_param: install_script_version } __vfw_private_ip_0__ : { get_param: vfw_private_ip_0 } __vfw_private_ip_1__ : { get_param: vfw_private_ip_1 } __vfw_private_ip_2__ : { get_param: vfw_private_ip_2 } __cloud_env__ : { get_param: cloud_env } template: | #!/bin/bash # Create configuration files mkdir /opt/config echo "__dcae_collector_ip__" > /opt/config/dcae_collector_ip.txt echo "__dcae_collector_port__" > /opt/config/dcae_collector_port.txt echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt echo "__install_script_version__" > /opt/config/install_script_version.txt echo "__vfw_private_ip_0__" > /opt/config/vfw_private_ip_0.txt echo "__vfw_private_ip_1__" > /opt/config/vfw_private_ip_1.txt echo "__vfw_private_ip_2__" > /opt/config/vfw_private_ip_2.txt echo "__cloud_env__" > /opt/config/cloud_env.txt # Download and run install script curl -k __repo_url_blob__/org.openecomp.demo/vnfs/vfw/__install_script_version__/v_firewall_install.sh -o /opt/v_firewall_install.sh cd /opt chmod +x v_firewall_install.sh ./v_firewall_install.sh # Virtual Packet Generator instantiation vpg_private_0_port: type: OS::Neutron::Port properties: network: { get_resource: unprotected_private_network } fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vpg_private_ip_0 }}] vpg_private_1_port: type: OS::Neutron::Port properties: network: { get_param: onap_private_net_id } fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vpg_private_ip_1 }}] vpg_0: type: OS::Nova::Server properties: image: { get_param: vfw_image_name } flavor: { get_param: vfw_flavor_name } name: { get_param: vpg_name_0 } key_name: { get_resource: my_keypair } networks: - network: { get_param: public_net_id } - port: { get_resource: vpg_private_0_port } - port: { get_resource: vpg_private_1_port } metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }} user_data_format: RAW user_data: str_replace: params: __fw_ipaddr__: { get_param: vfw_private_ip_0 } __protected_net_cidr__: { get_param: protected_private_net_cidr } __sink_ipaddr__: { get_param: vsn_private_ip_0 } __repo_url_blob__ : { get_param: repo_url_blob } __repo_url_artifacts__ : { get_param: repo_url_artifacts } __demo_artifacts_version__ : { get_param: demo_artifacts_version } __install_script_version__ : { get_param: install_script_version } __vpg_private_ip_0__ : { get_param: vpg_private_ip_0 } __vpg_private_ip_1__ : { get_param: vpg_private_ip_1 } __cloud_env__ : { get_param: cloud_env } template: | #!/bin/bash # Create configuration files mkdir /opt/config echo "__fw_ipaddr__" > /opt/config/fw_ipaddr.txt echo "__protected_net_cidr__" > /opt/config/protected_net_cidr.txt echo "__sink_ipaddr__" > /opt/config/sink_ipaddr.txt echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt echo "__install_script_version__" > /opt/config/install_script_version.txt echo "__vpg_private_ip_0__" > /opt/config/vpg_private_ip_0.txt echo "__vpg_private_ip_1__" > /opt/config/vpg_private_ip_1.txt echo "__cloud_env__" > /opt/config/cloud_env.txt # Download and run install script curl -k __repo_url_blob__/org.openecomp.demo/vnfs/vfw/__install_script_version__/v_packetgen_install.sh -o /opt/v_packetgen_install.sh cd /opt chmod +x v_packetgen_install.sh ./v_packetgen_install.sh # Virtual Sink instantiation vsn_private_0_port: type: OS::Neutron::Port properties: network: { get_resource: protected_private_network } fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vsn_private_ip_0 }}] vsn_private_1_port: type: OS::Neutron::Port properties: network: { get_param: onap_private_net_id } fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vsn_private_ip_1 }}] vsn_0: type: OS::Nova::Server properties: image: { get_param: vfw_image_name } flavor: { get_param: vfw_flavor_name } name: { get_param: vsn_name_0 } key_name: { get_resource: my_keypair } networks: - network: { get_param: public_net_id } - port: { get_resource: vsn_private_0_port } - port: { get_resource: vsn_private_1_port } metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }} user_data_format: RAW user_data: str_replace: params: __protected_net_gw__: { get_param: vfw_private_ip_1 } __unprotected_net__: { get_param: unprotected_private_net_cidr } __repo_url_blob__ : { get_param: repo_url_blob } __repo_url_artifacts__ : { get_param: repo_url_artifacts } __install_script_version__ : { get_param: install_script_version } __vsn_private_ip_0__ : { get_param: vsn_private_ip_0 } __vsn_private_ip_1__ : { get_param: vsn_private_ip_1 } __cloud_env__ : { get_param: cloud_env } template: | #!/bin/bash # Create configuration files mkdir /opt/config echo "__protected_net_gw__" > /opt/config/protected_net_gw.txt echo "__unprotected_net__" > /opt/config/unprotected_net.txt echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt echo "__install_script_version__" > /opt/config/install_script_version.txt echo "__vsn_private_ip_0__" > /opt/config/vsn_private_ip_0.txt echo "__vsn_private_ip_1__" > /opt/config/vsn_private_ip_1.txt echo "__cloud_env__" > /opt/config/cloud_env.txt # Download and run install script curl -k __repo_url_blob__/org.openecomp.demo/vnfs/vfw/__install_script_version__/v_sink_install.sh -o /opt/v_sink_install.sh cd /opt chmod +x v_sink_install.sh ./v_sink_install.sh