When running os-brick in a virtual environment created by a non root user, we get the following error: ModuleNotFoundError: No module named 'os_brick.privileged.rootwrap' This happens because the privsep daemon drops all the privileged except those defined in the context, and our current context doesn't bypass file read permission checks, so the Daemon cannot read the file with the code it was asked to run, because it belongs to a different user. This patch adds the CAP_DAC_READ_SEARCH capability to our privsep context so we can load the libraries, but only when we are running on a virtual environment to follow the principle of least privilege. This bug doesn't affect system-wide installations because the files installed under /sys/python*/site-packages belong to the Daemon user (root), so no special capabilities are necessary. Change-Id: Ib191c075ad1250822f6ac842f39214af8f3a02f0 Close-Bug: #1884059
35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import os
|
|
|
|
from oslo_privsep import capabilities as c
|
|
from oslo_privsep import priv_context
|
|
|
|
|
|
capabilities = [c.CAP_SYS_ADMIN]
|
|
|
|
# On virtual environments libraries are not owned by the Daemon user (root), so
|
|
# the Daemon needs the capability to bypass file read permission checks in
|
|
# order to dynamically load the code to run.
|
|
if os.environ.get('VIRTUAL_ENV'):
|
|
capabilities.append(c.CAP_DAC_READ_SEARCH)
|
|
|
|
# It is expected that most (if not all) os-brick operations can be
|
|
# executed with these privileges.
|
|
default = priv_context.PrivContext(
|
|
__name__,
|
|
cfg_section='privsep_osbrick',
|
|
pypath=__name__ + '.default',
|
|
capabilities=capabilities,
|
|
)
|