Openstack oslo.privsep 使用介绍

发布时间: 更新时间: 总字数:177 阅读时间:1m 作者: IP属地: 分享 复制网址

oslo.privsep 是用于特权分离的 OpenStack 库,是 oslo.rootwrap 的替代实现。

安装

pip install oslo.privsep

使用

  • privsep/__init__.py 中定义 Contexts
from oslo_privsep import capabilities
from oslo_privsep import priv_context

sys_admin_pctxt = priv_context.PrivContext(
    'nova',
    cfg_section='nova_sys_admin',
    pypath=__name__ + '.sys_admin_pctxt',
    capabilities=[capabilities.CAP_CHOWN,
                  capabilities.CAP_DAC_OVERRIDE,
                  capabilities.CAP_DAC_READ_SEARCH,
                  capabilities.CAP_FOWNER,
                  capabilities.CAP_NET_ADMIN,
                  capabilities.CAP_SYS_ADMIN],
)
  • 定义 privileged 方法
import nova.privsep

@nova.privsep.sys_admin_pctxt.entrypoint
def update_motd(message):
    with open('/etc/motd', 'w') as f:
        f.write(message)

超时示例:

from oslo_privsep import daemon

from neutron import privileged

@privileged.default.entrypoint_with_timeout(timeout=5)
def get_link_devices(namespace, **kwargs):
    try:
        with get_iproute(namespace) as ip:
            return make_serializable(ip.get_links(**kwargs))
    except OSError as e:
        if e.errno == errno.ENOENT:
            raise NetworkNamespaceNotFound(netns_name=namespace)
        raise
    except daemon.FailedToDropPrivileges:
        raise
    except daemon.PrivsepTimeout:
        raise
  • 使用方法
import nova.privsep.motd  # 全路径导入
...

nova.privsep.motd.update_motd('This node is currently idle')
  • 配置 nova 权限
$ cat /etc/sudoers.d/nova
Defaults:nova !requiretty

nova ALL = (root) NOPASSWD: /usr/bin/privsep-helper *

说明:

  • /usr/bin/privsep-helper 必须是这个路径,否则不生效
  • 可以对以命令或 lib 执行特权

参考

  1. https://docs.openstack.org/oslo.privsep/latest/
  2. https://governance.openstack.org/tc/goals/selected/wallaby/migrate-to-privsep.html
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数