Provided by: lxc-utils_5.0.0~git2209-g5a7b9ce67-0ubuntu1.1_amd64
NAME
lxc-attach - 実行中のコンテナ内でプロセスの開始
SYNOPSIS
lxc-attach {-n, --name name} [-f, --rcfile config_file] [-a, --arch arch] [-e, --elevated- privileges privileges] [-s, --namespaces namespaces] [-R, --remount-sys-proc] [--keep-env] [--clear-env] [-v, --set-var variable] [--keep-var variable] [-u, --uid uid] [-g, --gid gid] [-- command]
説明
lxc-attach は name で指定したコンテナ内で指定した command を実行します。 実行する時点でコ ンテナが実行中でなければなりません。 もし command が指定されていない場合、lxc-attach コマンドを実行したユーザのデフォルトシェル をコンテナ内で調べて実行します。 もしコンテナ内にユーザが存在しない場合や、コンテナで nsswitch 機構が働いていない場合はこの動作は失敗します。 前のバージョンの lxc-attach は、単に指定したコンテナの名前空間にアタッチし、最初に擬似端末 (pseudo terminal) を割り当てないで、シェルもしくは指定したコマンドを実行しました。 これ は、異なる特権レベルを持つユーザ空間の実行コンテキストを切り替えた後に、TIOCSTI ioctl の呼 び出し経由で擬似入力を行うことに対して脆弱となります。 新しいバージョンの lxc-attach は、ホスト上の擬似端末のファイルディスクリプタのペアを割り当てようとします。そしてシェルや コマンドを実行する前に、擬似端末のコンテナ側に対して、ターミナルを参照する標準ファイルディ スクリプタをアタッチします。 ターミナルを参照する標準ファイルディスクリプタがない場合 は、lxc-attach は擬似端末の割り当てを行わないことに注意してください。代わりに、単にコンテ ナの名前空間にアタッチし、シェルや指定したコマンドを実行します。
オプション
-f, --rcfile config_file コンテナの仮想化、隔離機能の設定のための設定ファイルを指定します。 (lxc-create 経由で) 前もってコンテナが作られた際の設定ファイルが既にあった場合で も、このオプションが指定された場合は、指定した設定ファイルが使用されます。 -a, --arch arch コマンドを実行するコンテナのアーキテクチャを指定します。 このオプションは、コンテナ の設定ファイルで指定する lxc.arch オプションと同じものが使用可能です。 lxc.conf(5) を参照してください。デフォルトでは、実行しているコンテナのアーキテクチャになりま す。 -e, --elevated-privileges privileges コンテナの内部で command を実行する時に特権を削除しません。 もしこのオプションが指 定された場合、新しいプロセスはコンテナの cgroup に追加 されず、実行する前にケーパビ リティ (capability) も削除しません。 全ての特権の取得したくない場合は、パイプで連結したリストとして、例えば CGROUP|LSM のように、特権を指定することが可能です。 指定できる値は、それぞれ cgroup、ケーパビ リティ、特権の制限を表す CGROUP、CAP、LSM です。 (パイプ記号を CGROUP\|LSM のように エスケープするか、"CGROUP|LSM" のように引用符号を付ける必要があります。) 警告: もし実行するコマンドが、アタッチするメインプロセスが終了した後も実行されたま まのサブプロセスを開始するような場合、このオプションの指定はコンテナ内への特権の リークとなる可能性があります。 コンテナ内でのデーモンの開始(もしくは再起動)は問題と なります。 デーモンが多数のサブプロセスを開始する cron や sshd のような場合は特に問 題となります。 充分な注意を払って使用してください。 -s, --namespaces namespaces アタッチする名前空間をパイプで連結したリストで指定します。 例えば NETWORK|IPC のよ うにです。 ここで使用可能な値は MOUNT, PID, UTSNAME, IPC, USER , NETWORK です。 こ れにより指定した名前空間にプロセスのコンテキストを変更できます。 例えばコンテナの ネットワーク名前空間に変更する一方で、他の名前空間はホストの名前空間のままにすると いうような事が可能です。 (パイプ記号を MOUNT\|PID のようにエスケープする か、"MOUNT|PID" のように引用符号を付ける必要があります。) 重要: このオプションは -e オプションを指定しなくても指定している場合と同様の動作を します。 -R, --remount-sys-proc -s を指定し、そこにマウント名前空間が含まれない時、このオプションにより lxc-attach は /proc と /sys をリマウントします。 これは現在の他の名前空間のコンテキストを反映 させるためです。 もっと詳細な説明は 注意 を参照してください。 このオプションは、マウント名前空間へのアタッチが行われる場合は無視されます。 --keep-env アタッチされるプログラムに対して現在の環境を保持したままにします。 これは現在 (バー ジョン 0.9 時点) のデフォルトの動作ですが、将来は変更される予定です。 この動作がコ ンテナ内への望ましくない情報の漏洩につながる可能性があるためです。 アタッチするプロ グラムで環境変数が利用可能であることを期待している場合、将来的にもそれが保証される ようにこのオプションを使用するようにしてください。 現在の環境変数に加え て、container=lxc が設定されます。 --clear-env アタッチする前に環境変数をクリアします。 これによりコンテナへの不要な環境変数の漏洩 が起こらなくなります。 変数 container=lxc のみがアタッチするプログラムの開始の時の 環境変数となります。 -v, --set-var variable コンテナにアタッチしたプログラムから見える環境変数を追加します。このオプションは "VAR=VALUE" の形式で指定し、複数回指定できます。 --keep-var variable --clear-env を指定した際に、クリアせずに保持したままにしたい環境変数を指定しま す。--clear-env と同時にしか使えません。複数回指定できます。 -u, --uid uid コンテナ内で、ユーザ ID uid で command を実行します。 --g, --gid gid コンテナ内で、グループ ID gid で command を実行します。
共通オプション
ここで紹介するオプションは lxc コマンドの大部分で共通のものです。 -?, -h, --help 通常より長い使い方のメッセージを表示します。 --usage 使い方を表示します。 -q, --quiet 出力を抑制します。 -P, --lxcpath=PATH デフォルトと別のコンテナパスを使用します。デフォルトは /var/lib/lxc です。 -o, --logfile=FILE 追加のログを FILE に出力します。デフォルトは出力しません。 -l, --logpriority=LEVEL ログの優先度を LEVEL に設定します。デフォルトの優先度は ERROR です。以下の値を設定 可能です: FATAL, ALERT, CRIT, WARN, ERROR, NOTICE, INFO, DEBUG, TRACE。 このオプションは追加のログファイルへのイベントログの優先度の設定である事に注意して ください。stderr への ERROR イベントのログには影響しません。 -n, --name=NAME NAME という名前でコンテナを識別します。コンテナ識別子のフォーマットは英数字の文字列 です。 --rcfile=FILE コンテナの仮想化、隔離機能の設定のための設定ファイルを指定します。 (lxc-create 経由で) 前もってコンテナが作られた際の設定ファイルが既にあった場合で も、このオプションが指定された場合は、指定した設定ファイルが使用されます。 --version バージョン番号を表示します。
例
存在するコンテナ内で新しいシェルを生成するには、以下のようにします。 lxc-attach -n container 実行中の Debian コンテナの cron サービスを再起動するには、以下のように実行します。 lxc-attach -n container -- /etc/init.d/cron restart NET_ADMIN ケーパビリティを持たない実行中のコンテナのネットワークインターフェース eth1 の動 作を停止させるには、ケーパビリティを増加させるために -e オプションを指定し、ip ツールがイ ンストールされていることを前提に、以下のように実行します。 lxc-attach -n container -e -- /sbin/ip link delete eth1
互換性
(pid とマウント名前空間を含む) コンテナに対する完全なアタッチを行うには 3.8 以上、もしくは パッチを適用したカーネルが必要となります。 詳しくは lxc のウェブサイトを参照してください。 パッチが当たっていない 3.8 より小さなバージョンのカーネルを使った場合は、lxc-attach の実行 は失敗するでしょう。 しかし、もし -s を使用して、アタッチするものを NETWORK, IPC, UTSNAME の 1 つか複数の名前空 間に限定して使用すれば、バージョン 3.0 以上のパッチを適用していないカーネルでもアタッチが 成功するでしょう。 ユーザ名前空間へのアタッチは、ユーザ名前空間機能を有効にした 3.8 以上のカーネルでサポート されます。
注意
Linux の /proc と /sys ファイルシステムは名前空間によって影響を受けるある程度の情報を持っ ています。 これは /proc 内のプロセス ID の名前のディレクトリや、/sys/class/net 内のネット ワークインターフェース名のディレクトリなどです。 擬似ファイルシステムをマウントしているプ ロセスの名前空間が、どのような情報を表示するかを決定します。 /proc や /sys にアクセスして いるプロセスの名前空間が決定するのではありません。 -s を使ってコンテナの pid 名前空間のみをアタッチし、マウント名前空間 (これはコンテナの /proc を含み、ホストのは含まないでしょう) はアタッチしない場合、/proc のコンテンツはコンテ ナのものではなく、ホストのものとなります。 似たような事例として、ネットワーク名前空間のみ をアタッチして、/sys/class/net のコンテンツを読んだ場合も同じような事が起こるでしょう。 この問題への対処のために、-R オプションが /proc と /sys が提供されています。 これによ り、アタッチするプロセスのネットワーク/pid 名前空間のコンテキストを反映させることができま す。ホストの実際のファイルシステムに影響を与えないために、実行前にはマウント名前空間は unshare されます (lxc-unshare のように)。 これは、/proc と /sys ファイルシステム以外はホス トのマウント名前空間と同じである、新しいマウント名前空間がプロセスに与えられるということで す。 以前のバージョンの lxc-attach は、いくつかの重要なサブシステムに対して、書き込み可能な cgroup 内に配置することなしに、ユーザがコンテナの名前空間にアタッチできたバグがありまし た。 新しいバージョンの lxc-attach は、このような重要なサブシステムに対して、ユーザが書き 込み可能な cgroup 内にいるかどうかをチェックします。 したがって、ユーザによっては lxc- attach は不意に失敗するかもしれません (例えば、非特権ユーザが、ログイン時に重要であるサブ システムの書き込み可能な cgroup に配置されていないようなシステムで)。しかし、この振る舞い は正しく、よりセキュアです。
セキュリティ
-e と -s オプションの使用には注意を払うべきです。 不適切に使用した場合、コンテナの隔離を破 壊してしまう可能性があります。
SEE ALSO
lxc(7), lxc-create(1), lxc-copy(1), lxc-destroy(1), lxc-start(1), lxc-stop(1), lxc- execute(1), lxc-console(1), lxc-monitor(1), lxc-wait(1), lxc-cgroup(1), lxc-ls(1), lxc- info(1), lxc-freeze(1), lxc-unfreeze(1), lxc-attach(1), lxc.conf(5)
作者
Daniel Lezcano <daniel.lezcano@free.fr> 2024-01-24 lxc-attach(1)