Empowered by expect

希望は体力

IaaS Casual Talks #1におじゃましました

iaas-casual.connpass.com

Casual Talksだけどカシュっと聞こえなくてちょっと緊張。
全員発表形式で、それ自体はためになってとても良かったんですが
時間が大幅超過したのが平日夜はツライかもでした。
(かといって次回を沖縄(Janog流れ)という案もツライのですが)


お話はオフレコ気味なものも多かったのでぼやかしてざっと感想
・ESXiでサービス基盤を構築している事業者さんが結構多い
・おぷすたのコードに手をいれるかどうかの戦い/世界線
・IaaS人材 ~= フルスタックエンジニア ~= いない


私は咳き込みながら発表でもコメントでも
ツールをいろいろ紹介していたので、挙げたツールを以下整理

NW作業の自動化

rancid

このジャンルでは超古参ツール。expectベース
www.shrubbery.net

OpenNetAdmin

メインはIPAM機能ですが、NW機器のconf diffとかも可能。開発停滞?
opennetadmin.com

サーバーのConfig as Code

holo-cm

chefがツラい人向けの機能的にはdeployerに近いツール
Holo - Minimalistic Configuration Management
holo-buildも併せて使うとシンプル,簡単,気持ちいい
github.com

複数マシン/クラスタをまたぐ運用自動化

StackStorm(略称st2)

この翌日にBrocadeによる買収が発表されましたが..
StackStormについてはどこかで個別にLTしようと思います
Webで言うiftttの運用版、を名乗っています。
stackstorm.com

Badlock関連の情報雑メモ

かねてより予告のあったSMB関連の脆弱性、Badlockの情報が公開されました。
ひとまず見て回った情報を雑メモしておきます。
Badlock Bug
CVSSスコアはBase7.1です。
(追記: CERTはBase 7.9でした http://www.kb.cert.org/vuls/id/813296)


それぞれ、SambaパッケージのアップデートやWindows update
NASストレージのファームウェア更新など環境に応じた対応を行いましょう。

Samba3.Xとかはそもそもちょっと古い環境への互換性を持つ面もあるので
トレードオフかもしれませんが、平文や弱い認証形式をやめていくべきという
このところTLS周りで起きている事と似ている感じもあります。
Samba周りはネット上の情報も古いままのものが多いので、
ssl.confみたいにsmb.confの模範情報が欲しいですね。

影響のあるSambaバージョン

3.6.x,
4.0.x,
4.1.x,
4.2.0-4.2.9,
4.3.0-4.3.6,
4.4.0

3.6より古いバージョンは未確認とのことです(Earlier versions have not been assessed)。
RHEL5系は3.0.Xで未確認....
RHEL6系は当初3.5だったようですが最新では3.6系や4系なので対象確定となります。
Ubuntuは14.04LTSでも4.1系ですね。

(追記: RHEL5もバックポート提供されました
3.0.33 https://rhn.redhat.com/errata/RHSA-2016-0621.html
3.6.23 https://rhn.redhat.com/errata/RHSA-2016-0613.html
さらに追記同じく3.0.33でRHEL4 延長サポート向けも提供されました
https://rhn.redhat.com/errata/RHSA-2016-0625.html
またGlusterFSもアップデートが出ています)

被る攻撃内容

1. MITM
2. リモートからのDoS

ワークアラウンド

1.のMITM向け対策

以下に相当する設定を適用することが挙げられています。

smb signing = required
ntlm auth = no

副作用は、signingはその分負荷が上がります。
(Windows 2008 R2では最大15%程度負荷上昇との記述があります。 
https://technet.microsoft.com/ja-jp/library/cc731957.aspx)
NTLMの無効化はNTLMv1クライアントに影響します、がv1はそもそも今時ダメではないかと
(https://support.microsoft.com/ja-jp/kb/2793313)

2.のDoS向け対策

Firewallなどでアクセスをきちんと制御することが挙げられています。

(追記 適用時の影響)

RedHatのサイトのFAQによればアップデート適用時にサービスリスタートも行われるとのことです。
( I have updated my Samba servers and clients, do I need to restart anything?
->No, when the update is applied on your system, the smb service will be restarted automatically.)

$ rpm -qp --scripts samba4-4.2.10-6.el6_7.x86_64.rpm
postinstall scriptlet (using /bin/sh):
/sbin/chkconfig --add smb
/sbin/chkconfig --add nmb
if [ "$1" -ge "1" ]; then
/sbin/service smb condrestart >/dev/null 2>&1 || :
/sbin/service nmb condrestart >/dev/null 2>&1 || :
fi
exit 0 (preuninstallは略)

補記

今回リリースされたSamba4.4.2,4.3.8,4.2.11はデフォルト値の変更なども含まれるので
一気にバージョンアップする場合はBadlock関連以外の機能でも挙動変化もあり得そうです。
https://www.samba.org/samba/latest_news.html#4.4.2

また、2016/3/22にSamba4.4.0がリリースされたのに伴い
4.1.X系はサポート対象外となりましたので今回もアップデートは提供されません。

(追記 今回の対象CVE)

CVE-2016-2118
CVE-2016-0128 / MS16-047
CVE-2015-5370
CVE-2016-2110
CVE-2016-2111
CVE-2016-2112
CVE-2016-2113
CVE-2016-2114
CVE-2016-2115

ちなみに間に挟まれている
CVE-2016-2116 はJasPer(jpeg)
CVE-2016-2117 はkernel
で別物でした。何か関連事項が隠されている、とかではありませんでした。

ふと思い出した20年前

私がITというか計算機管理に関わるようになったきっかけは20年前。
当時計算機を苦手としていた私は、大学の講義課題をやる中であるトラブルを起こす。
計算機のことを分かってなさ過ぎた故にありえない操作を行ってしまい、
ローカル権限昇格のバグ?セキュリティホール?を突いてしまったのである。

当時の状況
私「え!課題で作ったファイルが全部消えた~!」
実際には権限昇格したため/roor/に移動していたのである。
真に、引用のpwdやwhoamiという知識があれば活かされたであろうシーンである。

嘆いてたところ、計算機管理を担っていた先輩が見てくれて、状況把握した上で
先輩「君面白いね。計算機管理やってみない?」
と誘いつつ、直してくれた。(今思えばexitしただけかも)

数年後にこの先輩から聞いたのだが、
先輩「今の君なら分かるかもしれないけど、あれローカルの権限昇格してたんだよ。
   そんな危ないことする奴、放置してられないから『教えてやるよ』って言って
   飼い慣らした方が安心できるだろ」
という事だったらしい。

先輩たちからは様々な知識や技を頂いて、おかげでいまもいっぱしのエンジニアとしてやっていけてる。
だが、そもそも計算機の世界に引き込まれたことが良かったのかどうかは答えに自信が無い。

expectのおさらい

この投稿はNetOpsCoding Advent Calendar 2015 - Qiita19日目分です。

(なお、特に新しい知見は含んでいない10年前の内容であるかもしれません。)

 

昨日はcodeoutさんの netconf / restconf 時代にもxlogin 使いまくってる話 - LGTM

という素晴らしい記事でした。

xloginを提供するrancidは2.3.1が2004年、2.3.8p4が2013年にリリースされるなど枯れて安定しているものの、3.0が2014年にリリースされるなど今も開発・改善が継続されている素敵ツールです。

expectがカバーできること

ネットワーク機器の作業を自動化/コード化/CI&CD化するにはいくつか段階があります。

f:id:w4yh:20151219204940j:plain

expectは最初の段階にあたる、手作業と同じ内容をマクロ的に実行することに特化した、スクリプト言語tclの拡張実装です。

 

expectの良いところ

 

サーバーとネットワークの技術者が別れている場合、例えばInfrastracture as Codeなどの潮流にさらされているサーバー技術者と、プログラムは書いたこと無いというネットワーク技術者の間に暗くて深い川が流れている場合もあります。

しかし作業の自動化コード化の恩恵はネットワーク技術者にもあるはずです。

以下にネットワーク技術者がexpectに触れるメリット/甘言を挙げてみます。

 

  • 使い始めるまでの学習コストがきわめて小さい

expectスクリプトの例を見てみましょう。

#!/usr/bin/expect
set timeout 60 spawn telnet rauter.example.com expect "Password:" send "ExpectExample101\n" expect ">"
send "exit\n"

コマンドプロンプトの応答をexpect、入力するコマンドをsendで送る、という大まかな流れなので分かりやすいかと思います。

また、expectは古くからある枯れた実装なので、参考書籍も1994年刊のオライリー本がほぼ唯一なので迷うこともありません。

shop.oreilly.com

JavaScriptのような変化の激しい処理系に比べると、多少腰を据えて学習しても陳腐化することは無いというのは作業を楽にしたいだけのエンジニアにとってはメリットになるでしょう。

 

それでもプログラムやDSLを書くのはイヤだ、という方にはautoexpectというツールがあります。

こちらはLinuxであればexpectパッケージに含まれる便利コマンドで、MS OfficeTeraterm、RLoginのマクロ記録 - マクロ実行と同じような感覚で、コマンドラインの作業をexpectスクリプトに記録して再実行可能にするものです。

$ autoexpect

~~作業を行う~~

$exit

作業内容をexpectスクリプトにしたscript.expというファイルが生成されます。

もう一度同じ作業を行う場合は、./script.expと生成されたファイルを実行するだけでOKです。簡単ですね!

 

  • ネットワーク機器作業に特化したラッパーrancidの存在

詳細は先述した昨日のcodeoutさんのエントリの通りですが、rancidは主要ベンダー製品への自動ログイン機構を備えており、configのバージョン管理や定期取得、差分検知などの基本的かつ広く共通したニーズが満たされるます。

まだこれらが実現できていないという環境には、とっかかりとして良いのではないでしょうか。

 

  • tclはネットワーク機器ファームでもサポートされていたりする

私もNetworkers 2006のIOSセッションで知ったのですが(もう9年前。NMS-301のセッションで、Kronもこの時に知りました)、例えばCisco社のファームウェアにはtcl/tclshが実装されていて、ルータ上でtclスクリプトを動かすことができます。

ルータの一機能だと思えば抵抗感も少なくなるのではないでしょうか。

 

一方、expectの注意すべきところ

記録&再生マクロのように気軽に使える分、極めて狭いスコープを対象とした特定の作業のみを行う、似て非なるスクリプトが量産されてしまう事態に陥りやすいです。

これを避けつつスケールさせていくためには、ある程度スクリプト作成に慣れたところで

 共通部分のテンプレート化と変数の抜き出し

 直接expectスクリプトを作るのではなく置換などでexpectスクリプトを生成するようなメタスクリプトの作成

といったことを視野に入れる必要があります。

テンプレート化とメタスクリプティング、面倒だなー、誰か作ってないかなー、記述にDSL使えそうだなー、AnsibleとかFabricとか使えそうだなー、あれexpect要らなくね?

....おや、こんなところに大勢の足跡が

 

明日はバラ色の主日、早いですねえ。 

 

 

参考リンク:

expect本家サイト http://expect.sourceforge.net/

rancid http://www.shrubbery.net/rancid/

OpenNetAdmin (rancid同様の管理&自動化機能を持つツール。2013年以降開発停滞気味?) http://opennetadmin.com/

Cisco Tclスクリプティング

(IOS) http://www.cisco.com/cisco/web/support/JP/docs/CIAN/IOS/IOS15_1M_T/CG/009/nm_script_tcl.html?bid=0900e4b18252971b

(IOS-XE) http://www.cisco.com/cisco/web/support/JP/docs/SEC/IdentityMGMT/SecureAccessCntrlServer4W/IG/002/nm_script_tcl_xe.html?bid=0900e4b1825ae544

(NX-OS) http://www.cisco.com/cisco/web/support/JP/docs/SW/DCSWT/Nex7000SWT/CG/026/b_Cisco_Nexus_7000_Series_NX-OS_Fundamentals_Configuration_Guide_Release_6.x_chapter_01001.html?bid=0900e4b182adf3e5