Hack the World!

プログラミングや,ネットワークに関する話題を取り扱っています.知識をつけて,優雅にお仕事するのを目指しています.

閉鎖環境でも 超簡単に Bash を一括アップデートする。 #shellshock #ansiblejp thanks ansible

弊社は観測範囲では外部ユーザーがコマンド実行できる様なサービスではないので(一体何をしているのかはかなり謎ですが)、どうやらCGIとかを使ってない様なので問題はなかったようです。

が、一応念のためシナリオは作って準備しておいたので、このまま眠らせておくのはかわいそうなので公開しようと思います。

 

閉鎖環境でない&RedHat系なら、こちらの記事が参考になるかと思います。

Ansible で、複数サーバの RPM を一括で更新する - Shin x blog

Patch Shellshock)with Ansible - Raymii.org

 

Ansibleを知らない人の為に

 

Ansible は、最近話題のDeploymentツールです。

teraterm マクロの発展形みたいなもので、構成情報(操作するホスト)、とシナリオ(playbook、操作する内容)を書くだけの、シンプルな設定だけで使える様になるので、非常にお勧めです。

大きいところだと、Evernote さんなんかが使っている事例が公開されています。

 


Ansible is Simple IT Automation

 

今回のBashアップデートツール を使う前提条件

■OS 

Ansible実行ホスト:Linux

Ansibleターゲットホスト:LinuxRedhat系、Debian系)

 

python(ターゲットホスト)

python2.5以上が入っている事が前提条件となっており、

python2.4の入っているOS(RHEL、CentOS5系)では、ついでにsimple-jsonパッケージが必要です。(なので、python2.4しか入っていない場合は、手でやったほうがいいでしょう。ついでに次回以降のために、simple-jsonを入れておくといいかも。)

 

ちなみに今回のBashのアップデートは完璧ではないので、また次回も必ず利用します。

(追記)

RedHat 系は、修正が出たようなのでぜひツールを使って(検証して)インストールしてみてください。

Bug 1146319 – CVE-2014-7169 bash: code execution via specially-crafted environment (Incomplete fix for CVE-2014-6271) 

 

適当に持ってきたdebianは、pythonすら入ってなかったので失敗しました。

別途、sudo apt-get install python 等を実行すると、Ansibleが動作する様になりました。

failed: [debian] => {"failed": true, "parsed": false}
invalid output was: SUDO-SUCCESS-xwpgdtgjefwmpfzeksmjbkehwpvwlzgh
/bin/sh: /usr/bin/python: not found

 

 

Ansibleを使ったBashアップデートツールの概要

 

以下が概要図となっています。

実行ホスト側に、ansibleとそれぞれ便利なツール類のインストールが必要です。

監視サーバなどが該当するかと思われます。

(力尽きたので、インストールの説明までならず。。。)

 

 

で、bash_update.shを実行すると、各サーバのBashをアップデートしてくれます。

f:id:graceful_life:20140927230509p:plain

 

ツールの動作は以下のようになっています。

  1. 事前作業:まずはディストリビューションの確認
  2. 事前作業:/var/tmp/bash_update という作業用ディレクトリの作成
  3. 事前作業:ターゲットサーバにファイルの転送
  4. 作業  :Bashのアップデート
  5. 事後作業:エビデンス収集、rpm -q bash の実行

 

 

とりあえず心配な人たちのために、公開時の状態ではパッケージのアップデートは行わないようにしてあります。

必要なファイルを、files_to_debian/files_to_redhatというディレクトリを作成して、中にファイルを入れる&ymlファイルのpkg_filenameを正しく入力するとアップデートが行われる様になっています。

 

 

必要なパッケージファイルは以下からダウンロードしましょう。

RPM resource bash

Ubuntu – Package Search Results -- bash

 

実行イメージ

以下の様な感じで実行されます。

いきなりsudo を聞かれますが、Bashのアップデートに使われます。

ターゲット側のsudo使えるアカウントが必要になりますので、アカウントが同じ場合のみ使えます。

f:id:graceful_life:20140928012324p:plain

--stepオプションをデフォルトで付けてくれるようにしてあります。

ついでに、stepオプションの説明も出るにしてみました。

 

 

デフォルトでは、適当なファイル名が指定されているので、途中で警告メッセージが出るようにしてあります。

f:id:graceful_life:20140928012440p:plain

実行されると、ターゲット側のサーバの /var/tmp/bash_update というディレクトリにログが残るようになっています。

また、実行ホスト側の./logs/[ホスト名]/bash_update.tar.gz というファイルが収集されているので、正しく実行されたかご確認ください。

rpm -q bash 等の実行結果も含まれています。

(ちゃんとバージョン比較までやってやれればよかったのですが、日々バージョン変わるので・・・)

ファイル

今回使ったファイルは以下に用意しておきました。


bash update

最後に

Ansible非常に便利ですが、閉鎖環境内で暮らすことを余儀なくされている方は追加でパッケージインストールなどはもってのほかだ、と曰われSAN値を削られている物と思われますが、

日々負けず、めげず、努力しつつ、啓蒙していけば数年もすればやって当たり前のような世界が切り開けます。

その時のために、(見捨てて他社に転職)継続して、成果を発表しつづけましょう。

 

最近は昔よりこういうツール類を使ってあたりまえだよね、という空気が出てきた(と言うか、洗脳が完了した)ので、

ぜひ皆様方の会社でもコレを気に交渉してAnsibleを提案してみましょう。

 

 

 

Thanks Ansible!


Shellshock

 

 

あ、インストール/踏み台のことを書き忘れた。。。。

また次回

 

(追記)インストール方法を追加しました。

 

 

 

他にも試して欲しいディストリビューションとかあったら、ご連絡ください。

#shellshock のクリティカル条件まとめ

どんどん情報が出てきましたね。

Critical な条件もわかるようになってきたので、まだの皆様はアップデートを行ってください。他にも多々あるのですが、プロダクトベースのほうが理解が早そうなので、情報まとめて置きます。

(ここまで来たら全アップデートでもいいんじゃねーの、と思っていますが。)

 

 

アプリ系

  • (確認中)
  • IRC(のなにか)

ミドルウェア

  • Rails などで、Passenger を使っている。
  • qmail で 外部コマンドを実行している場合

プログラミング系

  • CGI使ってる。
  • PHP でsystem call を使っている。
  • PHP でmail,mb_send_mail を使っている。(フレームワーク系も疑う事。)

 

 

 

 

 

 

参考サイト

BashアップデートするならAnsibleで

 

 

 

ウェブアプリにおけるBash脆弱性の即死条件 #ShellShock - めもおきば

 

 

0day.jp (ゼロデイ.JP): bash 0dayマルウェア感染の「real time」リバースエンジニアリング

 

# と、言うか会社で投げるようまとめですが。 

閉鎖環境に Ansible をインストールする(した)

閉鎖環境にて就業中の皆様こんばんは。

弊社も漏れ無く(準)閉鎖環境を用意しているのですが、割と自由が残されていてそのせいでセキュリティ事故が起こったりと難しいものです。

 

それはさておき、閉鎖環境のせいで作業効率が落ちるのはいただけません。

ということで、私が某社の閉鎖環境にどうやってAnsibleを持ち込んだのかを少々残しておきたいと思います。

 

 

閉鎖環境にAnsibleを持ち込む手段は2つあります。

ひとつは正攻法、ひとつはちょっと(python的に)危うい裏道?です。

 

 

正攻法:egg, wheelパッケージを持ち込む

持ち込み先に管理者権限が必要ですね。

 

pip install --no-install ansible --download-cache . -U でansibleと依存関係周りがCurrent Directoryにダウンロードされるので、頑張って転送しましょう。

pycrypt とかビルドが必要なものだと、ビルドに必要なパッケージが入ってないと積みます更に頑張ってgcc やら何やら落とさなきゃダメですね。

 

頑張って一個一個回答して、依存関係を手で解消しつつ、sudo python setup.py install を実行していきましょう。

 

 

裏道:virtualenv環境を持ち込む(補償なし?)

こちらはなんと持ち込み先に管理者権限要りません。

まぁライブラリあろうが無かろうがクラッカーなら何が何でもコード書いて何とかできるので別に構わないですね。

一つ問題だとすると、クラッキング速度が向上してしまうことでしょうか。

 

概要イメージ図

こんな感じのイメージです。

f:id:graceful_life:20140928211916p:plain

 

手順

 以下の手順で閉鎖環境にAnsibleを持ち込みました。

  1.  持ち込み先のマシンと同じアーキテクチャ(i386,x86_64)のマシンを用意する。(仮想でもOK)
  2. virtualenv(virtualenvwrapperの方が楽)をインストールする。
  3. 仮想環境を作って、Ansibleをインストールする。
  4. 仮想環境を固めて、閉鎖環境に持ち込む(ここで挫折する人もいますが、管理者を説得して頑張りましょう。うちの管理者理解のある人で良かった。)
  5. 同じパスに展開する。(Virtualenvが内部的にパスを持っている)
  6. 仮想環境を有効化する。

 

 

2.virtualenv(virtualenvwrapperの方が楽)をインストールする。

とりあえず、pythonのパッケージ管理システム&virtualenvを入れる。

Installation — pip 1.5.6 documentation

$ wget https://bootstrap.pypa.io/get-pip.py

$ sudo -E install python get-pip.py

$ sudo -E pip install virtualenvwrapper

  HTTP_PROXY環境変数を読んでくれるので、proxy環境下にある人は設定しましょう。

 

 

3.仮想環境を作って、Ansibleをインストールする。

仮想環境はユーザー単位のものなので、ユーザー権限で実行します。

 

# sourceの行は、.bashrc に追加しておくと次回から不要です。

$ source `which virtualenvwrapper.sh`

$ mkvirtualenv ansible

$ pip install ansible

これで、/home/[実行ユーザー]/.virtualenvs/ansible のような環境が作成されます。 

global のpythonやライブラリに対してシンボリックリンクが張られるので、なるべくクリーンで依存性の無いような形にしておいたほうが良いと思います。 

 

 

4.仮想環境を固めて、閉鎖環境に持ち込む

以下のコマンドで、pythonの仮想環境をまるっと固めましょう。

$ tar cvzf ansible.tar.gz ~/.virtualenvs/ 

 

5.同じパスに展開する。

virtualenv の場合、デフォルトではhomeディレクトリに作成なのでhomeで実行ですね。

 

$ cd ~/

$ tar xvzf ansible.tar.gz 

 
6.仮想環境を有効化する。 

以下のsource コマンドを打てば仮想環境をロードできます。

$ source ~/.virtualenvs/ansible/bin/activate

 (ansible) $ 

 

 

以下のコマンドを打って正しく動くか確認しましょう

 (ansible) $ which ansible 

/home/[実行ユーザー]/.virtualenvs/ansible/bin/ansible

 (ansible) $ ansible  --version

Version 1.7.2

 

 

 コレで閉鎖環境にAnsibleの環境が出来ました。

 気づいたら一年ばかり使ってますが、特に問題は起こってないですね。(気づいてないかもしれませんが

CentOS6.4 -> RHEL6.4 でもとりあえずいけてます

 

 

この記事を書いた理由のもう1つは本当に裏道なのかどうかを知りたかったから、というのもあったりします。

 

ツッコミ大歓迎

&それ常套手段ですよね、等のコメントもお待ちしております。

 

 

 

 

 

 

 

あぁそれから第3の手順が有りました。

Virtualbox仮想マシンを頑張って転送する。(前PJの方法)

20GBを頑張って転送してた。

100MBで踏み台サーバのコネクションが切られるので大変でした。

圧縮するのも超大変

 

いやしかし何事も経験しておくものです。

なんか、packagingシステムやら依存関係とか気にしなきゃいけないものが身につきます。