系统角色的使用(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 -x
   user_r
      Dominated Roles:
         user_r
      Types:
         chromium_renderer_t
         user_gkeyringd_t
         ...

试着启动一个程序(先不考虑服务),并且启动失败。接着确定是否是应用程序(比如mozilla_t或chromium_t)的域不在当前所在角色支持的域中

切换角色

用户如果愿意可以切换角色。然而,当SELinux用户被允许“成为”其他角色的前提下,我们才可以角色切换。使用semanage user –l 可以查看下是否是这样情形

root #semanage user -l
SELinuxUser    SELinux Roles
 
root            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.yml
 
8 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.repo
  copy:
    src: ../files/dvd.repo
    dest: /etc/yum.repos.d/dvd.repo
 
- name: sent template
  template:
    src: ../templates/httpd.conf.j2
    dest: /etc/httpd/conf.d/httpd.conf

定义角色依赖项

角色依赖

角色依赖项使得角色可以将其他角色作为依赖项包含在内

一个定义文档服务器的角色可能依赖于另一个安装和配置web服务器的角色。依赖关系在角色目录层次结构中的meta/main.yml文件内定义

[root@localhost project]# cat httpd/meta/main.yml
---
- name: dependen role
  dependencies:
    - role: apache
      port: 8080
    - role: postgres
      dbname: serverlist
      admin_user: felix

默认情况下,角色仅作为依赖项添加到playbook中一次。若有其他角色也将它作为依赖项列出,它不会再次运行

此行为可以被覆盖,将meta/main.yml文件中的allow_duplicates变量设置为yes即可

在playbook中使用角色

在playbook中引用角色

要访问角色,可在play的roles:部分引用它

[root@localhost project]# cat playbook.yaml
---
- hosts: all
  roles:
    - httpd

这里可以不用加roles,默认情况下,Ansible会在Playbook所在目录的roles子目录中查找角色

Logo

更多推荐