ケーパビリティを直訳すると「能力」や「才能」といった意味となります。経営学の中では、「企業・組織が得意とする組織的な能力」といった意味と説明されています。
しかし、ITの世界では少し意味が異なり、「与えられた権限」といった意味として使われます。
Linuxカーネルケーパビリティ
IT・エンジニアリングの世界でケーパビリティと聞くとLinuxカーネルケーパビリティが有名です。Linuxを含むUNIX系OSで動くプロセスには、一般ユーザー権限とrootなどの特権ユーザー権限の何れかの権限が与えられます。一般ユーザー権限で動くプロセスであれば大した問題にもならないのですが、例えば、pingなどrawソケットに直接データを送りトラフィックを発生させるようなプロセスの場合、そのプロセス自体に「特権となる権限」を与える必要がでてきます。しかし、プロセスに脆弱性などの問題があった場合、与えられた「特権」を悪用し、rootを奪取されてしまうような問題が発生してしまう可能性が出てきます。
そこで、対象となるプロセスには最小限のケーパビリティと呼ばれる権限だけを与えましょうというのが、「POSIX Capability」です。Linuxではカーネル2.4からLinuxカーネルケーパビリティとして採用されています。
参考情報: Linuxカーネルケーパビリティ マニュアルページ
rawソケット(raw socket) 生のネットワークパケットへのダイレクトな送信と受信を可能にするインターネットソケットです。rawソケットの他には標準的に使われている標準ソケットというソケットがあり、標準ソケットで送信されたペイロード(データ部分)はTCPやUDPといった選択したトランスポート層のプロトコルによってカプセル化されます。rawソケットの主な用途としてはユーザー空間の中での新しい実装の際に利用されるが、ネットワークエンジニア的な目線で説明するとOSPFやIGMPといったルーティングプロトコル、疎通確認の際に皆さんが必ず利用するPingなどでrawソケットが利用されています。
コンテナもケーパビリティでセキュリティ強化
コンテナをroot権限で動かす場合も、実はケーパビリティによって権限が制限されています。以下にコンテナ内でrootがDefaultで持っているケーパビリティを張り付けておきますので、コンテナの安全性をもっと強固にしたい場合の参考にしてみてください。設定の方法は別の記事でご紹介します。
Capability | 権限 |
CAP_AUDIT_WRITE | 監査ログの書き込みができる。 |
CAP_CHOWN | ファイルの所有者の変更ができる。 |
CAP_DAC_OVERRIDE | ファイルの読み取り、書き込み、実行の権限(パーミッション)チェックをバイパスします。 |
CAP_FOWNER | ファイルの所有権の権限チェックをバイパスできる。 |
CAP_FSETID | ファイルが変更されたときにset-user-IDおよびset-group-IDモードビットをクリアしない。 |
CAP_KILL | シグナル送信の許可チェックをバイパスします。 |
CAP_MKNOD | mknodを使用した実行ファイルの作成ができる。 |
CAP_NET_BIND_SERVICE | 特権ポート(1024未満のTCP/UDPポート)にbindできる。 |
CAP_NET_RAW | RAWおよび標準ソケットを使用し、任意のパケットをを送受信できる。※特に気を使いましょう。 |
CAP_SETGID | GIDを変更できる。 |
CAP_SETFCAP | 実行ファイルに任意の属性を設定できる。 Set arbitrary capabilities on a file. |
CAP_SETPCAP | 呼び出しプロセス(スレッド)が許可されている任意のケーパビリティを、他の継承可能なプロセスに追加・削除することができる。 |
CAP_SETUID | UIDを変更できる。 |
CAP_SYS_CHROOT | ルートディレクトリを変更できる。 |