hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

仮想ファイルシステムのマスク/アンマスク方法



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 参考図書

今回の記事執筆にあたり参考にした図書は以下のものです。

単行本


Docker実践ガイド 第3版 (impress top gear)

電子書籍



Software Design (ソフトウェアデザイン) 2023年11月号 [雑誌]


Docker実践ガイド 第3版 impress top gearシリーズ