当前位置: 代码迷 >> 综合 >> 系统角色(selinux)角色结构与创建和使用方式
  详细解决方案

系统角色(selinux)角色结构与创建和使用方式

热度:78   发布时间:2023-12-02 21:23:13.0

系统角色的使用(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子目录中查找角色