Help us understand the problem. What is going on with this article?

DockerとSELinux

はじめに

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に慣れないといけないのだな…と私は感じました。

参考になれば幸いです。

ttt_okamoto
Linux関連からコンテナ関連を修行中です。 言語についても興味ありの人です。
comture
コムチュアグループは、デジタルトランスフォーメーション(DX)時代を担う「デジタルソリューションパートナー」として、デジタル技術を活用し、お客様の経営課題解決とイノベーション推進を積極的に進めてまいります。※各記事はすべて個人の見解であり、コムチュアグループの公式見解ではありません。
https://www.comture.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away