oslo_privsep 包

子包

子模块

oslo_privsep.capabilities 模块

class oslo_privsep.capabilities.Capabilities(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)

基类: IntEnum

CAP_AUDIT_CONTROL = 30
CAP_AUDIT_READ = 37
CAP_AUDIT_WRITE = 29
CAP_BLOCK_SUSPEND = 36
CAP_BPF = 39
CAP_CHECKPOINT_RESTORE = 40
CAP_CHOWN = 0
CAP_DAC_OVERRIDE = 1
CAP_FOWNER = 3
CAP_FSETID = 4
CAP_IPC_LOCK = 14
CAP_IPC_OWNER = 15
CAP_KILL = 5
CAP_LEASE = 28
CAP_LINUX_IMMUTABLE = 9
CAP_MAC_ADMIN = 33
CAP_MAC_OVERRIDE = 32
CAP_MKNOD = 27
CAP_NET_ADMIN = 12
CAP_NET_BIND_SERVICE = 10
CAP_NET_BROADCAST = 11
CAP_NET_RAW = 13
CAP_PERFMON = 38
CAP_SETFCAP = 31
CAP_SETGID = 6
CAP_SETPCAP = 8
CAP_SETUID = 7
CAP_SYSLOG = 34
CAP_SYS_ADMIN = 21
CAP_SYS_BOOT = 22
CAP_SYS_CHROOT = 18
CAP_SYS_MODULE = 16
CAP_SYS_NICE = 23
CAP_SYS_PACCT = 20
CAP_SYS_PTRACE = 19
CAP_SYS_RAWIO = 17
CAP_SYS_RESOURCE = 24
CAP_SYS_TIME = 25
CAP_SYS_TTY_CONFIG = 26
CAP_WAKE_ALARM = 35
oslo_privsep.capabilities.drop_all_caps_except(effective, permitted, inheritable)

将 (effective, permitted, inheritable) 设置为提供的 caps 列表

oslo_privsep.capabilities.get_caps()

返回 (effective, permitted, inheritable) 作为 caps 列表

oslo_privsep.capabilities.set_keepcaps(enable)

设置/取消设置线程的“保留 capabilities”标志 - 请参阅 prctl(2)

oslo_privsep.comm 模块

用于 privsep 的序列化/反序列化。

线路格式是 msgpack 对象流,用于编码原始 python 数据类型。Msgpack ‘raw’ 假定是有效的 utf8 字符串(msgpack 2.0 ‘bin’ 类型用于字节)。Python 列表在序列化/反序列化期间转换为元组。

class oslo_privsep.comm.ClientChannel(sock)

基类: object

close()
out_of_band(msg)

接收到 OOB 消息。子类可能希望覆盖此方法。

send_recv(msg, timeout=None)
class oslo_privsep.comm.Deserializer(readsock)

基类: object

class oslo_privsep.comm.Future(lock, timeout=None)

基类: object

一个非常简单的对象,用于跟踪函数调用的返回值

result()

必须已经持有构造函数中使用的锁

set_exception(exc)

必须已经持有构造函数中使用的锁

set_result(data)

必须已经持有构造函数中使用的锁

class oslo_privsep.comm.Message(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)

基类: IntEnum

通过通信通道发送的消息类型

CALL = 3
ERR = 5
LOG = 6
PING = 1
PONG = 2
RET = 4
exception oslo_privsep.comm.PrivsepTimeout

基础: Exception

class oslo_privsep.comm.Serializer(writesock)

基类: object

close()
send(msg)
class oslo_privsep.comm.ServerChannel(sock)

基类: object

服务器端双向客户端通道

send(msg)

oslo_privsep.daemon 模块

特权分离(“privsep”)守护进程。

为了方便过渡,它支持 2 种启动守护进程的替代方法,所有方法都导致一个辅助进程以提升的权限运行,并打开与原始进程的套接字。

  1. 通过 fork() 启动

    假定当前进程具有所有必需的权限,并且即将放弃它们(也许通过 setuid 到非特权用户)。如果初始环境是安全的,并且在 main() 中早期调用 PrivContext.start(Method.FORK),那么这是最安全和最简单的方法。特别是,如果初始进程已经以非 root 身份运行(但具有足够的权限,例如通过合适的 systemd 服务文件),那么不需要涉及 uid=0 或 sudo 的任何部分。

  2. 通过 sudo/rootwrap 启动

    这通过 sudo 和 rootwrap 在首次使用时启动 privsep 辅助进程,并通过命令行传递的临时 Unix 套接字进行通信。通信通道在文件系统中短暂暴露,但受到文件权限的保护,并且连接到它仅授予非特权进程访问权限。需要 sudoers 或 rootwrap.conf 过滤器中的适当条目。

当通信通道关闭时(通常在非特权进程退出时),privsep 守护进程退出。

class oslo_privsep.daemon.Daemon(channel, context)

基类: object

注意:这不会 fork() - 在调用 run() 之前自己 fork()

loop()

守护进程请求循环的主体

run()

运行请求循环。设置环境,然后调用 loop()

exception oslo_privsep.daemon.FailedToDropPrivileges

基础: Exception

class oslo_privsep.daemon.ForkingClientChannel(context)

基类:_ClientChannel

class oslo_privsep.daemon.PrivsepLogHandler(channel, processName=None)

基类:Handler

emit(record)

执行记录指定日志记录所需的一切操作。

此版本旨在由子类实现,因此会引发 NotImplementedError。

exception oslo_privsep.daemon.ProtocolError

基础: Exception

class oslo_privsep.daemon.RootwrapClientChannel(context)

基类:_ClientChannel

class oslo_privsep.daemon.StdioFd(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)

基类: IntEnum

STDERR = 2
STDIN = 0
STDOUT = 1
oslo_privsep.daemon.fdopen(fd, *args, **kwargs)
oslo_privsep.daemon.helper_main()

启动特权进程,通过 Unix 套接字提供请求。

oslo_privsep.daemon.replace_logging(handler, log_root=None)
oslo_privsep.daemon.set_cloexec(fd)
oslo_privsep.daemon.setgid(group_id_or_name)
oslo_privsep.daemon.setuid(user_id_or_name)
oslo_privsep.daemon.un_monkey_patch()

oslo_privsep.priv_context 模块

oslo_privsep.priv_context.CapNameOrInt(value)
class oslo_privsep.priv_context.Method(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)

基础: Enum

FORK = 1
ROOTWRAP = 2
class oslo_privsep.priv_context.PrivContext(prefix, cfg_section='privsep', pypath=None, capabilities=None, logger_name='oslo_privsep.daemon', timeout=None)

基类: object

property conf

以尽可能延迟的方式返回 oslo.config 部分对象。

entrypoint(func)

这旨在用作装饰器。

entrypoint_with_timeout(timeout)

这旨在用作带有超时的装饰器。

helper_command(sockpath)
is_entrypoint(func)
set_client_mode(enabled)
start(method=Method.ROOTWRAP)
stop()
oslo_privsep.priv_context.init(root_helper=None)

初始化 oslo.privsep 库。

此函数应在 main() 的顶部调用,在解析命令行、初始化 oslo.config 和设置日志记录之后,但在调用任何特权入口点、更改用户 ID、分叉或执行任何其他“奇怪”操作之前。

参数:

root_helper – 以列表形式提供要与 privsep-helper 前缀的命令和参数,以便以 root 身份运行 helper。请注意,如果上下文的 helper_command 配置选项已设置,则会被忽略。

oslo_privsep.version 模块

模块内容