はじめに
Dockerなどのコンテナを使っていると「SELinuxを有効にしておけ」と言われますが、
実際に起動していないとどうなのか検証してみたことと、
色々なところでも紹介されているものですが、自身のメモとして投稿しました。
今回の検証環境
- VirtualBox 6.0
- CentOS 7.3
- Docker 19.03.05
SELinuxが無効な場合
まず、SELinuxを無効にします。
# vi /etc/selinux/config
(以下にパラメータを変更)
SELINUX=disabled # enforcingからdisabledに変更
# reboot
※ SELinuxの状態
- Enforcing : SELinuxが有効
- Permissive : SELinuxのラベリングはしているけど、無効な状態
- Disabled : SELinuxが無効
再起動後、SELinuxの状態確認
# getenforce
Disabled
これでコンテナを作成してみて、dmesgコマンドを実行すると、
$ docker run -it --rm centos:7 bash
[root@27726ede260a /]# dmesg
(実行結果は省略)
と色々出てきてしまいます。
これはなんでかと調べると、コンテナはホストOSのカーネルを共有しているため、
dmesgなどのコマンド実行するとすべて中身が見えてしまいます。
コンテナを安全に設計していたとしてもホストOS側が雑に作られていると、
ホストOSが攻撃対象になってしまうことが想定されています。
それとコンテナの脆弱性に関しては少しずつ発表されてきていますが、
コンテナは最悪作り直しがすぐにできますが、
ホスト側の作り直しはかなり手間なので、SELinuxを有効にしておく必要があります。
SELinuxが有効な場合
まず、SELinuxを有効にします。
# vi /etc/selinux/config
(以下にパラメータを変更)
SELINUX=enforcing # disabledからenforcingに変更
# reboot
(再起動後確認)
# getenforce
Enforcing
ではコンテナを作成し、dmesgコマンドを入力すると以下の結果になりました。
$ docker run -it --rm centos:7 bash
[root@c282a2fe3617 /]# dmesg
dmesg: read kernel buffer failed: Operation not permitted
エラーになり、dmesgコマンドが失敗しました。
このようにホスト側の情報を隠すといううえでも、SELinuxを有効にする必要があります。
いったんコンテナを抜けてラベルを確認します。
[root@c282a2fe3617 /]# (Ctrl +P→Q)
$
$ ps -efZ
(一部省略)
system_u:system_r:spc_t:s0 root 3084 3068 0 15:06 pts/0 00:00:00 bash
$ ls -Z
-rw-r--r--. root root system_u:object_r:var_log_t:s0 /var/log/dmesg
補足
DockerのSELinuxに関しては、別パッケージが必要です。
最新版はcontainer-selinuxパッケージにSELinuxの必要なラベルが入っており、インストール時もdocker-ceなどのパッケージと依存関係にあるのでセットでインストールします。
古いDockerのバージョンですと、docker-selinuxパッケージが別途必要なようです。
新しくDockerをインストールするなら、最新バージョンのほうが良さそうですね。
脆弱性も発表されていますし。。
参考:
Dockerの脆弱性
Dockerの探索
(参考)dmesgのアクセス制限
コンテナ上でdmesgコマンドを実行してもエラーになるように、専用の個別設定も可能ですが、
一つ一つ設定していくのは手間なので、SELinuxでまとめて制限かけたほうが無難な印象です。
# echo "kernel.dmesg_restrict=1" >> /etc/sysctl.d/dmesg.conf
# sysctl --system
$
$ docker run -it --rm centos:7 bash
/# dmesg
dmesg: read kernel buffer failed: Operation not permitted
さいごに
このように、コンテナやクラウド、さらにはIoTなど、LinuxをホストOSとして利用されていることが増えてきましたが、
リソースが乏しく、ソフトのバージョンアップなどが難しいものなどで使用される場合は万が一侵入されても大丈夫な対策として、SELinuxの導入がされ始めています。
先述していますが、個別設定でも抜けがでたりするので、まとめて設定できるSELinuxに慣れないといけないのだな…と私は感じました。
参考になれば幸いです。