Linux

2010年2月23日 (火)

LinuxでchrootによるJail環境を構築

FreeBSDにはJailという簡易仮想マシンを作るコマンドがあるけど、残念ながら
Linuxにはない。ただ、chrootという古くからあるunixコマンドで仮想マシンに
近いことができる。
この辺のことについては、Apacheセキュリティ という本に記述されている。
Apacheセキュリティの場合は、root権限を使わないようにしたり、必要最低限の
ファイルのみをJail環境に移行することによって、セキュリティを強固にするため
に使われている。
私の場合は、自分のプロジェクトのチームが作成しているWebアプリが、/etc配下
の設定ファイルのパスをソースに直で書いてあるため、設定ファイルを書き換え
て、Webアプリを同時に2個立ち上げることができなかったためにJail環境を構築し
た。そのため、厳密にセキュリティを考慮していないが、悪しからず。
Apacheセキュリティでは、必要な実行ファイルとその実行ファイルを引数にlddを
実行して、依存関係のあるファイルのみ移行していた。

sudo su -l

rootになる。

mkdir /chroot

適当なchroot用のディレクトリの作成(どこでもいい。以降は/chrootと仮定)

mkdir /chroot/proc

procディレクトリの作成

mkdir /chroot/bin

chroot用の/binディレクトリの作成

cp -r /bin/* /chroot/bin/

/bin配下のコマンドをchroot環境にコピー

mkdir /chroot/lib

chroot用の/libディレクトリの作成

cp -r /lib/* /chroot/lib/

/lib配下のライブラリをchroot環境にコピー

mkdir /chroot/usr

chroot用の/usrディレクトリの作成

cp -r /usr/lib /chroot/usr/

/usr/lib配下のライブラリをchroot環境にコピー

mkdir /chroot/tmp

chroot用の/tmpディレクトリの作成

mkdir /chroot/dev

chroot用の/devディレクトリの作成

mknod  -m 666 /chroot/dev/null c 1 3

chroot環境に/dev/nullデバイスの作成

mknod  -m 666 /chroot/dev/zero c 1 5

chroot環境に/dev/zeroデバイスの作成

mknod  -m 644 /chroot/dev/random c 1 8

chroot環境に/dev/randomデバイスの作成

mkdir /chroot/etc

chroot環境に/etcディレクトリの作成

cp /etc/group /chroot/etc/group

chroot環境にgroup設定ファイルをコピー

cp /etc/hosts /chroot/etc/hosts

chroot環境にhosts設定ファイルをコピー

cp /etc/mime.types /chroot/etc/mime.types

chroot環境にmime一覧ファイルをコピー

cp /etc/mtab /chroot/etc/mtab

chroot環境にmount設定ファイルをコピー

cp /etc/nsswitch.conf /chroot/etc/nsswitch.conf

chroot環境にネームサービス設定ファイルをコピー

cp /etc/passwd /chroot/etc/passwd

chroot環境にユーザ設定ファイルをコピー

cp /etc/resolv.conf /chroot/etc/resolv.conf

chroot環境にDNSサーバー設定ファイルをコピー

cp -r /etc/apache2 /chroot/etc

chroot環境にapacheの設定ファイルをコピー

vim /chroot/etc/apache2/ports.conf

chroot環境のapacheのポートを今起動しているサーバとかぶらないよう変更

mkdir /chroot/etc/init.d

chroot環境に起動用スクリプトディレクトリの作成

cp /etc/init.d/apache2 /chroot/etc/init.d/apache2

chroot環境にApacheの起動スクリプトをコピー

mkdir /chroot/usr/bin

chroot環境に/usr/binディレクトリの作成

mkdir /chroot/usr/sbin

chroot環境に/usr/sbinディレクトリの作成

cp /usr/bin/env /chroot/usr/bin/env

chroot環境にenvコマンドをコピー

cp /usr/bin/install /chroot/usr/bin/install

chroot環境にinstallコマンドをコピー

cp /usr/bin/perl /chroot/usr/bin/perl
cp /usr/bin/perl5.10.0 /chroot/usr/bin/perl5.10.0
cp /usr/bin/perlbug /chroot/usr/bin/perlbug
cp /usr/bin/perldoc /chroot/usr/bin/perldoc
cp /usr/bin/perlivp /chroot/usr/bin/perlivp

chroot環境にperlコマンドをコピー

cp /usr/bin/vim /chroot/usr/bin/vim

chroot環境にvimコマンドをコピー

cp /usr/sbin/apache2 /chroot/usr/sbin/apache2
cp /usr/sbin/apache2ctl /chroot/usr/sbin/apache2ctl

chroot環境にapacheコマンドをコピー

mkdir /chroot/var
cp -r /var/www /chroot/var
mkdir  /chroot/var/lock
mkdir /chroot/var/log
mkdir /chroot/var/run

chroot環境に各種/varディレクトリの作成

mkdir /chroot/usr/share
cp -r /usr/share/perl /chroot/usr/share/
cp -r /usr/share/perl5 /chroot/usr/share/

chroot環境にperlライブラリのコピー

sudo cp /usr/share/zoneinfo/Japan /chroot/etc/localtime
mkdir -p /chroot/usr/lib/locale
set|grep LANG
sudo cp -dpR /usr/lib/locale/ja_JP.utf8 /chroot/usr/lib/locale

chroot環境の時刻のlocaleを設定

chroot /chroot

chrootの実行!!

mount -t proc proc /proc

/procのmount

/etc/init.d/apache2 start

congraturation!!

mysql -u root -h 127.0.0.1 --password=root

ちなみに、mysqlはunix socketでは通信できなくなったのでTCPで通信する
必要があります。その際に-pだけでは駄目で、--password=パスワードのよう
にパスワードをコマンドライン上で指定しないと繋がりませんでした。

| | コメント (0) | トラックバック (0)

2008年2月20日 (水)

makeがエラー

configureしてmakeしたら、エラーになった。
同じソース前にmakeした時はうまくいったので、なんでかなーと
一日近くはまった結果、ようやく判った。

configureて../src/configureのように相対パスで実行しないとダメなのね。知らずに/home/atico/src/configureのように絶対パスで実行すると、srcdirが.//home/atico/src/configureになってしまい、そのせいで参照している他のmakeファイル
なんかが読みこめずにエラーになってました。

疲れたー。

| | コメント (1) | トラックバック (0)

2008年2月15日 (金)

連番によるバックアップ

cp ファイル名 ファイル名.bk
みたいな作業が多くなり、いちいちファイル名を2回入力
するのが面倒に感じ、
bk ファイル名 [
ファイル名 ...]
により、ファイル名+番号のバックアップを行えるような
シェルスクリプトを作成した。
(すでにファイルがあった場合は最後の番号+1にする)
いちいちsubversionに登録するには及ばんよという時に
便利かも。
私はPATHの通ったディレクトリにbkの名前で下記のスクリプト
を保存している。

無保証です。問題が起こっても、保証しません。
#!/bin/sh

while [ $# -gt 0 ]
do
  if [ ! -f $1 ]
  then
    echo "no exist $1."
    shift
    continue
  fi
  i=1
  while [ -e "$1.$i" ]
 do
    let i=$i+1
  done
  /bin/cp $1 $1.$i
  shift
done

| | コメント (0) | トラックバック (0)

2008年2月 8日 (金)

複数ファイルのファイル名変更

昨日は複数ファイル中の文字列の置き換えを行いましたが、今回は複数ファイルのファイル名自体の変更を行う方法についてです。
例えば、デジカメで撮った写真のファイル名は、日時+連番.jpgなどの無機質なファイル名になってしまいますが、ファイル名の先頭に誕生会や熱海旅行などの文字列を追加したい場合、いちいちひとつずつファイル名を変換していくのは面倒です。
そういった場合は、私は下記のようにします。

1.  find . -name -type -f > rename.sh
カレントディレクトリ配下のファイル一覧を取得
別にコマンドはなんでもいいが、とにかく変換したいファイルの一覧をファイルに書き出す。

2. rename.shの内容を自分の好みのエディタでmvコマンドになるように編集。
vimの場合、ファイル名の先頭に運動会という文字列をつけたい場合は、
%s/\(.*\)/mv \1 運動会\1/
とすれば、
mv 20080210_001.jpg 運動会20080210_001.jpg
mv 20080210_002.jpg 運動会20080210_002.jpg
のようなシェルスクリプトが作成できる。
別に置換を行わなくても、単にコピペや編集だけでも大幅に手間が減る。

3. sh rename.sh
後は単純にできあがったシェルスクリプトを実行するだけだ。

私は8年ぐらいIT業界にいるが、こんな単純なことに気づいたのは、ここ1年ぐらいだ。
それまで、vimのディレクトリエディタのスクリプトであるexplorer.vimを直接ファイル名を書き変えられるようにスクリプトを改造するなど手間暇かけてまわりくどいことをしていた。おまけにその場合カレントディレクトリしかファイル名の変換対象にならないし。きっかけはvim7になって、explorer.vimが使われなくなったせいで、今までのように単にスクリプトファイルを置き換えるだけではいかなくなり、どうしたもんかと悩んているときに、あっとひらめいた。
コマンドつなげるにはパイプっていう固定概念がこんなことさえ気づかなくしていた。

| | コメント (2) | トラックバック (0)