Kubernetes Authorization

authorization mode

kubernetesではauthorizationに関していくつかのモードを提供してくれている。 authorization modeの指定はkube-api-serverで--authorization-modeを使って行う。
よくある、設定は--authorization-mode=Node, RBACになっている。

Kubernetesが提供しているモードは以下の通り。

--authorization-mode=ABAC

kube-apiserverに--authorization-policy-file=SOME_FILENAMEというオプションを併せて指定して利用する。 このオプションで指定したファイルに色々とauthorizationのルールを書いていく方法

--authorization-mode=RBAC

roleとかrolebindingとか使ってAutorizationをやる有名なやつ。

kubernetes.io

--authorization-mode=Webhook

webhookを使って自前の認可サーバーに認可に関するリクエストを飛ばして、authorizationを行う方法

kubernetes.io

--authorization-mode=Node

各ノードにあるkubeletの認証

どういったリクエストが許可されるかについてはKuberntes側で予め決まっている。
バージョンごとの差分もあるので、内容については下記リンクを参照

kubernetes.io

--authorization-mode=AlwaysDeny

すべてのリクエストを拒否する

--authorization-mode=AlwaysAllow

すべてのリクエストを許可する

anonymous access

anonymous accessの有効無効はkube-api-serverで--anonymous-auth=true|falseオプションを使って行う。
AlwaysAllow以外のauthorization modeであれば、デフォルトで有効になっている。(--anonymous-auth=trueとは言ってもABACやRBACを利用している場合、そこで認可が走るため、匿名ユーザがkubernes APIで何でもできるというわけではない。)
ちなみに、匿名ユーザからのアクセスはusernameがsystem:anonymous、groupがsystem:unauthenticatedであるとkube-api-serverには解釈される。

検証

--anonymous-auth=trueの状態でKubernetescurlでアクセスしてみる。

$ curl https://K8S_API_ENDPOINT -k
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {},
  "code": 403
}

RBACで弾かれているものの、普通に認可自体はできているっぽい。

今度は--anonymous-auth=falseの状態でKubernetescurlでアクセスしてみる。

$ curl https://K8S_API_ENDPOINT -k
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "Unauthorized",
  "reason": "Unauthorized",
  "code": 401
}

ちゃんとunauthorizeが返ってきている。