conjur-api 2.4.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/LICENSE +1 -1
- data/Rakefile +3 -1
- data/conjur-api.gemspec +3 -1
- data/lib/conjur-api/version.rb +1 -1
- data/lib/conjur/has_id.rb +1 -1
- data/lib/conjur/log.rb +6 -26
- data/lib/conjur/resource.rb +10 -1
- data/manual/asset/about.markdown +12 -0
- data/manual/asset/members.add.markdown +52 -0
- data/manual/asset/show.markdown +50 -0
- data/manual/group/about.markdown +6 -0
- data/manual/group/create.markdown +20 -0
- data/manual/host/about.markdown +23 -0
- data/manual/host/create.markdown +34 -0
- data/manual/host/enroll.markdown +21 -0
- data/manual/resource/about.markdown +11 -0
- data/manual/resource/create.markdown +29 -0
- data/manual/resource/deny.markdown +23 -0
- data/manual/resource/permit.markdown +35 -0
- data/manual/role/about.markdown +10 -0
- data/manual/role/members.markdown +40 -0
- data/manual/role/memberships.markdown +26 -0
- data/spec/api/authn_spec.rb +49 -0
- data/spec/api/groups_spec.rb +24 -0
- data/spec/api/hosts_spec.rb +29 -0
- data/spec/api/resources_spec.rb +19 -0
- data/spec/api/secrets_spec.rb +16 -0
- data/spec/api/users_spec.rb +16 -0
- data/spec/api/variables_spec.rb +14 -0
- data/spec/cas_rest_client.rb +17 -0
- data/spec/io_helper.rb +18 -0
- data/spec/lib/build_from_response_spec.rb +49 -0
- data/spec/lib/host_spec.rb +12 -8
- data/spec/lib/log_source_spec.rb +13 -0
- data/spec/lib/log_spec.rb +42 -0
- data/spec/lib/resource_spec.rb +98 -5
- data/spec/lib/role_grant_spec.rb +12 -0
- data/spec/lib/role_spec.rb +83 -3
- data/spec/lib/standard_methods_spec.rb +66 -0
- data/spec/lib/user_spec.rb +2 -1
- data/spec/spec_helper.rb +27 -0
- data/spec/standard_methods_helper.rb +30 -0
- data/spec/variable_spec.rb +41 -0
- metadata +71 -8
- data/.rvmrc +0 -1
data/.gitignore
CHANGED
data/LICENSE
CHANGED
data/Rakefile
CHANGED
@@ -3,7 +3,9 @@ require "bundler/gem_tasks"
|
|
3
3
|
|
4
4
|
begin
|
5
5
|
require 'rspec/core/rake_task'
|
6
|
-
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
7
|
+
t.rspec_opts = '--order rand'
|
8
|
+
end
|
7
9
|
rescue LoadError
|
8
10
|
$stderr.puts "RSpec Rake tasks not available in environment #{ENV['RACK_ENV']}"
|
9
11
|
end
|
data/conjur-api.gemspec
CHANGED
@@ -3,10 +3,11 @@ require File.expand_path('../lib/conjur-api/version', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Rafa\305\202 Rzepecki","Kevin Gilpin"]
|
6
|
-
gem.email = ["divided.mind@gmail.com","
|
6
|
+
gem.email = ["divided.mind@gmail.com","kgilpin@conjur.net"]
|
7
7
|
gem.description = %q{Conjur API}
|
8
8
|
gem.summary = %q{Conjur API}
|
9
9
|
gem.homepage = ""
|
10
|
+
gem.license = "MIT"
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\) + Dir['build_number']
|
12
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -23,4 +24,5 @@ Gem::Specification.new do |gem|
|
|
23
24
|
gem.add_development_dependency 'rspec'
|
24
25
|
gem.add_development_dependency 'webmock'
|
25
26
|
gem.add_development_dependency 'ci_reporter'
|
27
|
+
gem.add_development_dependency 'simplecov'
|
26
28
|
end
|
data/lib/conjur-api/version.rb
CHANGED
data/lib/conjur/has_id.rb
CHANGED
data/lib/conjur/log.rb
CHANGED
@@ -1,40 +1,20 @@
|
|
1
|
-
|
1
|
+
require 'logger'
|
2
|
+
|
2
3
|
module Conjur
|
3
4
|
# You can also configure logging by the environment variable CONJURAPI_LOG.
|
4
5
|
def self.log= log
|
5
6
|
@@log = create_log log
|
6
7
|
end
|
7
8
|
|
8
|
-
# Create a log that respond to << like a logger
|
9
|
-
# param can be 'stdout', 'stderr', a string (then we will log to that file) or a logger (then we return it)
|
10
9
|
def self.create_log param
|
11
10
|
if param
|
12
11
|
if param.is_a? String
|
13
12
|
if param == 'stdout'
|
14
|
-
|
15
|
-
def << obj
|
16
|
-
STDOUT.write obj
|
17
|
-
end
|
18
|
-
end
|
19
|
-
stdout_logger.new
|
13
|
+
Logger.new $stdout
|
20
14
|
elsif param == 'stderr'
|
21
|
-
|
22
|
-
def << obj
|
23
|
-
STDERR.write obj
|
24
|
-
end
|
25
|
-
end
|
26
|
-
stderr_logger.new
|
15
|
+
Logger.new $stderr
|
27
16
|
else
|
28
|
-
|
29
|
-
attr_writer :target_file
|
30
|
-
|
31
|
-
def << obj
|
32
|
-
File.open(@target_file, 'a') { |f| f.write obj }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
logger = file_logger.new
|
36
|
-
logger.target_file = param
|
37
|
-
logger
|
17
|
+
Logger.new param
|
38
18
|
end
|
39
19
|
else
|
40
20
|
param
|
@@ -49,4 +29,4 @@ module Conjur
|
|
49
29
|
def self.log # :nodoc:
|
50
30
|
@@env_log || @@log
|
51
31
|
end
|
52
|
-
end
|
32
|
+
end
|
data/lib/conjur/resource.rb
CHANGED
@@ -35,7 +35,7 @@ module Conjur
|
|
35
35
|
logger << " with options #{options.to_json}"
|
36
36
|
end
|
37
37
|
end
|
38
|
-
super
|
38
|
+
super options
|
39
39
|
end
|
40
40
|
|
41
41
|
def permit(privilege, role, options = {})
|
@@ -62,6 +62,15 @@ module Conjur
|
|
62
62
|
self["?deny&privilege=#{query_escape p}&role=#{query_escape role}"].post(options)
|
63
63
|
end
|
64
64
|
end
|
65
|
+
|
66
|
+
# True if the logged-in role, or a role specified using the acting-as option, has the
|
67
|
+
# specified +privilege+ on this resource.
|
68
|
+
def permitted?(privilege, options = {})
|
69
|
+
self["?check&privilege=#{query_escape privilege}"].get(options)
|
70
|
+
true
|
71
|
+
rescue RestClient::ResourceNotFound
|
72
|
+
false
|
73
|
+
end
|
65
74
|
|
66
75
|
protected
|
67
76
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Asset
|
2
|
+
=====
|
3
|
+
|
4
|
+
Implements a domain-specific permission modeling concept. Assets combine functionality of roles, resources, and other assets
|
5
|
+
together into unified APIs.
|
6
|
+
|
7
|
+
Assets commonly perform the following functions:
|
8
|
+
|
9
|
+
* **containment** An asset can contain other assets, such as an environment which contains variables or a deployment which contains hosts.
|
10
|
+
Assets can be collected and re-combined arbitrarily.
|
11
|
+
* **role management** Container assets can define roles which manage permissions on child assets.
|
12
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
Asset#members#add
|
2
|
+
=================
|
3
|
+
|
4
|
+
A common purpose of an asset is to manage access to a collection of "child" assets. Permissions on child assets are granted
|
5
|
+
via roles defined on the parent asset.
|
6
|
+
|
7
|
+
For example, consider an Environment asset which contains a number of child Variables:
|
8
|
+
|
9
|
+
```
|
10
|
+
Environment[e1]
|
11
|
+
- variables
|
12
|
+
- Variable[v1]
|
13
|
+
- Variable[v2]
|
14
|
+
- Variable[v3]
|
15
|
+
```
|
16
|
+
|
17
|
+
The Environment may define a role "use_variable" and permit "read" and "execute" on each variable by the "use_variable" role.
|
18
|
+
Therefore, granting the "use_variable" role to another role "r1" will permit r1 to read and execute each variable.
|
19
|
+
|
20
|
+
Examples
|
21
|
+
--------
|
22
|
+
|
23
|
+
### Command Line
|
24
|
+
|
25
|
+
```bash
|
26
|
+
$ conjur asset:create environment `conjur id:create`
|
27
|
+
{
|
28
|
+
"id": "9yxa80",
|
29
|
+
<snip>
|
30
|
+
}
|
31
|
+
$ conjur host:create
|
32
|
+
{
|
33
|
+
"id": "9bfqx5",
|
34
|
+
<snip>
|
35
|
+
}
|
36
|
+
$ conjur environment:variables:create 9yxa80 test-var test text/plain "the-value"
|
37
|
+
Variable created
|
38
|
+
$ conjur asset:show environment 9yxa80
|
39
|
+
{
|
40
|
+
"id": "9yxa80",
|
41
|
+
"variables": {
|
42
|
+
"test-var": "he2e00"
|
43
|
+
},
|
44
|
+
<snip>
|
45
|
+
}
|
46
|
+
$ conjur resource:check variable he2e00 host:9bfqx5 execute
|
47
|
+
false
|
48
|
+
$ conjur asset:members:add environment 9yxa80 use_variable host:9bfqx5
|
49
|
+
Membership granted
|
50
|
+
$ conjur resource:check variable he2e00 host:9bfqx5 execute
|
51
|
+
true
|
52
|
+
```
|
@@ -0,0 +1,50 @@
|
|
1
|
+
Asset#show
|
2
|
+
==========
|
3
|
+
|
4
|
+
Display an asset as JSON.
|
5
|
+
|
6
|
+
The Conjur `jsonfield` utility can be used to pluck JSON values.
|
7
|
+
|
8
|
+
Examples
|
9
|
+
--------
|
10
|
+
|
11
|
+
### Command Line
|
12
|
+
|
13
|
+
#### Create and show an environment
|
14
|
+
|
15
|
+
```bash
|
16
|
+
$ id=`conjur id:create`
|
17
|
+
$ e=`conjur asset:create environment $id`
|
18
|
+
$ conjur asset:show environment id
|
19
|
+
{
|
20
|
+
"id": "0y3s00",
|
21
|
+
"variables": {
|
22
|
+
},
|
23
|
+
"userid": "kgilpin",
|
24
|
+
"ownerid": "sandbox:user:kgilpin",
|
25
|
+
"resource_identifier": "sandbox:environment:0y3s00"
|
26
|
+
}
|
27
|
+
```
|
28
|
+
#### Create and show a host
|
29
|
+
|
30
|
+
```bash
|
31
|
+
$ hostid=`conjur host:create | jsonfield id`
|
32
|
+
$ conjur asset:show host $hostid
|
33
|
+
{
|
34
|
+
"id": "g7hytz",
|
35
|
+
"userid": "kgilpin",
|
36
|
+
"created_at": "2013-07-09T21:10:06+00:00",
|
37
|
+
"ownerid": "sandbox:user:kgilpin",
|
38
|
+
"roleid": "sandbox:host:g7hytz",
|
39
|
+
"resource_identifier": "sandbox:host:g7hytz"
|
40
|
+
}
|
41
|
+
```
|
42
|
+
|
43
|
+
#### Attempt to show a non-existant asset.
|
44
|
+
|
45
|
+
```bash
|
46
|
+
$ conjur asset:show host foo
|
47
|
+
error: 404 Resource Not Found
|
48
|
+
$ echo $?
|
49
|
+
1
|
50
|
+
```
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Group#create
|
2
|
+
============
|
3
|
+
|
4
|
+
A group is created from an identifier. The identifier should be unique.
|
5
|
+
|
6
|
+
Example
|
7
|
+
-------
|
8
|
+
|
9
|
+
### Command Line
|
10
|
+
|
11
|
+
```bash
|
12
|
+
$ conjur group:create `conjur id:create`
|
13
|
+
Created https://core-sandbox-conjur.herokuapp.com/groups/5zjys0
|
14
|
+
```
|
15
|
+
|
16
|
+
### API
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
conjur.create_group SecureRandom.uuid
|
20
|
+
```
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Host
|
2
|
+
====
|
3
|
+
|
4
|
+
A host represents a non-human user. VMs, processes, and jobs are all commonly represented as Hosts.
|
5
|
+
|
6
|
+
Attributes
|
7
|
+
----------
|
8
|
+
|
9
|
+
* **username** the host username is composed of the word 'host' composed with the host identifier. For example, "host/i-bbe231db"
|
10
|
+
* **api_key** each host is assigned an API key, just like a human user
|
11
|
+
|
12
|
+
Like a human User, a Host can authenticate with Conjur and perform actions.
|
13
|
+
|
14
|
+
Roles
|
15
|
+
-----
|
16
|
+
|
17
|
+
On creation, the host creates a Conjur role to represent itself. The role kind is 'host'.
|
18
|
+
|
19
|
+
Resources
|
20
|
+
---------
|
21
|
+
|
22
|
+
On creation, the host creates a Conjur resource to represent itself.
|
23
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
Host#create
|
2
|
+
===========
|
3
|
+
|
4
|
+
A host is created with an identifier. The identifier must be unique.
|
5
|
+
It can be assigned, or it can be generated by Conjur.
|
6
|
+
|
7
|
+
When the host is created, the `api_key` field is included in the JSON response.
|
8
|
+
|
9
|
+
Host#show does not include the `api_key`.
|
10
|
+
|
11
|
+
Example
|
12
|
+
-------
|
13
|
+
|
14
|
+
```bash
|
15
|
+
$ conjur host:create
|
16
|
+
{
|
17
|
+
"id": "8y2p5w",
|
18
|
+
"userid": "kgilpin",
|
19
|
+
"created_at": "2013-07-09T21:12:57+00:00",
|
20
|
+
"ownerid": "sandbox:user:kgilpin",
|
21
|
+
"roleid": "sandbox:host:8y2p5w",
|
22
|
+
"resource_identifier": "sandbox:host:8y2p5w",
|
23
|
+
"api_key": "vj98ne10ar6vvmwrjt02ryfj6924a4vkch6yqcw292v9p12sv1rd"
|
24
|
+
}
|
25
|
+
$ conjur asset:show host 8y2p5w
|
26
|
+
{
|
27
|
+
"id": "8y2p5w",
|
28
|
+
"userid": "kgilpin",
|
29
|
+
"created_at": "2013-07-09T21:12:57+00:00",
|
30
|
+
"ownerid": "sandbox:user:kgilpin",
|
31
|
+
"roleid": "sandbox:host:8y2p5w",
|
32
|
+
"resource_identifier": "sandbox:host:8y2p5w"
|
33
|
+
}
|
34
|
+
```
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Host#enroll
|
2
|
+
===========
|
3
|
+
|
4
|
+
Returns a unique URL which, when fetched, returns a shell command which will login
|
5
|
+
the host with Conjur.
|
6
|
+
|
7
|
+
Example
|
8
|
+
-------
|
9
|
+
|
10
|
+
```bash
|
11
|
+
$ conjur host:enroll vaz7qg
|
12
|
+
https://core-sandbox-conjur.herokuapp.com/hosts/enroll?key=7fxt_HiRfOodA3J6wh5s2X9a6gm-b-wkPmF0g-HOPYo=
|
13
|
+
On the target host, please execute the following command:
|
14
|
+
curl -L https://core-sandbox-conjur.herokuapp.com/hosts/enroll?key=7fxt_HiRfOodA3J6wh5s2X9a6gm-b-wkPmF0g-HOPYo= | bash
|
15
|
+
$ curl -L https://core-sandbox-conjur.herokuapp.com/hosts/enroll?key=7fxt_HiRfOodA3J6wh5s2X9a6gm-b-wkPmF0g-HOPYo=
|
16
|
+
#!/bin/sh
|
17
|
+
set -e
|
18
|
+
|
19
|
+
conjur authn:login -u host/vaz7qg -p 39c63b3d5bc372de1c100feec852e05f747bc9eb
|
20
|
+
```
|
21
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Resource
|
2
|
+
========
|
3
|
+
|
4
|
+
A resource is an entity on which permissions are assigned.
|
5
|
+
|
6
|
+
Resources are partitioned into "kinds", such as "group", "host",
|
7
|
+
"file", "environment", "variable", etc.
|
8
|
+
|
9
|
+
Resources are not frequently used directly. Instead, higher-level "assets" such as Host, Group, User,
|
10
|
+
Variable provide more intuitive functionality. For example, Assets often combine role and resource
|
11
|
+
functionality together.
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Resource#create
|
2
|
+
===============
|
3
|
+
|
4
|
+
A resource is composed of a `kind` and `identifier`. The `kind`
|
5
|
+
indicates the semantic purpose of the resource, the identifier identifies
|
6
|
+
it uniquely within the kind.
|
7
|
+
|
8
|
+
Example
|
9
|
+
-------
|
10
|
+
|
11
|
+
### Command Line
|
12
|
+
|
13
|
+
```bash
|
14
|
+
$ conjur resource:create food bacon
|
15
|
+
{
|
16
|
+
"id": {
|
17
|
+
"account": "sandbox",
|
18
|
+
"kind": "food",
|
19
|
+
"id": "bacon"
|
20
|
+
},
|
21
|
+
"owner": {
|
22
|
+
"account": "sandbox",
|
23
|
+
"id": "user:kgilpin"
|
24
|
+
},
|
25
|
+
"permissions": [
|
26
|
+
|
27
|
+
]
|
28
|
+
}
|
29
|
+
```
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Resource#deny
|
2
|
+
=============
|
3
|
+
|
4
|
+
Removes a specific permission on a resource from a role.
|
5
|
+
|
6
|
+
The owner of a resource always has all permissions on the resource, even if specific permissions
|
7
|
+
are denied.
|
8
|
+
|
9
|
+
Example
|
10
|
+
-------
|
11
|
+
|
12
|
+
### Command Line
|
13
|
+
|
14
|
+
```bash
|
15
|
+
$ conjur resource:permit food bacon host:a4yta8 fry
|
16
|
+
Permission granted
|
17
|
+
$ conjur resource:check food bacon host:a4yta8 fry
|
18
|
+
true
|
19
|
+
$ conjur resource:deny food bacon host:a4yta8 fry
|
20
|
+
Permission revoked
|
21
|
+
$ conjur resource:check food bacon host:a4yta8 fry
|
22
|
+
false
|
23
|
+
```
|
@@ -0,0 +1,35 @@
|
|
1
|
+
Resource#permit
|
2
|
+
===============
|
3
|
+
|
4
|
+
Gives a specific permission on a resource to a role.
|
5
|
+
|
6
|
+
Example
|
7
|
+
-------
|
8
|
+
|
9
|
+
### Command Line
|
10
|
+
|
11
|
+
```bash
|
12
|
+
$ conjur host:create
|
13
|
+
<snip>
|
14
|
+
$ conjur resource:permit food bacon host:a4yta8 fry
|
15
|
+
Permission granted
|
16
|
+
$ conjur resource:check food bacon host:a4yta8 fry
|
17
|
+
true
|
18
|
+
$ conjur resource:check food bacon host:a4yta8 bake
|
19
|
+
false
|
20
|
+
$ conjur resource:permitted_roles food bacon fry
|
21
|
+
[
|
22
|
+
{
|
23
|
+
"id": {
|
24
|
+
"account": "sandbox",
|
25
|
+
"id": "user:kgilpin"
|
26
|
+
}
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"id": {
|
30
|
+
"account": "sandbox",
|
31
|
+
"id": "host:a4yta8"
|
32
|
+
}
|
33
|
+
}
|
34
|
+
]
|
35
|
+
```
|