Skip to content

Commit 8143c68

Browse files
committed
Add test for SubjectAccessReview authorization.
Signed-off-by: Martin Hesko <[email protected]>
1 parent 20053cc commit 8143c68

File tree

5 files changed

+111
-14
lines changed

5 files changed

+111
-14
lines changed

testsuite/tests/singlecluster/authorino/identity/conftest.py

+15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22

33
import pytest
44

5+
from testsuite.kubernetes.service_account import ServiceAccount
6+
7+
8+
@pytest.fixture(scope="module")
9+
def create_service_account(request, cluster, blame, module_label):
10+
"""Creates and returns service account"""
11+
12+
def _create_service_account(name):
13+
service_account = ServiceAccount.create_instance(cluster, blame(name), labels={"app": module_label})
14+
request.addfinalizer(service_account.delete)
15+
service_account.commit()
16+
return service_account
17+
18+
return _create_service_account
19+
520

621
@pytest.fixture(scope="module")
722
def authorization(authorization):

testsuite/tests/singlecluster/authorino/identity/subject_access_review/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""Conftest for SubjectAccessReview related tests."""
2+
3+
import pytest
4+
5+
from testsuite.httpx.auth import HeaderApiKeyAuth
6+
from testsuite.kubernetes.cluster_role import ClusterRole, ClusterRoleBinding
7+
8+
9+
@pytest.fixture(scope="module")
10+
def create_cluster_role(request, cluster, blame, module_label):
11+
"""Creates and returns a ClusterRole"""
12+
13+
def _create_cluster_role(rules):
14+
cluster_role = ClusterRole.create_instance(cluster, blame("cr"), rules, labels={"app": module_label})
15+
request.addfinalizer(cluster_role.delete)
16+
cluster_role.commit()
17+
return cluster_role
18+
19+
return _create_cluster_role
20+
21+
22+
@pytest.fixture(scope="module")
23+
def create_cluster_role_binding(request, cluster, blame, module_label):
24+
"""Creates and returns a ClusterRoleBinding"""
25+
26+
def _create_cluster_role_binding(cluster_role, service_accounts):
27+
cluster_role_binding = ClusterRoleBinding.create_instance(
28+
cluster, blame("crb"), cluster_role, service_accounts, labels={"app": module_label}
29+
)
30+
request.addfinalizer(cluster_role_binding.delete)
31+
cluster_role_binding.commit()
32+
return cluster_role_binding
33+
34+
return _create_cluster_role_binding
35+
36+
37+
@pytest.fixture(scope="module")
38+
def bound_service_account(create_cluster_role, create_service_account, create_cluster_role_binding, audience):
39+
"""Create a ServiceAccount and bind it to a ClusterRole with given permissions"""
40+
cluster_role = create_cluster_role([{"nonResourceURLs": ["/get"], "verbs": ["get"]}])
41+
service_account = create_service_account("tkn-auth")
42+
create_cluster_role_binding(cluster_role.model.metadata.name, [service_account.model.metadata.name])
43+
return service_account.get_auth_token(audience)
44+
45+
46+
@pytest.fixture(scope="module")
47+
def auth(bound_service_account):
48+
"""Create request auth with service account token as API key"""
49+
return HeaderApiKeyAuth(bound_service_account, "Bearer")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"""Test kubernetes SubjectAccessReview authorization by verifying only a
2+
ServiceAccount bound to a ClusterRole is authorized to access a resource"""
3+
4+
import pytest
5+
6+
from testsuite.httpx.auth import HeaderApiKeyAuth
7+
from testsuite.kuadrant.policy.authorization import ValueFrom
8+
9+
pytestmark = [pytest.mark.authorino]
10+
11+
12+
@pytest.fixture(scope="module")
13+
def authorization(authorization):
14+
"""Add kubernetes token-review and subject-access-review identity"""
15+
authorization.identity.add_kubernetes("token-review-host")
16+
user = ValueFrom("auth.identity.user.username")
17+
authorization.authorization.add_kubernetes("subject-access-review-host", user, None)
18+
return authorization
19+
20+
21+
@pytest.fixture(scope="module")
22+
def audience(hostname):
23+
"""Return hostname as only audience for the service account bound token"""
24+
return [hostname.hostname]
25+
26+
27+
@pytest.fixture(scope="module")
28+
def service_account_token(create_service_account, audience):
29+
"""Create a non-authorized service account and request its bound token with the hostname as audience"""
30+
service_account = create_service_account("tkn-non-auth")
31+
return service_account.get_auth_token(audience)
32+
33+
34+
@pytest.fixture(scope="module")
35+
def auth2(service_account_token):
36+
"""Create request auth with service account token as API key"""
37+
return HeaderApiKeyAuth(service_account_token, "Bearer")
38+
39+
40+
def test_host_audience(client, auth, auth2):
41+
"""Test Kubernetes SubjectAccessReview functionality by setting up authentication and authorization for an endpoint
42+
and querying it with non-authorized and authorized ServiceAccount."""
43+
response = client.get("/anything/get", auth=auth2)
44+
assert response.status_code == 403
45+
46+
response = client.get("/get", auth=auth)
47+
assert response.status_code == 200

testsuite/tests/singlecluster/authorino/identity/token_review/conftest.py

-14
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,6 @@
33
import pytest
44

55
from testsuite.httpx.auth import HeaderApiKeyAuth
6-
from testsuite.kubernetes.service_account import ServiceAccount
7-
8-
9-
@pytest.fixture(scope="module")
10-
def create_service_account(request, cluster, blame, module_label):
11-
"""Creates and returns service account"""
12-
13-
def _create_service_account(name):
14-
service_account = ServiceAccount.create_instance(cluster, blame(name), labels={"app": module_label})
15-
request.addfinalizer(service_account.delete)
16-
service_account.commit()
17-
return service_account
18-
19-
return _create_service_account
206

217

228
@pytest.fixture(scope="module")

0 commit comments

Comments
 (0)