2004年07月05日

おうちでサーバ(その3: Linux BOX化編)

まずはSSH

いよいよ LANDISK HDL-160U をLinux BOXとして設定する.なんにしろ, shellが使えるようにしなくては話がはじまらない.そこで,まずはhttp://iwa.ath.cx/landisk/landisk-ssh.htmlにあるインストーラをありがたく使わせていただいて, sshdをインストール.ファームウェアの更新機能を使ってインストールできるので簡単.感謝.

ファームウェアのアップデート

ファームウェアのバージョンが1.00だったので1.30へアップデートした.いろいろ不具合が直っている. 詳細はIO-DATAのサイトを参照.アップデート後,sshdが正常に稼動していることを確認.よしよし.

Debian環境の構築

さて.これからいろいろとインストールをするにあたり,開発環境を構築しなくてはならない. できればapt-getが使えるDebianで環境を構築したいところだが,もともとの出荷環境を破壊するのは最小限に留めたい.

そこで,/mnt/hda3の下にdebianというディレクトリを切ってその下にDebianのツリーを展開し, chrootして使うことにした.幸い,Debian/SH4はDODESプロジェクトによりそれなりにパッケージングがなされているため, これをありがたく拝借する.

以下は手順.以下,$debianは構築するDebian環境のルートディレクトリとする (私の環境では/mnt/hda3/debian).

  1. sudo -s でrootになる.
  2. http://debian.dodes.org/debian/base/base-sh4-020728.tar.gzを$debianに展開する.
  3. echo 'deb http://debian.dodes.org/debian sid main non-free contrib' > $debian/etc/apt/sources.list
  4. HOME=/root $debian/usr/sbin/chroot $debian /bin/sh -l
  5. apt-get update
  6. あとは適宜 apt-get install hogehoge で必要なhogehogeパッケージをインストールする. apt-getの使い方はあちこちにあるDebian関係のリソースを参照してください.

これでたいていの必要な環境は揃ってしまう.拍子抜けなほど簡単.うーむ.

TIPS

  • ps などを使えるようにするために,proc ファイルシステムを $debian/procにmountしておきましょう.
  • screen などを使えるようにするために,/dev/pts ファイルシステムを $debian/dev/ptsにmountしておきましょう.
  • (重要)/etc/sudoers を編集するときには忘れずパーミッションを元に戻しましょう.忘れると非常に痛い思いをします.

/etc/sudoersの編集における悲劇(喜劇?)

とても痛い目にあったので忘れないように.

普段使っているlogin nameからsudoしたかったので,/etc/sudoersを書き換えようとした. ちなみに/etc/sudoersはsudo可能なuserを管理するための設定ファイルである.

  1. mount -o rw,remount / でrootファイルシステムを読み書き可能モードで再マウント.
  2. 本来はvisudoで/etc/sudoersの更新は行うのだが, 当然そんなものは入っていないのでふつーにviで書き換えることにする.
  3. chmod +w /etc/sudoers で書き換え可能にし,
  4. vi /etc/sudoers で編集.

で,ここで思わずroot shellからexitしてしまった.

…sudoは/etc/sudoersがread onlyでないと失敗するんじゃん. ファームウェアの更新もsudoを使っているっぽい (ユーザapacheからNOPASSWDでsudo可能にしてある… のはそういうことだよね)ので,今後ふつーのNASとして利用するのでさえも差し支えてしまう.きゃあ.これは困った.

さて,ここで問題です

  • /etc/sudoers のパーミッションが0640になってしまっている.
  • 一般ユーザとしてログインすることは可能である.
  • rootのパスワードは知らない.
  • chroot環境 (/etc は含まれない) でroot shellが利用できる.当然, /etc/sudoersは触れない.

という状況で,/etc/sudoersのパーミッションを戻すにはどうしたらよいでしょうか.

setuid

30秒ほど青ざめた後,setuidしたスクリプトをchroot環境のroot shellを使って作り, それをchroot環境の外の一般ユーザで実行することにより/etc/sudoersのパーミッションを0440に戻すことを思いつく.

ただし,shellスクリプトはsetuidできないことになっているので,suidperlを使うことに…したのだが, なぜかLANDISKに元々入っているsuidperlでは「Can't do setuid」とか言われて実行できない. Debianなchroot環境では正常に実行できるのだが,それでは意味が無い. しょうがないのでCでプログラムを書いてchroot環境のgccでコンパイルし,setuidして実行することにした. 以下はそのソースコード…と呼べるほどのものでもないけれど.

#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>

main()
{
  if ( chmod("/etc/sudoers",S_IREAD) )
    perror(strerror(errno));
}

以後,同じような事故が起こったときのために, これをコンパイルしてsuidを立てたものを/usr/local/binに置いておくことにした.

…まあ,visudoもどきを書いておくのが本来だと思うけど,本気で書こうとすると結構面倒くさいし.エラー制御とか.

この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。