Skip to content

Commit 2400885

Browse files
authored
Identity service support, containing Users, Roles, Policies and Directories API's with fitting validation models (cyberark#20)
* Identity service support, containing Users, Roles, Policies and Directories API's with fitting validation models * Minor fix to defaults * Minor fix to defaults * Minor fixes * Some more examples * Some more examples
1 parent c38d13f commit 2400885

File tree

73 files changed

+2319
-77
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+2319
-77
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ CyberArk's Official SDK and CLI for different services operations
3737
- [x] DPA K8S Service
3838
- [x] DPA DB Service
3939
- [x] Session Monitoring Service
40+
- [x] Identity Users Service
41+
- [x] Identity Roles Service
42+
- [x] Identity Policies Service
43+
- [x] Identity Directories Service
4044
- [x] All services contains CRUD and Statistics per respective service
4145
- [x] Ready to use SDK in Python
4246
- [x] CLI and SDK Examples
@@ -211,6 +215,12 @@ The following services and commands are supported:
211215
- <b>db</b> - DPA DB Enduser Operations
212216
- <b>sso</b> - DPA SSO Enduser Operations
213217
- <b>k8s</b> - DPA kubernetes service
218+
- <b>sm</b> - Session Monitoring Service
219+
- <b>identity</b> - Identity Service
220+
- <b>users</b> - Identity Users Management
221+
- <b>roles</b> - Identity Roles Management
222+
- <b>policies</b> - Identity Policies Management
223+
- <b>directories</b> - Identity Directories Reading
214224
215225
Any command has its own subcommands, with respective arguments
216226

ark_sdk_python/ark_api.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,54 @@ def profile(self) -> ArkProfile:
8080
"""
8181
return self.__profile
8282

83+
@property
84+
def identity_directories(self) -> "ArkIdentityDirectoriesService":
85+
"""
86+
Returns the Identity Directories Service if the appropriate authenticators were given
87+
88+
Returns:
89+
ArkIdentityDirectoriesService: _description_
90+
"""
91+
from ark_sdk_python.services.identity.directories import ArkIdentityDirectoriesService
92+
93+
return cast(ArkIdentityDirectoriesService, self.service(ArkIdentityDirectoriesService))
94+
95+
@property
96+
def identity_policies(self) -> "ArkIdentityPoliciesService":
97+
"""
98+
Returns the Identity Policies Service if the appropriate authenticators were given
99+
100+
Returns:
101+
ArkIdentityPoliciesService: _description_
102+
"""
103+
from ark_sdk_python.services.identity.policies import ArkIdentityPoliciesService
104+
105+
return cast(ArkIdentityPoliciesService, self.service(ArkIdentityPoliciesService))
106+
107+
@property
108+
def identity_roles(self) -> "ArkIdentityRolesService":
109+
"""
110+
Returns the Identity Roles Service if the appropriate authenticators were given
111+
112+
Returns:
113+
ArkIdentityRolesService: _description_
114+
"""
115+
from ark_sdk_python.services.identity.roles import ArkIdentityRolesService
116+
117+
return cast(ArkIdentityRolesService, self.service(ArkIdentityRolesService))
118+
119+
@property
120+
def identity_users(self) -> "ArkIdentityUsersService":
121+
"""
122+
Returns the Identity Users Service if the appropriate authenticators were given
123+
124+
Returns:
125+
ArkIdentityUsersService: _description_
126+
"""
127+
from ark_sdk_python.services.identity.users import ArkIdentityUsersService
128+
129+
return cast(ArkIdentityUsersService, self.service(ArkIdentityUsersService))
130+
83131
@property
84132
def dpa_workspaces_db(self) -> "ArkDPADBWorkspaceService":
85133
"""
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from ark_sdk_python.auth import ArkISPAuth
2+
from ark_sdk_python.models.auth import ArkAuthMethod, ArkAuthProfile, ArkSecret, IdentityArkAuthMethodSettings
3+
from ark_sdk_python.models.services.identity.roles import ArkIdentityCreateRole
4+
from ark_sdk_python.models.services.identity.users import ArkIdentityCreateUser
5+
from ark_sdk_python.services.identity import ArkIdentityAPI
6+
7+
if __name__ == "__main__":
8+
isp_auth = ArkISPAuth()
9+
isp_auth.authenticate(
10+
auth_profile=ArkAuthProfile(
11+
username='CoolUser', auth_method=ArkAuthMethod.Identity, auth_method_settings=IdentityArkAuthMethodSettings()
12+
),
13+
secret=ArkSecret(secret='CoolPassword'),
14+
)
15+
16+
# Create an identity service to create some users and roles
17+
print('Creating identity roles and users')
18+
identity_api = ArkIdentityAPI(isp_auth)
19+
identity_api.identity_roles.create_role(ArkIdentityCreateRole(role_name='IT'))
20+
identity_api.identity_users.create_user(ArkIdentityCreateUser(username='it_user', password='CoolPassword', roles=['IT']))
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from ark_sdk_python.auth import ArkISPAuth
2+
from ark_sdk_python.models.ark_profile import ArkProfileLoader
3+
from ark_sdk_python.models.services.identity.directories import ArkIdentityListDirectoriesEntities
4+
from ark_sdk_python.services.identity import ArkIdentityAPI
5+
6+
if __name__ == "__main__":
7+
isp_auth = ArkISPAuth()
8+
isp_auth.authenticate(ArkProfileLoader().load_default_profile())
9+
identity_api = ArkIdentityAPI(isp_auth)
10+
print(identity_api.identity_directories.tenant_default_suffix())
11+
for page in identity_api.identity_directories.list_directories_entities(ArkIdentityListDirectoriesEntities()):
12+
print([i.name for i in page.items])

ark_sdk_python/models/actions/services/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
from typing import Any, List
22

33
from ark_sdk_python.models.actions.services.ark_dpa_exec_action_consts import DPA_ACTIONS
4+
from ark_sdk_python.models.actions.services.ark_identity_exec_action_consts import IDENTITY_ACTIONS
45
from ark_sdk_python.models.actions.services.ark_sm_exec_action_consts import SM_ACTIONS
56

67
SUPPORTED_SERVICE_ACTIONS: List[Any] = [
8+
IDENTITY_ACTIONS,
79
DPA_ACTIONS,
810
SM_ACTIONS,
911
]
1012

1113
__all__ = [
14+
'IDENTITY_ACTIONS',
1215
'DPA_ACTIONS',
1316
'SM_ACTIONS',
1417
'SUPPORTED_SERVICE_ACTIONS',
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
from typing import Dict, Final, Optional, Type
2+
3+
from ark_sdk_python.models import ArkModel
4+
from ark_sdk_python.models.actions.ark_service_action_definition import ArkServiceActionDefinition
5+
from ark_sdk_python.models.services.identity.directories import ArkIdentityListDirectories, ArkIdentityListDirectoriesEntities
6+
from ark_sdk_python.models.services.identity.policies import (
7+
ArkIdentityAddAuthenticationProfile,
8+
ArkIdentityAddPolicy,
9+
ArkIdentityDisablePolicy,
10+
ArkIdentityEnablePolicy,
11+
ArkIdentityGetAuthenticationProfile,
12+
ArkIdentityGetPolicy,
13+
ArkIdentityRemoveAuthenticationProfile,
14+
ArkIdentityRemovePolicy,
15+
)
16+
from ark_sdk_python.models.services.identity.roles import (
17+
ArkIdentityAddAdminRightsToRole,
18+
ArkIdentityAddGroupToRole,
19+
ArkIdentityAddRoleToRole,
20+
ArkIdentityAddUserToRole,
21+
ArkIdentityCreateRole,
22+
ArkIdentityDeleteRole,
23+
ArkIdentityListRoleMembers,
24+
ArkIdentityRemoveGroupFromRole,
25+
ArkIdentityRemoveRoleFromRole,
26+
ArkIdentityRemoveUserFromRole,
27+
ArkIdentityRoleIdByName,
28+
ArkIdentityUpdateRole,
29+
)
30+
from ark_sdk_python.models.services.identity.users import (
31+
ArkIdentityCreateUser,
32+
ArkIdentityDeleteUser,
33+
ArkIdentityResetUserPassword,
34+
ArkIdentityUpdateUser,
35+
ArkIdentityUserByName,
36+
ArkIdentityUserIdByName,
37+
)
38+
39+
# Identity Definitions
40+
# Directories
41+
IDENTITY_DIRECTORIES_ACTION_TO_SCHEMA_MAP: Final[Dict[str, Optional[Type[ArkModel]]]] = {
42+
'list-directories': ArkIdentityListDirectories,
43+
'list-directories-entities': ArkIdentityListDirectoriesEntities,
44+
'tenant-default-suffix': None,
45+
}
46+
IDENTITY_DIRECTORIES_ACTIONS: Final[ArkServiceActionDefinition] = ArkServiceActionDefinition(
47+
action_name='directories',
48+
schemas=IDENTITY_DIRECTORIES_ACTION_TO_SCHEMA_MAP,
49+
)
50+
51+
# Policies
52+
IDENTITY_POLICIES_ACTION_TO_SCHEMA_MAP: Final[Dict[str, Optional[Type[ArkModel]]]] = {
53+
'add-authentication-profile': ArkIdentityAddAuthenticationProfile,
54+
'remove-authentication-profile': ArkIdentityRemoveAuthenticationProfile,
55+
'list-authentication-profiles': None,
56+
'authentication-profile': ArkIdentityGetAuthenticationProfile,
57+
'add-policy': ArkIdentityAddPolicy,
58+
'remove-policy': ArkIdentityRemovePolicy,
59+
'list-policies': None,
60+
'policy': ArkIdentityGetPolicy,
61+
'enable-policy': ArkIdentityEnablePolicy,
62+
'disable-policy': ArkIdentityDisablePolicy,
63+
'enable-default-policy': None,
64+
'disable-default-policy': None,
65+
}
66+
IDENTITY_POLICIES_ACTIONS: Final[ArkServiceActionDefinition] = ArkServiceActionDefinition(
67+
action_name='policies',
68+
schemas=IDENTITY_POLICIES_ACTION_TO_SCHEMA_MAP,
69+
)
70+
71+
# Roles
72+
IDENTITY_ROLES_ACTION_TO_SCHEMA_MAP: Final[Dict[str, Optional[Type[ArkModel]]]] = {
73+
'add-user-to-role': ArkIdentityAddUserToRole,
74+
'add-group-to-role': ArkIdentityAddGroupToRole,
75+
'add-role-to-role': ArkIdentityAddRoleToRole,
76+
'remove-user-from-role': ArkIdentityRemoveUserFromRole,
77+
'remove-group-from-role': ArkIdentityRemoveGroupFromRole,
78+
'remove-role-from-role': ArkIdentityRemoveRoleFromRole,
79+
'create-role': ArkIdentityCreateRole,
80+
'update-role': ArkIdentityUpdateRole,
81+
'delete-role': ArkIdentityDeleteRole,
82+
'list-role-members': ArkIdentityListRoleMembers,
83+
'add-admin-rights-to-role': ArkIdentityAddAdminRightsToRole,
84+
'role-id-by-name': ArkIdentityRoleIdByName,
85+
}
86+
IDENTITY_ROLES_ACTIONS: Final[ArkServiceActionDefinition] = ArkServiceActionDefinition(
87+
action_name='roles',
88+
schemas=IDENTITY_ROLES_ACTION_TO_SCHEMA_MAP,
89+
)
90+
91+
# Users
92+
IDENTITY_USERS_ACTION_TO_SCHEMA_MAP: Final[Dict[str, Optional[Type[ArkModel]]]] = {
93+
'create-user': ArkIdentityCreateUser,
94+
'update-user': ArkIdentityUpdateUser,
95+
'delete-user': ArkIdentityDeleteUser,
96+
'user-by-name': ArkIdentityUserByName,
97+
'user-id-by-name': ArkIdentityUserIdByName,
98+
'reset-user-password': ArkIdentityResetUserPassword,
99+
}
100+
IDENTITY_USERS_ACTIONS: Final[ArkServiceActionDefinition] = ArkServiceActionDefinition(
101+
action_name='users',
102+
schemas=IDENTITY_USERS_ACTION_TO_SCHEMA_MAP,
103+
)
104+
105+
# Service Actions Definition
106+
IDENTITY_ACTIONS: Final[ArkServiceActionDefinition] = ArkServiceActionDefinition(
107+
action_name='identity',
108+
subactions=[
109+
IDENTITY_DIRECTORIES_ACTIONS,
110+
IDENTITY_POLICIES_ACTIONS,
111+
IDENTITY_ROLES_ACTIONS,
112+
IDENTITY_USERS_ACTIONS,
113+
],
114+
)

ark_sdk_python/models/common/identity/ark_identity_directory_schemas.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class RoleRow(ArkModel):
9494
id: str = Field(alias='_ID')
9595
admin_rights: Optional[List[RoleAdminRight]] = Field(alias='AdministrativeRights')
9696
is_hidden: Optional[bool] = Field(alias='IsHidden')
97+
description: Optional[str] = Field(alias='Description')
9798

9899

99100
class RoleResult(ArkModel):
@@ -113,6 +114,7 @@ class UserRow(ArkModel):
113114
directory_service_type: DirectoryService = Field(alias='ServiceType')
114115
email: Optional[str] = Field(alias='EMail')
115116
internal_id: Optional[str] = Field(alias='InternalName')
117+
description: Optional[str] = Field(alias='Description')
116118

117119

118120
class UserResult(ArkModel):

ark_sdk_python/models/services/dpa/policies/db/ark_dpa_db_connection_data.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,13 @@ class ArkDPADBOracleDBAuth(ArkDPADBBaseAuth):
4040

4141

4242
class ArkDPADBMongoDBAuth(ArkDPADBBaseAuth):
43-
global_builtin_roles: List[ArkDPADBMongoGlobalBuiltinRole] = Field(description='Global builtin roles across all databases')
44-
database_builtin_roles: Dict[str, List[ArkDPADBMongoDatabaseBuiltinRole]] = Field(description='Per database builtin roles')
45-
database_custom_roles: Dict[str, List[str]] = Field(description='Custom per database roles')
43+
global_builtin_roles: List[ArkDPADBMongoGlobalBuiltinRole] = Field(
44+
description='Global builtin roles across all databases', default_factory=list
45+
)
46+
database_builtin_roles: Dict[str, List[ArkDPADBMongoDatabaseBuiltinRole]] = Field(
47+
description='Per database builtin roles', default_factory=dict
48+
)
49+
database_custom_roles: Dict[str, List[str]] = Field(description='Custom per database roles', default_factory=dict)
4650
applied_to: Optional[List[ArkDPADBAppliedTo]] = Field(description='Which resources to apply to')
4751

4852

ark_sdk_python/models/services/dpa/workspaces/db/ark_dpa_db_add_database.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class ArkDPADBAddDatabase(ArkCamelizedModel):
1414
platform: ArkWorkspaceType = Field(
1515
description='Platform of the database, as in, where it resides, defaulted to on premises', default=ArkWorkspaceType.ONPREM
1616
)
17+
auth_database: str = Field(description='Authentication database used, most commonly used with mongodb', default='admin')
1718
services: Optional[List[str]] = Field(description='Services related to the database, most commonly used with oracle')
1819
domain: Optional[str] = Field(description='The domain the DB resides in')
1920
domain_controller_name: Optional[str] = Field(description='Domain controller name associated to this database')

ark_sdk_python/models/services/dpa/workspaces/db/ark_dpa_db_database.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class ArkDPADBDatabase(ArkCamelizedModel):
1313
name: str = Field(description='Name of the database, often referenced in policies and other APIs')
1414
network_name: str = Field(description='Name of the network the database resides in', default='OnPrem')
1515
platform: Optional[ArkWorkspaceType] = Field(description='Platform of the database, as in, where it resides')
16+
auth_database: str = Field(description='Authentication database used, most commonly used with mongodb', default='admin')
1617
services: List[str] = Field(description='Services related to the database, most commonly used with oracle', default_factory=list)
1718
domain: Optional[str] = Field(description='The domain the DB resides in')
1819
domain_controller_name: Optional[str] = Field(description='Domain controller name associated to this database')

ark_sdk_python/models/services/dpa/workspaces/db/ark_dpa_db_update_database.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class ArkDPADBUpdateDatabase(ArkCamelizedModel):
1414
new_name: Optional[str] = Field(description='New name for the database')
1515
network_name: Optional[str] = Field(description='Name of the network the database resides in', default='ON-PREMISE')
1616
platform: Optional[ArkWorkspaceType] = Field(description='Platform of the database, as in, where it resides')
17+
auth_database: str = Field(description='Authentication database used, most commonly used with mongodb', default='admin')
1718
services: Optional[List[str]] = Field(description='Services related to the database, most commonly used with oracle')
1819
domain: Optional[str] = Field(description='The domain the DB resides in')
1920
domain_controller_name: Optional[str] = Field(description='Domain controller name associated to this database')

ark_sdk_python/models/services/identity/__init__.py

Whitespace-only changes.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from ark_sdk_python.models.services.identity.directories.ark_identity_directory import ArkIdentityDirectory
2+
from ark_sdk_python.models.services.identity.directories.ark_identity_entity import (
3+
ArkIdentityEntity,
4+
ArkIdentityEntityType,
5+
ArkIdentityGroupEntity,
6+
ArkIdentityRoleEntity,
7+
ArkIdentityUserEntity,
8+
)
9+
from ark_sdk_python.models.services.identity.directories.ark_identity_list_directories import ArkIdentityListDirectories
10+
from ark_sdk_python.models.services.identity.directories.ark_identity_list_directories_entities import ArkIdentityListDirectoriesEntities
11+
12+
__all__ = [
13+
'ArkIdentityListDirectoriesEntities',
14+
'ArkIdentityEntity',
15+
'ArkIdentityEntityType',
16+
'ArkIdentityGroupEntity',
17+
'ArkIdentityRoleEntity',
18+
'ArkIdentityUserEntity',
19+
'ArkIdentityListDirectories',
20+
'ArkIdentityDirectory',
21+
]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from pydantic import Field
2+
3+
from ark_sdk_python.models import ArkModel
4+
from ark_sdk_python.models.common.identity import DirectoryService
5+
6+
7+
class ArkIdentityDirectory(ArkModel):
8+
directory: DirectoryService = Field(description='Name of the directory')
9+
directory_service_uuid: str = Field(description='ID of the directory')
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from enum import Enum
2+
from typing import List, Optional
3+
4+
from pydantic import Field
5+
6+
from ark_sdk_python.models import ArkModel
7+
from ark_sdk_python.models.common.identity import DirectoryService, RoleAdminRight
8+
9+
10+
class ArkIdentityEntityType(str, Enum):
11+
Role = 'ROLE'
12+
User = 'USER'
13+
Group = 'GROUP'
14+
15+
16+
class ArkIdentityEntity(ArkModel):
17+
id: str = Field(description='ID of the entity')
18+
name: str = Field(description='Name of the entity')
19+
entity_type: ArkIdentityEntityType = Field(description='Type of the entity')
20+
directory_service_type: DirectoryService = Field(description='Directory type of the entity')
21+
display_name: Optional[str] = Field(description='Display name of the entity')
22+
service_instance_localized: str = Field(description='Display directory service name')
23+
24+
25+
class ArkIdentityUserEntity(ArkIdentityEntity):
26+
email: Optional[str] = Field(description='Email of the user')
27+
description: Optional[str] = Field(description='Description of the user')
28+
29+
30+
class ArkIdentityGroupEntity(ArkIdentityEntity):
31+
pass
32+
33+
34+
class ArkIdentityRoleEntity(ArkIdentityEntity):
35+
admin_rights: Optional[List[RoleAdminRight]] = Field(description='Admin rights of the role')
36+
is_hidden: bool = Field(description='Whwether this role is hidden or not')
37+
description: Optional[str] = Field(description='Description of the role')
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from typing import List, Optional
2+
3+
from pydantic import Field
4+
5+
from ark_sdk_python.models import ArkModel
6+
from ark_sdk_python.models.common.identity import DirectoryService
7+
8+
9+
class ArkIdentityListDirectories(ArkModel):
10+
directories: Optional[List[DirectoryService]] = Field(description='Directories types to list')

0 commit comments

Comments
 (0)