@@ -79,7 +79,7 @@ def _revoke(user: str, acl: str, description: str, action: str = "create") -> No
79
79
log .info ("Want to delete {user}+{acl}" .format (user = user , acl = acl ))
80
80
81
81
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 ]:
83
83
return [
84
84
# registration permissions
85
85
{
@@ -89,6 +89,27 @@ def get_permissions(service_account_name: str, role: str, linux_user: str) -> ty
89
89
service_account_name , role
90
90
),
91
91
},
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 [
92
113
# task execution permissions
93
114
{
94
115
"user" : service_account_name ,
@@ -108,13 +129,6 @@ def get_permissions(service_account_name: str, role: str, linux_user: str) -> ty
108
129
),
109
130
},
110
131
# 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
- },
118
132
{
119
133
"user" : service_account_name ,
120
134
"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
124
138
"action" : "delete" ,
125
139
},
126
140
# 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
- },
134
141
{
135
142
"user" : service_account_name ,
136
143
"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
142
149
]
143
150
144
151
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 :
146
158
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
+
148
168
for permission in permissions :
149
169
_grant (** permission )
170
+
150
171
log .info ("Permission setup completed for {account}" .format (account = service_account_name ))
151
172
152
173
153
174
def revoke_permissions (linux_user : str , role_name : str , service_account_name : str ) -> None :
154
175
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
+
156
185
for permission in permissions :
157
186
_revoke (** permission )
187
+
158
188
log .info ("Permission cleanup completed for {account}" .format (account = service_account_name ))
159
189
160
190
@@ -228,13 +258,24 @@ def delete_secret(secret: str) -> None:
228
258
229
259
230
260
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
- # )
236
261
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
+ ]
238
279
239
280
240
281
def setup_security (
@@ -263,10 +304,11 @@ def setup_security(
263
304
264
305
service_account_info ["roles" ] = _get_role_list (service_name )
265
306
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
+ )
270
312
271
313
log .info ("Finished setting up strict-mode security" )
272
314
@@ -284,10 +326,9 @@ def cleanup_security(service_name: str, service_account_info: typing.Dict) -> No
284
326
roles = service_account_info .get ("roles" , _get_role_list (service_name ))
285
327
linux_user = service_account_info .get ("linux_user" , "nobody" )
286
328
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
+ )
291
332
292
333
delete_service_account (service_account , service_account_secret )
293
334
0 commit comments