Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
小 白蛋
Nomad
Commits
d844f37b
Unverified
Commit
d844f37b
authored
5 years ago
by
Danielle Lancashire
Browse files
Options
Download
Email Patches
Plain Diff
acls: Break mount acl into mount-rw and mount-ro
parent
478195a0
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
acl/policy.go
+6
-5
acl/policy.go
acl/policy_test.go
+22
-3
acl/policy_test.go
nomad/job_endpoint.go
+12
-2
nomad/job_endpoint.go
nomad/job_endpoint_test.go
+26
-8
nomad/job_endpoint_test.go
with
66 additions
and
18 deletions
+66
-18
acl/policy.go
+
6
-
5
View file @
d844f37b
...
...
@@ -45,8 +45,9 @@ const (
// combined we take the union of all capabilities. If the deny capability is present, it
// takes precedence and overwrites all other capabilities.
HostVolumeCapabilityDeny
=
"deny"
HostVolumeCapabilityMount
=
"mount"
HostVolumeCapabilityDeny
=
"deny"
HostVolumeCapabilityMountReadOnly
=
"mount-readonly"
HostVolumeCapabilityMountReadWrite
=
"mount-readwrite"
)
var
(
...
...
@@ -160,7 +161,7 @@ func expandNamespacePolicy(policy string) []string {
func
isHostVolumeCapabilityValid
(
cap
string
)
bool
{
switch
cap
{
case
HostVolumeCapabilityDeny
,
HostVolumeCapabilityMount
:
case
HostVolumeCapabilityDeny
,
HostVolumeCapabilityMount
ReadOnly
,
HostVolumeCapabilityMountReadWrite
:
return
true
default
:
return
false
...
...
@@ -172,9 +173,9 @@ func expandHostVolumePolicy(policy string) []string {
case
PolicyDeny
:
return
[]
string
{
HostVolumeCapabilityDeny
}
case
PolicyRead
:
return
[]
string
{
HostVolumeCapability
Den
y
}
return
[]
string
{
HostVolumeCapability
MountReadOnl
y
}
case
PolicyWrite
:
return
[]
string
{
HostVolumeCapabilityMount
}
return
[]
string
{
HostVolumeCapabilityMount
ReadOnly
,
HostVolumeCapabilityMountReadWrite
}
default
:
return
nil
}
...
...
This diff is collapsed.
Click to expand it.
acl/policy_test.go
+
22
-
3
View file @
d844f37b
...
...
@@ -202,7 +202,7 @@ func TestParse(t *testing.T) {
{
`
host_volume "production-tls-*" {
capabilities = ["mount"]
capabilities = ["mount
-readonly
"]
}
`
,
""
,
...
...
@@ -212,7 +212,26 @@ func TestParse(t *testing.T) {
Name
:
"production-tls-*"
,
Policy
:
""
,
Capabilities
:
[]
string
{
HostVolumeCapabilityMount
,
HostVolumeCapabilityMountReadOnly
,
},
},
},
},
},
{
`
host_volume "production-tls-*" {
capabilities = ["mount-readwrite"]
}
`
,
""
,
&
Policy
{
HostVolumes
:
[]
*
HostVolumePolicy
{
{
Name
:
"production-tls-*"
,
Policy
:
""
,
Capabilities
:
[]
string
{
HostVolumeCapabilityMountReadWrite
,
},
},
},
...
...
@@ -221,7 +240,7 @@ func TestParse(t *testing.T) {
{
`
host_volume "volume has a space" {
capabilities = ["mount"]
capabilities = ["mount
-readwrite
"]
}
`
,
"Invalid host volume name"
,
...
...
This diff is collapsed.
Click to expand it.
nomad/job_endpoint.go
+
12
-
2
View file @
d844f37b
...
...
@@ -117,8 +117,18 @@ func (j *Job) Register(args *structs.JobRegisterRequest, reply *structs.JobRegis
return
structs
.
ErrPermissionDenied
}
if
!
aclObj
.
AllowHostVolumeOperation
(
cfg
.
Source
,
acl
.
HostVolumeCapabilityMount
)
{
return
structs
.
ErrPermissionDenied
// If a volume is readonly, then we allow access if the user has ReadOnly
// or ReadWrite access to the volume. Otherwise we only allow access if
// they have ReadWrite access.
if
vol
.
ReadOnly
{
if
!
aclObj
.
AllowHostVolumeOperation
(
cfg
.
Source
,
acl
.
HostVolumeCapabilityMountReadOnly
)
&&
!
aclObj
.
AllowHostVolumeOperation
(
cfg
.
Source
,
acl
.
HostVolumeCapabilityMountReadWrite
)
{
return
structs
.
ErrPermissionDenied
}
}
else
{
if
!
aclObj
.
AllowHostVolumeOperation
(
cfg
.
Source
,
acl
.
HostVolumeCapabilityMountReadWrite
)
{
return
structs
.
ErrPermissionDenied
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
nomad/job_endpoint_test.go
+
26
-
8
View file @
d844f37b
...
...
@@ -185,7 +185,7 @@ func TestJobEndpoint_Register_ACL(t *testing.T) {
defer
s1
.
Shutdown
()
testutil
.
WaitForLeader
(
t
,
s1
.
RPC
)
newVolumeJob
:=
func
()
*
structs
.
Job
{
newVolumeJob
:=
func
(
readonlyVolume
bool
)
*
structs
.
Job
{
j
:=
mock
.
Job
()
tg
:=
j
.
TaskGroups
[
0
]
tg
.
Volumes
=
map
[
string
]
*
structs
.
VolumeRequest
{
...
...
@@ -194,6 +194,7 @@ func TestJobEndpoint_Register_ACL(t *testing.T) {
Config
:
map
[
string
]
interface
{}{
"source"
:
"prod-ca-certs"
,
},
ReadOnly
:
readonlyVolume
,
},
}
...
...
@@ -201,7 +202,8 @@ func TestJobEndpoint_Register_ACL(t *testing.T) {
{
Volume
:
"ca-certs"
,
Destination
:
"/etc/ca-certificates"
,
ReadOnly
:
true
,
// Task readonly does not effect acls
ReadOnly
:
true
,
},
}
...
...
@@ -212,9 +214,13 @@ func TestJobEndpoint_Register_ACL(t *testing.T) {
submitJobToken
:=
mock
.
CreatePolicyAndToken
(
t
,
s1
.
State
(),
1001
,
"test-submit-job"
,
submitJobPolicy
)
volumesPolicy
:=
mock
.
HostVolumePolicy
(
"prod-*"
,
""
,
[]
string
{
acl
.
HostVolumeCapabilityMount
})
volumesPolicy
ReadWrite
:=
mock
.
HostVolumePolicy
(
"prod-*"
,
""
,
[]
string
{
acl
.
HostVolumeCapabilityMount
ReadWrite
})
submitJobWithVolumesToken
:=
mock
.
CreatePolicyAndToken
(
t
,
s1
.
State
(),
1002
,
"test-submit-volumes"
,
submitJobPolicy
+
"
\n
"
+
volumesPolicy
)
submitJobWithVolumesReadWriteToken
:=
mock
.
CreatePolicyAndToken
(
t
,
s1
.
State
(),
1002
,
"test-submit-volumes"
,
submitJobPolicy
+
"
\n
"
+
volumesPolicyReadWrite
)
volumesPolicyReadOnly
:=
mock
.
HostVolumePolicy
(
"prod-*"
,
""
,
[]
string
{
acl
.
HostVolumeCapabilityMountReadOnly
})
submitJobWithVolumesReadOnlyToken
:=
mock
.
CreatePolicyAndToken
(
t
,
s1
.
State
(),
1003
,
"test-submit-volumes-readonly"
,
submitJobPolicy
+
"
\n
"
+
volumesPolicyReadOnly
)
cases
:=
[]
struct
{
Name
string
...
...
@@ -235,15 +241,27 @@ func TestJobEndpoint_Register_ACL(t *testing.T) {
ErrExpected
:
false
,
},
{
Name
:
"with a token that can submit a job, but not use a required volume
s
"
,
Job
:
newVolumeJob
(),
Name
:
"with a token that can submit a job, but not use a required volume"
,
Job
:
newVolumeJob
(
false
),
Token
:
submitJobToken
.
SecretID
,
ErrExpected
:
true
,
},
{
Name
:
"with a token that can submit a job, and use all required volumes"
,
Job
:
newVolumeJob
(),
Token
:
submitJobWithVolumesToken
.
SecretID
,
Job
:
newVolumeJob
(
false
),
Token
:
submitJobWithVolumesReadWriteToken
.
SecretID
,
ErrExpected
:
false
,
},
{
Name
:
"with a token that can submit a job, but only has readonly access"
,
Job
:
newVolumeJob
(
false
),
Token
:
submitJobWithVolumesReadOnlyToken
.
SecretID
,
ErrExpected
:
true
,
},
{
Name
:
"with a token that can submit a job, and readonly volume access is enough"
,
Job
:
newVolumeJob
(
true
),
Token
:
submitJobWithVolumesReadOnlyToken
.
SecretID
,
ErrExpected
:
false
,
},
}
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment