- 1 はじめに
- 2 検証環境
- 3 podmanのインストール方法
- 4 アンマスクする方法(--security-opt unmask=dir)
- 5 マスクする方法(--security-opt mask=dir)
- 6 マスク/アンマスクのパスを同時に指定する方法
- Y 参考図書
- Z 参考情報
1 はじめに
コンテナがホストの仮想ファイルシステムへの参照を禁止または許可する方法について説明します。仮想ファイルシステムとは、/proc、/sys、/dev などを指します。コンテナが動作するのに必要のない仮想ファイルシステムは、コンテナから見えないようにマスクすることで、セキュリティを向上させることができます。例えば、以下に抜粋したマニュアルを参照すると、/proc/acpi や /proc/kcore などはデフォルトでマスクされています。つまり、コンテナからこれらのファイルシステムをデフォルトで参照することはできません。
[root@kvm-host ~]# man podman-run ~ unmask=ALL or /path/1:/path/2, or shell expanded paths (/proc/*): Paths to unmask separated by a colon. If set to ALL, it unmasks all the paths that are masked or made read-only by default. The de‐ fault masked paths are /proc/acpi, /proc/kcore, /proc/keys, /proc/latency_stats, /proc/sched_debug, /proc/scsi, /proc/timer_list, /proc/timer_stats, /sys/firmware, and /sys/fs/selinux. The default paths that are read-only are /proc/asound, /proc/bus, /proc/fs, /proc/irq, /proc/sys, /proc/sysrq- trigger, /sys/fs/cgroup. -snip-
2 検証環境
サーバのAlmaLinux版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release AlmaLinux release 9.2 (Turquoise Kodkod)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 5.14.0-284.11.1.el9_2.x86_64
3 podmanのインストール方法
podmanパッケージをインストールします。
[root@server ~]# dnf -y install podman
podmanコマンドの版数を確認します。
[root@server ~]# podman -v podman version 4.9.4-rhel
4 アンマスクする方法(--security-opt unmask=dir)
コンテナを起動するイメージを確認します。ここでは、almalinux イメージを使用します。
[user1@server ~]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/almalinux latest fe9652e6c62e 5 days ago 191 MB
デフォルトの状態を確認するため、--security-opt オプションを指定せずコンテナを起動します。
[user1@server ~]$ podman run -it --rm --name test1 almalinux [root@1b1a123822ef /]#
ls コマンドで /proc/scsi を確認します。マニュアルに記載されている通り、/proc/scsi はデフォルトでマスクされているため、/proc/scsi 配下には何も表示されないことが確認できます。
[root@1b1a123822ef /]# ls /proc/scsi/ [root@1b1a123822ef /]#
コンテナ内でマウントしているファイルシステムを確認します。/proc/scsi には tmpfs がマウントされていることがわかります。つまり、/proc/scsi にアクセスすると、ホストのメモリを参照することになります。これにより、ホストの /proc/scsi へのアクセスが制限されていることが確認できます。
[root@c8db3cd3c364 /]# findmnt -a | grep /proc/scsi | |-/proc/scsi tmpfs tmpfs ro,relatime,context="system_u:object_r:container_file_t:s0:c63,c112",size=0k,uid=1000,gid=1000,inode64
コンテナから抜けます。
[root@c8db3cd3c364 /]# exit exit
次に、--security-opt オプションを使用して /proc/scsi をアンマスクしてみます。アンマスクを指定すると、コンテナからホストの /proc/scsi を参照できるようになります。
[user1@server ~]$ podman run -it --rm --security-opt unmask=/proc/scsi --name test1 almalinux [root@99e528143a44 /]#
lsコマンドで/proc/scsi 配下を確認すると、各種ファイルを確認することができます。
[root@326649924a35 /]# ls -l /proc/scsi/ total 0 -r--r--r--. 1 nobody nobody 0 Jul 28 12:35 device_info -r--r--r--. 1 nobody nobody 0 Jul 28 12:35 scsi dr-xr-xr-x. 9 nobody nobody 0 Jul 28 12:35 sg
コンテナ内でマウントしているファイルシステムを確認します。/proc/scsi には tmpfsはマウントされていません。つまり、ホストの/proc/scsi を参照できることがわかります。
[root@326649924a35 /]# findmnt -a | grep /proc/scsi [root@326649924a35 /]#
コンテナから抜けます。
[root@326649924a35 /]# exit exit
5 マスクする方法(--security-opt mask=dir)
コンテナに特定の仮想ファイルシステムを参照できないようにするには、マスクするパスを --security-opt オプションで指定します。例えば、コンテナから /proc/sys/net を参照できないようにする場合は、次のように実行します。
まず初期状態を確認するため、--security-opt オプションを指定せずコンテナを起動してみます。
[user1@server ~]$ podman run -it --rm --name test1 almalinux [root@96ac14e1d2a3 /]#
lsコマンドで /proc/sys/net 配下を確認してみます。
[root@96ac14e1d2a3 /]# ls -l /proc/sys/net total 0 dr-xr-xr-x. 1 root root 0 Jul 28 12:36 core dr-xr-xr-x. 1 root root 0 Jul 28 12:36 ipv4 dr-xr-xr-x. 1 root root 0 Jul 28 12:36 ipv6 dr-xr-xr-x. 1 root root 0 Jul 28 12:36 mptcp dr-xr-xr-x. 1 root root 0 Jul 28 12:36 netfilter dr-xr-xr-x. 1 root root 0 Jul 28 12:36 unix
コンテナから抜けます。
[root@d42f33ba2d95 /]# exit exit
次に、--security-opt オプションを使用して /proc/sys/net をマスクしてみます。マスクを指定すると、コンテナからホストの /proc/sys/net を参照できなくなります。
[user1@server ~]$ podman run -it --rm --security-opt mask=/proc/sys/net --name test1 almalinux [root@0c40734feca6 /]#
lsコマンドで /proc/sys/net 配下を確認すると、何も表示されないことが確認できます。
[root@0c40734feca6 /]# ls -l /proc/sys/net total 0
コンテナから抜けます。
[root@0c40734feca6 /]# exit exit
6 マスク/アンマスクのパスを同時に指定する方法
マスク、アンマスクするパスを複数同時に指定する場合は、パスを「:」で区切ります。ここでは、コンテナからホストの以下の仮想ファイルシステムをマスクしてみます。
・/proc/sys/net/ipv4
・/proc/sys/net/ipv6
[user1@server ~]$ podman run -it --rm --security-opt mask=/proc/sys/net/ipv4:/proc/sys/net/ipv6 --name test1 almalinux
コンテナ内で /proc/sys/net/ipv4 配下を確認してみます。/proc/sys/net/ipv4 がマスクされているため、ls コマンドで /proc/sys/net/ipv4 配下を確認すると、何も表示されないことが確認できます。
[root@598c9f73964c /]# ls -l /proc/sys/net/ipv4/ total 0
コンテナ内で /proc/sys/net/ipv6 配下を確認してみます。/proc/sys/net/ipv6 がマスクされているため、ls コマンドで /proc/sys/net/ipv6/ 配下を確認すると、何も表示されないことが確認できます。
[root@598c9f73964c /]# ls -l /proc/sys/net/ipv6/ total 0
Y 参考図書
今回の記事執筆にあたり参考にした図書は以下のものです。