
|
[バックナンバーのトップへ] [Linux システム管理のトップへ] いますぐ実践! Linux システム管理 / Vol.109 / 読者数:1095名こんばんは、うすだです。 このメルマガは、たいてい、日曜と月曜の間の深夜に書いています。 事前に仕上げておけばよいのでしょうが、そんな計画性がわたくしにあるはずもなく、 深夜になってせっぱつまってから、油成分を多く含んだ汗をまき散らしつつ、 せっせと書いております。 しかし、毎週毎週、綱渡り的になんとか発行していることに、 われながらびっくりします。(たまーにお休みすることもありますけどね。) 過去に、よっぱらって気持ち悪くなり、今日はもう無理、 絶対書けない…と諦めかけたこともありました。
でも、ぎりぎりのところで、「ぎりぎりの神様」が助けてくれます。 よくはわからないのですが、「ぎりぎりの神様」という名称を思いついたときから、 自分には「ぎりぎりの神様」が見守ってくださっているのだ、 と思うようにしています。すると、最後まで諦めちゃいけない、 と自然に考えるようになることが多いのです。不思議ですね。 というわけで、今週も「ぎりぎりの神様」に助けられながら、 はりきってまいりたいと思います。 今週のお題 - コマンドをラップして使うどんなに気をつけていてもバグをなくすことができないように、 どれほど気をつけていても、セキュリティホールをなくすことはできません。
一般的に普及しているツールやコマンド類であれば、
早急にパッチが提供されるかもしれません。
しかし、開発が止まっていたり、独自に作成したツールなどの場合、
パッチの提供すらままならない可能性があります。 とはいえ、ユーザのみなさんが普段使っていたり、 なんらかのサービスがそのコマンドを利用していますと、 使用禁止にするわけにもいきません。
そんなときによく使われるのが、
ラッパーと呼ばれるプログラムを用いる方法です。 というわけで今週は、安全でないコマンドをラップして、安全に使う方法を、 ご紹介したいと思います。 まずは、引数をチェックするラッパーを、考えてみたいと思います。
以降では、wget コマンドを対象にしていますが、
wget に問題が多いとか過去に問題がよく発生していた、
というわけではありません。 で、ここでは、wget コマンド実行するために以下を満たす必要がある、 という制約を設けたいと思います。
どう見ても実用的ではないですが、話を単純にするため、
ご容赦いただけますと幸いです。
最初に、ホンモノの wget コマンドを、別の名前に変えてしまいます。 # mv /usr/bin/wget /usr/bin/.real_wget そして、/usr/bin/wget を、以下のシェルスクリプトにしてしまいます。 #!/bin/sh /usr/bin/.real_wget $*
こうすることで、wget を実行すると、上記のラッパーが実行されます。
ただ、これですと、ラッパーはなにもチェックしませんので、意味がありません。
#!/bin/sh
check=0
if [ $# -ne 4 ]; then
exit 1
fi
if [ "z$1" = "z-q" -a "z$2" = "z-O" ]; then
check=1
fi
if [ "z$1" = "z-O" -a "z$3" = "z-q" ]; then
check=1
fi
if [ $check -eq 1 -a ${#4} -lt 1024 -a "z`echo $4|grep \?`" = z ]
then
exec /usr/bin/.real_wget $*
else
exit 2
fi
チェック1〜4 を満たすためには、引数が4つである必要があります。 念のため、実際に実行してみましょう。 % wget -q -O - 'http://www.usupi.org/cre/dcontent?user=kuri' この場合、-q オプションも -O オプションも指定していますが、 URL に '?' があるため、実際には実行されません。 …回りくどい例で申し訳ありませんが、上記のようにすることで、 引数をチェックするラッパーを、噛ませることができます。
先ほどは、安全に実行するためにチェックするラッパーを作りました。
たとえば、そのコマンドは普段あまり使われることがないため、
実行したことを知りたい、記録に残したい、ということがあるでしょう。 たとえば、先ほどの wget のラッパーを、以下のようにしてみましょう。 #!/bin/sh /usr/bin/logger -i -t wget -p auth.notice "options: $*" exec /usr/bin/.real_wget $* この場合、引数のチェックは行われませんが、 logger コマンドを使って syslog にログを残せるようになります。 (syslog の設定にもよりますが。) % wget -O /dev/null http://www.yahoo.co.jp/ のように実行しますと、以下のようなログが syslog に記録されます。 wget[PID]: options: -O /dev/null http://www.yahoo.co.jp/ また、ラッパーを以下のようにすると、メールで root 宛に通知することもできますね。
#!/bin/sh
echo "execute wget by $LOGNAME@$HOSTNAME with $*" | \
/usr/bin/Mail -s "[wget] notice" root
exec wget $*
やや脱線しますが、複数の OS や CPU 上で実行するときに、 ラッパーで実行するモノを切替えることもできます。
たとえば、Linux用のバイナリと、NetBSD用のバイナリがあるとします。
#!/bin/sh
case "`uname -s`" in
Linux)
exec /opt/usu/bin/foo.linux;;
NetBSD)
exec /opt/usu/bin/foo.netbsd;;
*)
echo Unknown OS...
esac
実行したマシンが Linux なら /opt/usu/bin/foo.linux を、 NetBSD なら /opt/usu/bin/foo.netbsd を実行します。 こうすることで、OS が違っても、同じ名前のコマンドを実行することができます。 以上、コマンドをラップする方法について、いくつかご紹介しました。 ラッパーは便利ですが、もしパッケージを操作する必要があるときには、 操作する前に、ラッパーを外してコマンドを元に戻すことを、 忘れないでくださいませ。 ちなみに、今回のネタは、以下の本からいただきました。
セキュアプログラミング - 失敗から学ぶ設計・実装・運用・管理
ノウハウ的な本ではなく、考え方から教えてくれる、いい本です。 宿題の答え先週の宿題は、 シェルスクリプトや Perl スクリプトに、セットユーザID を設定して 実行し、効果がないことを確かめてみましょう。 でした。 たとえば、以下のシェルスクリプトを用意します。 #!/bin/sh [ $# -ge 1 ] && touch $* 引数に指定されたファイルを touch するだけのスクリプトです。 これを、たとえば suidtest.sh という名で保存したら、 chmod コマンドでセットユーザID を設定します。 % chmod u+rwxs,go+rx suidtest.sh % ls -l suidtest.sh -rwsr-xr-x 1 usu adm 35 6月20日 01:34 suidtest.sh*
上記では、所有者が usu さんで、ちゃんと s がついていますね。 % id uid=10001(test) gid=99(nobody) 所属グループ=99(nobody),10000(test) % ./suidtest.sh /tmp/suid-test % ls -l /tmp/suid-test -rw------- 1 test nobody 0 6月20日 01:23 /tmp/suid-test
ここでは、test さんに実行してもらいました。
Perl スクリプトの場合はどうでしょうか。
#!/usr/bin/perl
while($#ARGV >= 0) {
my $fname = shift;
open(TEST, ">$fname") && close TEST;
}
先ほどのシェルスクリプトと同等ですが、touch コマンドを呼び出さず、
open してすぐ close するようにしています。 % ./suidtest2.pl /tmp/suid-test2 Insecure dependency in open while running setuid at ./suidtest2.pl \ line 4.
危ないよ、と叱られてしまいました。 というわけで、みなさんも、Ruby とか Python とかなんでも構いませんので、 いろいろ試してみてくださいまし。 今週の宿題今週の宿題は、 ホンモノのコマンドを実行されないようにする方法を考えましょう。 です。
せっかくラッパーに差し替えても、
移動させたホンモノのコマンドのほうを直接実行されてしまいますと、
元も子もありません。 あとがきわたしが、World Wide Web なるものに遭遇したのは、 入社して少し経過したころ−たしか 1994年の秋くらいだったと思います。 当時、わたくしは、アナログ専用回線で会社をインターネットに接続し、 物珍しさから、各社のホームページなどを拝見しておりました。
しかし、ひとの作ったものを見るだけでは、面白くありません。
とはいえ、そういったことを独学でやるには、今日の多忙なビジネスマンには、
なかなか難しいことではないかと思います。
…というわけで、前置きが長すぎですね、すみません。 -------------------------------------------------- レンタルサーバーでHPを持っている方へ HPでCGIを動かしてみませんか? 10日間の無料講習テキストをお送りします。 http://www.searchman.info/cgi_perl/index_rak.html -------------------------------------------------- いまどきは Ajax とか MT とか Rails とか、 抽象化された土台を使うのが流行っているようですが、 や・は・り! 基本は CGI だと思います。 サーチマン佐藤さんが、FTP によるアップロードから、 CGI を動かすまでの一連の手順を、手取り足取り…かどうかはわかりませんが、 すべて無料で教えてくださいます。
CGI くらい書けるようになりたいけど、勉強する時間や勇気がない、
などという貴兄は、これを機会に、登録してみてください。 「実践無くして、向上無し!」(by 発想源)ですので、 是非自らの手で CGI を動かしてみてくださいませ。
今週も、ここまで読んでいただき、ありがとうございました。
「いますぐ実践! Linux システム管理」の解除は、以下からできます。
バックナンバーは、こちらにほぼ全部そろっています。
「栗日記」−栗の絵描いてるばっかりじゃなく、なんか作らなきゃー。 |
▼ トップ ▼ プロフィール ▼ リンク
▼ 作ってみました
▼ せんでん
▼ 最近読んだ本 [X]
「センネン画報」 今日 マチ子「粟津潔 デザインする言葉」 粟津潔 「Binary Hacks」 高林 哲,鵜飼 文敏,佐藤 祐介,浜地 慎一郎,首藤 一幸 「Make: Volume01」 オライリー・ジャパン 「セーラが町にやってきた」 清野 由実 「手紙屋」 喜多川 泰 「Linuxカーネル2.6解読室」 高橋 浩和,小田 逸郎,山幡 為佐久 「人蕩し術」 無能 唱元 「子育てハッピーアドバイス2」 明橋 大二, 太田 知子 「ラッセル幸福論」 B. Russell 「それでも人生にイエスと言う」 Viktor Emil Frankl 「子育てハッピーアドバイス」 明橋 大二, 太田 知子 「考具」 加藤 昌治 「北欧デザイン<3>」 渡部 千春 「北斎の謎を解く」 諏訪 春雄 「体感美術館」 平野 暁臣 「チベット永遠の書」 Theodore Illion 「リナックスの革命」 Pekka Himanen 「人月の神話」 Frederick Phillips,Jr. Brooks 「ヤバい経済学」 Steven D. Levitt, Stephen J. Dubner 「小布施ッション<2001-2002>」 セーラ・マリ カミングス 「アンパンマン伝説」 やなせ たかし 「夢をかなえるゾウ」 水野 敬也 「ゲーム開発者のためのAI入門」 David M. Bourg, Glenn Seemann 「北欧デザイン<2>」 渡部 千春 「北欧デザイン<1>」 渡部 千春 「ヒューマン2.0」 渡辺 千賀 「中国・ロシア同盟がアメリカを滅ぼす日」 北野 幸伯 「超ロング・セラー 絶滅寸前商品」 湯浅 豊彦 「The BUG(ザ・バグ)」 すずき ひろのぶ,かとう みつあき 「デザインのデザイン」 原 研哉 「マキアヴェッリ語録」 塩野 七生 「ハンバーガーを待つ3分間の値段」 斎藤 由多加 「星の旅人-スペイン「奥の細道」-」 黛 まどか 「食品の裏側」 安部 司 「On Lisp」 Paul Graham 「ぼくが医者をやめた理由 つづき」 永井 明 「あなたならどうする?」 Jack Nikolaschka 「セキュアプログラミング−失敗から学ぶ設計・実装・運用・管理」 Mark G. Graff, Kenneth R. van Wyk 「「左利き」は天才?−利き手をめぐる脳と進化の謎」 David Wolman 「自分の中に毒を持て」 岡本 太郎 「アトピーの薬を減らす本」 田中 貴子 「岡本太郎「明日の神話」修復960日間の記録」 吉村 絵美留 「X51.ORG THE ODYSSEY」 佐藤 健寿 「アレルギーっ子の暮らし応援BOOK」 佐藤 のり子 「沖縄文化論」 岡本 太郎 「「伝説の社員」になれ!」 土井 英司 「コンピュータの構成と設計(上)」 Patterson & Hennessy 「カラスのジョンソン」 明川 哲也 「ドリルを売るには穴を売れ」 佐藤 義典 「頭がよくなる照明術」 結城 未来 「クロフォードのインタラクティブデザイン論」 Chris Crawford 「いじめの根を絶ち子どもを守るガイド」 Barbara Coloroso 「非常識のすすめ―逆発想の仏教論」 ひろさちや 「Linuxアドバンストネットワーク構築ガイド - HAサーバ構築編」 デージーネット 「イノベーションの達人!」 Tom Kelly, Jonathan Littman 「クリエーター50人が語る創造の原点」 小原 啓渡 「欺術 - 史上最強のハッカーが明かす禁断の技法」 Kevin Mitnick 「楽しい気象観察図鑑」 武田 康男 「入門 Ajax」 高橋 登史朗 「リリカルな自画像」 岡本 太郎 「やぎの目ゴールデンベスト」 林 雄司 「初めてのPython 第2版」 Mark Lutz,David Ascher 「鼻兎」 小林 賢太郎 「なぜ、これがアートなの?」 Amelia Arenas 「芸術起業論」 村上 隆 「まほう色の瞳」 Enrique Barrios 「ラーメンズつくるひとデコ」 ラーメンズ 「R25 つきぬけた男たち」 R25編集部 「美の呪力」 岡本 太郎 「しろのあお」 上大岡 トメ 「ザ・ゴール」 Eliyahu M. Goldratt 「ハッカーと画家」 Paul Graham 「岡本太郎に乾杯」 岡本 敏子 「Fedore Core Expert」 Software Design 「誰も知らない男」 ブルース・バートン 「子どもが育つ魔法の言葉」 ドロシー・ロー・ノルト 「国家の罠」 佐藤 優 「夜回り先生」 水谷 修 「やぎの目絵日記」 林 雄司 「7つの習慣」 スティーブン・R. コヴィー 「まろ、ん?−大掴源氏物語」 小泉 吉宏 「ザ・サーチ グーグルが世界を変えた」 ジョン・バッテル 「ポストモダン・マーケティング」 スティーブン ブラウン 「機動戦士ガンダムさん」 大和田 秀樹 「小エロのひみつ - Webやぎの目研究発表」 林 雄司 「これ、誰がデザインしたの?」 渡部千春 「60分間・企業ダントツ化プロジェクト」 神田 昌典 「ガルシアへの手紙」 エルバート ハバード 「人生は素晴らしいものだ」 オグ・マンディーノ 「ザ・マインドマップ」 トニー・ブザン,バリー・ブザン 「ワインバーグのシステム思考法」 G.M.ワインバーグ 「渋谷ではたらく社長の告白」 藤田 晋 「渋井真帆の日経新聞読みこなし隊」 渋井 真帆 「コラム息切れ」 小野 法師丸 「早朝起業」 松山 真之介 「変な人が書いた驚くほどツイてる話」 斎藤 一人 「35歳から仕事で大切にしたいこと」 村井 勉 「金融広告を読め」 吉本 佳生 「発想する会社!」 トム・ケリー,ジョナサン・リットマン 「エハイク」 吉田 戦車 「人生の旋律」 神田 昌典 「仕事の思想」 田坂 広志 「CPUの創りかた」 渡波 郁 「非常識な成功法則」 神田 昌典 …これ以前は記録してません…
▼ 気に入ってる本
| ||||||||||||||||||||||||||||||||||||||||