いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.125 / 読者数:1208名

こんばんは、うすだです。

前回の最後に、月2回発行を宣言してから、初めての発行になります。
やはり、2週間の猶予があると、余裕があっていいですね。

…なんて思っていましたら、前週末に、また風邪を引いてしまいました。
月2回にしますと言っておいて、正解でした。(^ε^;
相変わらず、ギリギリでラッキーだということを、痛感しております。
(気が緩んで風邪を引いたのでは、とも考えられますが…。)

それはさておき、やはり、ネタを考えるのも、構成などを考えて動作確認を行うのも、 時間に余裕のある方が、なにかとうまくいくようです。
(あ、よく考えなくても、ものすごく当り前のことですね…。)

そのかいがあったのでしょうか、今回、自分では面白いと思えるネタを、 思いつくことができました。
(本来、思いつくものではないはずですが…ご容赦ください。)

まあ、こんな調子で、月2回発行を続けていきたいと思います。
これからも楽しくがんばっていきますので、よろしくお願いします。

…特にオチはありませんので、今週も、はりきってまいりましょう!

今週のお題 - chroot してデーモンを動かす

近年の仮想化技術の発展にともない、1台のマシン上で複数の OS を立ち上げ、 それぞれの仮想マシン上で別のサービスを動作させる、なんていうことが、 ごく普通にできるようになりました。

これにより、セキュリティの強化と管理のしやすさが両立できるように… なったかと言いますと、論理的には PC の数が増えていることになりますので、 一概にそうとは言えないように思います。
(バックアップや障害時の対応のしやすさなど、メリットがたくさんあるということは、 理解しているつもりです。)

もう少し、管理の手間を省きつつ、セキュリティを強化したいなあということで、 今週は、chroot を使って、 隔離された環境下でデーモンを動作させてみたいと思います。


その前にまず、chroot とはなんぞや? というところから始めたいと思います。
(ご存じのかたは、すっとばすか、アラを探してください。)

chroot とは、カレントプロセスのルートディレクトリを、 / 以外に設定してくれる機能です。

指定したディレクトリがルートディレクトリになりますので、 それより上のディレクトリを参照できなくなります。
ということは、/etc などにある大事なファイルに、 たとえ root の権限があっても参照できなくなります。
ということは、chroot してからデーモンを起動すると、 そのデーモンにセキュリティホールがあって侵入されても、 大事なファイルを参照したり改竄したりできない、ということになります。

先ほど、さらっと「機能です」とか言いましたが、実際には、 chroot を実行する同名のコマンドと、やはり同名のシステムコールがあります。

コマンドの方が例を示しやすいので、以降では、chroot コマンドを使用して、 いろいろ試してみたいと思います。


まずは、chroot を体験してみましょう。

ここでは、/bin/sh を chroot で動かしてみたいと思います。
ルートディレクトリに指定するディレクトリは、/tmp/chroot-sh とでもしておきます。 /tmp/chroot-sh の下に、必要最低限なものを揃えます。

  # cd /tmp
  # mkdir chroot-sh

なにはともあれ必要なのは、/bin/sh そのものです。
以下のように、/bin/sh をコピーしましょう。

  # mkdir chroot-sh/bin
  # cp -p /bin/sh chroot-sh/bin/

また、/bin/sh はたいていダイナミックリンクされていますので、 必要なライブラリを、ldd コマンドで確認します。

  # ldd /bin/sh
          linux-gate.so.1 =>  (0xffffe000)
          libtermcap.so.2 => /lib/libtermcap.so.2 (0xb7f6d000)
          libdl.so.2 => /lib/libdl.so.2 (0xb7f68000)
          libc.so.6 => /lib/i686/libc.so.6 (0xb7e46000)
          /lib/ld-linux.so.2 (0xb7f82000)

libtermcap.so.2, libdl.so.2, libc.so.6 および ld-linux.so.2 が必要ですので、 これらをコピーします。

  # mkdir chroot-sh/lib
  # cp -p /lib/libtermcap.so.2 /lib/libdl.so.2 /lib/i686/libc.so.6 \
  /lib/ld-linux.so.2 chroot-sh/lib

最低限のものが用意できましたので、実行してみましょう。
chroot コマンドを実行するには、root の権限が必要です。 su コマンドで権限を得たり、sudo コマンド経由で実行するなどしてください。
以下のように、第1引数にルートにしたいディレクトリを、 第2引数に実行するコマンドを指定します。

  # chroot /tmp/chroot-sh /bin/sh
  sh-2.05# 

上記のように、シェルのプロンプトが出力されれば、成功です。
ただ、/bin/sh しかありませんので、

  sh-2.05# ls
  sh: /bin/ls: No such file or directory

なにかコマンドを実行しようとしても、ないよと言われてしまいます。
ここはひとつ、シェルの組込みコマンドで我慢しておきましょう。

  sh-2.05# echo *
  bin lib
  sh-2.05# echo lib/*
  lib/ld-linux.so.2 lib/libc.so.6 lib/libdl.so.2 lib/libtermcap.so.2

もういいと思われたら、exit してください。もとのシェルに戻ります。

  sh-2.05# exit
  exit
  #

ちなみに、必要なライブラリがないと、以下のように文句を言われ、 実行できません。

  # mv chroot-sh/lib/libc.so.6 chroot-sh/lib/libc.so.6-
  # chroot /tmp/chroot-sh /bin/sh
  /bin/sh: error while loading shared libraries: libc.so.6: cannot \
  open shared object file: No such file or directory

chroot してなにかを動かす方法が、それとなくわかりました。
それではいよいよ、なにかデーモンさんを動かしてみましょう。

とはいえ、たとえば Apache なんかですと、 必要なライブラリやファイルなどが大量にありますので、 簡単にご紹介することができません。

いろいろ探した結果、dhcpd が簡単に実現できますので、 異論のある貴兄もいらっしゃるとは思いますが、 dhcpd を動かしてみたいと思います。
(dhcpd は root の権限で動作しますので、chroot して動かしておけば、 万が一侵入されたとしても、なにかと安心です。よね。ね。)

まずは、先ほどと同様、dhcpd を動作させるのに必要な、 実行ファイルとライブラリを一通りそろえます。
(/tmp/chroot-dhcpd を chroot 先のディレクトリにしています。)

  # cd /tmp
  # mkdir -p chroot-dhcpd/sbin chroot-dhcpd/lib
  # cp -p `which dhcpd` chroot-dhcpd/sbin
  # ldd `which dhcpd`
          linux-gate.so.1 =>  (0xffffe000)
          libc.so.6 => /lib/i686/libc.so.6 (0xb7e62000)
          /lib/ld-linux.so.2 (0xb7f95000)
  # cp -p /lib/i686/libc.so.6 /lib/ld-linux.so.2 chroot-dhcpd/lib

これだけでいいかと言いますと、実は、dhcpd を動かすには、 上記の他に以下のファイルを必要とします。

  /etc/dhcpd.conf
  /var/lib/dhcp/dhcpd.leases

ですので、これらをコピーします。

  # tar cf - -C / etc/dhcpd.conf var/lib/dhcp/dhcpd.leases | \
  tar xvfp - -C chroot-dhcpd

これで、準備が整いました。では、実行してみましょう。

  # chroot /tmp/chroot-dhcpd /sbin/dhcpd

特に文句を言われていなければ、動作しているはずです。
他の PC などからアドレスを取得してみるなど、確認してみてください。


以上、chroot を用いて、 限られた環境下でデーモンを動作させる方法をご紹介しました。

デーモンを動作させるには、必要なファイルを洗い出す必要があります。
これが結構大変だったりしますが、たとえば、 そのパッケージの一覧から推測することは可能だと思います。
あとは、地道に試行錯誤を繰り返してくださいませ。

また、動作させたいものが /proc や /sys 等を使用する場合、 そのままではうまくいきません。
どうしても使いたいなら、 chroot 先のディレクトリに procfs や sysfs を mount するしかないように思います。

それから、/etc 以下などのファイルを見せなくすることはできますが、 たとえばネットワークには制限がかかりませんので、 踏台として使われるリスクは変わりません。 chroot によって守られる箇所とそうでない箇所を把握した上で、お使いください。

さて、最後に、ここまで引っ張っておいてたいへん申し訳ありませんが、 chroot にはアナがありまして、もう一度 chroot することで、 指定したルートディレクトリより上に行けてしまうようです。
ただ、簡単にできてしまうというわけではありませんし、 将来改善される可能性もありますので、chroot を用いて保護するという考え方自体は、 個人的にはよいのではないかと思っております。

宿題の答え

先週の宿題は、

  dump/restore の代わりに、tar を使って、フルバックアップと復元を
  試みてください。

でした。

というわけで、実際にやってみました。

前回の手順のうち、dump コマンドと restore コマンドを実行するところを、 tar コマンドに差し替えて試しました。
ですので、全部の手順ではなく、差し替えた部分だけを、ご紹介します。

まず、バックアップですが、前回では、以下のように、 dump コマンドを実行していました。
(/mnt に NFS マウントしていますので、ファイルは NFS サーバ側に作成されています。以降も同様です。)

  # dump -0u -f /mnt/ubuntu.dump /

この部分を、tar コマンドの実行に置き換えます。

  # tar cfz /mnt/ubuntu.tgz bin boot cdrom dev etc home initrd* \
  lib media opt root sbin srv usr var vmlinuz

/mnt, /proc および /sys を対象から外すため、 それ以外のディレクトリをすべて指定しています。
これらはマウントポイントで、実際は単体のディレクトリですので、 後で手動で作成することにします。

そして、バックアップを復元する際に、前回では、 以下のように restore コマンドを実行していました。

  # restore -r -f /media/nfs/ubuntu.dump

これを、tar コマンドの実行に置き換えます。
(/mnt, /proc および /sys も、忘れずに作成します。)

  # tar xfz /media/nfs/ubuntu.tgz
  # mkdir mnt proc sys

その後、同様に GRUB の設定を行うことで、無事 Ubuntu が立ち上がるのかと言いますと…

…問題なく、普通に立ち上がりました。

厳密には、/var/lock, /var/run や /dev 以下など、 実際には tmpfs として使用されるところもバックアップ・復元しているため、 冗長になっていますが、tar でもそれなりになんとかなりました。

前回の手順につきましては、以下をご参照ください。

Vol.124 - 正統派なバックアップを行う / 王の帰還
http://www.usupi.org/sysad/124.html

ちなみに、 telinit 1 でシングルユーザモードに移行してバックアップを行っていますが、 recovery mode で立ち上げるという方法もアリだと思います。

今週の宿題

今週の宿題は、

  inetd/xinetd 経由で起動されるサービスも chroot できるかどうか、
  試してみましょう。

です。

原理的にはできるはずですが、既存のサービスでこれっていうものがありませんので、 簡単なサービスを作成して、それを chroot で起動できないか、 試行錯誤してみたいと思います。

あとがき

以前にも書きましたが、わたしは成功マニアです。(あるいは、でした。)

数年前までは、世間でそれなりに話題になっている成功本があると、つい購入して、 読んで、高揚して、よーしやるぞと決意して、数日で断念するかやらない、 という失敗スパイラルを繰り返しました。

ですから、まあ、さすがに、もう、ここのところは、話題の成功本を見ても、 心ときめくことなく、購入することもなく、スルーしておりました。

しかし、以下の本が話題になったとき、またしても、 わたしの中の何かが反応してしまい、ブックオフで見つけた瞬間に購入していました。

夢をかなえるゾウ
http://www.amazon.co.jp/exec/obidos/ASIN/4870318059/usupiorg06-22

評判の内容はさまざまですが、主に、 「笑える」「今までの成功本を網羅している」「理想の成功本」 という声が多いように思われます。
(成功本、のところは、自己啓発とか成功法則に置き換えてください。)

実際読んでみますと、まず「笑える」という時点で、 今までの成功本とは違うと言っても過言ではないと思います。面白いです。

しかし、注目すべき点は、各章にある「今日の課題」だと思います。
普通の成功本ですと、 「目標を紙に書くとかなう」とか「寄付をしよう」などと書かれているのですが、 「今日の課題」はもっと具体的です。
「コンビニでお釣りを募金する」とか「その日がんばれた自分をホメる」など、 やろうと思えばすぐできそうなことが、書かれています。

というわけで、一気に読んでしまうのがもったいないので、 1日に1章ずつ読んでいます。
肝心の課題は…えーと、簡単なはずなのに、ときどきしか実行していないですね。 またしても、成功から遠ざかっているようです…。

ロウソクの火がまだ小さくなっていない方は、是非読んでみてください。

あ、著者のサイトも面白いです。
日によっては、上品でないこともありますが、おおお鋭い! と思うことがよくあります。普通の道を歩んでいないひとは、なにかが違いますね。

ウケる日記
http://www.mizunokeiya.com/

 

今週も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 12月2日 頃に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−ここにきて、いろんなことが進み始めています。ふふふ。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本