SheevaPlug

2014年9月28日 (日)

SheevaPlugのbash脆弱性対応

bashに脆弱性があるようですので、バージョンアップします。
まずは、バージョンを確認します。

# bash -version
GNU bash, version 3.2.48(1)-release (arm-unknown-linux-gnueabi)
Copyright (C) 2007 Free Software Foundation, Inc.

脆弱性の有無を確認します。

# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

vulnerableと表示されたため、任意のコードが実行できる脆弱性があるようです。
必要となるファイル一式をダウンロードします。

$ wget http://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz
$ wget http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-049
$ wget http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-050
$ wget http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-051
$ wget http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-052
$ wget http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-053

適当なディレクトリに移動した後、解凍します。

$ tar -xvf bash-3.2.48.tar.gz

ソースコードにパッチを適用します。たくさんありますが、全て適用します。

$ cd bash-3.2.48/
$ patch -p0 < ../bash32-049
patching file lib/readline/mbutil.c
patching file patchlevel.h
$ patch -p0 < ../bash32-050
patching file lib/readline/mbutil.c
patching file patchlevel.h
$ patch -p0 < ../bash32-051
patching file builtins/read.def
patching file patchlevel.h
$ patch -p0 < ../bash32-052
patching file builtins/common.h
patching file builtins/evalstring.c
patching file variables.c
patching file patchlevel.h
$ patch -p0 < ../bash32-053
patching file parse.y
patching file patchlevel.h

コンパイルします。

$ ./configure

$ make

インストールします。ただし、インストール先が/usr/local/binになってしまうので、後からリンクでごまかします。

$ su -
# make install

バージョンが3.2.53になっているか確認します。

# ls -l /usr/local/bin/bash
-rwxr-xr-x 1 root root 2150134 2014-09-28 10:35 /usr/local/bin/bash

# /usr/local/bin/bash --version
GNU bash, version 3.2.53(1)-release (armv5tel-unknown-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

リンクでごまかします。

# cd /bin
# mv bash bash-3.2.48
# ln -s /usr/local/bin/bash /bin/bash
# ls -l bash
lrwxrwxrwx 1 root root 19 2014-09-28 10:36 bash -> /usr/local/bin/bash

# exit

最終確認です。

$ bash --version
GNU bash, version 3.2.53(1)-release (armv5tel-unknown-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

vulnerableと表示されないので、脆弱性も無くなりました。

2014/10/08追記

3.2.57までパッチが出ていますので、必ず57までダウンロードした後、57までパッチを適用してください。

| | コメント (0)

2011年10月23日 (日)

SheevaPlug 復活

昨日死亡したSheevaPlug ですが、復活しました。

ハードオフで5V/2.6AのACアダプタを315円で入手しました。
壊れた内蔵電源からコネクタ部分を切断し、購入したACアダプタと接続することであっさりと復活しました。

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

2011年10月22日 (土)

SheevaPlug 死亡

昨日の夜から30分~1時間おきぐらいにSheevaPlugがリブートを繰り返すので、いったん電源をOFFにして、コンソールをつないで確認しようとしたら、電源のLEDとLANのLEDが点滅して起動しない...
いろいろググると同じ症状の方々が。

どうやら電源が死んでるみたいです。
5V2AのACアダプタで復活させようか...

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

2010年12月20日 (月)

Apacheバージョンアップ

久しぶりにApacheをバージョンアップしました。
以下、その手順です。

Apache停止

# /etc/rc2.d/S97apache stop
# exit

Apacheのビルド&インストール

$ cd /opt/srcall
$ wget http://www.meisei-u.ac.jp/mirror/apache/httpd/httpd-2.0.64.tar.gz
$ cd ../src
$ tar zxf ../srcall/httpd-2.0.64.tar.gz
$ cd httpd-2.0.64
$ ./configure --disable-include --disable-env --disable-status --disable-autoindex --disable-asis --disable-imap --enable-auth-digest --enable-ssl --with-ssl=/usr --enable-deflate
$ su -
# cd /opt/src/httpd-2.0.64
# make
# make install
# exit

PHPのビルド&インストール

$ cd /opt/srcall
$ wget http://jp2.php.net/get/php-5.2.15.tar.gz/from/jp.php.net/mirror
$ cd ../src
$ tar zxf ../srcall/php-5.2.15.tar.gz
$ cd php-5.2.15
$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-pcntl --enable-mbstring --enable-mbregex --enable-zend-multibyte --without-mysql --with-pear=/usr/local/lib/php --with-openssl=/usr --with-zlib --with-zlib-dir=/usr/lib --with-gd=/usr  --enable-gd-native-ttf --enable-gd-jis-conv --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-xpm-dir==/usr/lib
$ make
$ su -
# cd /opt/src/php-5.2.15
# make install
# exit

eAcceleratorのビルド&インストール

$ cd /opt/srcall
$ wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
$ cd ../src
$ tar jxf ../srcall/eaccelerator-0.9.6.1.tar.bz2
$ cd eaccelerator-0.9.6.1/
$ /usr/local/bin/phpize
$ ./configure --enable-eaccelerator --with-eaccelerator-shared-memory --with-eaccelerator-sessions --with-eaccelerator-content-caching --with-eaccelerator-disassembler --with-eaccelerator-userid=80
$ make
# cd /opt/src/eaccelerator-0.9.6.1
# make install

Apache起動

# /etc/rc2.d/S97apache start
# exit

| | コメント (0)

2009年12月11日 (金)

Apacheが "Digest: generating secret for digest authentication ..."でハングする

OS起動時はApacheが正常に起動するのですが、OS起動後に手動でApacheを再起動すると上記メッセージをerror_logに出力したところで止まってしまいます。

いろいろと調べたところ、こちらと同じように、Apacheが起動しない時にpsコマンドで見ると、random_readで止まっています。

# ps ax -o pid,comm,wchan  | grep httpd
 1815 httpd           random_read
entropy_availも少ないようです。
# cat /proc/sys/kernel/random/entropy_avail
51
対策としては、rng-toolsをインストールすればよいらしいのですが、
# apt-get install rng-tools

Trying to create /dev/hwrng device inode...
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
Starting Hardware RNG entropy gatherer daemon: (Hardware RNG device inode not found)
/etc/init.d/rng-tools: Cannot find a hardware RNG device to use.
invoke-rc.d: initscript rng-tools, action "start" failed.
デバイスが無いようで起動してくれません。
こちらを参考に/etc/default/rng-toolsに
HRNGDEVICE=/dev/urandom
を追記し、
# /etc/init.d/rng-tools start
Starting Hardware RNG entropy gatherer daemon: rngd.
とすると動きました。entropy_availも問題ないようです。
# cat /proc/sys/kernel/random/entropy_avail
1991
Apacheも正常に起動するようになりました。

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

2009年9月10日 (木)

rep2を並列ダウンロードで高速化してみる

rep2(現在はp2)を1.8.40から1.8.58にバージョンアップしていると、conf_admin.inc.phpに気になるコメントを見つけました。

// pecl_http が利用できる場合、HttpRequestPool による並列ダウロードを有効にする(※PHP5以上のみ可)
// この設定を有効にした場合は、$_conf['dlSubjectTotalLimitTime*'] の設定が無効となる。
// (off:0, on:1, モバイル時のみon:3) // cli:2 は未対応
$_conf['expack.use_pecl_http'] = 0; // (0)

そもそも今回玄箱からSheevaPlugに変えたのはrep2を高速化させるためでした。たしかにCPUクロックの向上とメモリの増加によりPHP自体の高速化はできたものの、[更新]ボタンを押した際のレスポンスは大して速くなりませんでした。どうやら2chのサーバからのダウンロードがボトルネックになっているようで、高速化をあきらめていましたが、並列ダウンロードとなればさらなる高速化が期待できます。早速pecl_httpを使えるようにしてみたいと思います。

とりあえずは、peclでinstallを試してみたものの

# pecl install pecl_http
pecl.php.net is using a unsupported protocal - This should never happen.
install failed

エラーが出てインストールできません。仕方がないのでソースからビルドします。

$ wget http://pecl.php.net/get/pecl_http-1.6.5.tgz
$ tar zxf pecl_http-1.6.5.tgz
$ cd pecl_http-1.6.5/
$ ./configure

checking for curl/curl.h... not found
configure: error: could not find curl/curl.h

curl.hが無いみたいです。

$ su -
# apt-get install libcurl3 libcurl3-gnutls
# apt-get install libcurl4-gnutls-dev
# exit
$ ./configure

checking for curl/curl.h... found in /usr
checking for curl-config... found: /usr/bin/curl-config
checking for curl version >= 7.12.3... 7.18.2

creating libtool
appending configuration tag "CXX" to libtool
updating cache ./config.cache
creating ./config.status
creating config.h

今度はうまくいきました。それでは、makeします。

$ make

Build complete.
Don't forget to run 'make test'.
$ su -
# make install
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-non-zts-20060613/
Installing header files:          /usr/local/include/php/

# ls /usr/local/lib/php/extensions/no-debug- non-zts-20060613/
eaccelerator.so http.so

インストールされたようですので、php.iniを修正します。

# vi /usr/local/lib/php.ini

; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/

extension=http.so

conf_admin.inc.phpを修正前後でどれぐらい応答時間が違うか「最近読んだスレ」の[更新]で測定してみます。(最近読んだスレの記録数は1000にしています。)

$_conf['expack.use_pecl_http'] = 0の場合

192.168.1.xxx - - [10/Sep/2009:21:36:51 +0900] "GET ..... HTTP/1.1" 200 214782 20

$_conf['expack.use_pecl_http'] = 1の場合

192.168.1.xxx - - [10/Sep/2009:21:40:11 +0900] "GET ..... HTTP/1.1" 200 214782 14

20秒→14秒...1.43倍,うーん微妙。

| | コメント (0)

2009年8月30日 (日)

SheevaPlug 請求書が来ました

8月28日にFedExから請求書が来ました。どうやらこちらのDAIさんからのコメントでも指摘があったように輸入消費税のようです。請求金額は\1,200で内訳は、

  • 関税 \0
  • 消費税 \600
  • 地方消費税 \100
  • 手数料 \500

となっていました。
コンビニか銀行振り込みで10日以内に支払いをしなさいとのことでしたので、コンビニで早速支払ってきました。ちなみに、銀行振り込みだと手数料がかかるようです。

| | コメント (0)

2009年8月29日 (土)

SheevaPlug Apacheインストール

Apacheはaptでインストールしても良いのですが、今使っている玄箱と比較したいので、いつものようにセルフビルドする方針で行きます。

  1. OpenSSLのヘッダーファイルをインストールします
    # apt-get install libssl-dev
  2. 作業用ディレクトリを作成します。(/opt/srcallにダウンロードしたソースファイル、/opt/srcをビルド作業ディレクトリにしています)
    # cd /opt
    # mkdir srcall
    # mkdir src
    # chmod 777 srcall src
  3. Apache 2.0.63のソースをダウンロードした後、ビルドしてインストールします。
    $ cd /opt/srcall
    $ wget http://www.meisei-u.ac.jp/mirror/apache/httpd/httpd-2.0.63.tar.gz
    $ cd ../src
    $ tar zxf ../srcall/httpd-2.0.63.tar.gz
    $ cd httpd-2.0.63
    $ ./configure --disable-ipv6 --disable-include --disable-env --disable-status --disable-autoindex --disable-asis --disable-imap --enable-auth-digest --enable-ssl --with-ssl=/usr
    $ su -
    # cd /opt/src/httpd-2.0.63
    # make
    # make install

httpd.confの設定などは後回しにします。とりあえずPHPが必要なのでこちらもセルフビルドします。 また、Apache2.0.63のconfigure,makeの時間をtimeコマンドで計測してみました。なお、比較対象は無印の玄箱(PowerPC 200MHz, メモリ64MB, OS:純正OS)です。

configure

sheevakuro-box
real 3m 47.402s 9m 32.803s
user 2m 13.120s 4m 55.290s
sys 1m 33.250s 4m 31.900s

make

sheevakuro-box
real 15m 26.416s 31m 31.129s
user 13m 21.240s 25m 10.390s
sys 2m 3.160s 6m 3.380s

続いてPHP5.2.10をセルフビルドします。

  1. 必要となる前提パッケージををインストールしておきます。
    # apt-get install libxml2 libxml2-utils libxml2-dev
    # apt-get install libjpeg62 libjpeg62-dev
    # apt-get install libpng12-0 libpng12-dev
    # apt-get install libgd2-xpm libgd2-xpm-dev
    # apt-get install bison flex re2c
  2. PHP5.2.10のソースをダウンロードした後、ビルドしてインストールします。
    $ cd /opt/srcall
    $ wget http://jp2.php.net/get/php-5.2.10.tar.gz/from/jp.php.net/mirror
    $ cd ../src
    $ tar zxf ../srcall/php-5.2.10.tar.gz
    $ cd php-5.2.10
    $ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-pcntl --enable-mbstring --enable-mbregex --enable-zend-multibyte --without-mysql --with-pear=/usr/local/lib/php --with-openssl=/usr --with-zlib --with-zlib-dir=/usr/lib --with-gd=/usr  --enable-gd-native-ttf --enable-gd-jis-conv --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-xpm-dir==/usr/lib
    $ make
    # cd /opt/src/php-5.2.10
    # make install
    うーん、なぜかインストール中にこんなWarningがたくさん出ます...
    Warning: Cannot use a scalar value as an array in phar://install-pear-nozlib.phar/PEAR/ChannelFile.php on line ...
    ググってみたけど、pearまわりのトラブル?
    http://pear.php.net/go-pear をダウンロードしてphpで実行すればよいとか、もう一度make installでいけたとか、よく分かりません。とりあえず、make installをもう一回するとエラーが出ません。
    試しに、go-pearをやると今度はpear関連のファイル配置が変になるようで、pearが動かなくなってしまいます。
    とりあえず、pear versionでこんな感じ↓で出るので次に進みます。
    # pear version
    PEAR Version: 1.8.0
    PHP Version: 5.2.10
    Zend Engine Version: 2.2.0
    Running on: Linux sheeva 2.6.30.5 #1 PREEMPT Sun Aug 16 18:37:13 MDT 2009 armv5tel
  3. php.inを編集します。
    # cp -p php.ini-dist /usr/local/lib/php.ini
    # vi /usr/local/lib/php.ini
    [mbstring]
    mbstring.language = Japanese
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = auto
    mbstring.http_output = EUC-JP
    mbstring.detect_order = auto
    mbstring.substitute_character = none;

    expose_php = Off
  4. httpd.confを環境に合わせて修正します。このあたりは、たくさん情報があると思いますので省略します。
  5. PHPの実行を高速化するため、eAcceleratorをインストールします。
    $ cd /opt/srcall
    $ wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
    $ cd ../src
    $ tar jxf ../srcall/eaccelerator-0.9.5.3.tar.bz2
    $ cd eaccelerator-0.9.5.3/
    $ /usr/local/bin/phpize
    こんなWarningが出ます。
    configure.in:158: warning: AC_CACHE_VAL(lt_prog_compiler_static_works, ...): suspicious cache-id, must contain _cv_ to be cached
    ググってみるとautoconf2.63だとダメみたいなのでバージョン2.13を入れた後、再度phpizeを実行します。
    $ su -
    # apt-get install autoconf2.13
    # exit
    $ /usr/local/bin/phpize
    $ ./configure --enable-eaccelerator --with-eaccelerator-shared-memory --with-eaccelerator-sessions --with-eaccelerator-content-caching --with-eaccelerator-disassembler --with-eaccelerator-userid=80   ←80はApacheの起動ユーザのuidです。
    $ make
    # cd /opt/src/eaccelerator-0.9.5.3
    # make install
  6. /usr/loca/lib/php.iniにeaccelerator.iniの内容を追記します。以下は私の場合の設定内容です。
    • キャッシュ内容をメモリにのみ保持します。
    • 圧縮は無しにしています。
    • キャッシュサイズを32MBにしているため、/etc/sysctl.confに kernel.shmmax=67109888 を追加してkerelの共有メモリサイズを64MBに変更しています。(SheevaPlugのkernel.shmmaxのデフォルト値は32MBでした。)
    ;; eAccelerator
    zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
    eaccelerator.shm_size = "32"    ← 16MB以上に増やす場合は/etc/sysctl.confのkernel.shmmaxの値を増やして下さい。 
    eaccelerator.cache_dir = "/tmp/eac-cache" ← キャッシュ保存用ディレクトリ
    eaccelerator.enable = "1"
    eaccelerator.optimizer = "1"
    eaccelerator.check_mtime = "1"
    eaccelerator.debug = "0"
    eaccelerator.filter = ""
    eaccelerator.shm_max = "0"
    eaccelerator.shm_ttl = "0"
    eaccelerator.shm_prune_period = "0"
    eaccelerator.shm_only = "0"
    eaccelerator.compress = "0" ← 圧縮無し
    eaccelerator.compress_level = "9"
    eaccelerator.keys     = "shm_only" ← メモリのみキャッシュを保存する場合
    eaccelerator.sessions = "shm_only" ← メモリのみキャッシュを保存する場合
    eaccelerator.content  = "shm_only" ← メモリのみキャッシュを保存する場合
    eaccelerator.allowed_admin_path = "/usr/local/apache2/htdocs/control.php"
  7. 後はcontrol.phpをApacheのhtdocs(上の場合は/usr/local/apache2/htdocs)に入れて動作確認します。
  8. Apacheの自動起動の設定を行います。
    # cd /etc/rc2.d
    # ln -s /usr/local/apache2/bin/apachectl S97apache
    # cd /etc/rc0.d
    # ln -s /usr/local/apache2/bin/apachectl K10apache
  9. Apacheのログローテーションの設定をします。
    # vi /etc/logrotate.d/httpd
    月1回、2世代まで保管する場合の例
    /usr/local/apache2/logs/*_log {
        monthly
        rotate 2
        postrotate
            /usr/local/apache2/bin/apachectl restart
        endscript
    }

この後、玄箱からrep2のファイルを持ってきて実行させたところ正常に動作しました。なお、期待していた実行速度ですが、明らかに速い箇所と、1.5倍ぐらいの速さのところがあり、まだまだチューニングが必要なようです。(素直にaptで入れた方が実行速度が速いって事はないよね...)

| | コメント (2)

2009年8月25日 (火)

SheevaPlug OS設定

カーネル更新まで完了したので、OSの設定に入ります。

  1. SDカードからブートします。
  2. IPアドレスを固定します。
    # vi /etc/network/interfaces
    auto eth0
    iface eth0 inet dhcp
    # /usr/share/doc/ifupdown/examples for more information.
      ↓以下の通り修正
    auto eth0
    iface eth0 inet static
        address 192.168.1.100
        netmask 255.255.255.0    
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
  3. rootのパスワードをデフォルト値から変更します。
    # passwd
  4. 一般ユーザを追加します。
    # useradd -u 1001 -g users -m -s /bin/bash ユーザ名
    # passwd ユーザ名
  5. sshでrootのログインを禁止します。
    # vi /etc/ssh/sshd_config
    PermitRootLogin yes
      ↓
    PermitRootLogin no
  6. 一度リブートします。
  7. サービスのON/OFFをするため、sysv-rc-confをインストールします。
    # apt-get install sysv-rc-conf
  8. サービス一覧を表示し、不要なサービスを停止します。
    # sysv-rc-conf
    # sysv-rc-conf samba off
  9. aptにてインストール済みパッケージを更新します。
    # apt-get update
    # apt-get -u upgrade
  10. /var/log/messagesに  -- MARK -- が定期的に記録されるのを止めます。
    # vi /etc/init.d/sysklogd 2009/8/26訂正(修正するファイルを間違えていました)
    # vi /etc/default/syslogd
    SYSLOGD=""
      ↓
    SYSLOGD="-m 0"
    # /etc/init.d/sysklogd restart
  11. gccなどの開発ツールをインストールします。 2009/8/26訂正(makeなどが入っていませんでした)
    # apt-get update
    # apt-get install build-essential
    # apt-get install libtool
  12. ホスト名を変更します。あわせてhostsも更新したあとリブートして反映します。
    # vi /etc/hostname
    # vi /etc/hosts
    # shutdown -r now

今日はここまで。明日以降Apacheを入れる予定です。

| | コメント (0)

2009年8月24日 (月)

SheevaPlug SDカードと内蔵フラッシュを疑似マルチブート

Plug Wikiのこちらの記事を見ていると、SDカードでブートしてみてブートできなければ内蔵フラッシュメモリからブートさせることができるようなので、早速やってみました。

  1. ubootから以下の環境変数を設定します。
    Marvell>> setenv bootargs_nand 'rootfstype=jffs2 console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1'
    Marvell>> setenv bootcmd_nand 'setenv bootargs $(bootargs_nand); nand read.e 0x800000 0x100000 0x400000; bootm 0x800000'

    Marvell>> setenv bootargs_sd 'console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mmcblk0p3 rootfstype=ext2 rootdelay=3'
    Marvell>> setenv bootcmd_sd 'setenv bootargs $(bootargs_sd); mmcinit; ext2load mmc 0:1 0x800000 /sheeva-2.6.30.5-uImage; bootm 0x800000'

    Marvell>> set bootcmd 'run bootcmd_sd; run bootcmd_nand'
  2. 環境変数を保存します。
    Marvell>> saveenv

これで、SDカードがセットされていればSDカードから、SDカードがない場合は内蔵フラッシュメモリからブートするようになりました。

| | コメント (0)