システムコールのインターセプション
LXD では非特権コンテナーで、いくつか特定のシステムコールをインターセプトできます。もし、それが安全であると見なせるのであれば、ホスト上で特権を昇格させて実行します。
これを行うことで、対象のシステムコールではパフォーマンスに影響があり、LXD ではリクエストを評価するための作業が必要となり、もし許可されれば昇格した特権で実行されます。
利用できるシステムコール
mknod / mknodat
mknod
と mknodat
システムコールを使用して、色々なスペシャルファイルを作成できます。
もっとも一般的にはコンテナー内部で、ブロックデバイスやキャラクターデバイスを作成するために呼び出されます。このようなデバイスを作成することは、非特権コンテナー内では許可されません。これは、ディスクやメモリのようなリソースに直接書き込みのアクセスを許可することになり、特権を昇格するのに非常に簡単な方法であるためです。
しかし、作成しても安全であるファイルもあります。このような場合に、システムコールをインターセプトすることで、特定の処理のブロックが解除され、非特権コンテナー内部で実行できるようになります。
現時点で許可されているデバイスは次のものです:
- overlayfs whiteout (char 0:0)
- /dev/console (char 5:1)
- /dev/full (char 1:7)
- /dev/null (char 1:3)
- /dev/random (char 1:8)
- /dev/tty (char 5:0)
- /dev/urandom (char 1:9)
- /dev/zero (char 1:5)
キャラクターデバイス以外のすべてのファイルタイプは、現時点では通常通りカーネルに送られるので、この機能を有効にしても動作は全く変わりません。
この機能は security.syscalls.intercept.mknod
を true
に設定することで有効に出来ます。
setxattr
setxattr
システムコールは、拡張ファイル属性を設定するのに使われます。
現時点で、これにより処理される属性は次のものです:
- trusted.overlay.opaque (overlayfs directory whiteout)
この介入は多数の文字列で行う必要があるため、現在のところ、対象の少数の属性のみインターセプトする簡単な方法がありません。上記の属性のみを許可しているため、カーネルが以前に許可していた他の属性を破損する可能性があります。
この機能は security.syscalls.intercept.setxattr
を true
に設定することで有効にできます。