系统角色的使用(selinux )
SELinux用户域
来查看下普通linux用户的上下文
user $id
uid=1000(swift)gid=100(users) groups=100(users),16(cron),...,995(gorg)context=user_u:user_r:user_t
上下文显示用户在user_t域,再看下root用户的上下文
root #id -Z
root:sysadm_r:sysadm_t
可以看到,显示root用户在sysadm_t域。
SELinux策略规定普通用户域(user_t)是无特权区:不允许执行任何管理任务。即使你给它授权为root的访问权限(sudo或者su),用户也不能危害到系统。它不仅仅因为user_t域,也因为那个用户所在的SELinux角色
显示被允许的域
使用seinfo工具,可以罗列出一个特定角色被允许的域
user $seinfo-ruser_r -xuser_rDominated Roles:user_rTypes:chromium_renderer_tuser_gkeyringd_t...
试着启动一个程序(先不考虑服务),并且启动失败。接着确定是否是应用程序(比如mozilla_t或chromium_t)的域不在当前所在角色支持的域中
切换角色
用户如果愿意可以切换角色。然而,当SELinux用户被允许“成为”其他角色的前提下,我们才可以角色切换。使用semanage user –l 可以查看下是否是这样情形
root #semanage user -l
SELinuxUser SELinux Rolesroot staff_r sysadm_r
staff_u staff_r sysadm_r
sysadm_u sysadm_r
system_u system_r
unconfined_u unconfined_r
user_u user_r
我们后面讨论SELinux用户,目前为止,可以说SELinux用户(上面例子第一列)必须匹配用户上下文的首个进入点(使用id -Z)
user_u:user_r:user_t
我们可以看到用户只能被允许在user_r角色。换句话说,这用户无法切换角色
root:sysadm_r:sysadm_t
用户可以从sysadm_r角色切换到staff_r角色(反之亦然)
使用newrole –r 切换角色,一般最普遍的是从staff_r角色切换到sysadm_r角色
user $newrole -r sysadm_r
Password:
标准角色集合
以下表格给出了SELinux系统上可用的标准角色,可能在其他的系统存在更多的角色
角色 | 描述 |
---|---|
user_r | 普通用户角色,只允许用户程序和其他非特权域 |
staff_r | 类似于user_r角色,但是比起普通用户被允许获取更多的系统信息。这个角色用于允许用户切换到其他角色 |
sysadm_r | 系统管理员角色,具有很高权限的角色,被允许最多的目标域,包括特权域。使用的时候需留意 |
system_r | 系统角色,不要直接切换到它(因为它没有默认相关联的用户域-后面再讨论) |
注意:
角色决定用户(或会话)被允许进入的域
使用newrole来修改角色
SELinux用户定义申明了用户可以进入的角色
角色结构与创建和使用方式
创建角色目录结构
角色创建流程
在Ansible中创建角色不需要特别的开发工具。创建和使用角色包含三个步骤:
创建角色目录结构
定义角色内容
在playbook中使用角色
角色目录创建说明
默认情况下,Ansible在Ansible Playbook所在目录的roles子目录中查找角色。这样,用户可以利用playbook和其他支持文件存储角色
如果Ansible无法在该位置找到角色,它会按照顺序在Ansible配置设置roles_path所指定的目录中查找
此变量包含要搜索的目录的冒号分隔列表。此变量的默认值为:
~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
在/etc/ansible/ansible.cfg文件中添加roles_path
[root@localhost ~]# grep roles_path /etc/ansible/ansible.cfg
roles_path = ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
这允许用户将角色安装到由多个项目共享的系统上
用户可能将自己的角色安装在自己的主目录下的~/.ansible/roles子目录中,而系统可能将所有用户的角色安装在/usr/share/ansible/roles目录中
角色各目录说明
README.md提供人类可读的基本角色描述、有关如何使用该角色的文档和示例,以及其发挥作用所需要满足的任何非Ansible要求
meta子目录包含一个main.yml文件,该文件指定有关模块的作者、许可证、兼容性和依赖项的信息
files子目录包含固定内容的文件,而templates子目录则包含使用时可由角色部署的模板
其他子目录中可以包含main.yml文件,它们定义默认的变量值、处理程序、任务、角色元数据或变量,具体取决于所处的子目录
创建角色框架
角色框架构建
ansible-galaxy命令行工具可用于管理Ansible角色,包括新角色的创建。用户可以运行ansible-galaxy init来创建新角色的目录结构(init:初始化)
指定角色的名称作为命令的参数,该命令在当前工作目录中为新角色创建子目录
创建一个httpd角色
[root@localhost project]# ls
playbook.yaml
[root@localhost project]# ansible-galaxy init httpd
- Role httpd was created successfully
[root@localhost project]# ls
httpd playbook.yaml
[root@localhost project]# tree httpd/
httpd/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars└── main.yml8 directories, 8 files//创建httpd目录后,会自动创建一些示例的文件
定义角色内容
创建角色内容
以上面创建的httpd角色目录结构
在file目录中创建需要copy的文件
[root@localhost project]# ls httpd/files/
dvd.rep
在templates目录中创建模板文件
[root@localhost project]# cat httpd/templates/httpd.conf.j2
<VirtualHost {
{ anisble_facts['default_ipv4']['address'] }}:{
{ port }}>DocumentRoot "/var/www/html/{
{ dir_name }}"ErrorLog "/var/log/httpd/{
{ dir_name }}-error_log"CustomLog "/var/log/httpd/{
{ dir_name }}-access_log" common
</VirtualHost>
在vars目录下床架变量文件
[root@localhost project]# cat httpd/vars/main.yml
---
# vars file for httpd
port: 8080
dir_name: sharedir
在tasks目录中床架执行文件
[root@localhost project]# cat httpd/tasks/main.yml
---
- name: copy dvd.repocopy:src: ../files/dvd.repodest: /etc/yum.repos.d/dvd.repo- name: sent templatetemplate:src: ../templates/httpd.conf.j2dest: /etc/httpd/conf.d/httpd.conf
定义角色依赖项
角色依赖
角色依赖项使得角色可以将其他角色作为依赖项包含在内
一个定义文档服务器的角色可能依赖于另一个安装和配置web服务器的角色。依赖关系在角色目录层次结构中的meta/main.yml文件内定义
[root@localhost project]# cat httpd/meta/main.yml
---
- name: dependen roledependencies:- role: apacheport: 8080- role: postgresdbname: serverlistadmin_user: felix
默认情况下,角色仅作为依赖项添加到playbook中一次。若有其他角色也将它作为依赖项列出,它不会再次运行
此行为可以被覆盖,将meta/main.yml文件中的allow_duplicates变量设置为yes即可
在playbook中使用角色
在playbook中引用角色
要访问角色,可在play的roles:部分引用它
[root@localhost project]# cat playbook.yaml
---
- hosts: allroles:- httpd
这里可以不用加roles,默认情况下,Ansible会在Playbook所在目录的roles子目录中查找角色