rootwrap模块解析以及功能扩展

rootwrap模块用于非特权用户安全执行需要root权限的操作。它避免了使用sudoers文件的复杂性和限制。本文分析了rootwrap的工作流程,包括命令行解析、配置文件读取、过滤器加载和匹配,以及如何通过功能扩展实现特定命令的执行。扩展方法包括直接修改过滤器文件或创建新的过滤器类。
摘要由CSDN通过智能技术生成

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!

如果转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:dong.liu@siat.ac.cn

PS:因为各方面的原因好久没有写博客了,有时间还是要写一写的!


    使用rootwrap的目的就是针对系统某些特定的操作,让非特权用户以root用户的身份来安全地执行这些操作。据说nova曾经使用sudoers文件来列出允许执行的特权命令,使用sudo来运行这些命令,但是这样做不容易维护,而且不能进行复杂的参数处理(引自:http://blog.lightcloud.cn/?p=240)。早期版本我没有读过,而rootwrap的出现就是为了解决上述问题。


示例:

    对于文件要求root权限的文件/etc/iscsi/initiatorname.iscsi,如果我们在openstack系统中以非特权用户的身份来查看:

cat /etc/iscsi/initiatorname.iscsi
则会提示权限不足:Permission denied;而如果我们应用rootwrap模块对其进行命令行的封装:
sudo nova-rootwrap /etc/nova/rootwrap.conf cat /etc/iscsi/initiatorname.iscsi
就可以以非特权用户的身份在免输入密码的情况下顺利执行这条命令,得到想要的结果

InitiatorName=iqn.1994-05.com.redhat:5536dfb81ec0

    在这篇博客中,我们就以命令行

sudo nova-rootwrap /etc/nova/rootwrap.conf cat /etc/iscsi/initiatorname.iscsi
为例,来解析rootwrap模块具体的执行过程,以及功能扩展的方式。

注:至于配置文件/etc/nova/rootwrap.conf等的作用会在下面模块分析的过程中进行解析;


1.rootwrap模块解析

    rootwrap已经迁移到项目oslo中。我们以rootwrap在nova中的应用为例,在文件setup.cfg中可以看到nova-rootwrap的entrance为nova-rootwrap = oslo.rootwrap.cmd:main;

    首先来看方法:/oslo/rootwrap/cmd.py----def main:

def main():
    # Split arguments, require at least a command
    """
    sudo nova-rootwrap /etc/nova/rootwrap.conf cat /etc/iscsi/initiatorname.iscsi
    sys.argv = [
        '/usr/bin/nova-rootwrap', 
        '/etc/nova/rootwrap.conf', 
        'cat', 
        '/etc/iscsi/initiatorname.iscsi']
    """
    execname = sys.argv.pop(0)
    if len(sys.argv) < 2:
        _exit_error(execname, "No command specified", RC_NOCOMMAND, log=False)

    configfile = sys.argv.pop(0)
    userargs = sys.argv[:]
    """
    execname = /usr/bin/nova-rootwrap
    configfile = /etc/nova/rootwrap.conf
    userargs = ['cat', '/etc/iscsi/initiatorname.iscsi']
    """

    # Add ../ to sys.path to allow running from branch
    possible_topdir = os.path.normpath(os.path.join(os.path.abspath(execname),
                                                    os.pardir, os.pardir))
    """
    possible_topdir = /usr
    """
    
    if os.path.exists(os.path.join(possible_topdir, "oslo", "__init__.py")):
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值