pam_cgfs(8)

NAME
pam_cgfs - 非特権の LXC コンテナのための cgroup を管理する

SYNOPSIS
\FCpam_cgfs.so\F[]
{-c kernel_controller,name=named_controller}

説明
LXC は LXC 1.0 以降、完全な非特権コンテナをサポートしてきました。完全な非特権コンテナは安全なコンテナであり、一般ユーザ（非 root）で実行できます。これはホスト上の特権のない UID と GID の範囲を、それとは異なるコンテナ内の UID と GID の範囲にマッピングするユーザ名前空間を使うことで実現しています。これは、コンテナ内の UID 0 (root) が、コンテナの外では 1000000 のような特権のないユーザ ID にマッピングされ、自身の所有するリソースに対してのみ権限を有することを意味します。

完全な非特権コンテナの cgroup 管理は、このようなコンテナが使用するリソースを制限するということです。例えば、コンテナの CPU 使用量を制限したり、コンテナ内で起動するプロセスの数を制限したり、コンテナが消費できるメモリを制限したりということです。 完全な非特権コンテナは一般ユーザによって実行され、コンテナ間のリソース消費を制限、管理する必要があるということは明らかです。 しかし、非特権での cgroup 管理はほとんどの init システムでは簡単ではありません。 そこで、pam_cgfs.so が誕生したのです。

pam_cgfs.so モジュールは、純粋な cgroupfs v1 (\FC/sys/fs/cgroup/$controller\F[]) ツリーと、コントローラのいくつかが cgroupfs v1 ツリー (\FC/sys/fs/cgroup/$controller\F[]) で、それ以外が cgroupfs v2 (\FC/sys/fs/cgroup/unified\F[]) ツリーと言ったようなミックスマウントを扱えます。 書き込み可能な cgroup がすべてのコントローラ用に作られます。また、引数で指定すれば、指定したコントローラのみ書き込み可能な cgroup が作られます。 純粋な cgroup v2 のみのマウントは pam_cgfs.so モジュールでは対象外です。

作成された cgroup \FCuser/$user/n\F[] は cgroup カーネルコントローラ階層配下の n 番目のセッション用です。

init システムが systemd であるシステムは、cgroupfs v1 と v2 の両方が特別に扱われます。cgroupfs v1 と v2 の両方に対して、このモジュールは systemd が既に、\FCuser.slice/user-$uid/session-n.scope\F[] を cgroup 内に作成しているかどうか、$uid == login uid であるかどうかをチェックします。もし $uid == login uid であるなら、\FCsession-n.scope\F[] をユーザに chown します。そうでなければ、前述のような cgroup (\FCuser/$user/n\F[]) が作成され、ログイン uid で chown されます。 もし、init システムがすでにセッション特有のグループ内にログインユーザーの cgroup を配置しているなら、pam_cgfs.so モジュールはそれを検出して再利用する機能を持っています。

基本的には pam_cgfs.so モジュールは、ログイン時に非特権（非 root）ユーザが書き込みできる cgroup を配置し、ログアウト時にもその cgroup ツリーをクリーンアッ�\x83\x97する処理を行います。したがって、必要に応じて提供されているリソースをコンテナに自由に委譲できます。

オプション

\FC-c \F[]controller-list
    カンマ（","）で区切られたカーネルコントローラと名前付きコントローラ（訳注: mount オプションとして name オプションで名前を指定してマウントした cgroup v1 ツリー）のリストを設定した文字列の引数を取ります。名前付きコントローラは "name=$namedcontroller" の形で指定する必要があります。"all" を指定して、すべての cgroup リソースコントローラーのツリーを有効にできます。"all" と他のコントローラを同時に指定すると、明確に PAM_SESSION_ERR が返ります。

MODULE TYPES PROVIDED
モジュールタイプとして \FCsession\F[] のみが提供されます（そして必要です）。

返り値

PAM_SUCCESS
    ユーザ用の書き込み可能な cgroup が作成されました。

PAM_SESSION_ERR
    ユーザ用の書き込み可能な cgroup の作成が失敗しました。

ファイル

/etc/pam.d/common-session{,-noninteractive}
    これらのファイルの最後にデフォルト設定が追加されます。

例
\FC
session optional        pam_cgfs.so -c freezer,memory,named=systemd
# デフォルト設定
# ユーザが書き込み可能な cgroup が freezer, memory, 名前付き cgroup "systemd" ツリー以下に作成されます。
# freezer と memory に対しては /sys/fs/cgroup/$controller/user/$user/n
# systemd に対しては /sys/fs/cgroup/systemd/user.slice/user-$uid/session-n.scope

session optional        pam_cgfs.so -c all
# すべての cgroup コントローラ以下にユーザが書き込み可能な cgroup が作成されます

session optional        pam_cgfs.so -c all,memory,freezer
# 不正な引数なので PAM_SESSION_ERR が返ります
    \F[]

SEE ALSO
lxc-cgroup(1), cgroups(7), user_namespaces(7), namespaces(7), pam(8)