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

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


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

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

先日、ひさしぶりに、某 MS 社のセミナーに侵入してきました。

…も、もちろん、正規に申し込んで、堂々と行ってきたのですが。
ただ、Linux のポーティングやドライバの開発などでゴハンを食べているためか、 侵入というイメージが頭に浮かんでしまうようです。

それはさておき、こういったセミナーのささやかな楽しみといいますと、 よく来てくれたねぇ的グッズをいただけることではないか、 と個人的には思っております。

今回はなにをいただけるのかな、なんて淡い期待をいだいていましたら、 分厚くてでかくて重い写真集を、もれなくいただきました。
もちろん、他の来場者のかたがたと同様、ありがたく頂戴して、カバンに押し込み、 がんばっておうちまで持って帰りました。

さて、どんな写真集なのかと思い、期待せずに開けて見てみますと…
MS の社員のひとが、延々と写っておりました。えんえんえんと、です。

さまざまな可能性を考慮してみましたが、この写真集を家に置いておくというニーズを、 ついに思いつくことはできませんでした。
しかたがないので、またしてもカバンに詰め込んで、がんばって会社まで持っていって、 本棚の隅の見えないところに押し込んであります。

ここのところ、会社では、本棚の隅のほうを見るたびに、 写真集のことを思い出させられてしまいます。
なんの意図があって、こんな写真集をつくり、来場者に配ったのか、 末端の技術者の端くれには、崇高な MS の考えを理解することができません。
ですが、淡泊な日常生活に微量の刺激を与えてくれたという点では、 感謝すべきことなのかもしれない、という気がしております。

強引にポジティブ思考したところで、今回も、はりきってまいりますよ!

今回のお題 - fakeroot で root になりきる

今でこそ、システム管理のメルマガなんて出しちゃっていますけれども、 学生のころは、一度も root 権限を得ることなく、 一般ユーザとして日々を過ごしていました。

root 権限を持つ先輩が、su して作業するのを見るたびに、 ああシステム管理者は大変そうだけどかっこいいなあ…などと思ったものでした。

さて、時は流れ、現在では、仮想環境やらなんやらのおかげで、 UNIX 的な環境を個人で持つことが、かなり簡単な世の中になりました。
そんなお試しチックな環境下なら、簡単に root 権限が得られます。

とはいえ、初心者や初心者に近いかたにとっては、 それすらも敷居の高いものかもしれません。
そんな貴兄でも、普段使わせてもらっている Linux の上で、 root っぽい雰囲気くらい味わってみたい、と思うこともあるのではないでしょうか。

というわけで、今回は、fakeroot をご紹介しようと思います。
fakeroot を用いますと、一般ユーザの権限で、 root の権限を得られたかのような錯覚を得ることができます。 (微妙な言い回しですが…)


fakeroot は、root 権限をシミュレートしてくれるソフトです。
主に、Debian 系のディストリビューションで、パッケージの構築を行う際に、 よく使われているようです。

もし fakeroot パッケージが見当たらなければ、Debian 系のかたは apt で、 Fedora なかたは yum で、入手してください。
パッケージがないという貴兄は、下記をたどってソースコードを入手し、 地道にコンパイルなどしてみてください。

fakeroot
http://fakeroot.alioth.debian.org/

…といったことができるなら、 fakeroot で root の雰囲気を味わう必要などないように思いますが… 気づかなかったふりをしたいと思います。


それではまず、習うより慣れろ、ということで、実行してみましょう。
邪心を取り除いてから、引数なしで fakeroot コマンドを実行します。

  % fakeroot
  # 

上記では、プロンプトが root っぽくなっていますが、 実際には何も変化しないかもしれません。ですが、見分けがつかないと不便ですので、 以降では、fakeroot 上か否かがわかるよう、プロンプトを変えておきます。

まずは、試しに、ファイルを作成してみましょう。

  # touch foo
  # ls -l foo
  -rw-r--r-- 1 root root 0  5月31日 23:34 foo

foo という名の空のファイルを、touch コマンドで作成しています。
ls コマンドで確認しますと、所有者が root になっています。

普通のひとなのに、fakeroot コマンドを実行しただけで、パスワードもなしに、 root の権限を得てしまったのでしょうか…。

…もちろん、そんなわけはありません。
fakeroot を実行中でない端末で、同じファイルを見ればわかります。

  % ls -l foo
  -rw-r--r-- 1 usu adm 0  5月31日 23:34 foo

…ああ、なんの変哲もない、自分のファイルでした。
どうやら、fakeroot 上では、root に見えるだけのようです。

別のひとの持ち物にしてみると、どうなるでしょうか。
たとえば、chown コマンドで、 users グループの test ユーザの持ち物にしてみましょう。

  # chown test.users foo
  # ls -l foo
  -rw-r--r-- 1 test users 0  5月31日 23:34 foo

ちゃんと、test ユーザ(users グループ)の持ち物になっています。
実際は、別の端末から眺めるとわかりますが、違います。

  % ls -l foo
  -rw-r--r-- 1 usu adm 0  5月31日 23:34 foo

それでは、一般ユーザが作れないファイルを、 fakeroot 上では作ることができるのでしょうか。
試しに、mknod コマンドでデバイスファイルを作ってみたいと思います。

  # mknod null c 1 3
  # ls -l null
  crw-r--r-- 1 root root 1, 3 6月 1日 21:51 null

…おお、作れてしまいました。
もちろん、お察しの通り、別の端末から見ると、ただのファイルです。

  % ls -l null
  -rw-r--r-- 1 usu adm 0 6月 1日 21:51 null

ちなみに、既存のファイルもすでに root のものになっています。

  # ls -l
  drwxr-xr-x  3 root root   4096  4月 3日 19:41 bin/
  drwxr-xr-x 12 root root   4096  6月10日  2004 doc/
  ...

fakeroot が root 権限をシミュレートするものだということが、 なんとなくわかっていただけたのではないかと思います。

ところで、fakeroot は、どのような原理で動作しているのでしょうか。

fakeroot を実行しますと、LD_PRELOAD という環境変数を設定して、 新たにシェルを起動します。
LD_PRELOAD が設定されていますと、 実行時に本来ロードされるべき libc 等のライブラリをロードする前に、 LD_PRELOAD で指定されたライブラリを先にロードします。(glibc の機能です。)
これを利用しますと、libc の関数やシステムコールではなく、 嘘の結果を返す fakeroot の関数に処理を行わせることができます。

試しに、LD_PRELOAD を空っぽにしますと、悪い夢から醒めます。
(2回目の ls -ld の実行結果を見ますと、所有者が元に戻っています。)

  # echo $LD_PRELOAD
  libfakeroot.so
  # ls -ld bin
  drwxr-xr-x 3 root root 4096  4月 3日 19:41 bin/
  # export LD_PRELOAD=
  # echo $LD_PRELOAD

  # ls -ld bin
  drwxr-xr-x 3 usu adm 4096  4月 3日 19:41 bin/

 

ただ、fakeroot の実体は、LD_PRELOAD で指定されたライブラリと言えるため、 これだけでは、fakeroot 内で行った結果を残しておけません。

そこで、faked というデーモンさんを起動して、 faked に情報を一括管理させています。
ですので、faked を kill してしまいますと、fakeroot は途方に暮れてしまいます。

  # ls -ld bin
  drwxr-xr-x 3 root root 4096  4月 3日 19:41 bin/
  # ps -C faked
    PID TTY          TIME CMD
  25262 ?        00:00:00 faked
  # kill 25262
  semop(1): encountered an error: 無効な引数です
  bash: [: -ge: unary operator expected
  # ls -ld bin
  (応答がなくなる…)

faked を kill した後は、faked から情報が得られなくなってしまいますので、 その後 ls などを実行しますと、固まってしまいます。
(kill -9 しないと ls が終了しなくなりますので、 あまりやらないほうがよいかもです。)

 

…といった原理で、fakeroot は動作しています。
ですので、もちろん、本当に root 権限を必要とする行為は、うまく動作しません。

たとえば、/etc/shadow は root しか読み書きできませんので、 fakeroot 上で参照しようとしても、にべもなく断られます。

  # grep test /etc/shadow
  grep: /etc/shadow: 許可がありません

mount もできません。…が、その理由は微妙に異なります。

  # mount -o loop,ro /boot/initrd.img /mnt/tmp
  mount: error while loading shared libraries: libfakeroot.so: \
  cannot open shared object file: No such file or directory

実は、mount コマンドは setuid されているため、 LD_PRELOAD が無効になってしまいます。ですので、動作しないというわけなのです。

  # ls -l `which mount`
  -rwsr-xr-x 1 root root 85564 11月 6日  2007 /bin/mount

それでは、fakeroot は、どのような状況で必要とされるのでしょうか。

前述しましたが、ファイルを自分以外の所有者にしたいときや、 デバイスファイルなどをアーカイブやパッケージに含めたいときに、使用します。

以下では、一例として、Vine Linux 4.2 で使用している initrd に細工を施して、 QEMU 上で動作させてみたいと思います。
説明は大幅に割愛しますが、initrd に /bin/ash を放りこんで、 延々と ash を起動するようにしています。
最後の行で作成した initrd.img が、新たに作成した initrd です。
(わかりにくいですが、一連の作業でデバイスファイルも扱います。 その際に、fakeroot のおかげで、エラーにならずに済んでいます。)

  % fakeroot
  # zcat < /boot/initrd-2.6.16-0vl76.28.img > initrd-cpio.img
  # mkdir initrd-cpio; cd initrd-cpio
  # cpio -i < ../initrd-cpio.img 
  552 blocks
  # rm init bootsplash bin/*
  # cp -p /bin/ash bin/
  # cp -p /lib/i686/libc.so.6 /lib/ld-linux.so.2 lib/
  # cat > init << EOF
  #!/bin/ash
  mount -t proc proc /proc
  mount -t sysfs sysfs /sys
  while [ 1 ]; do
          /bin/ash
  done
  EOF
  # chmod +x init
  # cd ..
  # (cd initrd-cpio; find . | cpio -o -H newc) | gzip -9 > initrd.img

これを、以下のようにして、QEMU でお試し実行します。

  % qemu -kernel /boot/vmlinuz-2.6.16-0vl76.28 -initrd initrd.img \
  -m 128 -no-kqemu -hda /dev/null

すると、QEMU 上で、ash がひたすら起動します。
他にコマンドがないため、あまり実用にはなりませんが、 ash の代わりに busybox を入れたりすれば、最小構成な Linux 環境になると思います。


以上、fakeroot の簡単な使いかたやしくみを、ご紹介しました。

詰め込んで駆け足でご説明してしまいましたので、 わかりにくい点も多々あったように思われます。そうだったら、申し訳ありません。

そんなときは、実行例をそっくり真似て、実行してみてください。
目で見ているだけでは気づかないことが、実行してはじめて気づくこともある… かもしれませんので。いや、きっとあります。…あるかな。

あ、fakeroot や LD_PRELOAD につきましては、以下の本に、 やや詳しく載っています。気になる貴兄は、 本屋さんで立ち読んでみてください。
内容はプログラマ向けですが、いろいろ楽しいことが書いてあります。

Binary Hacks - ハッカー秘伝のテクニック100選
http://www.amazon.co.jp/exec/obidos/ASIN/4873112885/usupiorg06-22

宿題の答え

前回の宿題は、

  CSV ファイルから、ユーザを復元するスクリプトを作りましょう。

でした。

CSV ファイルの該当する行から情報をいただいて、 useradd コマンドなどを呼んでしまえばよさそうですね。

というわけで、シェルスクリプトをもりもりと作成してみました。

  #!/bin/sh
  if [ $# -ne 1 ]; then
      echo "Usage: $0 account"
      exit 1
  fi
  IFS=','
  while read acct pass uid gid gcos hdir shell lstchg min max \
      warn inact expire flag; do
      if [ "$1" = "$acct" ]; then
          [ -n "$expire" ] && exp_opt="-e $expire" || exp_opt=""
          [ -n "$inact" ] && ina_opt="-f $inact" || ina_opt=""
          useradd -c "$gcos" -d $hdir $exp_opt $ina_opt \
              -g $gid -p "$pass" -s $shell -u $uid $acct
          [ -n "$min" ] && min_opt="-m $min" || min_opt=""
          [ -n "$max" ] && max_opt="-M $max" || max_opt=""
          [ -n "$warn" ] && warn_opt="-W $warn" || warn_opt=""
          if [ -n "$min" -o -n "$max" -o -n "$warn" ]; then
              chage $min_opt $max_opt $warn_opt $acct
          fi
          if [ -n "$lstchg" ]; then
              chage -d $lstchg $acct
          fi
      fi
  done

引数に、復活させたいユーザ名を、1つだけ指定します。
そして、標準入力から、CSV ファイルを読み込みます。
上記スクリプトを、restoreuser.sh という名前で作成しましたら、 以下のように実行します。
(以下では、大胆にも、jesus さんを復活させています。)

  # chmod +x restoreuser.sh
  # ./restoreuser.sh jesus < user_20080518.csv

CSV ファイルは、前回の前半でご紹介した、showuser.pl で作成したものです。 /etc/passwd と /etc/shadow 双方の情報を含むやつですね。

このスクリプトは、例によって、CSV ファイルをひたすら読み込み、 引数で指定したユーザ名と一致する行があれば、 useradd や chage といったコマンドを実行します。
chage コマンドを2回実行していますが、1回にまとめますと、 最後に変更した日数が反映されないため、分けました。理由はわかりません。 ご存知のかたは、ぜひぜひ教えてくださいませ。m(_o_)m

情報のない項目のことをやや考えているため、見づらくなっています。
ただ、それでも、入力がおかしな形式だったりなど、 いろんなイリーガルな状態のことまでは考慮していません。
紙面(?)の都合上、やや妥協して短くした、ということをご了承いただけますと、 とっても幸いです。(ただの言い訳なんですがー)

前回の内容や chage コマンドについて、詳しくご覧になりたい貴兄は、 以下を参考にしてくださいまし。

Vol.137 - ユーザ情報を管理する
http://www.usupi.org/sysad/137.html
Vol.036 - パスワードを管理する
http://www.usupi.org/sysad/036.html

今回の宿題

今回の宿題は、

  fakeroot で、setuid/setgid のコマンドを実行できない理由を考えて
  みましょう。

です。

setuid/setgid されたコマンドは、実行すると LD_PRELOAD が無効になりますが、 その理由を考えてみましょう。
お察しの通り、セキュリティ絡みだからなのですが、 なぜダメなのかピンと来ない貴兄は、これを機に、考えてみてくださいませ。

あとがき

冒頭で、分厚い写真集の恨みつらみを書いてしまいましたが、もちろん、 それだけではなく、Windows Server 2008 や Vista を、 ぽーんと無償でくださいました。1年間という期限つきではありますが、 それでもかなり太っ腹ではないかと思います。ありがたいです。敵ながら。…て、敵?

今の会社に入ってからは、Windows サーバなどには一切関わってきませんでしたので、 これを機会に、どこかにインストールして、1年間フル活用したいと思います。

ところで、MS さんは、DynamicIT と称して、ハードウェアの仮想化だけでなく、 ミドルウェアやアプリケーションなど、 あらゆるレイヤで仮想化を進めていこうとしているようです。

周囲の変化にあわせて柔軟に対応するために、 あらゆる層で仮想化を行うという考え方は、とてもまっとうなように思います。
しかし、仮想化が進めば進むほど、 それらの管理の重要性も増していくのではないかと思われます。
われわれシステム管理者のニーズは、この先もまだまだありそうで、 食いっぱぐれることもなさそうだな、てなことを感じました。

 

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

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本