Linuxコンテナお気軽管理(その2): セキュリティ調査編

3行で言うと…


前回のブログが公開されたのが7月の上旬でまだ梅雨が明ける前の話でした。
今日はもう8月の終わりで、今回のブログは前回の続編を書く予定でしたが一気に夏を越えてしまいました。
少しずつ秋めいた空気を感じる日が増えてきました。冬よりは夏の方が好きなので、ちょっとさびしい気がしています。

サーバの脆弱性


(クリックで大きな画像を表示)

サーバを稼働させるOSやサービスを構成するミドルウェアには意図しない動作を行うバグを含んでおり、常に修正を行っていくものというのが一般的な考え方だと思われます。そしてこれらのバグのうち欠陥や不都合な事象に繋がる可能性があるものをソフトウェアの脆弱性(ぜいじゃくせい)と呼びます。

一方、セキュリティ対策は脆弱性対策と言われることもあります。ここで言われる「脆弱性」とは組織のあり方や運用などを含めた弱点を指すもので、ソフトウェアの脆弱性とは言葉の意味が異なります。しかしソフトウェアの脆弱性の放置は間違いなく組織の弱点に繋がりますので対策が必要になります。

セキュリティ対策としての脆弱性対策の最初のステップは守るべき対象の弱点を知ることです。自分達が管理するシステム(ホスト)の脆弱性を調査することは対策の第一歩になります。

脆弱性検査ツール Vuls

VulsはGo言語で書かれたオープンソースの脆弱性検査ツールです。

future-architect/vuls: Vulnerability scanner for Linux/FreeBSD, agentless, written in Go

日本国内の企業であるフューチャーアーキテクト株式会社の方を中心に開発され、日本語への対応もしっかりしており、またドキュメント類やサポートなど日本語でも行っていらっしゃるため、私たち日本人にはとても利用しやすい環境が整ってます。

Vulsの特徴ですが、

といった点が挙げられると感じています。

脆弱性対策は実際に対象のソフトウェアを更新しないと対策されたことになりませんので、検査ツールであるVulsを実行するだけでは対策は完了しません。ただ、自分達が管理するホストに対応が必要なパッケージがあるか、今すぐ対応が必要かどうか、などを知るために継続的に調査をする意味は大きいと思われます。

また、稼働中のホストはいつでもパッケージ更新したり、再起動が実施出来るわけではありません。検査専用のツールであるVulsは勝手にホスト内のプログラムを改変することが無いため、安心して導入することができます。

先日8月25日にVulsの新バージョン0.4が公開されました。

0.4では特に

といった特徴が挙げられており、その他にも多数の内容がアップデートされています。

簡単な導入

導入や使用方法については公開されているREADMEに詳しく書かれています。日本語対応しているだけではなく、記述も丁寧です。

vuls/README.ja.md at master · future-architect/vuls

公式のドキュメント以外にもVuls導入の記事を多く見かけますので、導入について大きな問題は無いかと思われます。

今回ブログ公開が翌週と言うこともあって、新バージョン公開翌日に早速更新してみました。

最新バージョンの動作要件として、Go言語の版数が1.8.3以上であることからGo言語の更新も行ったのですが、そこで更新が不適切であったためVulsの更新に失敗しました。具体的には下記のブログで書かれているとおり以前のバージョンのファイルが残ったまま最新のGo言語をインストールし、ビルドの段階でファイルのパーミッションによるエラーが発生しました。

下記ブログに書かれている通り最新のGo言語を導入したところ問題無くVulsの更新ができました。

go get で permission denied が発生する - kawaken's blog

導入の詳細については、上記READMEやその他の記事をご参照ください。

Vulsで主に使用するコマンドは

になります。

0.3より前ののVulsではprepareサブコマンドで接続の試験と被検査ホストのセットアップを行っていましたが、最近の版数のものではconfigtestサブコマンドの実行でチェックのみを行います。(セキュリティ上の理由などからVuls実行ユーザに環境設定権限を持たせないため)

Linuxコンテナも検査できる!

今回のブログのタイトルは 「Linuxコンテナお気軽管理」 です。

VulsはDockerとLXDのLinuxコンテナの検査をすることができます。READMEにも書かれてますが、vulsの検査対象設定ファイルであるconfig.tomlに

[default]
port = "22"
user = "vuls"

[servers]

[servers.localhost]
host = "127.0.0.1"
keyPath = "/home/vuls/ssh_keys/id_key"

[servers.blog-contsv]
host = "10.211.55.114"
keyPath = "/home/vuls/ssh_keys/id_key"

[servers.blog-contsv.containers]
type = "lxd"
includes = ["${running}"]

のように対象のホストとコンテナの内容を追記することで動作中のコンテナを検査します。

上記の例では、blog-contsvはLXDコンテナが動作する対象のホストを指します。またIPアドレスは今回のブログ掲載用に作成したホストのものです。

コンテナの情報を個別に設定する必要が無いので、コンテナが増減する環境でも楽に運用出来るのでは無いでしょうか。

注意点としてはvulsを実行するアカウントがlxd関係のコマンドが実行できる必要があります。私がvulsを動作させた環境ではVuls動作専用にvulsアカウントを作成しました。vulsアカウントを被検査ホストにも作成しssh認証鍵を登録して検査を行っています。

Ubuntu 16.04ではlxd関係のコマンドを実行するためにはアカウントがlxdグループに登録されている必要があります。

/etc/group の一部

lxd:x:110:ubuntu,vuls

またvisudoなどを使用して、vulsアカウントがsudo を使用してlxdのコマンドを実行できる様にしておく必要があります。

/etc/sudoer の一部

vuls ALL=(ALL) NOPASSWD: /usr/bin/apt-get update , /usr/bin/lxc

多様な形式のレポート出力

Vulsではレポートの出力形式として one-line-textshort-textfull-text が選べます。
さらに、Vulsのreportサブコマンドには差分出力の機能があります。検査と差分レポートを定期的に実施することで新たに対応が必要な脆弱性情報を得やすくなります。

one-line-text

One Line Summary
================
cont01@blog-contsv              Total: 49 (High:14 Medium:24 Low:11 ?:0)    4 updatable packages
cont02@blog-contsv              Total: 49 (High:14 Medium:24 Low:11 ?:0)    4 updatable packages
[Reboot Required] blog-contsv   Total: 147 (High:57 Medium:59 Low:31 ?:0)   0 updatable packages
[Reboot Required] localhost Total: 139 (High:32 Medium:86 Low:21 ?:0)   3 updatable packages

short-text

cont01@blog-contsv (ubuntu16.04) on blog-contsv
=========================================
Total: 49 (High:14 Medium:24 Low:11 ?:0)    4 updatable packages

CVE-2017-9525       10.0 HIGH (jvn)
                    In the cron package through 3.0pl1-128 on Debian, and through 3.0pl1-128ubuntu2
                    on Ubuntu, the postinst maintainer script allows for group-crontab-to-root
                    privilege escalation via symlink attacks against unsafe usage of the chown and
                    chmod programs.
                    ---
                    https://nvd.nist.gov/vuln/detail/CVE-2017-9525
                    http://people.ubuntu.com/~ubuntu-security/cve/CVE-2017-9525 (Ubuntu-CVE)
                    6.9/AV:L/AC:M/Au:N/C:C/I:C/A:C (nvd)
                    10.0/AV:N/AC:L/Au:N/C:C/I:C/A:C (jvn)
                    https://nvd.nist.gov/vuln-metrics/cvss/v2-calculator?name=CVE-2017-9525
                    Confidence: 100 / OvalMatch

CVE-2012-2663       7.5 HIGH (nvd)
                    extensions/libxt_tcp.c in iptables through 1.4.21 does not match TCP SYN+FIN
                    packets in --syn rules, which might allow remote attackers to bypass intended
・
・
・

full-text

cont01@blog-contsv (ubuntu16.04) on blog-contsv
=========================================
Total: 49 (High:14 Medium:24 Low:11 ?:0)    4 updatable packages

CVE-2017-9525
----------------
Max Score           10.0 HIGH (jvn)
nvd                 6.9/AV:L/AC:M/Au:N/C:C/I:C/A:C
jvn                 10.0/AV:N/AC:L/Au:N/C:C/I:C/A:C
CVSSv2 Calc         https://nvd.nist.gov/vuln-metrics/cvss/v2-calculator?name=CVE-2017-9525
Summary             In the cron package through 3.0pl1-128 on Debian, and through 3.0pl1-128ubuntu2
                    on Ubuntu, the postinst maintainer script allows for group-crontab-to-root
                    privilege escalation via symlink attacks against unsafe usage of the chown and
                    chmod programs.
Source              https://nvd.nist.gov/vuln/detail/CVE-2017-9525
Ubuntu-CVE          http://people.ubuntu.com/~ubuntu-security/cve/CVE-2017-9525
CWE-59 (nvd)        https://cwe.mitre.org/data/definitions/59.html
Package/CPE         cron-3.0pl1-128ubuntu2 -> Not Fixed Yet
Confidence          100 / OvalMatch


CVE-2012-2663
----------------
Max Score           7.5 HIGH (nvd)
nvd                 7.5/AV:N/AC:L/Au:N/C:P/I:P/A:P
・
・
・

one-line-text形式でCVSS(共通脆弱性評価システム)の深刻度が7以上の物のみ

vuls@vulssv:~$ vuls report -format-one-line-text -cvss-over=7
[Aug 29 11:50:16]  INFO [localhost] Validating config...
[Aug 29 11:50:16]  INFO [localhost] cve-dictionary: /home/vuls/cve.sqlite3
[Aug 29 11:50:16]  INFO [localhost] Loaded: /home/vuls/results/2017-08-29T09:51:30+09:00


One Line Summary
================
cont01@conthost             Total: 14 (High:14 Medium:0 Low:0 ?:0)  4 updatable packages
cont02@conthost             Total: 14 (High:14 Medium:0 Low:0 ?:0)  4 updatable packages
[Reboot Required] conthost  Total: 57 (High:57 Medium:0 Low:0 ?:0)  0 updatable packages
[Reboot Required] localhost Total: 32 (High:32 Medium:0 Low:0 ?:0)  3 updatable packages

さらに前回検査時との差分を表示

vuls@vulssv:~$ vuls report -format-one-line-text -cvss-over=7 -diff
[Aug 29 11:50:19]  INFO [localhost] Validating config...
[Aug 29 11:50:19]  INFO [localhost] cve-dictionary: /home/vuls/cve.sqlite3
[Aug 29 11:50:19]  INFO [localhost] Loaded: /home/vuls/results/2017-08-29T09:51:30+09:00
[Aug 29 11:50:19]  INFO [localhost] Privious json found: /home/vuls/results/2017-08-29T09:05:30+09:00/conthost.json
[Aug 29 11:50:19]  INFO [localhost] Privious json found: /home/vuls/results/2017-08-29T09:05:30+09:00/conthost.json
[Aug 29 11:50:19]  INFO [localhost] Privious json found: /home/vuls/results/2017-08-29T09:05:30+09:00/conthost.json
[Aug 29 11:50:19]  INFO [localhost] Privious json found: /home/vuls/results/2017-08-29T09:05:30+09:00/localhost.json


One Line Summary
================
cont01@conthost             Total: 14 (High:14 Medium:0 Low:0 ?:0)  0 updatable packages
cont02@conthost             Total: 14 (High:14 Medium:0 Low:0 ?:0)  0 updatable packages
[Reboot Required] conthost  Total: 57 (High:57 Medium:0 Low:0 ?:0)  0 updatable packages
[Reboot Required] localhost Total: 32 (High:32 Medium:0 Low:0 ?:0)  0 updatable packages

Terminal-Based User Interface

TUI


(クリックで大きな画像を表示)

Vulsではその他にも、電子メールやSlackを使ったレポートの確認方法も用意されています。
今回は お気軽〜 がテーマですので記事にはしませんが、他にもVulsRepoというVulsが出力したjsonファイルを見やすく表示するWeb UIもOSS公開されています。

Vulsの検査は脆弱性データベース情報との比較なので、必要性や重要度に関係無くレポートが作成されます。このため検出を認識しているものの対応を行っていない脆弱性情報は常に報告が上がることになります。結果として検査を定期的に実行するとどんどん大量のレポートが届き、新たに検出された脆弱性情報を知ることが難しくなってきます。

レポートは詳しい情報を得たい場合もありますが、冗長なメッセージにより他の重要な情報を見落とす可能性もあります。適したタイミングに適した手段を用いて脆弱性情報を取得し対策の第一歩としたいですね。

まとめ

前回今回と特にLXDによるLinuxコンテナの管理を簡単に行う話を書きました。

コンテナが一般的に使われるようになり管理対象のサーバは従来よりはるかに増えているものと思われます。コンテナ一つ一つにエージェントの導入や設定の追加などを行うのはとても骨の折れる内容で、継続的な管理運用が難しくなると想像します。

コンテナの稼働状況や脆弱性検査について、コンテナ内部に触れなくてもここまでできます。安定稼働のための対策活動のきっかけになれば嬉しいです。

ファーエンドテクノロジーからのお知らせ(2017/11/01更新)
第7回モバイル活用展(11/8〜10開催) でRedmineについてのご相談にお応えします
11/8〜10 Japan IT Week(幕張メッセ) アジャイルウェアブースにぜひお越しください
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け