Skip to content

Commit c5fcbde

Browse files
committed
Validate use of 'root' user by Processes and Tasks
* Policy implementation because we rely on current process.docker? db state * Initial implementation only allows root user for docker lifecycle Apps
1 parent 2f50f92 commit c5fcbde

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

app/models/runtime/constraints/process_user_policy.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ def initialize(process, allowed_users)
99

1010
def validate
1111
return if @process.user.blank?
12+
13+
return if @process.docker? && @process.user.downcase == 'root' && VCAP::CloudController::Config.config.get(:allow_process_root_user)
14+
1215
return if @allowed_users.map(&:downcase).include?(@process.user.downcase)
1316

1417
@errors.add(:user, sprintf(ERROR_MSG, requested_user: quote_user(@process.user), allowed_users: formatted_users_for_error))

app/models/runtime/process_model.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -576,8 +576,6 @@ def permitted_users
576576
end
577577

578578
def docker_run_action_user
579-
return AppModel::DEFAULT_CONTAINER_USER unless docker?
580-
581579
desired_droplet&.docker_user.presence || (Config.config.get(:allow_process_root_user) ? AppModel::DEFAULT_DOCKER_CONTAINER_USER : AppModel::DEFAULT_CONTAINER_USER)
582580
end
583581

spec/unit/models/runtime/constraints/process_user_policy_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,38 @@
4444
end
4545
end
4646

47+
context 'when process belongs to a Docker lifecycle app' do
48+
let(:process) { VCAP::CloudController::ProcessModelFactory.make({ docker_image: 'example.com/image' }) }
49+
50+
context 'when root user is allowed' do
51+
before do
52+
TestConfig.override(allow_process_root_user: true)
53+
end
54+
55+
context 'when the process specifies the root user' do
56+
let(:process_user) { 'root' }
57+
58+
it 'is valid' do
59+
expect(validator).to validate_without_error(process)
60+
end
61+
end
62+
end
63+
64+
context 'when root user is not allowed' do
65+
before do
66+
TestConfig.override(allow_process_root_user: false)
67+
end
68+
69+
context 'when the process specifies the root user' do
70+
let(:process_user) { 'root' }
71+
72+
it 'is not valid' do
73+
expect(validator).to validate_with_error(process, :user, sprintf(ProcessUserPolicy::ERROR_MSG, requested_user: "'root'", allowed_users: "'vcap', 'ContainerUser'"))
74+
end
75+
end
76+
end
77+
end
78+
4779
describe 'case insensitivity' do
4880
context 'when user is allowed, but does not match case' do
4981
let(:process_user) { 'vCaP' }

0 commit comments

Comments
 (0)