Example Service Access Control Setup¶
We've decided that our resources for the service will be defined in Athenz as:
rec.movie
rec.tvshow
and the only supported action for now would be read. Now we can
create their respective client and server (also commonly referred
as tenant and provider) roles and policies in Athenz. Go to
Athenz UI and login with your account which should have system
administrator access.
Client (Tenant) Domain¶
The client services will be defined in the editors domain so
let's create that domain and services. Click on the
Create a domain link in top left corner to add the domain:

Movie Editors¶
Each service is identified by its private/public key pair. The
movie service will be authorized to access the /rec/v1/movie
endpoint from our recommendation service. So we
need to first generate the key pair (at the end we're going to
display the contents of the public key since we'll be using that
when creating the service in the UI):
$ openssl genrsa -out movie_private.pem 2048
$ openssl rsa -in movie_private.pem -pubout > movie_public.pem
$ cat movie_public.pem
Now we need to register the movie service in the editors domain.
After you login, click on the editors domain in the left hand
tree pane, then choose the Services tab. Click on the
Add Service button. In the Key Value field when creating a
service, enter the contents of the movie_public.pem file.
For the Public Key Id field we'll use v0. Each service
can be identified my multiple key pairs. For example, if you
have services running in different geographical data centers,
each data center instance can have its own unique public/private
key pair. It also allows the service administrator to establish
a key rotation policy - e.g. generate a new key pair every 6
months and assign a new key identifier: v0, v1, etc.

TvShow Editors¶
The tvshow service will be authorized to access the /rec/v1/tvshow
endpoint from our recommendation service. So again, we
need to first generate the key pair (at the end we're going to
display the contents of the public key since we'll be using that
when creating the service in the UI):
$ openssl genrsa -out tvshow_private.pem 2048
$ openssl rsa -in tvshow_private.pem -pubout > tvshow_public.pem
$ cat tvshow_public.pem
Now we need to register the tvshow service in the editors domain.
After you login, click on the editors domain in the left hand
tree pane, then choose the Services tab. Click on the
Add Service button. In the Key Value field when creating a
service, enter the contents of the tvshow_public.pem file.
For the Public Key Id field we'll use v0. See the
Movie Editors section for additional details on this field.

Site Editors¶
The site service will be authorized to access both /rec/v1/movie
and /rec/v1/tvshow endpoints from our recommendation service. So we
need to first generate the key pair (at the end we're going to
display the contents of the public key since we'll be using that
when creating the service in the UI):
$ openssl genrsa -out site_private.pem 2048
$ openssl rsa -in site_private.pem -pubout > site_public.pem
$ cat site_public.pem
Finally, we need to register the site service in the editors domain.
After you login, click on the editors domain in the left hand
tree pane, then choose the Services tab.Click on the
Add Service button. In the Key Value field when creating a
service, enter the contents of the site_public.pem file.
For the Public Key Id field we'll use v0. See the
Movie Editors section for additional details on this field.

Service View¶
Once all three services are successfully registered, you should
have the following Services view for the editors domains:

Server (Provider) Domain¶
The recommendation service will be run by recommend property.
So let's first create this domain in Athenz. Click on the
Create a domain link in top left corner to add the domain:

Authorization Roles and Policies¶
Typically since we have two resources and only one action supported in this use case, we'll be creating 2 roles that will be providing access control. In this model, if we want one service to have access to both services, we'll need to add that principal to both roles. A slightly different approach would be to create yet another role that provides full access to all recommendation endpoints.
Movie Access¶
First we need to create the role that includes principals
authorized to access the movie resource. In our example, we'll
call this role as movie_editors and include editors.movie
service as a member of this role. After you login, click on
the recommend domain in the left hand tree pane, then choose
the Roles tab. Click on the Add Role button:

Now we need to give access to this role with action read to
resource rec.movie. Choose the Policies tab and click on
the Add Policy button:

TvShow Access¶
Now we need to create the role that includes principals
authorized to access the tvshow resource. In our example, we'll
call this role as tvshow_editors and include editors.tvshow
service as a member of this role. After you login, click on
the recommend domain in the left hand tree pane, then choose
the Roles tab. Click on the Add Role button:

Now we need to give access to this role with action read to
resource rec.tvshow. Choose the Policies tab and click on
the Add Policy button:

Full Access¶
Finally, we need to create the role that includes principals
authorized to have full access to any resource in our
recommendation service. In our example, we'll call this role
as full_access and include editors.site service as a member
of this role. After you login, click on the recommend domain
in the left hand tree pane, then choose the Roles tab. Click
on the Add Role button:

Now we need to give access to this role with action * to
resource rec.*. Since Athenz support glob style wildcards,
having * indicates it will match all actions - e.g. read,
write, etc. And having the resource as rec.* indicates that
it will match rec.movie, rec.tvshow and any other resource
that we create with the prefix rec.. Choose the Policies tab
and click on the Add Policy button:
