其他
小白都能看懂的 Kubernetes安全之API-server安全
目录
API-server的作用
API-server提供的安全机制
认证方式之——TLS
授权方式之——node
授权方式之——RBAC
准入控制之——NodeRestriction
自定义准入插件
API-server的作用
提供了集群管理的REST API接口; 提供其他模块之间的数据交互和通信的枢纽); 是资源配额控制的入口; 提供一定的集群安全机制.
API-server提供的安全机制
运行时机不同。认证/授权模块相当于是web开发中的filter,是针对请求头和证书进行分析操作,运行在具体handle处理逻辑之前,而准入模块可以操作具体的请求体,是在具体的处理逻辑中。 管控范围不同。授权模块只管控用户有没有操作的权限,具体操作的细节并不关注。准入模块可以管控用户申请的资源大小(LimitRanger),可以细粒度地划分用户权限(NodeRestriction),可以检查用户创建的命名空间是否存在(NamespaceLifecycle)等等。 运行逻辑不同。准入模块之间是逻辑与的关系,设定之后用户的任何请求必须满足所有的准入检查,如果一个插件不满足就会拒绝请求。认证/授权模块之间是逻辑或的关系,只要满足一个请求就可以通过。
认证方式之——TLS
什么是证书
API-server与kubelet-client的证书验证
授权方式之——node
操作 | 资源 |
授权方式之——RBAC
准入控制之——NodeRestriction
自定义准入插件
// 验证的主要逻辑
func admit(data []byte) *v1alpha1.AdmissionReviewStatus {
ar := v1alpha1.AdmissionReview{}
if err := json.Unmarshal(data, &ar); err != nil {
glog.Error(err)
return nil
}
podResource := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
if ar.Spec.Resource != podResource {
glog.Errorf("expect resource to be %s", podResource)
return nil
}
raw := ar.Spec.Object.Raw
pod := v1.Pod{}
if err := json.Unmarshal(raw, &pod); err != nil {
glog.Error(err)
return nil
}
reviewStatus := v1alpha1.AdmissionReviewStatus{}
for _, container := range pod.Spec.Containers {
if !strings.Contains(container.Image, "gcr.io") {
reviewStatus.Allowed = false
reviewStatus.Result = &metav1.Status{
Reason: "can only pull image from grc.io",
}
return &reviewStatus
}
}
reviewStatus.Allowed = true
return &reviewStatus
}
推荐阅读