LoginSignup
71
55

More than 3 years have passed since last update.

DockerとSELinux

Last updated at Posted at 2020-01-24

はじめに

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

参考になれば幸いです。

71
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
55