专栏首页kubernetes中文社区Kubernetes API 访问控制

Kubernetes API 访问控制

可以使用kubectl、客户端库方式对REST API的访问,Kubernetes的普通账户和Service帐户都可以实现授权访问API。API的请求会经过多个阶段的访问控制才会被接受处理,其中包含认证、授权以及准入控制(Admission Control)等。如下图所示:

需要注意:认证授权过程只存在HTTPS形式的API中。也就是说,如果客户端使用HTTP连接到kube-apiserver,是不会进行认证授权的。所以说,可以这么设置,在集群内部组件间通信使用HTTP,集群外部就使用HTTPS,这样既增加了安全性,也不至于太复杂。

认证

开启TLS时,所有的请求首先需要认证。Kubernetes支持多种认证机制,并支持同时开启多个认证插件(只要有一个认证通过即可)。如果认证成功,则用户的username会传入授权模块做进一步授权验证;对于认证失败的请求则返回HTTP 401。

当TLS建立时,HTTP请求会进行身份认证步骤,如图中步骤1,集群管理器将apiserver配置为运行一个或多个认证器模块。

认证模块包含客户端证书,密码、Plain Tokens、Bootstrap Tokens、JWT Tokens(used for service accounts)。

我们可以指定多个认证模块,每个认证模块都会按顺序进行,直到其中一个成功。

(在GCE上,客户端证书、密码、Plain Tokens和JWT Tokens都会启用。)

更多认证模块的使用方法可以参考 认证

授权

认证之后的请求是授权模块。如图中步骤2 。

请求必须包含请求者的用户名,请求的操作以及受该操作影响的对象,如果策略已经声明用户具有完成请求的权限,则该请求将被授权。

例如:设置如下Bob策略,那么会在namespace projectCaribou 中读取pods

{
    "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
    "kind": "Policy",
    "spec": {
        "user": "bob",
        "namespace": "projectCaribou",
        "resource": "pods",
        "readonly": true
    }
}

如果Bob发出以下请求,被允许读取projectCaribou namespace中的对象,请求被授权

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "spec": {
    "resourceAttributes": {
      "namespace": "projectCaribou",
      "verb": "get",
      "group": "unicorn.example.org",
      "resource": "pods"
    }
  }
}
  • 如果Bob向projectCaribou namespace中对象写入(create或update)请求,则会拒绝其授权。
  • 如果Bob请求在不同的namespace中读取(get)对象,比如projectFish,授权也将被拒绝。

Kubernetes授权要求使用公共常见得REST属性与云提供商的访问控制系统进行交互。为了避免访问控制系统与Kubernetes API与外部API的冲突,所以必须使用REST格式。

Kubernetes支持多种授权模块,如ABAC模式、RBAC模式和Webhook模式。当管理员创建集群时,他们将会配置在API Server中使用的授权模块。如果配置了多个授权模块,Kubernetes会检查每个模块,当通过其中任何模块授权请求,则授权成功,如果所有模块都拒绝了该请求,则授权失败(HTTP 403)。

准入控制(Admission Control)

准入控制(Admission Control)用来对请求做进一步的验证或添加默认参数,除了授权模块可用的属性外,准入控制模块还可以访问正在创建或更新对象内容。

也可以可以配置多个准入控制器,每个都会按顺序调用。

如图中步骤3。

与认证和授权模块不同,任何接入控制器模块被遭拒时,请求会立即失败。

当请求通过了所有准入控制(Admission Control),就会使用相应API对象的验证功能,然后写入对象存储(如步骤4所示)

API Server端口和IPs

之前讨论用于发送到API Server安全端口的请求(经典情况)。API Server实际上可以在两个端口上服务:

默认情况下,Kubernetes API Server在2个端口上提供HTTP:

  1. Localhost Port:
- is intended for testing and bootstrap, and for other components of the master node
   (scheduler, controller-manager) to talk to the API
 - no TLS
 - default is port 8080, change with `--insecure-port` flag.
 - defaults IP is localhost, change with `--insecure-bind-address` flag.
 - request **bypasses** authentication and authorization modules.
 - request handled by admission control module(s).
 - protected by need to have host access

2.Secure Port:

 - use whenever possible
 - uses TLS.  Set cert with `--tls-cert-file` and key with `--tls-private-key-file` flag.
 - default is port 6443, change with `--secure-port` flag.
 - default IP is first non-localhost network interface, change with `--bind-address` flag.
 - request handled by authentication and authorization modules.
 - request handled by admission control module(s).
 - authentication and authorisation modules run.

在Google Compute Engine(GCE)或其他云提供商使用kube-up.sh创建集群时

  • API Server提供 443端口
  • GCE项目配置防火墙
  • 允许API进行外部HTTPS访问

本文翻译Kubernetes官方文档

本文分享自微信公众号 - kubernetes中文社区(DailyDev),作者:Kubernetes

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使Kubernetes管理更容易的7个工具

    Kubernetes是最初由Google开发的容器编排工具,已成为敏捷和DevOps团队的重要资源。作为一个开源工具,Kubernetes本身正在成为一个生态系...

    kubernetes中文社区
  • 从零开始: 入门Kubernetes核心概念

    Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译是'舵手'或者'飞行员'。在一些常...

    kubernetes中文社区
  • Kubernetes 1.18新版本发布,速来看新特性

    今天,我们高兴地宣布Kubernetes 1.18正式与大家见面,这也是我们2020年以来进行的首次版本发布!Kubernetes 1.18中包含38项功能增强...

    kubernetes中文社区
  • c# 调用Oracle带有游标的存储过程

    我们在写Oracle存储过程时经常会需要返回数据,像这种方式一般都输出游标的方式。我们今天就来做个用C#程序调用Oracle带有游标输出的存储过程并展示出数据。

    Vaccae
  • 变化驱动:正交设计

    一个出发点 当谈起软件设计的目的时,能够获得所有人认同的答案只有一个:功能实现。 因为这是一个软件存在的根本原因。 而在计算机软件发展的初期,这一点也正是所有...

    张逸
  • 变化驱动:正交设计|洞见

    本文首发于InfoQ: http://www.infoq.com/cn/articles/change-driven-orthogonal-design 一个...

    ThoughtWorks
  • python list的一个面试题

    py3study
  • 拜占庭将军:背后的数学证明

    上一讲中拜占庭将军:分布式领域的幽灵,我们介绍了著名的拜占庭将军问题的由来及其结论:

    Oilbeater
  • 六款值得推荐的android(安卓)开源框架简介

    1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载...

    程序员互动联盟
  • 六款值得推荐的android(安卓)开源框架简介

    1、volley 项目地址 https://github.com/smanikandan14/Volley-demo  (1)  JSON,图像等的异步下载...

    庞小明

扫码关注云+社区

领取腾讯云代金券