OpenShift 4 - 个性化 Project 对象,提升 Namespace 使用安全

76 篇文章 6 订阅
59 篇文章 2 订阅

OpenShift / RHEL / DevSecOps 汇总目录
说明:本文已经在OpenShift 4.8环境中验证

Kubernetes 的 Namespace 与 OpenShift 的 Project 区别

在功能上 OpenShift 和 Kubernetes 完全兼容,但在很多地方 OpenShift 都进行了功能增强,以实现更多的功能或更便捷的操作。这其中之一就是OpenShift 的 Project 对 Kubernetes 的 Namespace 功能增强。

  1. 执行命令,分别创建一个 Project 和 Namespace。
$ oc new-project my-project
$ kubectl create namespace my-namespace
  1. 在 OpenShift 控制台的项目中可以看到两者显示稍有不同,这是因为在创建 Project 的时候会自动为其添加说明 “请求者” 的 Annotation,而在创建 Namespace 的时候就不会自动添加 Annotation。
    在这里插入图片描述
  2. 分别执行以下命令,还可以看出在 my-project 中除了三个默认的 “system:xxxxx” Role 外有一个名为 “admin” 的 Role,而在 my-namespace 中只有默认的 Role。
$ oc get rolebinding -n my-project
NAME                    ROLE                               AGE
admin                   ClusterRole/admin                  16m
system:deployers        ClusterRole/system:deployer        15m
system:image-builders   ClusterRole/system:image-builder   15m
system:image-pullers    ClusterRole/system:image-puller    15m
 
$ oc get rolebinding -n my-namespace
NAME                    ROLE                               AGE
system:deployers        ClusterRole/system:deployer        15m
system:image-builders   ClusterRole/system:image-builder   15m
system:image-pullers    ClusterRole/system:image-puller    15m

在 OpenShift 中创建 Project 是通过 Template 实现的。执行 Template 的过程不但会创建 Namespace,还能创建其对应的 RoleBinding 对象。用户在执行 “oc new-project <PROJECT_NAME>” 命令的时候,在 OpenShift 收到的是创建 ProjectRequest 的 API 请求,然后 OpenShift 再使用 Temple 创建对应的资源。

在 OpenShift 控制台的 API Explore中可以找到 “Project” 和 “ProjectRequest ” 这两个不同的对象。
在这里插入图片描述
而在 OpenShift 中创建 Project 所使用的 Template 是在 “集群设置” 中指定的。因此可以通过修改 Project 使用 Template 来改变创建 Project 的缺省操作,比如更加严格的网络隔离策略、Namespace 级的资源限制等。
在这里插入图片描述

个性化 Project 对象,提升 Namespace 使用安全

  1. 执行以下命令可以获得负责创建 Project 对应的 Template 内容。
$ oc adm create-bootstrap-project-template -o yaml > template_project-request-extended.yaml
  1. 查看 template_project-request-extended.yaml 的内容。
apiVersion: template.openshift.io/v1
kind: Template
metadata:
  creationTimestamp: null
  name: project-request
objects:
- apiVersion: project.openshift.io/v1
  kind: Project
  metadata:
    annotations:
      openshift.io/description: ${PROJECT_DESCRIPTION}
      openshift.io/display-name: ${PROJECT_DISPLAYNAME}
      openshift.io/requester: ${PROJECT_REQUESTING_USER}
    creationTimestamp: null
    name: ${PROJECT_NAME}
  spec: {}
  status: {}
- apiVersion: rbac.authorization.k8s.io/v1
  kind: RoleBinding
  metadata:
    creationTimestamp: null
    name: admin
    namespace: ${PROJECT_NAME}
  roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: admin
  subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: ${PROJECT_ADMIN_USER}
parameters:
- name: PROJECT_NAME
- name: PROJECT_DISPLAYNAME
- name: PROJECT_DESCRIPTION
- name: PROJECT_ADMIN_USER
- name: PROJECT_REQUESTING_USER
  1. 修改 template_project-request-extended.yaml 文件,为 Template 增加 allow-from-openshift-ingress、allow-from-openshift-monitoring、allow-same-namespace 三个 NetworkPolicy,它们关闭在项目之间彼此访问的能力,只允许项目内部的 Pod 之间项目访问、以及来自项目外部 OpenShift Ingress 和 OpenShift Monitoring 的访问。另外还为项目增加了Namespace 级的缺省 LimitRange。
$ cat << EOF > template_project-request-extended.yaml
apiVersion: template.openshift.io/v1
kind: Template
metadata:
  creationTimestamp: null
  name: project-request-extended
  namespace: openshift-config
objects:
- apiVersion: project.openshift.io/v1
  kind: Project
  metadata:
    annotations:
      openshift.io/description: ${PROJECT_DESCRIPTION}
      openshift.io/display-name: ${PROJECT_DISPLAYNAME}
      openshift.io/requester: ${PROJECT_REQUESTING_USER}
    creationTimestamp: null
    name: ${PROJECT_NAME}
  spec: {}
  status: {}
- apiVersion: rbac.authorization.k8s.io/v1
  kind: RoleBinding
  metadata:
    creationTimestamp: null
    name: admin
    namespace: ${PROJECT_NAME}
  roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: admin
  subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: ${PROJECT_ADMIN_USER}
- apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  metadata:
    name: allow-from-openshift-ingress
    namespace: ${PROJECT_NAME}
  spec:
    ingress:
    - from:
      - namespaceSelector:
          matchLabels:
            network.openshift.io/policy-group: ingress
    podSelector: {}
    policyTypes:
    - Ingress
- apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  metadata:
    name: allow-from-openshift-monitoring
    namespace: ${PROJECT_NAME}
  spec:
    ingress:
    - from:
      - namespaceSelector:
          matchLabels:
            network.openshift.io/policy-group: monitoring
    podSelector: {}
    policyTypes:
    - Ingress
- apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  metadata:
    name: allow-same-namespace
    namespace: ${PROJECT_NAME}
  spec:
    podSelector:
    ingress:
    - from:
      - podSelector: {}
- apiVersion: v1
  kind: LimitRange
  metadata:
    name: limitrange
    namespace: ${PROJECT_NAME}
  spec:
    limits:
    - default:
        cpu: 500m
        memory: 512Mi
      defaultRequest:
        cpu: 10m
        memory: 32Mi
      type: Container
parameters:
- name: PROJECT_NAME
- name: PROJECT_DISPLAYNAME
- name: PROJECT_DESCRIPTION
- name: PROJECT_ADMIN_USER
- name: PROJECT_REQUESTING_USER
EOF
  1. 执行命令,在 openshift-config 中创建新 Template。
$ oc apply -f template_project-request-extended.yaml
  1. 执行命令,更新 Project 使用的 Template。
$ oc patch project.config.openshift.io cluster --type=merge --patch '{"spec": {"projectRequestTemplate": {"name": "project-request-extended"}}}'
  1. 为了允许 Ingress 对项目的访问,为 “default” 的命名空间打标签。
$ oc label namespace default 'network.openshift.io/policy-group=ingress'
  1. 创建一个新项目,然后验证 OpenShift 会自动该项目创建 LimitRange 和 NetworkPolicy。
$ new-project my-project1

$ get limitrange -n my-project1
NAME         CREATED AT
limitrange   2022-03-07T01:54:38Z

$ get networkpolicy -n my-project1
NAME                              POD-SELECTOR   AGE
allow-from-openshift-ingress      <none>         2m18s
allow-from-openshift-monitoring   <none>         2m18s
allow-same-namespace              <none>         2m18s

参考

https://github.com/acend/openshift-4-ops-training/blob/main/content/en/docs/01/02_configuration.md

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值