web-dev-qa-db-ja.com

Docker(LXCベースではなくネイティブ)内のlsofをどのように置き換えることができますか?

Dockerコンテナの内部ではlsof -iが出力を生成しないことに多少困惑しています。

例(すべてのコマンド/コンテナー内からの出力):

[1] root@ec016481cf5f:/# lsof -i
[1] root@ec016481cf5f:/# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

また、PIDやプログラム名がnetstatで表示されないことに注意してください。 fuserはまた、やや混乱する出力を与え、PIDを正確に特定することもできません。

誰でもこれに光を当てることができますか?

  • lsof -iをどのように置き換えることができますか(プロセス名を表示するためにも!)
  • netstatの出力も同様に機能しないのはなぜですか?

NB:コンテナは"ExecDriver": "native-0.1"で実行されます。つまり、LXCではなく、Docker自体の実行レイヤーです。


[1] root@ec016481cf5f:/# fuser -a4n tcp 22
Cannot stat file /proc/1/fd/0: Permission denied
Cannot stat file /proc/1/fd/1: Permission denied
Cannot stat file /proc/1/fd/2: Permission denied
Cannot stat file /proc/1/fd/3: Permission denied
Cannot stat file /proc/1/fd/255: Permission denied
Cannot stat file /proc/6377/fd/0: Permission denied
Cannot stat file /proc/6377/fd/1: Permission denied
Cannot stat file /proc/6377/fd/2: Permission denied
Cannot stat file /proc/6377/fd/3: Permission denied
Cannot stat file /proc/6377/fd/4: Permission denied
22/tcp:

(私はPermission deniedにこだわっていません。それはその数字だからです。私を混乱させるのは、22/tcpの後のPIDの空のリストです。)


# lsof|awk '$1 ~ /^sshd/ && $3 ~ /root/ {print}'
sshd    6377      root  cwd   unknown                        /proc/6377/cwd (readlink: Permission denied)
sshd    6377      root  rtd   unknown                        /proc/6377/root (readlink: Permission denied)
sshd    6377      root  txt   unknown                        /proc/6377/exe (readlink: Permission denied)
sshd    6377      root    0   unknown                        /proc/6377/fd/0 (readlink: Permission denied)
sshd    6377      root    1   unknown                        /proc/6377/fd/1 (readlink: Permission denied)
sshd    6377      root    2   unknown                        /proc/6377/fd/2 (readlink: Permission denied)
sshd    6377      root    3   unknown                        /proc/6377/fd/3 (readlink: Permission denied)
sshd    6377      root    4   unknown                        /proc/6377/fd/4 (readlink: Permission denied)
sshd    6442      root  cwd   unknown                        /proc/6442/cwd (readlink: Permission denied)
sshd    6442      root  rtd   unknown                        /proc/6442/root (readlink: Permission denied)
sshd    6442      root  txt   unknown                        /proc/6442/exe (readlink: Permission denied)
sshd    6442      root    0   unknown                        /proc/6442/fd/0 (readlink: Permission denied)
sshd    6442      root    1   unknown                        /proc/6442/fd/1 (readlink: Permission denied)
sshd    6442      root    2   unknown                        /proc/6442/fd/2 (readlink: Permission denied)
sshd    6442      root    3   unknown                        /proc/6442/fd/3 (readlink: Permission denied)
sshd    6442      root    4   unknown                        /proc/6442/fd/4 (readlink: Permission denied)
sshd    6442      root    5   unknown                        /proc/6442/fd/5 (readlink: Permission denied)

接続されたユーザーの出力もいくつかありますが、正しく識別されますが、それだけです。特定の「オブジェクト」がどのタイプ(lsof -iインターネットソケットの制限)であるかを識別することは明らかに不可能です。

16
0xC0000022L

(注:質問者がどのようにdockerコンテナーに入っているかは質問では不明です。私はassumingdocker exec -it CONTAINER bashが使用されました。)

centos:7に基づくDockerイメージをDockerバージョン1.9.0で使用するときにこの問題が発生したため、これを克服するために実行しました。

docker exec --privileged -it CONTAINER bash

--privilegedが含まれていることに注意してください。

これが必要な理由についての私の素朴な理解:Dockerは ここに文書化 のように、コンテナをより「安全」にするための努力をしているようです。

7
erik.weathers

ああ、プロットは濃くなります。誰かがより良い答えを持っている場合は、それを書いてください。受け入れられる場合は、それを受け入れます。しかし、ここに明らかな理由があります。 Hostのログファイルを無視するのはどれほど怠慢ですか。

Jun 12 01:29:46 hostmachine kernel: [140235.718807] audit_printk_skb: 183 callbacks suppressed
Jun 12 01:29:46 hostmachine kernel: [140235.718810] type=1400 audit(1402536586.521:477): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="trace" denied_mask="trace" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718860] type=1400 audit(1402536586.521:478): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718886] type=1400 audit(1402536586.521:479): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718899] type=1400 audit(1402536586.521:480): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718921] type=1400 audit(1402536586.521:481): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718954] type=1400 audit(1402536586.521:482): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719001] type=1400 audit(1402536586.521:483): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719043] type=1400 audit(1402536586.521:484): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719086] type=1400 audit(1402536586.521:485): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719126] type=1400 audit(1402536586.521:486): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"

そのため、ホスト/コンテナのセキュリティを損なうことなくこれを許可する方法、またはセキュリティを損なうことなくそれが可能かどうかを確認する方法を理解する必要がありますが、apparmorが原因であるようです。

4
0xC0000022L

別の可能性として、今回はよりきめ細かいセキュリティ設定を使用します:DockerコンテナーにSYS_PTRACE特権を付与します。

docker run --cap-add=SYS_PTRACE ...

私もこの問題を発見しました。 apparmordockerを無効にした後、問題が発生しました:

$ Sudo aa-complain <docker apparmor profile name, "docker-default" on ubuntu>

参照URL: https://help.ubuntu.com/community/AppArmor

2
menghan