rhca-openshift里scc的设置

使用bob用户登录openshift,后续操作均在bob-p2项目里执行。

[root@node1 ~]# oc whoami
bob
[root@node1 ~]# oc project
Using project "bob-p2" on server "https://master:443".
[root@node1 ~]#
[root@node1 ~]#  oc new-app --docker-image=registry.lab.example.com/rhscl/httpd
--> Found Docker image e74fcb5 (2 years old) from registry.lab.example.com for "registry.lab.example.com/rhscl/httpd"
....输出...
--> Success
    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
     'oc expose svc/httpd' 
    Run 'oc status' to view your app.
[root@node1 ~]# 

查看pod的运行状态:
file
可以看到pod运行失败,查看此pod的日志:
file
大概意思是此pod里端口80运行不起来。

原因分析

通过命令oc edit dc httpd修改名字为httpd这个dc信息,增加如下内容:
file
这样的目的是用command里指定的命令 替代镜像里自带的命令,保存退出之后可以发现pod是可以正常运行的:
file
进入到pod httpd-2-lt4m5里:
file
可以看到pod里是以uid=1000250000的用户运行的,因为安全性,selinux不允许容器内部的进程以root身份运行,但是httpd-foreground进程需要以root来运行,所以导致刚才pod是没法运行。

下面看scc的信息(可以用system:admin用户通过oc get scc查看)
file
看RUNASUSER那列,RunAsAny具有最高权限,MustRunAsRange具有最低权限,restricted这个scc使用的则是MustRunAsRange。
每个项目里都有3个sa(serviceaccount),可以理解为Linux系统内置用户,是专门做某件事的”人”,查看项目内的sa:

[root@node1 ~]# oc get sa
NAME       SECRETS   AGE
builder    2         30m
default    2         30m
deployer   2         30m
[root@node1 ~]# 

其中default这个sa是用户运行pod的,它使用的是restricted这个scc,因为restricted使用的是MustRunAsRange(权限低),所以它运行pod时,不能让httpd-foreground进程以root身份运行。

修改

要是想让pod能正常运行起来,可以有两种方法:

1.修改项目bob-p2的default这个sa,让其使用anyid这个scc

语法:oc adm policy add-scc-to-user scc名-z sa名 -n 项目名

在master上,以system:admin用户执行如下命令

[root@master ~]# oc adm policy add-scc-to-user anyuid -z default -n bob-p2
scc "anyuid" added to: ["system:serviceaccount:bob-p2:default"]
[root@master ~]#

修改dc httpd,把command去掉,让其使用镜像里自带的命令运行:
file
改成
file
保存退出之后,查看pod的状态:
file
可以看到pod正常运行了。如果取消default这个sa使用anyuid这个scc可以用如下命令:

[root@master ~]# oc adm policy remove-scc-from-user anyuid -z default -n bob-p2
scc "anyuid" removed from: ["system:serviceaccount:bob-p2:default"]
[root@master ~]# 

删除httpd-3-q4hwg,看是否还能自动运行起来一个新pod:
file
已经运行不起来了,因为权限不满足。

2.修改restricted这个scc,设置其RUNASRUN的值为RunAsAny

语法:

oc patch  scc scc-名 -p '{"runAsUser":{"type":"RUNASUSER的值"}}'

再次确认restricted的RUNASUSER值:
file
下面开始修改

[root@master ~]# oc patch scc restricted -p '{"runAsUser":{"type":"RunAsAny"}}'
securitycontextconstraints "restricted" patched
[root@master ~]#

然后再次查看:
file
现在restricted有了足够的权限,然后删除httpd-3-c9q8l之后,看是否能运行起来:
file
已经可以正常运行了。

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读