地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【k8s】セキュリティを高めるCAPABILITIES

linuxjm.osdn.jp

capabilities - Linux のケーパビリティ (capability) の概要

ケーパビリティを使うとroot か root じゃないか、という究極の選択 的な権限の与え方ではなく、もっと細かい単位で権限をプロセスなりバイナリなりに付与してセキュリティを柔軟に設定したりするためのLinuxカーネルの機能。

ざっくり有名どころを書くと

* CAP_CHOWN
ファイルのUIDとGIDを変更できる。

* CAP_DAC_OVERRIDE
ファイルにアクセス(読み書き実行)できる。

* CAP_DAC_READ_SEARCH
ファイルの読み出しと実行ができる。

* CAP_KILL
シグナルを送信できる。

* CAP_NET_BIND_SERVICE
1024番未満のポートを使用できる。

* CAP_NET_ADMIN
ネットワーク関連の操作ができる。
(インターフェース、iptables やルーティングテーブルの設定など)

* CAP_NET_RAW
RAWソケットおよびPACKETソケットを使用できる。

* CAP_SYS_MODULE
カーネルモジュールのロード・アンロードが行える。

* CAP_SYS_CHROOT
chroot できる。

* CAP_SYS_ADMIN
quota や swap、mount などなど、様々な操作が行える。

* CAP_SYS_TIME
システム時間の設定が行える。

Kubernetsでやるならどうやるの

ケーパビリティ自体はdockerを触ってればある程度は使ってたりするのでk8sにもそのまま同じ考えでpod templateに書くだけで設定を持っていくことができる。

kubernetes.io

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alpine
spec:
  selector:
    matchLabels:
      app: alpine
  replicas: 1
  template:
    metadata:
      labels:
        app: alpine
    spec:
      containers:
      - name: alp
        image: alpine:latest
        command: ["tail", "-f", "/dev/null"]
        securityContext:
          capabilities:
            drop:
              - NET_RAW
              - CHOWN

ちなみにどんなのがあるかというとLinuxの場合は以下のヘッダーで定義されている。

github.com

案の定というかLinuxあるあるの状態確認するには専用のツールなりを用意してパースしないと見辛いフォーマットとなっている。ある程度何が追加されていて何が落とされているかは把握しておくべきではあると思う。

CapInh
このプロセスから新たにプロセスを作成する場合に継承されるセキュリティビットのようです。

CapPrm
Permittedなのでこのプロセスに許可されたセキュリティビットです。

CapEff
最終的に有効となったセキュリティビットのです。
対象のケーパビリティのビットが0の場合は権限なしとして扱われるようです。

CapBnd
CapInhとCapEffで設定されたセキュリティビットに対してマスクをかけるセキュリティビットのです。
起動ユーザのCapInh/CapPrmに設定されものからマスクされ、
CapEffにはマスクされた結果が反映されるようです。

CapAmb
特権を持たない一般ユーザに許可を与えるためのセキュリティビットです。
ここの設定値は連鎖してCapInh/CapPrmに設定されるようです。