README
===============================================================================
Federated AAA is deployed using several config files. This file explains a
simple scenario utilizing two servers:
a) ipa.example.com
- Runs the IPA Server Software
b) odl.example.com
- Runs the IPA Client Software
- Runs an Apache proxy frontend (AuthN through mod_lookup_identity.so)
- Runs ODL
This setup for this scenario is illustrated in Figure 1 below:
-----------------------
| odl.example.com |
| (Fedora 20 Linux) |
| |
| ------------------- |
| | ODL Jetty Server | |
| | (Port 8181 & 8383)| |
| ------------------- |
| ^ . |
| . (Apache . | SSSD Requests/Responses
| . Reverse . | /
| . Proxy) . | /
| . v | /
| ------------------- | | ------------------
| | Apache |<|..................| ipa.example.com |
| | (Port 80) |.|.................>| (FreeIPA |
| ------------------- | | Kerberos And |
| ______________________| | LDAP) |
------------------
Figure 1: Shows the setup for a simple Federated AAA use case utilizing
FreeIPA as an identity provider.
These instructions were written for Fedora 20, since SSSD is unique to RHEL based
distributions. SSSD is NOT a requirement for Federation though; you can use
any supported linux flavor. At this time, SSSD is the only Filter available
with regards to capturing IdP attributes that can be used in making advanced mapping
decisions (such as IdP group membership information).
1) Install FreeIPA Server on ipa.example.com. This is achieved through running:
# yum install freeipa-server bind bind-dyndb-ldap
# ipa-server-intall
2) Add a FreeIPA user called testuser:
$ kinit admin@EXAMPLE.COM
$ ipa group-add odl_users --desc "ODL Users"
$ ipa group-add odl_admin --desc "ODL Admin"
$ ipa user-add testuser --first Test --last USER --email test.user@example.com
$ ipa group-add-member odl_users --user testuser
$ ipa group-add-member odl_admin --user testuser
3) Install FreeIPA Client on odl.example.com. This is achieved through running:
# yum install freeipa-client
# ipa-client-install
4) Set up Client keytab for HTTP access on odl.example.com:
# ipa-getkeytab -p HTTP/odl.brcd-sssd-tb.com@BRCD-SSSD-TB.COM \
-s freeipa.brcd-sssd-tb.com -k /etc/krb5.keytab
# chmod 644 /etc/krb5.keytab
NOTE: The second command allows Apache to read the keytab. There are more
secure methods to support such access through SELINUX, but they are outside
the scope of this tutorial.
5) Install Apache on odl.example.com. This is achieved through running:
# yum install httpd
6) Create an Apache application to broker federation between ODL and FreeIPA.
Create the following file on odl.example.com:
[root@odl /]# cat /etc/httpd/conf.d/my_app.conf
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd on
KrbAuthRealms EXAMPLE.COM
Krb5KeyTab /etc/krb5.keytab
require valid-user
RequestHeader set X-SSSD-REMOTE_USER expr=%{REMOTE_USER}
RequestHeader set X-SSSD-AUTH_TYPE expr=%{AUTH_TYPE}
RequestHeader set X-SSSD-REMOTE_HOST expr=%{REMOTE_HOST}
RequestHeader set X-SSSD-REMOTE_ADDR expr=%{REMOTE_ADDR}
LookupUserAttr mail REMOTE_USER_EMAIL
RequestHeader set X-SSSD-REMOTE_USER_EMAIL %{REMOTE_USER_EMAIL}e
LookupUserAttr givenname REMOTE_USER_FIRSTNAME
RequestHeader set X-SSSD-REMOTE_USER_FIRSTNAME %{REMOTE_USER_FIRSTNAME}e
LookupUserAttr sn REMOTE_USER_LASTNAME
RequestHeader set X-SSSD-REMOTE_USER_LASTNAME %{REMOTE_USER_LASTNAME}e
LookupUserGroups REMOTE_USER_GROUPS ":"
RequestHeader set X-SSSD-REMOTE_USER_GROUPS %{REMOTE_USER_GROUPS}e
ProxyPass / http://localhost:8383/
ProxyPassReverse / http://localhost:8383/
7) Install the ODL distribution in the /opt folder on odl.example.com.
8) Add a federation connector to the jetty server hosting ODL on
odl.example.com:
[user@odl distribution]$ cat etc/jetty.xml
300000
2
false
8443
20000
5000
127.0.0.1
8383
300000
2
false
8445
federationConn
20000
5000
karaf
karaf
- org.apache.karaf.jaas.boot.principal.RolePrincipal
default
karaf
- org.apache.karaf.jaas.boot.principal.RolePrincipal
9) Add the idp_mapping rules file on odl.example.com
[user@odl distribution]$ cat etc/idp_mapping_rules.json
[
{
"mapping":{
"ClientId":"1",
"UserId":"1",
"User":"admin",
"Domain":"BRCD-SSSD-TB.COM",
"roles":"$roles"
},
"statement_blocks":[
[
[
"set",
"$groups",
[
]
],
[
"set",
"$roles",
[
"admin",
"user"
]
]
]
]
}
]
NOTE: This is a very basic mapping example in which all federated users are
mapped into the default "admin" account.
10) Start ODL and install the following features on odl.example.com:
# bin/karaf
karaf> feature:install odl-aaa-authn-sssd-no-cluster odl-restconf
11) Get a refresh_token on odl.example.com through Apache proxy port (80 forwarded to 8383):
[user@odl distribution]$ kinit testuser
[user@odl distribution]$ curl -s --negotiate -u : -X POST http://odl.example.com/oauth2/federation/
12) Obtain an access_token on odl.example.com through normal port (8181):
[user@odl distribution]$ curl -s -d 'grant_type=refresh_token&refresh_token=&scope=sdn' http://odl.example.com:8181/oauth2/token
13) Use the access_token to make authenticated rest calls from odl.example.com through normal port (8181):
[user@odl distribution]$ curl -s -H 'Authorization: Bearer ' http://odl.brcd-sssd-tb.com:8181/restconf/streams/