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_DAC_READ_SEARCH = 2¶
- 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
oslo_privsep.daemon 模块¶
特权分离(“privsep”)守护进程。
为了方便过渡,它支持 2 种启动守护进程的替代方法,所有方法都导致一个辅助进程以提升的权限运行,并打开与原始进程的套接字。
通过 fork() 启动
假定当前进程具有所有必需的权限,并且即将放弃它们(也许通过 setuid 到非特权用户)。如果初始环境是安全的,并且在 main() 中早期调用 PrivContext.start(Method.FORK),那么这是最安全和最简单的方法。特别是,如果初始进程已经以非 root 身份运行(但具有足够的权限,例如通过合适的 systemd 服务文件),那么不需要涉及 uid=0 或 sudo 的任何部分。
通过 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 配置选项已设置,则会被忽略。