fbpx

[和訳] ChefによるShellshockの検知と修正 #opschef_ja #getchef_ja

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本項は Detecting & Repairing Shellshock with Chef (2014/09/30) の和訳です。

The Bourne Shell - fifth film in the trilogy. Jason Bourne tries to patch servers against obscure bug. No fights or car chases. Avoid. - Charles Arthur (@charlesarthur) September 27, 2014

(訳注:ボーンシリーズにかけたジョーク)

嬉しくも何ともないことに、今年は致命的な遠隔から攻撃可能なセキュリティ脆弱性の年でした。まずOpenSSLHeartbleedバグがあり、先週はBash (Bourne-Again Shell)の環境変数の取り扱いに起因するShellshockバグがありました。本項では、Chefを用いているサーバ群にわたってセキュリティ脆弱性を検知と修正し、サーバ群を安全な状態にする豆知識をご紹介します。

脆弱なBashの検知

Chefのすばらしい特徴の1つに、OhaiというChef Clientの実行時にシステムの情報を集めるプログラムを持っていることが挙げられます。Ohaiは収集する情報を増やすために、簡単に利用できるプラグインシステムを用いて拡張することができます。Ohaiはデフォルトではシェルの情報は収集しないので、Bashが脆弱かどうかをすべてのノードで検知するための簡単なプラグインを作成しました。

bash.rb


#
# Author:: Julian C. Dunn ()
# Copyright:: Copyright (c) 2014, Chef Software, Inc.
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

Ohai.plugin(:Bash) do
provides 'languages/bash'
depends 'languages'

def bash_version
cmd = 'bash --version'
shell_out(cmd).stdout.lines.first.strip
end

def bash_vulnerable?
cmd = < /dev/null 2>&1
ENDCMD
shell_out(cmd).status == 0
end

collect_data do
languages[:bash] = Mash.new
languages[:bash][:version] = bash_version
languages[:bash][:shellshock_vulnerable] = bash_vulnerable?
end
end

このプラグインを使うには、新しいCookbookを作成します。ここではremediate-shellshockと呼ぶことにしましょう。そして、追加プラグインを組み込むために、Ohai コミュニティCookbook内で独自プラグイン機能を利用します。

attributes-default.rb


default['ohai']['plugins']['remediate-shellshock'] = 'plugins'

recipes-default.rb


include_recipe 'ohai'

bash.rbプラグインファイルを新しいCookbookのfiles/default/pluginsに置くことを忘れないでください。

おわかりだと思いますが、同様にすればHeartbleedに脆弱なOpenSSLのバージョンを検知して報告する同じようなプラグインを作ることができます。なお、このコードには他にも改良できそうな箇所が多数あります。例えば、/bin/shがBashかどうかを確認し、脆弱であるかどうかのフラグを設定するようにこのプラグインを拡張できそうです。

Ohaiのすべてのデータは動作の最後にChef Serverに送られるので、インフラ全体にわたってShellshockに脆弱なマシンを報告するのは容易です。knife searchを使ってみましょう。

knife search node 'bash_shellshock_vulnerable:true'

脆弱なBashの修正

脆弱なBashを検知したら、Bashパッケージを最新バージョンに更新するためのRecipeコードを書くだけです。例えば、次のようにすれば十分です。


package 'bash' do
action :upgrade
end

または、前述のOhaiプラグインの結果を組み合わせて、脆弱なバージョンが見つかった場合のみアップデートするのもよいでしょう。


package 'bash' do
action :upgrade
only_if { node['languages']['bash']['shellshock_vulnerable'] }
end

私達は、このような「パッチ管理」についてChefはよい選択肢なのかどうかというたくさんの質問を受けています。しばしば、顧客が意味する「パッチ管理」とは、サーバ群に対してパッチを適用するように、ある日時にパッチ適用をスケジューリングできるシステムのことです。この例やBrian Flad作のauto-patch cookbook の通りにChefを使うことで可能ですし、Red Hat SatelliteWindows Server Update Services (WSUS)のような外部システムはこの分野においてより高機能です。Chefをそれらと組み合わせることは簡単です。

Bashが脆弱ならChefの動作を停止する

コミュニティの一員であるJeff Blaine氏は、Bashが脆弱な場合にChefの動作をただちに停止するRecipeという別の手法を提案しています。それを実現するために彼は、私が作成したOhaiプラグインとまったく同じテストを実施するbash-cve-2014-7169というCookbookを書いています。このCookbookを用いてChefが停止すると、該当するマシンからアラートを受け取って、前述の修正措置を取るというやり方です。

まとめ

不幸にも0-dayの致命的なセキュリティ脆弱性は避けがたい現実ですが、Chefはインフラ全体にわたってとても迅速にセキュリティ脆弱性を検知し、修復し、監査する仕組みを提供しています。私達は、万単位のサーバに対するHeartbleed脆弱性を数時間のうちに修正できたというすばらしい逸話をいくつもの顧客から聞いています。当たり前のように早い応答時間は顧客への危険性を低減することを意味し、これは早さが重要だという真実を表しているでしょう。

新規CTA