blob: 2028536cd9013cbdee089c7c005e8ea38a7ce0ca [file] [log] [blame]
Felipe Monteiroc4589322017-06-09 19:42:50 +01001========================
2Team and repository tags
3========================
4
shangxiaobj11b02322017-08-14 22:45:11 -07005.. image:: https://governance.openstack.org/tc/badges/patrole.svg
6 :target: https://governance.openstack.org/tc/reference/tags/index.html
Felipe Monteiroc4589322017-06-09 19:42:50 +01007
Felipe Monteiroc4589322017-06-09 19:42:50 +01008Patrole - RBAC Integration Tempest Plugin
9=========================================
DavidPurcell663aedf2017-01-03 10:01:14 -050010
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +010011Patrole is a set of integration tests to be run against a live OpenStack
12cluster. It has a battery of tests dedicated to validating the correctness and
13integrity of the cloud's RBAC implementation.
14
15More importantly, Patrole is a security validation tool for verifying that
16Role-Based Access Control is correctly configured and enforced in an OpenStack
17cloud. It runs `Tempest`_-based API tests using specified RBAC roles, thus
18allowing deployments to verify that only intended roles have access to those
19APIs.
DavidPurcell663aedf2017-01-03 10:01:14 -050020
Felipe Monteiro780210d2017-07-17 22:21:53 +010021Patrole currently offers testing for the following OpenStack services: Nova,
22Neutron, Glance, Cinder and Keystone.
DavidPurcell663aedf2017-01-03 10:01:14 -050023
Felipe Monteiroc2873892017-11-15 06:09:02 +000024Patrole is currently undergoing heavy development. As more projects move
25toward policy in code, Patrole will align its testing with the appropriate
26documentation.
27
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +010028* Free software: Apache license
29* Documentation: https://docs.openstack.org/patrole/latest
30* Source: https://git.openstack.org/cgit/openstack/patrole
31* Bugs: https://bugs.launchpad.net/patrole
32* Release notes: https://docs.openstack.org/releasenotes/patrole/
Felipe Monteiro443d39c2018-04-08 17:05:33 -040033
Felipe Monteiroe9176552018-07-16 14:39:55 -040034.. _design-principles:
35
Felipe Monteiroc2873892017-11-15 06:09:02 +000036Design Principles
37-----------------
38
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +010039As a `Tempest plugin`_, Patrole borrows some `design principles`_ from Tempest,
40but not all, as its testing scope is confined to policies.
Felipe Monteiroc2873892017-11-15 06:09:02 +000041
42* *Stability*. Patrole uses OpenStack public interfaces. Tests in Patrole
43 should only touch public OpenStack APIs.
44* *Atomicity*. Patrole tests should be atomic: they should test policies in
45 isolation. Unlike Tempest, a Patrole test strives to only call a single
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +010046 endpoint at a time. This is because it is important to validate each policy
47 is authorized correctly and the best way to do that is to validate each
48 policy alone, to avoid test contamination.
Felipe Monteiro543f7b92018-06-10 13:38:31 -040049* *Complete coverage*. Patrole should validate all policy in code defaults. For
50 testing, Patrole uses the API-to-policy mapping contained in each project's
51 `policy in code`_ documentation where applicable.
52
53 For example, Nova's policy in code documentation is located in the
54 `Nova repository`_ under ``nova/policies``. Likewise, Keystone's policy in
55 code documentation is located in the `Keystone repository`_ under
56 ``keystone/common/policies``. The other OpenStack services follow the same
57 directory layout pattern with respect to policy in code.
58
59 .. note::
60
61 Realistically this is not always possible because some services have
62 not yet moved to policy in code.
63
Felipe Monteiroe9176552018-07-16 14:39:55 -040064* *Customizable*. Patrole should be able to validate custom policy overrides to
65 ensure that those overrides enhance rather than undermine the cloud's RBAC
66 configuration. In addition, Patrole should be able to validate any role.
Felipe Monteiro543f7b92018-06-10 13:38:31 -040067* *Self-cleaning*. Patrole should attempt to clean up after itself; whenever
Felipe Monteiroc2873892017-11-15 06:09:02 +000068 possible we should tear down resources when done.
69
70 .. note::
71
72 Patrole modifies roles dynamically in the background, which affects
73 pre-provisioned credentials. Work is currently underway to clean up
74 modifications made to pre-provisioned credentials.
75
Felipe Monteiro543f7b92018-06-10 13:38:31 -040076* *Self-testing*. Patrole should be self-testing.
77
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +010078.. _Tempest plugin: https://docs.openstack.org/tempest/latest/plugin.html
79.. _design principles: https://docs.openstack.org/tempest/latest/overview.html#design-principles
Felipe Monteiro543f7b92018-06-10 13:38:31 -040080.. _policy in code: https://specs.openstack.org/openstack/oslo-specs/specs/newton/policy-in-code.html
81.. _Nova repository: https://github.com/openstack/nova/tree/master/nova/policies
82.. _Keystone repository: https://github.com/openstack/keystone/tree/master/keystone/common/policies
Felipe Monteiroc2873892017-11-15 06:09:02 +000083
DavidPurcell663aedf2017-01-03 10:01:14 -050084Features
Felipe Monteiro780210d2017-07-17 22:21:53 +010085--------
86* Validation of default policy definitions located in policy.json files.
87* Validation of in-code policy definitions.
88* Validation of custom policy file definitions that override default policy
89 definitions.
90* Built-in positive and negative testing. Positive and negative testing
91 are performed using the same tests and role-switching.
92* Valdation of custom roles as well as default OpenStack roles.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +010093
94.. note::
95
Felipe Monteiro780210d2017-07-17 22:21:53 +010096 Patrole does not yet support policy.yaml files, the new file format for
97 policy files in OpenStack.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +010098
99How It Works
Felipe Monteiro780210d2017-07-17 22:21:53 +0100100------------
101Patrole leverages ``oslo.policy`` (OpenStack's policy enforcement engine) to
102determine whether a given role is allowed to perform a policy action, given a
103specific role and OpenStack service. The output from ``oslo.policy`` (the
104expected result) and the actual result from test execution are compared to
105each other: if both results match, then the test passes; else it fails.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100106
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100107Terminology
108^^^^^^^^^^^
109* Expected Result - The expected result of a given test.
110* Actual Result - The actual result of a given test.
111* Final Result - A match between both expected and actual results. A mismatch
112 in the expected result and the actual result will result in a test failure.
113
114 * Expected: Pass | Actual: Pass - Test Case Success
115 * Expected: Pass | Actual: Fail - Test Case Under-Permission Failure
116 * Expected: Fail | Actual: Pass - Test Case Over-Permission Failure
117 * Expected: Fail | Actual: Fail (Expected exception) - Test Case Success
118 * Expected: Fail | Actual: Fail (Unexpected exception) - Test Case Failure
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100119
Felipe Monteiro780210d2017-07-17 22:21:53 +0100120Quickstart
Felipe Monteiro7c7b5702017-07-21 01:43:42 +0100121----------
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100122To run Patrole, you must first have `Tempest`_ installed and configured
123properly. Please reference Tempest's `Quickstart`_ guide to do so. Follow all
124the steps outlined therein. Afterward, proceed with the steps below.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100125
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100126#. You first need to install Patrole. This is done with pip after you check out
127 the Patrole repo::
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100128
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100129 $ git clone https://git.openstack.org/openstack/patrole
130 $ pip install patrole/
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100131
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100132 This can be done within a venv.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100133
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100134 .. note::
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100135
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100136 You may also install Patrole from source code by running::
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100137
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100138 pip install -e patrole/
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100139
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100140#. Next you must properly configure Patrole, which is relatively
141 straightforward. For details on configuring Patrole refer to the
142 :ref:`patrole-configuration`.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100143
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100144#. Once the configuration is done you're now ready to run Patrole. This can
145 be done using the `tempest_run`_ command. This can be done by running::
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100146
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100147 $ tempest run --regex '^patrole_tempest_plugin\.tests\.api'
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100148
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100149 There is also the option to use testr directly, or any `testr`_ based test
150 runner, like `ostestr`_. For example, from the workspace dir run::
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100151
Felipe Monteiroe5ee4be2018-06-18 21:39:28 +0100152 $ stestr --regex '(?!.*\[.*\bslow\b.*\])(^patrole_tempest_plugin\.tests\.api))'
153
154 will run the same set of tests as the default gate jobs.
155
156 You can also run Patrole tests using `tox`_. To do so, ``cd`` into the
157 **Tempest** directory and run::
158
159 $ tox -eall-plugin -- patrole_tempest_plugin.tests.api
160
161 .. note::
162
163 It is possible to run Patrole via ``tox -eall`` in order to run Patrole
164 isolated from other plugins. This can be accomplished by including the
165 installation of services that currently use policy in code -- for example,
166 Nova and Keystone. For example::
167
168 $ tox -evenv-tempest -- pip install /opt/stack/patrole /opt/stack/keystone /opt/stack/nova
169 $ tox -eall -- patrole_tempest_plugin.tests.api
170
171#. Log information from tests is captured in ``tempest.log`` under the Tempest
172 repository. Some Patrole debugging information is captured in that log
173 related to expected test results and :ref:`role-overriding`.
174
175 More detailed RBAC testing log output is emitted to ``patrole.log`` under
176 the Patrole repository. To configure Patrole's logging, see the
177 :ref:`patrole-configuration` guide.
178
179.. _Tempest: https://github.com/openstack/tempest
180.. _Quickstart: https://docs.openstack.org/tempest/latest/overview.html#quickstart
181.. _tempest_run: https://docs.openstack.org/tempest/latest/run.html
182.. _testr: https://testrepository.readthedocs.org/en/latest/MANUAL.html
183.. _ostestr: https://docs.openstack.org/os-testr/latest/
184.. _tox: https://tox.readthedocs.io/en/latest/
185
186RBAC Tests
187----------
188
189To change the role that the patrole tests are being run as, edit
190``rbac_test_role`` in the ``patrole`` section of tempest.conf: ::
191
192 [patrole]
193 rbac_test_role = member
194 ...
195
196.. note::
197
198 The ``rbac_test_role`` is service-specific. member, for example,
199 is an arbitrary role, but by convention is used to designate the default
200 non-admin role in the system. Most Patrole tests should be run with
201 **admin** and **member** roles. However, other services may use entirely
202 different roles.
203
204For more information about the member role and its nomenclature,
205please see: `<https://ask.openstack.org/en/question/4759/member-vs-_member_/>`__.
206
207Unit Tests
208----------
209
210Patrole also has a set of unit tests which test the Patrole code itself. These
211tests can be run by specifying the test discovery path::
212
213 $ stestr --test-path ./patrole_tempest_plugin/tests/unit run
214
215By setting ``--test-path`` option to ``./patrole_tempest_plugin/tests/unit``
216it specifies that test discovery should only be run on the unit test directory.
217
218Alternatively, there are the py27 and py35 tox jobs which will run the unit
219tests with the corresponding version of Python.
220
221One common activity is to just run a single test; you can do this with tox
222simply by specifying to just run py27 or py35 tests against a single test::
223
224 $ tox -e py27 -- -n patrole_tempest_plugin.tests.unit.test_rbac_utils.RBACUtilsTest.test_override_role_with_missing_admin_role
225
226Or all tests in the test_rbac_utils.py file::
227
228 $ tox -e py27 -- -n patrole_tempest_plugin.tests.unit.test_rbac_utils
229
230You may also use regular expressions to run any matching tests::
231
232 $ tox -e py27 -- test_rbac_utils
233
234For more information on these options and details about stestr, please see the
235`stestr documentation <http://stestr.readthedocs.io/en/latest/MANUAL.html>`_.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100236
Felipe Monteiro780210d2017-07-17 22:21:53 +0100237Release Versioning
Felipe Monteiro7c7b5702017-07-21 01:43:42 +0100238------------------
Felipe Monteiro780210d2017-07-17 22:21:53 +0100239`Patrole Release Notes <https://docs.openstack.org/releasenotes/patrole/>`_
240shows which changes have been released for each version.
Felipe Monteiro7bc35dc2017-04-19 21:11:46 +0100241
Felipe Monteiro780210d2017-07-17 22:21:53 +0100242Patrole's release versioning follows Tempest's conventions. Like Tempest,
243Patrole is branchless and uses versioning instead.