Skip to content
This repository was archived by the owner on Dec 4, 2024. It is now read-only.

Commit 510676e

Browse files
committed
Add required roles and permissions required for group role enforcement.
1 parent 49edf88 commit 510676e

File tree

1 file changed

+73
-32
lines changed

1 file changed

+73
-32
lines changed

testing/sdk_security.py

Lines changed: 73 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def _revoke(user: str, acl: str, description: str, action: str = "create") -> No
7979
log.info("Want to delete {user}+{acl}".format(user=user, acl=acl))
8080

8181

82-
def get_permissions(service_account_name: str, role: str, linux_user: str) -> typing.List[dict]:
82+
def get_role_permissions(service_account_name: str, role: str) -> typing.List[dict]:
8383
return [
8484
# registration permissions
8585
{
@@ -89,6 +89,27 @@ def get_permissions(service_account_name: str, role: str, linux_user: str) -> ty
8989
service_account_name, role
9090
),
9191
},
92+
# resource permissions
93+
{
94+
"user": service_account_name,
95+
"acl": "dcos:mesos:master:reservation:role:{}".format(role),
96+
"description": "Service {} may reserve Mesos resources with role={}".format(
97+
service_account_name, role
98+
),
99+
},
100+
# volume permissions
101+
{
102+
"user": service_account_name,
103+
"acl": "dcos:mesos:master:volume:role:{}".format(role),
104+
"description": "Service {} may create Mesos volumes with role={}".format(
105+
service_account_name, role
106+
),
107+
},
108+
]
109+
110+
111+
def get_permissions(service_account_name: str, linux_user: str) -> typing.List[dict]:
112+
return [
92113
# task execution permissions
93114
{
94115
"user": service_account_name,
@@ -108,13 +129,6 @@ def get_permissions(service_account_name: str, role: str, linux_user: str) -> ty
108129
),
109130
},
110131
# resource permissions
111-
{
112-
"user": service_account_name,
113-
"acl": "dcos:mesos:master:reservation:role:{}".format(role),
114-
"description": "Service {} may reserve Mesos resources with role={}".format(
115-
service_account_name, role
116-
),
117-
},
118132
{
119133
"user": service_account_name,
120134
"acl": "dcos:mesos:master:reservation:principal:{}".format(service_account_name),
@@ -124,13 +138,6 @@ def get_permissions(service_account_name: str, role: str, linux_user: str) -> ty
124138
"action": "delete",
125139
},
126140
# volume permissions
127-
{
128-
"user": service_account_name,
129-
"acl": "dcos:mesos:master:volume:role:{}".format(role),
130-
"description": "Service {} may create Mesos volumes with role={}".format(
131-
service_account_name, role
132-
),
133-
},
134141
{
135142
"user": service_account_name,
136143
"acl": "dcos:mesos:master:volume:principal:{}".format(service_account_name),
@@ -142,19 +149,42 @@ def get_permissions(service_account_name: str, role: str, linux_user: str) -> ty
142149
]
143150

144151

145-
def grant_permissions(linux_user: str, role_name: str, service_account_name: str) -> None:
152+
def grant_permissions(
153+
linux_user: str,
154+
role_name: str = "",
155+
service_account_name: str = "",
156+
role_list: typing.List[str] = [],
157+
) -> None:
146158
log.info("Granting permissions to {account}".format(account=service_account_name))
147-
permissions = get_permissions(service_account_name, role_name, linux_user)
159+
160+
permissions = get_permissions(service_account_name, linux_user)
161+
162+
if not role_list:
163+
role_list = [role_name]
164+
165+
for role in role_list:
166+
permissions += get_role_permissions(service_account_name, role)
167+
148168
for permission in permissions:
149169
_grant(**permission)
170+
150171
log.info("Permission setup completed for {account}".format(account=service_account_name))
151172

152173

153174
def revoke_permissions(linux_user: str, role_name: str, service_account_name: str) -> None:
154175
log.info("Revoking permissions to {account}".format(account=service_account_name))
155-
permissions = get_permissions(service_account_name, role_name, linux_user)
176+
177+
permissions = get_permissions(service_account_name, linux_user)
178+
179+
if not role_list:
180+
role_list = [role_name]
181+
182+
for role in role_list:
183+
permissions += get_role_permissions(service_account_name, role)
184+
156185
for permission in permissions:
157186
_revoke(**permission)
187+
158188
log.info("Permission cleanup completed for {account}".format(account=service_account_name))
159189

160190

@@ -228,13 +258,24 @@ def delete_secret(secret: str) -> None:
228258

229259

230260
def _get_role_list(service_name: str) -> typing.List[str]:
231-
# TODO: spark_utils uses:
232-
# app_id_encoded = urllib.parse.quote(
233-
# urllib.parse.quote(app_id, safe=''),
234-
# safe=''
235-
# )
236261
role_basename = service_name.replace("/", "__")
237-
return ["{}-role".format(role_basename), "slave_public%252F{}-role".format(role_basename)]
262+
263+
roles = []
264+
265+
# Grant roles on each group components.
266+
path_components = service_name.split("/")
267+
role_path = ""
268+
for component in path_components[:-1]:
269+
if role_path != "":
270+
role_path += "__"
271+
role_path += component
272+
273+
roles.append(role_path)
274+
275+
return roles + [
276+
"{}-role".format(role_basename),
277+
"slave_public%252F{}-role".format(role_basename),
278+
]
238279

239280

240281
def setup_security(
@@ -263,10 +304,11 @@ def setup_security(
263304

264305
service_account_info["roles"] = _get_role_list(service_name)
265306

266-
for role_name in service_account_info["roles"]:
267-
grant_permissions(
268-
linux_user=linux_user, role_name=role_name, service_account_name=service_account
269-
)
307+
grant_permissions(
308+
linux_user=linux_user,
309+
role_list=service_account_info["roles"],
310+
service_account_name=service_account,
311+
)
270312

271313
log.info("Finished setting up strict-mode security")
272314

@@ -284,10 +326,9 @@ def cleanup_security(service_name: str, service_account_info: typing.Dict) -> No
284326
roles = service_account_info.get("roles", _get_role_list(service_name))
285327
linux_user = service_account_info.get("linux_user", "nobody")
286328

287-
for role_name in roles:
288-
revoke_permissions(
289-
linux_user=linux_user, role_name=role_name, service_account_name=service_account
290-
)
329+
revoke_permissions(
330+
linux_user=linux_user, role_list=roles, service_account_name=service_account
331+
)
291332

292333
delete_service_account(service_account, service_account_secret)
293334

0 commit comments

Comments
 (0)