金鱼哥RHCA回忆录:DO280OpenShift访问控制--security policy和章节实验

举报
金鱼哥 发表于 2022/08/24 15:53:06 2022/08/24
【摘要】 第五章 DO280OpenShift访问控制--security policy和章节实验

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥

🎈支持我:可点赞👍、可收藏⭐️、可留言📝


📜管理security policy

📑OCP authorization授权

OCP定义了用户可以执行的两组主要操作:

与项目相关的操作(也称为本地策略):project-related

与管理相关的操作(也称为集群策略):administration-related

由于这两种策略都有大量可用的操作,所以将一些操作分组并定义为角色。

默认角色 描述
cluster-admin 此角色中的所有用户都可以管理OpenShift集群。
cluster-status 此角色中的所有用户都提供对集群信息的只读访问。

为管理本地政策,OCP提供以下角色:

默认角色 描述
edit 角色中的用户可以从项目中创建、更改和删除公共应用程序资源,比如service和dc。 但是不能对限制范围和配额等管理资源采取行动,也不能管理对项目的访问权限。
basic-user 角色中的用户具有对项目的读访问权。
self-provisioner 角色中的用户可以创建新项目。这是一个集群角色,而不是项目角色。
admin 角色中的用户可以管理项目中的所有资源,包括授予对项目的其他用户的访问权

除了能够创建新应用程序之外,admin角色还允许用户访问项目资源,比如配额和限制范围。

edit角色允许用户在项目中充当开发人员,但要在项目管理员配置的约束下工作。


📑相关命令

向集群用户添加角色

$ oc adm policy add-cluster-role-to-user cluster-role username

示例:将普通用户更改为集群管理员。

$ oc adm policy add-cluster-role-to-user cluster-admin username

从用户中删除集群角色

$ oc adm policy remove-cluster-role-from-user cluster-role username

示例:将集群管理员更改为普通用户。

$ oc adm policy remove-cluster-role-from-user cluster-admin username

将指定的用户绑定到项目中的角色

$ oc adm policy add-role-to-user role-name username -n project

示例:在WordPress项目中dev用户绑定basic-user角色。

$ oc adm policy add-role-to-user basic-user dev -n wordpress

📑权限及规则

OpenShift将一组规则集合成一个角色,规则由谓词和资源定义。如create user是OpenShift中的一条规则,它是一个名为cluster-admin的角色的所拥有的权限的一部分。

oc adm policy who-can delete user


📑user类型

与OCP的交互基于用户,OCP的user对象表示可以通过向该用户或用户组添加角色来从而实现相应权限的授予。

  • Regular users:通常以这种用户类型与OCP交互,常规用户用User对象表。例如,user1,user2。

  • System users:通常在安装OCP中定义基础设施时自动创建的,主要目的是使基础设施能够安全地与API交互。包括集群管理员(可以访问所有内容)、每个节点的用户、路由器和内部仓库使用的用户,以及各种其他用户。还存在一个匿名系统用户,默认情况下,该用户用于未经身份验证的请求。system user主要包括:system:admin、system:openshift-registry和system:node:node1.example.com。

  • Service accounts:这些是与项目关联的特殊系统用户。有些是在第一次创建项目时自动创建的,项目管理员可以创建多个,以便定义对每个项目内容的访问。Service accounts由ServiceAccount对象表示。Service accounts主要包括:system:serviceaccount:default:deployer和system:serviceaccount:foo:builder。


每个用户在访问OpenShift容器平台之前必须进行身份验证。没有身份验证或身份验证无效的API请求将使用匿名系统用户身份验证来请求服务。身份验证成功后,策略确定用户被授权做什么。


📑安全上下文约束(SCCS)

OpenShift提供了一种名为安全上下文约束的安全机制,它限制对资源的访问,但不限制OpenShift中的操作。

SCC限制从OpenShift中运行的pod到主机环境的访问:

  • 运行特权容器
  • 请求容器的额外功能
  • 使用主机目录作为卷
  • 更改容器的SELinux上下文
  • 更改用户ID

社区开发的一些容器可能需要放松安全上下文约束,因为它们可能需要访问默认禁止的资源,例如文件系统、套接字或访问SELinux上下文。


OpenShift定义的安全上下文约束(SCCs)可以使用以下命令作为集群管理员列出。

$ oc get scc

SCC通常有以下7种SCCS:

  • anyuid
  • hostaccess
  • hostmount-anyuid
  • nonroot
  • privileged
  • restricted(默认)
$ oc describe scc anyuid #查看某一种SCC详情

OpenShift创建的所有容器都使用restricted类型的SCC,它提供了对OpenShift外部资源的有限访问。

对于anyuid安全上下文,run as user策略被定义为RunAsAny,表示pod可以作为容器中可用的任何用户ID运行。这允许需要特定用户使用特定用户ID运行命令的容器。


要将容器更改为使用不同的SCC运行,需要创建绑定到pod的服务帐户。

$ oc create serviceaccount service-account-name         # 首先创建服务账户
$ oc adm policy add-scc-to-user SCC -z service-account  # 将服务帐户与SCC关联
要确定哪个帐户可以创建需要更高安全性要求的pod,可以使用scc-subject-review子命令。
$ oc export pod pod-name > output.yaml
$ oc adm policy scc-subject-review -f output.yaml

📑OpenShift与SELinux

OpenShift要求在每个主机上启用SELinux,以便使用强制访问控制提供对资源的安全访问。同样,由OpenShift管理的Docker容器需要管理SELinux上下文,以避免兼容性问题。

为了最小化在不支持SELinux的情况下运行容器的风险,可以创建SELinux上下文策略。

为了更新SELinux上下文,可以使用现有的SCC作为起点生成一个新的SCC。

$ oc export scc restricted > custom_selinux.yml   # 导出默认的SCC

在这里插入图片描述

编辑导出的YAML文件以更改SCC名称和SELinux上下文。

$ oc create -f yaml_file   # 使用修改后的ymal重新创建一个SCC

📑特权容器

有些容器可能需要访问主机的运行时环境。S2I构建器容器需要访问宿主docker守护进程来构建和运行容器。

例如,S2I构建器容器是一类特权容器,它要求访问超出其自身容器的限制。这些容器可能会带来安全风险,因为它们可以使用OpenShift节点上的任何资源。通过创建具有特权访问权的服务帐户,可以使用SCCs启用特权容器的访问。


📑若想详细了解,可参考大神文章

https://www.cnblogs.com/sammyliu/p/10083659.html


📜章节实验

📑环境准备

[student@workstation ~]$ lab install-prepare setup
[student@workstation ~]$ cd /home/student/do280-ansible
[student@workstation do280-ansible]$ ./install.sh

提示:若已经拥有一个完整环境,可不执行。


📑本练习准备

[student@workstation ~]$ lab secure-review setup

📑创建用户

[root@master ~]# htpasswd /etc/origin/master/htpasswd user-review
New password: 【redhat】
Re-type new password: 【redhat】

📑修改策略

[student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
[student@workstation ~]$ oc adm policy remove-cluster-role-from-group \
self-provisioner system:authenticated system:authenticated:oauth 
cluster role "self-provisioner" removed: ["system:authenticated" "system:authenticated:oauth"]
# 禁用所有常规用户的项目创建功能

📑确认验证

[student@workstation ~]$ oc login -u user-review -p redhat
Login successful.

You don't have any projects. Contact your system administrator to request a project.

[student@workstation ~]$ oc new-project test       # 普通用户无法创建项目
Error from server (Forbidden): You may not request a new project via this API.

📑创建项目

[student@workstation ~]$ oc login -u admin -p redhat
[student@workstation ~]$ oc new-project secure-review		# 使用管理员创建项目

📑授权用户

[student@workstation ~]$ oc project secure-review
Already on project "secure-review" on server "https://master.lab.example.com:443".
[student@workstation ~]$ oc policy add-role-to-user edit user-review	# 将edit的role和user-review进行关联

📑测试访问

[student@workstation ~]$ oc login -u user-review -p redhat
[student@workstation ~]$ oc project secure-review		#测试访问
Already on project "secure-review" on server "https://master.lab.example.com:443".

📑检查模板

[student@workstation ~]$ cd /home/student/DO280/labs/secure-review/
[student@workstation secure-secrets]$ cat mysql-ephemeral.yml
…………
      spec:
        containers:
        - capabilities: {}
          env:
          - name: MYSQL_USER
            valueFrom:
              secretKeyRef:
                key: database-user
                name: ${DATABASE_SERVICE_NAME}
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                key: database-password
                name: ${DATABASE_SERVICE_NAME}
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                key: database-root-password
                name: ${DATABASE_SERVICE_NAME}
          - name: MYSQL_DATABASE
            value: ${MYSQL_DATABASE}
…………
- description: The name of the OpenShift Service exposed for the database.
  displayName: Database Service Name
  name: DATABASE_SERVICE_NAME
  required: true
  value: mysql
…………

模板解读:

该mysql-ephemeral.yml模板文件,包含openshift项目中的mysql临时模板,pod所需的其他环境变量由模板参数初始化,并具有默认值。

但没有secret定义,后续操作将手动创建模板所需的secret。

根据模板的要求,创建一个包含MySQL容器image使用的凭证的secret,将这个secret命名为mysql。

  • 应用程序访问的数据库用户名由database-user定义。
  • 数据库用户的密码由database-password定义。
  • 数据库管理员密码由database-root-password定义

使用user-review developer用户创建一个名为mysql的secret。这个secret应该存储用户名mysql、密码redhat和数据库管理员密码do280-admin。

数据库用户名由database-user定义。此用户的密码由mysql secret密钥定义。

数据库管理员密码由database-root-password定义。


📑创建secret

[student@workstation secure-secrets]$ oc create secret generic mysql \
--from-literal='database-user'='mysql' \
--from-literal='database-password'='redhat' \
--from-literal='database-root-password'='do280-admin'
secret "mysql" created


[student@workstation secure-secrets]$ oc get secret mysql -o yaml	#确认验证secret
apiVersion: v1
data:
  database-password: cmVkaGF0
  database-root-password: ZG8yODAtYWRtaW4=
  database-user: bXlzcWw=
kind: Secret
metadata:
  creationTimestamp: 2021-03-03T05:01:18Z
  name: mysql
  namespace: secure-review
  resourceVersion: "228731"
  selfLink: /api/v1/namespaces/secure-review/secrets/mysql
  uid: 7d379982-7bdd-11eb-9656-52540000fa0a
type: Opaque

📑部署应用

[student@workstation secure-review]$ oc new-app --file=mysql-ephemeral.yml
[student@workstation secure-review]$ oc get pod
NAME            READY     STATUS    RESTARTS   AGE
mysql-1-xkbm7   1/1       Running   0          9s

📑转发端口

[student@workstation secure-review]$ cd
[student@workstation ~]$ oc port-forward mysql-1-xkbm7 3306:3306
Forwarding from 127.0.0.1:3306 -> 3306

📑测试访问

[student@workstation ~]$ mysql -umysql -predhat -h127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.7.16 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| sampledb           |
+--------------------+
2 rows in set (0.00 sec)

📑部署phpmyadmin应用

使用内部仓库registry.lab.example.com的image部署phpmyadmin:4.7容器。phpmyadmin:4.7容器需要名为PMA_HOST的环境变量来提供MySQL服务器的IP地址。

使用模板创建一个基于FQND的MySQL pod的service。

为使用模板创建的MySQL服务器pod使用服务FQDN,该模板是mysql.secure-review.svc.cluster.local。

[student@workstation ~]$ oc new-app --name=phpmyadmin \
--docker-image=registry.lab.example.com/phpmyadmin/phpmyadmin:4.7 \
-e PMA_HOST=mysql.secure-review.svc.cluster.local
--> Found Docker image f51fd61 (2 years old) from registry.lab.example.com for "registry.lab.example.com/phpmyadmin/phpmyadmin:4.7"

    * An image stream will be created as "phpmyadmin:4.7" that will track this image
    * This image will be deployed in deployment config "phpmyadmin"
    * Ports 80/tcp, 9000/tcp will be load balanced by service "phpmyadmin"
      * Other containers can access this service through the hostname "phpmyadmin"
    * WARNING: Image "registry.lab.example.com/phpmyadmin/phpmyadmin:4.7" runs as the 'root' user which may not be permitted by your cluster administrator
…………

该命令会发出警告,提示需要root特权。默认情况下,OpenShift不支持使用操作系统的root用户运行容器。


📑查看pod

[student@workstation ~]$ oc get pod
NAME                 READY     STATUS             RESTARTS   AGE
mysql-1-xkbm7        1/1       Running            0          22m
phpmyadmin-1-m2rpm   0/1       CrashLoopBackOff   4          1m

📑授予权限

[student@workstation ~]$ oc login -u admin -p redhat			        # 使用管理员登录
[student@workstation ~]$ oc create serviceaccount phpmyadmin-account	# 首先创建服务账户
[student@workstation ~]$ oc adm policy add-scc-to-user anyuid -z phpmyadmin-account
scc "anyuid" added to: ["system:serviceaccount:secure-review:phpmyadmin-account"]	# 将服务帐户与anyuid安全上下文关联

📑更新应用

[student@workstation ~]$ oc patch dc phpmyadmin --patch='{"spec":{"template":{"spec":{"serviceAccountName": "phpmyadmin-account"}}}}'
# 更新负责管理phpmyadmin的dc资源,任何开发人员用户都可以执行此操作。

本环境中,相关操作命令可以从/home/student/DO280/labs/secure-review文件夹中的patch-dc.sh脚本运行或复制。


📑确认验证

[student@workstation ~]$ oc login -u user-review -p redhat
[student@workstation ~]$ oc get pod
NAME                 READY     STATUS    RESTARTS   AGE
mysql-1-xkbm7        1/1       Running   0          34m
phpmyadmin-2-pm7s7   1/1       Running   0          1m

📑暴露服务

[student@workstation ~]$ oc expose svc phpmyadmin --hostname=phpmyadmin.apps.lab.example.com

📑访问测试

[student@workstation ~]$ curl -s http://phpmyadmin.apps.lab.example.com

使用浏览器进行测试并登录,用户名和密码:mysql/redhat

在这里插入图片描述


📑确认及删除

[student@workstation ~]$ lab secure-review grade		    # 环境脚本判断
[student@workstation ~]$ oc login -u admin -p redhat
[student@workstation ~]$ oc adm policy add-cluster-role-to-group \
self-provisioner system:authenticated system:authenticated:oauth
[student@workstation ~]$ oc delete project secure-review    # 删除项目
[student@workstation ~]$ ssh root@master htpasswd -D /etc/origin/master/htpasswd user-review			# 删除用户
[student@workstation ~]$ oc delete user user-review

💡总结

RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

以上就是【金鱼哥】对 第五章 DO280OpenShift访问控制–security policy和章节实验 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。