見出し画像

Linux と Kubernetes の「capability」って何? 権限管理を柔軟にする仕組み

Linux で root 権限を使うのって、ちょっと怖くないですか?
システム管理やネットワークの設定変更など、特定の操作をするためだけに 「何でもできる」 root 権限を渡すのは、セキュリティ上リスクが大きいですよね。

そんな問題を解決するのが capability (ケイパビリティ) という仕組みです。
これは、プロセスごとに必要な特権だけを付与できる仕組み で、Linux だけでなく Kubernetes でも活用されています。

今回は、この capability の仕組みや活用方法について、具体例を交えながらまとめていきます!


(1) capability とは?

もともと Linux では、特権操作をするには root 権限 (UID 0) が必要でした。
でも、root にすると システムの全権限を持ってしまう ため、ちょっとした操作のために root を与えるのは危険です。

例えば、Web サーバーをポート 80 で動かしたいだけなのに root にするのは、明らかに権限を与えすぎですよね。

そこで登場したのが capability です。
capability を使えば、プロセスごとに必要な権限だけを渡せる ため、セキュリティリスクを減らせます。


(2) 具体的な capability の例

Linux では、capability は CAP_* という形で表されます。
例えば、以下のようなものがあります。

  • CAP_NET_BIND_SERVICE → 1024 未満のポートをバインドできる

  • CAP_SYS_TIME → システムの時刻を変更できる

  • CAP_SYS_ADMIN → システム管理操作が可能(超強力!)

  • CAP_NET_RAW → ping などの RAW ソケットを利用できる

例えば、通常ポート 80 で Web サーバーを動かすには root 権限が必要ですが、CAP_NET_BIND_SERVICE だけを付与すれば root なしで実行できる ようになります。

このように、capability を活用すると 最小限の権限だけを与える ことができます。


(3) Kubernetes での capability 管理

Kubernetes では、Pod のセキュリティを高めるために、securityContext.capabilities を使って capability を 追加・削除 できます。

例えば、コンテナに CAP_NET_ADMIN を付与したい場合は、以下のように設定します。

apiVersion: v1
kind: Pod
metadata:
  name: netadmin-pod
spec:
  containers:
  - name: my-container
    image: busybox
    securityContext:
      capabilities:
        add: ["CAP_NET_ADMIN"]

この設定をすると、コンテナ内で ip link set eth0 down などのネットワーク管理コマンドが実行できるようになります。

逆に、「デフォルトで付与される capability の中から不要なものを削除する」こともできます。

securityContext:
  capabilities:
    drop: ["CAP_NET_RAW"]

これを設定すると、ping コマンドが使えなくなります。
不要な capability は削除しておくことで、セキュリティを強化できる んです。


(5) まとめ

  • capability は root 権限を細かく分割したもの

  • プロセスごとに必要な特権のみを付与できる ため、セキュリティリスクを減らせる

  • Kubernetes では securityContext.capabilities で管理できる

  • 不要な capability は削除しておくのが安全

  • CAP_SYS_ADMIN などの強力な capability は慎重に扱うべき

Kubernetes や Linux を運用するうえで、「どのプロセスにどの権限が必要なのか?」を意識するのはとても重要です。
capability をうまく活用して、セキュリティと利便性のバランスをとっていきましょう!

いいなと思ったら応援しよう!