strongdm 1.0.7 → 1.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +28 -6
  3. data/doc/LICENSE.html +1 -11
  4. data/doc/Object.html +1 -679
  5. data/doc/README_md.html +32 -19
  6. data/doc/SDM.html +1 -1
  7. data/doc/SDM/AKS.html +4 -58
  8. data/doc/SDM/AKSBasicAuth.html +3 -3
  9. data/doc/SDM/AKSServiceAccount.html +3 -3
  10. data/doc/SDM/AccountAttachment.html +2 -2
  11. data/doc/SDM/AccountAttachmentCreateResponse.html +1 -1
  12. data/doc/SDM/AccountAttachmentDeleteResponse.html +1 -1
  13. data/doc/SDM/AccountAttachmentGetResponse.html +1 -1
  14. data/doc/SDM/AccountAttachments.html +2 -2
  15. data/doc/SDM/AccountCreateResponse.html +1 -1
  16. data/doc/SDM/AccountDeleteResponse.html +1 -1
  17. data/doc/SDM/AccountGetResponse.html +1 -1
  18. data/doc/SDM/AccountGrant.html +1 -1
  19. data/doc/SDM/AccountGrantCreateResponse.html +1 -1
  20. data/doc/SDM/AccountGrantDeleteResponse.html +1 -1
  21. data/doc/SDM/AccountGrantGetResponse.html +1 -1
  22. data/doc/SDM/AccountGrants.html +1 -1
  23. data/doc/SDM/AccountUpdateResponse.html +1 -1
  24. data/doc/SDM/Accounts.html +9 -9
  25. data/doc/SDM/AlreadyExistsError.html +1 -1
  26. data/doc/SDM/AmazonEKS.html +4 -22
  27. data/doc/SDM/AmazonES.html +3 -3
  28. data/doc/SDM/Athena.html +3 -3
  29. data/doc/SDM/AuroraMysql.html +3 -3
  30. data/doc/SDM/AuroraPostgres.html +3 -3
  31. data/doc/SDM/AuthenticationError.html +1 -1
  32. data/doc/SDM/BadRequestError.html +1 -1
  33. data/doc/SDM/BigQuery.html +3 -3
  34. data/doc/SDM/Cassandra.html +3 -3
  35. data/doc/SDM/Citus.html +3 -3
  36. data/doc/SDM/Client.html +26 -12
  37. data/doc/SDM/Clustrix.html +3 -3
  38. data/doc/SDM/Cockroach.html +3 -3
  39. data/doc/SDM/ControlPanel.html +236 -0
  40. data/doc/SDM/ControlPanelGetSSHCAPublicKeyResponse.html +267 -0
  41. data/doc/SDM/CreateResponseMetadata.html +1 -1
  42. data/doc/SDM/{DB2.html → DB2LUW.html} +7 -7
  43. data/doc/SDM/DB2i.html +391 -0
  44. data/doc/SDM/DeadlineExceededError.html +1 -1
  45. data/doc/SDM/DeleteResponseMetadata.html +1 -1
  46. data/doc/SDM/Druid.html +3 -3
  47. data/doc/SDM/DynamoDB.html +3 -3
  48. data/doc/SDM/Elastic.html +3 -3
  49. data/doc/SDM/ElasticacheRedis.html +3 -3
  50. data/doc/SDM/Gateway.html +4 -4
  51. data/doc/SDM/GetResponseMetadata.html +1 -1
  52. data/doc/SDM/GoogleGKE.html +4 -40
  53. data/doc/SDM/Greenplum.html +3 -3
  54. data/doc/SDM/HTTPAuth.html +3 -3
  55. data/doc/SDM/HTTPBasicAuth.html +3 -3
  56. data/doc/SDM/HTTPNoAuth.html +3 -3
  57. data/doc/SDM/InternalError.html +1 -1
  58. data/doc/SDM/Kubernetes.html +4 -58
  59. data/doc/SDM/KubernetesBasicAuth.html +3 -3
  60. data/doc/SDM/KubernetesServiceAccount.html +3 -3
  61. data/doc/SDM/Maria.html +3 -3
  62. data/doc/SDM/Memcached.html +3 -3
  63. data/doc/SDM/Memsql.html +3 -3
  64. data/doc/SDM/MongoHost.html +3 -3
  65. data/doc/SDM/MongoLegacyHost.html +3 -3
  66. data/doc/SDM/MongoLegacyReplicaset.html +3 -3
  67. data/doc/SDM/MongoReplicaSet.html +3 -3
  68. data/doc/SDM/Mysql.html +3 -3
  69. data/doc/SDM/NodeCreateResponse.html +3 -3
  70. data/doc/SDM/NodeDeleteResponse.html +3 -3
  71. data/doc/SDM/NodeGetResponse.html +3 -3
  72. data/doc/SDM/NodeUpdateResponse.html +3 -3
  73. data/doc/SDM/Nodes.html +11 -11
  74. data/doc/SDM/NotFoundError.html +1 -1
  75. data/doc/SDM/Oracle.html +3 -3
  76. data/doc/SDM/PermissionError.html +1 -1
  77. data/doc/SDM/Plumbing.html +751 -421
  78. data/doc/SDM/Postgres.html +3 -3
  79. data/doc/SDM/Presto.html +3 -3
  80. data/doc/SDM/RDP.html +3 -3
  81. data/doc/SDM/RPCError.html +1 -1
  82. data/doc/SDM/RateLimitError.html +1 -1
  83. data/doc/SDM/RateLimitMetadata.html +1 -1
  84. data/doc/SDM/Redis.html +3 -3
  85. data/doc/SDM/Redshift.html +3 -3
  86. data/doc/SDM/Relay.html +4 -4
  87. data/doc/SDM/ResourceCreateResponse.html +3 -3
  88. data/doc/SDM/ResourceDeleteResponse.html +3 -3
  89. data/doc/SDM/ResourceGetResponse.html +3 -3
  90. data/doc/SDM/ResourceUpdateResponse.html +3 -3
  91. data/doc/SDM/Resources.html +7 -7
  92. data/doc/SDM/Role.html +4 -4
  93. data/doc/SDM/RoleAttachment.html +3 -3
  94. data/doc/SDM/RoleAttachmentCreateResponse.html +3 -3
  95. data/doc/SDM/RoleAttachmentDeleteResponse.html +3 -3
  96. data/doc/SDM/RoleAttachmentGetResponse.html +3 -3
  97. data/doc/SDM/RoleAttachments.html +6 -6
  98. data/doc/SDM/RoleCreateResponse.html +3 -3
  99. data/doc/SDM/RoleDeleteResponse.html +3 -3
  100. data/doc/SDM/RoleGetResponse.html +3 -3
  101. data/doc/SDM/RoleGrant.html +3 -3
  102. data/doc/SDM/RoleGrantCreateResponse.html +3 -3
  103. data/doc/SDM/RoleGrantDeleteResponse.html +3 -3
  104. data/doc/SDM/RoleGrantGetResponse.html +3 -3
  105. data/doc/SDM/RoleGrants.html +6 -6
  106. data/doc/SDM/RoleUpdateResponse.html +3 -3
  107. data/doc/SDM/Roles.html +7 -7
  108. data/doc/SDM/SQLServer.html +3 -3
  109. data/doc/SDM/SSH.html +3 -3
  110. data/doc/SDM/SSHCert.html +3 -3
  111. data/doc/SDM/Service.html +1 -1
  112. data/doc/SDM/Snowflake.html +3 -3
  113. data/doc/SDM/Sybase.html +3 -3
  114. data/doc/SDM/SybaseIQ.html +3 -3
  115. data/doc/SDM/Teradata.html +3 -3
  116. data/doc/SDM/UpdateResponseMetadata.html +1 -1
  117. data/doc/SDM/User.html +1 -1
  118. data/doc/V1.html +17 -2
  119. data/doc/V1/AccountAttachments.html +1 -1
  120. data/doc/V1/AccountAttachments/Service.html +2 -2
  121. data/doc/V1/AccountGrants.html +1 -1
  122. data/doc/V1/AccountGrants/Service.html +1 -1
  123. data/doc/V1/Accounts.html +1 -1
  124. data/doc/V1/Accounts/Service.html +3 -3
  125. data/doc/V1/ControlPanel.html +113 -0
  126. data/doc/V1/ControlPanel/Service.html +119 -0
  127. data/doc/V1/Nodes.html +1 -1
  128. data/doc/V1/Nodes/Service.html +5 -5
  129. data/doc/V1/Resources.html +1 -1
  130. data/doc/V1/Resources/Service.html +1 -1
  131. data/doc/V1/RoleAttachments.html +1 -1
  132. data/doc/V1/RoleAttachments/Service.html +1 -1
  133. data/doc/V1/RoleGrants.html +1 -1
  134. data/doc/V1/RoleGrants/Service.html +1 -1
  135. data/doc/V1/Roles.html +1 -1
  136. data/doc/V1/Roles/Service.html +1 -1
  137. data/doc/V1/Tags.html +1 -1
  138. data/doc/created.rid +39 -45
  139. data/doc/css/rdoc.css +13 -5
  140. data/doc/examples/Gemfile.html +1 -11
  141. data/doc/index.html +12 -12
  142. data/doc/js/navigation.js.gz +0 -0
  143. data/doc/js/search_index.js +1 -1
  144. data/doc/js/search_index.js.gz +0 -0
  145. data/doc/js/searcher.js.gz +0 -0
  146. data/doc/lib/version.html +3 -13
  147. data/doc/strongdm_gemspec.html +0 -8
  148. data/doc/table_of_contents.html +232 -172
  149. data/lib/grpc/account_attachments_services_pb.rb +1 -1
  150. data/lib/grpc/accounts_services_pb.rb +3 -4
  151. data/lib/grpc/control_panel_pb.rb +39 -0
  152. data/lib/grpc/control_panel_services_pb.rb +37 -0
  153. data/lib/grpc/drivers_pb.rb +17 -12
  154. data/lib/grpc/nodes_services_pb.rb +3 -4
  155. data/lib/grpc/plumbing.rb +109 -30
  156. data/lib/models/porcelain.rb +117 -61
  157. data/lib/strongdm.rb +10 -9
  158. data/lib/svc.rb +52 -9
  159. data/lib/version +5 -5
  160. data/lib/version.rb +1 -1
  161. data/strongdm.gemspec +1 -1
  162. metadata +24 -26
  163. data/examples/Gemfile.lock +0 -14
  164. data/examples/README.md +0 -5
  165. data/examples/ldap-sync/ldapSync.rb +0 -290
  166. data/examples/okta-sync/Gemfile +0 -4
  167. data/examples/okta-sync/Gemfile.lock +0 -38
  168. data/examples/okta-sync/matchers.yml +0 -11
  169. data/examples/okta-sync/oktaSync.rb +0 -173
  170. data/examples/panicButton.rb +0 -138
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "strongdm"
4
- gem "oktakit"
@@ -1,38 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- addressable (2.7.0)
5
- public_suffix (>= 2.0.2, < 5.0)
6
- faraday (1.0.0)
7
- multipart-post (>= 1.2, < 3)
8
- google-protobuf (3.11.4)
9
- googleapis-common-protos-types (1.0.4)
10
- google-protobuf (~> 3.0)
11
- grpc (1.27.0)
12
- google-protobuf (~> 3.11)
13
- googleapis-common-protos-types (~> 1.0)
14
- grpc-tools (1.27.0)
15
- ipaddr (1.2.2)
16
- multipart-post (2.1.1)
17
- oktakit (0.2.0)
18
- sawyer (~> 0.8.1)
19
- openssl (2.1.2)
20
- ipaddr
21
- public_suffix (4.0.3)
22
- sawyer (0.8.2)
23
- addressable (>= 2.3.5)
24
- faraday (> 0.8, < 2.0)
25
- strongdm (1.0.0)
26
- grpc (~> 1.27.0, >= 1.27.0)
27
- grpc-tools (~> 1.27.0, >= 1.27.0)
28
- openssl (~> 2.1.2, >= 2.1.2)
29
-
30
- PLATFORMS
31
- ruby
32
-
33
- DEPENDENCIES
34
- oktakit
35
- strongdm
36
-
37
- BUNDLED WITH
38
- 1.17.2
@@ -1,11 +0,0 @@
1
- ---
2
- groups:
3
- -
4
- name: db/mongo
5
- resources:
6
- - type:mongo name:don*
7
- - type:ssh name:dev*
8
- -
9
- name: app/web
10
- resources:
11
- - type:ssh name:dev-web*
@@ -1,173 +0,0 @@
1
- # Copyright 2020 StrongDM Inc
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- #
15
- require "yaml"
16
- require "strongdm"
17
- require "oktakit"
18
- require "optparse"
19
-
20
- SDM_API_ACCESS_KEY = ENV.fetch("SDM_API_ACCESS_KEY", "")
21
- SDM_API_SECRET_KEY = ENV.fetch("SDM_API_SECRET_KEY", "")
22
- OKTA_CLIENT_TOKEN = ENV.fetch("OKTA_CLIENT_TOKEN", "")
23
- OKTA_CLIENT_ORGURL = ENV.fetch("OKTA_CLIENT_ORGURL", "")
24
-
25
- def okta_sync
26
- if SDM_API_ACCESS_KEY == "" || SDM_API_SECRET_KEY == "" || OKTA_CLIENT_TOKEN == "" || OKTA_CLIENT_ORGURL == ""
27
- puts "SDM_API_ACCESS_KEY, SDM_API_SECRET_KEY, OKTA_CLIENT_TOKEN, and OKTA_CLIENT_ORGURL must be set"
28
- exit
29
- end
30
-
31
- report = {
32
- :start => Time.now,
33
-
34
- :oktaUsersCount => 0,
35
- :oktaUsers => [],
36
-
37
- :sdmUsersCount => 0,
38
- :sdmUsers => [],
39
-
40
- :bothUsersCount => 0,
41
-
42
- :sdmResourcesCount => 0,
43
- :sdmResources => {},
44
-
45
- :permissionsGranted => 0,
46
- :permissionsRevoked => 0,
47
- :grants => [],
48
- :revocations => [],
49
-
50
- :matchers => {},
51
- }
52
-
53
- plan = false
54
- verbose = false
55
- OptionParser.new do |opts|
56
- opts.banner = "Usage oktaSync.rb [options]"
57
- opts.on("-p", "--plan", "calculate changes but do not apply them") do |p|
58
- plan = p
59
- end
60
- opts.on("-v", "--verbose", "print detailed report") do |v|
61
- verbose = v
62
- end
63
- end.parse!
64
-
65
- client = SDM::Client.new(SDM_API_ACCESS_KEY, SDM_API_SECRET_KEY)
66
- okta_client = Oktakit.new(token: OKTA_CLIENT_TOKEN, api_endpoint: OKTA_CLIENT_ORGURL + "/api/v1")
67
- matchers = YAML.load(File.read("matchers.yml"))
68
- report[:matchers] = matchers
69
-
70
- all_users = okta_client.list_users({
71
- 'query': {
72
- 'search': "profile.department eq \"Engineering\" and (status eq \"ACTIVE\")",
73
- },
74
- })
75
-
76
- okta_users = Array.new()
77
- all_users[0].each { |u|
78
- groups = okta_client.get_member_groups(u.id)
79
- group_names = Array.new()
80
- groups[0].each { |ug|
81
- group_names.push(ug.profile.name)
82
- }
83
- okta_users.push({ :login => u.profile.login, :first_name => u.profile.firstName, :last_name => u.profile.LastName, :groups => group_names })
84
- }
85
- report[:oktaUsers] = okta_users
86
- report[:oktaUsersCount] = okta_users.size
87
-
88
- accounts = client.accounts.list("type:user").map { |a| [a.email, a] }.to_h
89
- report[:sdmUsers] = accounts
90
- report[:sdmUsersCount] = accounts.size
91
- grants = client.account_grants.list("").map { |ag| ag }
92
-
93
- current = {}
94
- grants.each { |g|
95
- current[g.account_id] = [] if not current[g.account_id]
96
- current[g.account_id].push({ :resource_id => g.resource_id, :id => g.id })
97
- }
98
-
99
- desired = {}
100
- overlapping = 0
101
- matchers["groups"].each { |group|
102
- group["resources"].each { |resourceQuery|
103
- client.resources.list(resourceQuery).each { |res|
104
- report[:sdmResources][res.id] = res
105
- okta_users.each { |u|
106
- if u[:groups].include? group["name"]
107
- account = accounts[u[:login]]
108
- if account != nil
109
- overlapping += 1
110
- desired[account.id] = [] if not desired[account.id]
111
- desired[account.id].push(res.id)
112
- end
113
- end
114
- }
115
- }
116
- }
117
- }
118
- report[:bothUsersCount] = overlapping
119
- report[:sdmResourcesCount] = report[:sdmResources].size
120
-
121
- revocations = 0
122
- current.each { |aid, curRes|
123
- desRes = desired[aid]
124
- desRes = [] if not desired[aid]
125
- curRes.each { |r|
126
- if not(desRes.include? r[:resource_id])
127
- if plan
128
- puts "Plan: revoke %s from user %s\n" % [r[:resource_id], aid]
129
- else
130
- client.account_grants.delete(r[:id])
131
- end
132
- report[:revocations].push(r[:id])
133
- revocations += 1
134
- end
135
- }
136
- }
137
- report[:permissionsRevoked] = revocations
138
-
139
- grants = 0
140
- desired.each { |aid, desRes|
141
- curRes = current[aid]
142
- curRes = [] if not current[aid]
143
- desRes.each { |r|
144
- if not(curRes.map { |c| c[:resource_id] }.include? r)
145
- ag = SDM::AccountGrant.new()
146
- ag.account_id = aid
147
- ag.resource_id = r
148
- if plan
149
- puts "Plan: grant %s to user %s\n" % [r, aid]
150
- else
151
- client.account_grants.create(ag)
152
- end
153
- report[:grants].push(ag)
154
- grants += 1
155
- end
156
- }
157
- }
158
- report[:permissionsGranted] = grants
159
-
160
- report[:complete] = Time.now
161
-
162
- if verbose
163
- puts report.to_json
164
- else
165
- puts "%d Okta users, %d strongDM users, %d overlapping users, %d grants, %d revocations" % [okta_users.size, accounts.size, overlapping, grants, revocations]
166
- end
167
- end
168
-
169
- begin
170
- okta_sync
171
- rescue StandardError => ex
172
- puts "cannot synchronize with okta: " + ex.to_s
173
- end
@@ -1,138 +0,0 @@
1
- # Copyright 2020 StrongDM Inc
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- #
15
- require "strongdm"
16
- require "OpenSSL"
17
- require "JSON"
18
-
19
- # panicButton.rb suspends all users except for one admin,
20
- # in the fake use case of a critical break in or something
21
- # usage:
22
- # ruby panicButton.rb adminuser@email.com
23
- # to revert back to pre-panic state:
24
- # ruby panicButton.rb revert
25
- def main
26
- access_key = ENV["SDM_API_ACCESS_KEY"]
27
- secret_key = ENV["SDM_API_SECRET_KEY"]
28
- if access_key == nil or secret_key == nil
29
- puts "SDM_API_ACCESS_KEY and SDM_API_SECRET_KEY must be provided"
30
- return
31
- end
32
- client = SDM::Client.new(access_key, secret_key)
33
-
34
- if ARGV.size == 1 and ARGV[0] == "revert"
35
- state_file = File.open("state.json")
36
- state = JSON.load(state_file)
37
-
38
- reinstated_count = 0
39
-
40
- users = client.accounts.list("")
41
- users.each { |user|
42
- if user.suspended
43
- reinstated_count += 1
44
- user.suspended = false
45
- client.accounts.update(user)
46
- end
47
- }
48
- state["attachments"].each { |attachment|
49
- begin
50
- a = SDM::AccountAttachment.new()
51
- a.account_id = attachment["account_id"]
52
- a.role_id = attachment["role_id"]
53
- client.account_attachments.create(a)
54
- rescue SDM::AlreadyExistsError
55
- rescue => ex
56
- puts "skipping creation of attachment due to error: " + ex.to_s
57
- end
58
- }
59
- state["grants"].each { |attachment|
60
- begin
61
- g = SDM::AccountGrant.new()
62
- g.account_id = attachment["account_id"]
63
- g.resource_id = attachment["resource_id"]
64
- client.account_grants.create(g)
65
- rescue SDM::AlreadyExistsError
66
- rescue => ex
67
- puts "skipping creation of grant due to error: " + ex.to_s
68
- end
69
- }
70
-
71
- puts "reinstated " + reinstated_count.to_s + " users"
72
- puts "recreated " + state["attachments"].size.to_s + " account attachments"
73
- puts "recreated " + state["grants"].size.to_s + " account grants"
74
-
75
- return
76
- end
77
-
78
- admin_email = ""
79
- if ARGV.size == 1
80
- admin_email = ARGV[0]
81
- else
82
- puts "please provide an admin email to preserve"
83
- return 1
84
- end
85
-
86
- admin_user_id = ""
87
- users = client.accounts.list("email:?", admin_email)
88
- users.each { |user|
89
- admin_user_id = user.id
90
- }
91
-
92
- account_attachments = client.account_attachments.list("")
93
- account_grants = client.account_grants.list("")
94
-
95
- state = {
96
- 'attachments': account_attachments.map { |x|
97
- if x.account_id != admin_user_id
98
- out = {
99
- 'account_id': x.account_id,
100
- 'role_id': x.role_id,
101
- }
102
- end
103
- }.reject { |x| x == nil },
104
- 'grants': account_grants.map { |x|
105
- if x.account_id != admin_user_id and x.valid_until == nil
106
- out = {
107
- 'account_id': x.account_id,
108
- 'resource_id': x.resource_id,
109
- }
110
- end
111
- }.reject { |x| x == nil },
112
- }
113
-
114
- puts "storing " + state[:attachments].size.to_s + " account attachments in state"
115
- puts "storing " + state[:grants].size.to_s + " account grants in state"
116
-
117
- state_file = File.open("state.json", "w")
118
- state_file.write(state.to_json)
119
-
120
- suspended_count = 0
121
- users = client.accounts.list("")
122
- users.each { |user|
123
- if user.instance_of? SDM::User and user.email == admin_email
124
- next
125
- end
126
- user.suspended = true
127
- begin
128
- client.accounts.update(user)
129
- suspended_count += 1
130
- rescue StandardError => ex
131
- puts "skipping user " + user.id + " on account of error: " + ex.to_s
132
- end
133
- }
134
-
135
- puts "suspended " + suspended_count.to_s + " users"
136
- end
137
-
138
- main()