感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
博客地址: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")):