OpenShift - 安全

OpenShift安全性主要是两个组件的组合,主要处理安全性约束.

  • 安全上下文约束(SCC)

  • 服务帐户

安全上下文约束(SCC)

基本上使用它对于pod限制,这意味着它定义了pod的限制,如它可以执行的操作以及它可以在集群中访问的所有内容.

OpenShift提供了一组预定义的SCC可以由管理员使用,修改和扩展.

$ oc get scc
NAME              PRIV   CAPS  HOSTDIR  SELINUX    RUNASUSER         FSGROUP   SUPGROUP  PRIORITY
anyuid            false   []   false    MustRunAs  RunAsAny          RunAsAny  RunAsAny  10
hostaccess        false   []   true     MustRunAs  MustRunAsRange    RunAsAny  RunAsAny  <none>
hostmount-anyuid  false   []   true     MustRunAs  RunAsAny          RunAsAny  RunAsAny  <none>
nonroot           false   []   false    MustRunAs  MustRunAsNonRoot  RunAsAny  RunAsAny  <none>
privileged        true    []   true     RunAsAny   RunAsAny          RunAsAny  RunAsAny  <none>
restricted        false   []   false    MustRunAs  MustRunAsRange    RunAsAny  RunAsAny  <none>

如果想要使用任何预定义的scc,只需将用户或组添加到scc组即可.

$ oadm policy add-user-to-scc <scc_name> <user_name>
$ oadm policy add-group-to-scc <scc_name> <group_name>

服务帐户

服务帐户主要用于控制对OpenShift主API的访问,该命令在命令时被调用或者从任何主机或节点机器发出请求.

每当应用程序或进程需要受限制的SCC未授予的功能时,您将必须创建一个特定服务帐户并将帐户添加到相应的SCC.但是,如果SCC不符合您的要求,那么最好创建一个特定于您的需求的新SCC,而不是使用最适合的SCC.最后,将其设置为部署配置.

$ oc create serviceaccount Cadmin
$ oc adm policy add-scc-to-user vipin -z Cadmin

Container Security

在OpenShift中,容器的安全性基于如何构思保护容器平台是在哪里运行容器.当我们谈论集装箱安全性以及需要注意的事项时,有很多事情会出现.

图像来源 : 一个安全的标签系统可以准确无误地识别生产环境中运行的容器来自何处.

安全扫描 : 图像扫描程序会自动检查所有图像是否存在已知漏洞.

审核 : 定期审核生产环境,以确保所有容器都基于最新的容器,并且主机和容器都已安全配置.

隔离和最小权限 : 容器运行时具有有效运行所需的最少资源和特权.他们无法过度干扰主机或其他容器.

运行时威胁检测 : 能够在运行时检测容器化应用程序的主动威胁并自动响应它的功能.

访问控制 :  Linux安全模块(如AppArmor或SELinux)用于强制实施访问控制.

存储容器安全性的关键方法很少.

  • 通过oAuth控制访问

  • 通过自助服务Web控制台

  • 通过平台证书

通过OAuth控制访问

在此方法中,存档对API控制访问的身份验证,获取用于身份验证的安全令牌通过OAuth服务器,它内置在OpenShift主机中.作为管理员,您可以修改OAuth服务器配置的配置.

有关OAuth服务器配置的更多详细信息,请参阅本教程的第5章.

通过自助服务Web控制台

此Web控制台安全功能内置于OpenShift Web控制台中.此控制台可确保所有一起工作的团队无需身份验证即可访问其他环境. OpenShift中的多telnet主机具有以下安全功能 :

  • 启用TCL层

  • 使用x.509证书进行身份验证

  • 保护主计算机上的etcd配置

通过证书平台

在此方法中,通过Ansible在安装期间配置每个主机的证书.由于它通过Rest API使用HTTPS通信协议,因此我们需要TCL安全连接到不同的组件和对象.这些是预定义的证书,但是,甚至可以在主集群上安装自定义证书以进行访问.在主服务器的初始设置期间,可以使用 openshift_master_overwrite_named_certificates 参数覆盖现有证书来配置自定义证书.

示例

openshift_master_named_certificates = [{"certfile": "/path/on/host/to/master.crt", 
"keyfile": "/path/on/host/to/master.key", 
"cafile": "/path/on/host/to/mastercert.crt"}]

有关如何生成自定义证书的更多详细信息,请访问以下链接 :

https://www.linux.com/learn/creating-self-signed-ssl-certificates-apache-linux

网络安全

在OpenShift中,软件定义网络(SDN)用于通信.网络名称空间用于群集中的每个容器,其中每个容器都有自己的IP和一系列端口以获取网络流量.通过这种方法,可以隔离pod,因为它无法与其他项目中的pod通信.

隔离项目

这可以做到由集群管理员使用CLI中的以下 oadm命令.

$ oadm pod-network isolate-projects <project name 1> <project name 2>

这意味着上面定义的项目无法与集群中的其他项目通信.

卷安全性

卷安全性显然意味着保护OpenShift集群中项目的PV和PVC.在OpenShift中,主要有四个部分来控制对卷的访问.

  • 补充组

  • fsGroup

  • runAsUser

  • seLinuxOptions

补充组和减号;补充组是常规Linux组.当进程在系统中运行时,它将使用用户ID和组ID运行.这些组用于控制对共享存储的访问.

使用以下命令检查NFS挂载.

# showmount -e <nfs-server-ip-or-hostname>
Export list for f21-nfs.vm:
/opt/nfs *

使用以下命令检查装载服务器上的NFS详细信息命令.

# cat /etc/exports
/opt/nfs *(rw,sync,no_root_squash)
...
# ls -lZ /opt/nfs -d
drwxrws---. nfsnobody 2325 unconfined_u:object_r:usr_t:s0 /opt/nfs
# id nfsnobody
uid = 65534(nfsnobody) gid = 454265(nfsnobody) groups = 454265(nfsnobody)

/opt/nfs/导出可由UID 454265 2325 组访问.

apiVersion: v1
kind: Pod
...
spec:
   containers:
   - name: ...
      volumeMounts:
      - name: nfs
         mountPath: /usr/share/...
   securityContext:
      supplementalGroups: [2325]
   volumes:
   - name: nfs
      nfs:
      server: <nfs_server_ip_or_host>
      path: /opt/nfs

fsGroup

fsGroup代表文件系统组,用于添加容器补充组.补充组ID用于共享存储,fsGroup用于块存储.

kind: Pod
spec:
   containers:
   - name: ...
   securityContext:
      fsGroup: 2325

runAsUser

runAsUser使用用户ID进行通信.这用于在pod定义中定义容器图像.如果需要,可以在所有容器中使用单个ID用户.

在运行容器时,定义的ID与导出时的所有者ID匹配.如果在外部定义了指定的ID,则它对pod中的所有容器都是全局的.如果它是用特定的pod定义的,那么它就变得特定于一个容器.

spec:
   containers:
   - name: ...
      securityContext:
         runAsUser: 454265