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に書くだけで設定を持っていくことができる。
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の場合は以下のヘッダーで定義されている。
案の定というかLinuxあるあるの状態確認するには専用のツールなりを用意してパースしないと見辛いフォーマットとなっている。ある程度何が追加されていて何が落とされているかは把握しておくべきではあると思う。
CapInh このプロセスから新たにプロセスを作成する場合に継承されるセキュリティビットのようです。 CapPrm Permittedなのでこのプロセスに許可されたセキュリティビットです。 CapEff 最終的に有効となったセキュリティビットのです。 対象のケーパビリティのビットが0の場合は権限なしとして扱われるようです。 CapBnd CapInhとCapEffで設定されたセキュリティビットに対してマスクをかけるセキュリティビットのです。 起動ユーザのCapInh/CapPrmに設定されものからマスクされ、 CapEffにはマスクされた結果が反映されるようです。 CapAmb 特権を持たない一般ユーザに許可を与えるためのセキュリティビットです。 ここの設定値は連鎖してCapInh/CapPrmに設定されるようです。