OpenShift系列(十六) 安全上下文约束(SCC)
1 | 作者:李晓辉 |
SCC 概述
红帽 OpenShift 里面有个超厉害的安全功能,叫安全上下文约束(SCC)。这玩意儿简直就像是给容器和主机环境之间拉了一道防护网,能限制容器对主机环境的访问权限,可牛了!
具体来说,它能管住好多事儿。首先,要是容器想开启特权模式,那可没那么容易,得经过 SCC 的严格审核。特权模式下容器的权限会大很多,要是乱用很容易出问题,所以 SCC 这个“把关人”必须得好好管着。
其次,容器要是想请求一些额外的功能,比如访问一些特殊的系统资源之类的,也得先跟 SCC 打个招呼。不是想用就能用,得看 SCC 同不同意,这样就能避免一些不必要的风险。
再有,容器要是想把主机的目录挂载成自己的卷来用,也是被 SCC 管着的。毕竟主机的目录里面可能有很重要的东西,不能随便让容器去访问,得确保不会因为容器的操作而影响到主机的安全。
还有,容器的 SELinux 上下文也不能随便改,SELinux 是个很重要的安全机制,它定义了容器的权限和行为,要是容器能随意更改,那安全就很难保证了。所以 SCC 会严格控制这部分内容。
最后,容器的用户 ID 也受到 SCC 的管控。用户 ID 决定了容器在系统中的身份和权限,要是能随便改,那容器就可能获得不该有的权限,从而引发安全问题。所以 SCC 会确保用户 ID 的设置是安全合理的。
总之,这个 SCC 就像是一个超级严格的“管理员”,时刻盯着容器的一举一动,确保它们老老实实地运行,不会对主机环境造成威胁。有了它,用 OpenShift 的时候心里就踏实多了,不用担心容器会乱搞出安全问题,一般来说SCC 控制以下主机资源:
运行特权容器
就是容器想变成“超级用户”,拥有更多权限。但 SCC 这家伙可不轻易答应,它得确保容器不会乱来,不然主机的安全就危险了。请求容器的额外功能
容器有时候会想“借”点主机的特殊能力,比如访问一些高级的硬件功能。但 SCC 会仔细审查,看看是不是真的需要,防止容器“贪心”过头。将主机目录用作卷
容器想用主机的文件夹当自己的存储空间。不过,SCC 会管着,防止容器乱动主机的重要文件,确保主机的数据安全。更改容器的 SELinux 上下文
SELinux 是个“安全管家”,容器想改它的设置,SCC 会严格把关,确保容器不会因为乱改设置而破坏安全规则。更改用户 ID
容器的用户 ID 决定了它的权限,要是乱改,可能会搞出大问题。所以 SCC 会牢牢管住,确保容器的权限合理又安全。
列出SCC
集群管理员可以运行以下命令,以列出 OpenShift 定义的 SCC,此命令会列出所有可用的 SCC,你可以通过它们的名称来查看具体配置。
1 | [student@workstation ~]$ oc get scc |
看来默认情况下,openshift提供以下的scc
1 | [student@workstation ~]$ oc get scc -o name |
查询SCC属性
这个命令会显示 anyuid SCC 的所有配置细节,包括它允许和限制的内容。
1 | [student@workstation ~]$ oc describe scc anyuid |
大部分的pod都用的是restricted,因为这个提供 OpenShift 外部资源的有限访问权限
1 | [student@workstation ~]$ oc get pod -n openshift-console |
授予SCC特权案例
涉及到特权管理,我们就以lab来完成学习
1 | [student@workstation ~]$ lab start appsec-scc |
用普通账号登录,然后创建一个应用,观察其失败的原因,并分配合适的scc给到serviceaccount,将具有scc的sa绑定到应用,即可解决失败的问题
1 | oc login -u developer -p developer https://api.ocp4.example.com:6443 |
1 | oc new-project appsec-scc |
1 | oc new-app --name gitlab \ |
创建一段时间后,来获取一些pod状态发现是失败的
1 | [student@workstation ~]$ oc get pod |
获取日志看看,发现对特定的目录没有权限
1 | [student@workstation ~]$ oc logs gitlab-6fd4f89dbc-hkr54 |
既然权限不足,那就让应用root权限运行就可以了,我们来创建一个serviceaccount,然后给这个serviceaccount绑定anyuid的scc,让它可以以任何人的uid运行
用管理员登录,给其准备好资源
创建 ServiceAccount,将 anyuid SCC 绑定到这个 ServiceAccount
1 | [student@workstation ~]$ oc login -u admin -p redhatocp https://api.ocp4.example.com:6443 |
再登录普通用户,将这个具有特权的serviceaccount分配到他自己的资源
1 | [student@workstation ~]$ oc login -u developer -p developer |
观察一下新的pod是否成功运行
1 | [student@workstation ~]$ oc get pod |
ok,看上去没什么问题,我们来访问一下看看
1 | [student@workstation ~]$ oc expose service/gitlab --port 80 --hostname gitlab.apps.ocp4.example.com |
访问成功,说明应用成功启动并提供服务了
1 | [student@workstation ~]$ curl -sL http://gitlab.apps.ocp4.example.com | grep -i 'sign in' |