blob: a2da53d96919262396822b80e0a25c23dfc64e18 [file] [log] [blame]
AAA
===
Introduction
------------
In this section, we will explain how to use Trellis with AAA service, which can be used to authenticate a client host.
We will explain how this works with a simple **single switch** topology.
.. image:: ../images/config-aaa.png
Configure ONOS
--------------
Activate AAA app
^^^^^^^^^^^^^^^^
We need to install and activate AAA app separately since it is located in a separate (CORD) repository.
There are multiple methods to install and activate a pre-compiled app. Let's use CLI now.
.. code-block::console
$ onos-app localhost install! aaa-1.1-SNAPSHOT.oar
Provide network configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
We need to provide AAA configuration in the apps section of network configuration.
.. code-block:: json
:linenos:
{
"apps": {
"org.opencord.aaa" : {
"AAA" : {
"radiusIp": "10.128.0.231",
"radiusServerPort": "1812",
"radiusSecret": "howdoyouturnthison"
}
}
}
}
- ``radiusIp``: The IP address of the Radius server
- ``radiusServerPort``: The UDP port of the Radius server. (Optional -- ONOS will use port 1812 by default).
- ``radiusSecret``: The Radius secret. This needs to be consistent with the Radius server configuration
Then push the JSON to ONOS:
.. code-block:: console
$ onos-netcfg $OC1 aaa-config.json
Configure Radius server
-----------------------
Install FreeRadius
^^^^^^^^^^^^^^^^^^
Technically all Radius server should work.
However, the way to configure them are probably different case to case.
Here we use FreeRadius on Ubuntu as an example.
To install the Radius server, simply run:
.. code-block:: console
sudo apt-get install freeradius
Configure FreeRadius
^^^^^^^^^^^^^^^^^^^^
Add a user
""""""""""
We usually connect Radius server to a database where we store the user information.
In this section, we statically configure a user to simplify the setup.
To add a user ``admin`` with password ``cord_test``, edit ``/etc/freeradius/users`` and add following lines:
.. code-block:: text
admin Cleartext-Password := "cord_test"
Reply-Message = "Hello, %{User-Name}"
Allow external clients
""""""""""""""""""""""
By default the Radius server only accepts requests from ``localhost``.
To allow external clients, we need to modify ``/etc/freeradius/clients.conf``
We also need to change the secret.
.. code-block:: diff
-client localhost {
+client 0.0.0.0/0 {
- secret = testing123
+ secret = howdoyouturnthison
Use TLS
"""""""
By default, FreeRadius use MD5 challenge response to authenticate clients.
To use TLS, we need to modify ``/etc/freeradius/eap.conf``
We also need to change the private key password.
.. code-block:: diff
- default_eap_type = md5
+ default_eap_type = tls
- private_key_password = whatever
+ private_key_password = onos_test
.. note::
The key and certificates required by TLS will locate under ``/etc/freeradius/certs`` by default.
There will be three symbolic links link to ``ca.pem``, ``server.key``, ``server.pem``.
We only need to change the symbolic links after we generates the keys and certificates.
Therefore, we don't need to change the path in ``/etc/freeradius/eap.conf``
.. note::
Both server certificate and client certificate need to be signed by the same CA certificate.
Also note that each key we generate below needs a unique Common Name.
Generate CA certificate (ca.pem) and private key (privkey.pem)
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.. code-block:: console
openssl req -out ca.pem -new -x509
Generate and sign server certificate (server.pem) and private key (server.key)
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.. code-block:: console
openssl genrsa -out server.key 1024
openssl req -key server.key -new -out server.req
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAserial file.srl -out server.pem
Generate and sign client certificate (client.pem) and private key (client.key)
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.. code-block:: console
openssl genrsa -out client.key 1024
openssl req -key client.key -new -out client.req
openssl x509 -req -in client.req -CA ca.pem -CAkey privkey.pem -CAserial file.srl -out client.pem
Deploy keys and certificates
""""""""""""""""""""""""""""
On the server side, please link **/etc/freeradius/{ca.pem, server.key, server.pem}** to the files we just generated.
Also copy **ca.pem, client.key, client.pem** to the client side through a secured channel.
They will later be used when testing the Radius authentication.
Testing
-------
We can use the ``wpa_supplicant`` as the test client. In case ``wpa_supplicant`` has not been installed, you can run ``sudo apt-get install wpasupplicant``
Compose wpa_supplicant.conf
^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: text
ctrl_interface=/var/run/wpa_supplicant
eapol_version=1
ap_scan=0
fast_reauth=0
network={
key_mgmt=WPA-EAP
eap=TLS
identity="admin"
password="cord_test"
ca_cert="ca.pem"
client_cert="client.pem"
private_key="client.key"
private_key_passwd="onos_test"
eapol_flags=3
}
Run the test client
^^^^^^^^^^^^^^^^^^^
.. tip::
If you are using a Linux VM behind a bridge to send out this authentication message, make sure the Linux kernel of your host machine is 3.2 or above.
Otherwise the EAPOL messages won't go through the bridge.
.. code-block:: console
$ sudo wpa_supplicant -Dwired -ieth1 -cwpa_supplicant.conf
You should see the following message if authentication succeed:
.. code-block:: console
Successfully initialized wpa_supplicant
eth1: Associated with 01:80:c2:00:00:03
eth1: CTRL-EVENT-EAP-STARTED EAP authentication started
eth1: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=13
eth1: CTRL-EVENT-EAP-METHOD EAP vendor 0 method 13 (TLS) selected
eth1: CTRL-EVENT-EAP-PEER-CERT depth=1 subject='/C=US/ST=CA/L=Menlo Park/O=ON.Lab/CN=ca.cord.lab/emailAddress=xxx@xxx.xxx'
eth1: CTRL-EVENT-EAP-PEER-CERT depth=0 subject='/C=US/ST=CA/L=Menlo Park/O=ON.Lab/CN=server.cord.lab/emailAddress=xxx@xxx.xxx'
eth1: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
Reference
---------
- https://tools.ietf.org/html/rfc3580
- https://www.vocal.com/secure-communication/eapol-extensible-authentication-protocol-over-lan/
- https://dst.lbl.gov/~boverhof/openssl_certs.html