2012年11月28日

パソコン日記(2012)




1997年からはじめた身の回りのコンピュータ全体の日記コーナーです。

仕事でソフトウェア開発をやっていたので、仕事も趣味もコンピュータです。 そんな生活の中で起こったことや気づいたことを紹介します。
毎日書いてるわけではないのですが、のらりくらりと続いています。

特定のテーマで独立したページを書くのは結構大変なのですが、日々の出来事を エッセイ風に書くのはかなり楽なので最近はこちらばかり更新しています。



2024年 2023年 2022年
2021年 2020年 2019年 2014年 2013年
2011年 2010年 2009年 2008年 2007年
2006年 2005年 2004年 2003年 2002年
2001年 2000年 1999年 1998年 1997年

リンクアイコン トップページへ戻る


2012/11/28(水)

正常にシャットダウンできない

夏に組み立てた、Intel DZ77SL-50K マザーボードを用いたWindows7 64bit 自作機ですが、シャットダウンした時に20回に1回くらいの割合でHDD のアクセスランプが点灯したままになり、 シャットダウンがフリーズすることがあります。
待ってもその状態がずっと続くので、こうなると手動で電源ボタンを 長押しして強制的に電源をオフしています。
その後にPCを起動すると、Windows の前回正常にシャットダウンしていませんね、 的な警告は出ないので、OS から見るとシャットダウンに必要な処理は完了できているのかもしれません。

インターネット上の情報を参考に、次の対処を試してみましたが、いずれも効果は ありません。

1. マザーボード関連のドライバを最新のものに更新する
2. shutdown.exe のショートカットを作成し、シャットダウン操作はこれで行う
3. Windows のHDD 省電力設定をOff にする

それではと、2012年11月に公開された、このマザーボード用の最新のBIOS に更新してみることにしました。 すると、更新はうまくいったような感触なのですが、PC が起動できなくなってしまいました。

BIOS アップデート失敗からの回復

Intel のマザーボード DZ77SL-50K のBIOS(2012/11/21 SLZ7710H.86A version 0091) の更新に失敗したようで、PC が起動できなくなりました。

経緯としては、Windows 上から実行できるexe 形式のBIOS アップデートユーティリティ SLZ7710H.86A.0091.EB.WINPE64.EXE を用いました。 ボタンをマウスでクリックするとPCが再起動し、起動時にBIOS がうまく更新されたように見えました。
その後の再起動後、オンボードのHDMI 端子に接続した液晶モニタには全く画面が 表示されません。OSも起動されません。 オンボードで圧電スピーカが搭載されてますが、この時にビープ音はありません。 しばらくすると勝手に再起動するのですが、同じことが延々と繰り返されます。

このマザーボードの英語マニュアルをIntel のWeb サイトから入手できます。 それによると、BIOS Setup Configuration ジャンパを抜いて、BIOS の.BIO 形式ファイルをルートディレクトリに置いたCD-R やUSB フラッシュメモリからリカバリできるようです。自力でUSBフラッシュ読むんだ。 これらはbootable でなくてもよいとあります。

INTEL のサイトから2012/11/21 版のSL0091.BIO をダウンロードしてUSB フラッシュメモリのルートディレクトリに置き、 ジャンパを抜いてPCを起動すると画面が映るようになり、何もしなくてもBIOS が自動で読み込まれました。 停止してジャンパを元に戻してBIOS の設定が問題ないこととOS を起動できることを確認。見事リカバリに成功しました。 BIOS 飛ばしても、なんとかできるようになってるんですね。

2012/09/02(日)

ホームネットワークでDLNA連携

先日組んだWindow7 機 にはスピーカを接続していません。
音を出せるように、まずアクティブスピーカの購入を検討しました。 BOSE のComputer MusicMonitor とかすごくよさそうなのですが、 4万円近くするのでまだ買わず検討を継続。

ところで、Windows7 はDLNA 等のホームネットワークマルチメディア対応がXP より進んでいることを思い出しました。このPCはリビングに設置しており、DLNA に対応したSONY のテレビKDL-22EX300 やPlayStation3 があり全て有線イーサネットでつながってます。 これらとの連携を実験してみました。

最初にWindows MediaPlayer(Ver 12.0.7601.17514)を起動し、「ストリーム」 プルダウンにある「ホームメディアへのインターネットアクセスを許可する」 をクリックすると、オンラインIDをリンクするだとか、その先にはWindows ユーザーアカウントにオンラインID をリンクするとかといった手続きが控えており、 何かやりたいこととは違う気がします。これはパス。
これは違う

次に、キャプチャして保存した動画ファイルを右クリックすると「リモート再生」 のメニューの中にネットワーク上のDLNA 対応のテレビが選択肢に現れるではありませんか。
テレビへ動画をスロー

それを選択すると、なんと地上波を受信していたテレビをハイジャックして 元の動画がテレビ上でリモート再生されました。 DLNA のThrow というやつでしょうか。 かなり簡単です。量販店とかでいたずらされないのか心配になってしまいます。 この方法による再生では、動画の画質はかなりダウンしているようで残念です。

PS3 の方はクロスメディアバーから「ビデオ」のメニューを確認すると、 「Windows Media Player」のアイコンでWindpws7 がDLNA サーバとして認識されてました。
PS3 にMediaPlayer のアイコンが出現

しかしそれをクリックしても、何かエラーになります。 サーバー側で設定が必要なようです。
MediaPlayer 側で「ストリーム」 のプルダウンメニューからネットワークを「ローカルネットワーク」へ設定し、 詳細はもうわからなくなりましたがいくつか設定をすることでPS3 上からWindows7 上のコンテンツにアクセスできるようになりました。 動画の画質も満足できます。

PS3 はSHARP の42inch のテレビに接続しているのですが、このテレビはDLNA に対応していません。 単体でDLNAに対応しているもう1台のテレビ(=さっきから登場しているKDL-22EX300) のメニューにはWindows7 のDLNAサーバアイコンが現れなかったのですが、 「設定」→「通信設定」→「接続サーバー診断」で検索すると検出でき、「ビデオ」 のメニューに現れるようになりました。PS3ではこれが自動検出だったようです。


2012/08/29(水)

Cygwin のemacs 24.1

Windows 7(64bit版) ではMule for Windows 2.3 は古すぎてうまく動かないようです。
代替手段を検討しました。

私のemacs の利用方法はちょっと特殊で、コマンドプロンプト(cmd.exe) の中でコンソールモード(-nw 引数で起動) で利用します。Windows NT4.0 の頃から15年以上このように利用してきたからです。 日本語入力はWindows のIMEです。

あれこれ試してみたところ、Cygwin で配布されているemacs-24.1 で期待する動作をさせることができました。

コマンドプロンプトからCygwin のemacs を起動するために、Cygwin のbin やusr\bin を環境変数PATH に通します。 また、 日本語入力の際に入力した文字列の末尾が文字化けしてしまうことを避けるため、 環境変数LANGja_JP.sjis に設定します。 .emacsファイルには次の設定を記述しました。 dired でグループ名の文字化けを逃げるためや「f」 によるファイルオープンができるようにするための設定も入れてます。

(set-language-environment "Japanese")
(set-default-coding-systems 'sjis)
(set-terminal-coding-system 'sjis)
(set-buffer-file-coding-system 'sjis)
(set-keyboard-coding-system 'sjis)
(modify-coding-system-alist 'process "" 'sjis)

; to avoid dired problems
(add-hook 'dired-load-hook
   '(lambda ()
       (setq dired-listing-switches "-Gglha")
    )
)

emacs の起動は「emacs-nox -nw ファイル名」です。

emacs 24.1 日本語の様子
emacs 24.1 dired の様子

2012/08/19(日)

小型液晶モニタ On-Lap1302

リビングのコタツで利用するデスクトップPC用に、小型の液晶モニタを購入しました。 TEKWIND 社の On-Lap1302 という製品で、秋葉原のヨドバシカメラで15,800 円でした。

On-LAP1302

写真のキーボードはLENOVO のトラックポイント付きUSBキーボード(SK-8855) になります。

13.3インチのTN液晶でWXGA(1366x768)の解像度があります。 HDMIとアナログVGAによる入力が可能で給電はUSB経由です。 スピーカーはついてないので音は鳴りませんが、HDCP に対応しているので店頭ではPS3に接続されてデモをしていました。

ノートPCの液晶の横に装着して、デュアルモニタにする利用法も提案 (というか、これがメインの利用法なのかもしれない) されていて、 その場合は写真の金具を付属の両面テープでノートPCの液晶側にはるようです。 (ヒンジが硬めなので、開け閉めの時に両面テープがはがれないかな?)
小さい方の写真は液晶の裏側で、右横がヒンジ部分です。180度回転します。

ノートPCにつける金具 ヒンジの様子

HDMI・(給電用)USBケーブルの長さは約90cm です。 PCまで届かないので、次のようなHDMI メスメスの中継アダプタで延長しました。 USBの方は延長ケーブルが普通に市販されてますね。

HDMIの中継アダプタ

実際の使用感ですが、視野角による映り具合の変化が大きい(ただし、 輝度を下げると低減)ことと、付属のスタンドの安定感がなく今ひとつです。 ケーブルが角の部分から出るので、引き回しに注意しないと中で断線しそうです。 ケーブルは液晶側のコネクタが独自仕様なので、 断線するとメーカーから直接売ってもらうしかなく残念です。 それ以外はHDMI接続でこのサイズでこの解像度の液晶ディスプレー製品はないはずで まあ画面は映るので貴重な製品だと思います。

2012/08/13(月)

Norton 先生、Mule を削除する!

Windows XP のhosts ファイルを変更するために、15年以上愛用している Mule for Windows 2.3 で編集し、save しようとしたところ、Norton Internet Security 2012 のSONAR が誤認識しやがって、mulent.exe を勝手に削除されてしまいました。環境壊すな。脱力。今後はmule2 を対象から除外するようにNorton を設定。

SONAR はウィルス定義ファイルではなく、 プログラムの振る舞いを見て未知のウィルス/ワームを抑制する機能のようです。
バルーンTips 風の窓で画面の右下にメッセージが出たから誤検出されたとわかりましたが、 バルーンTips をdisable している環境ではHDD からファイルが消えたように見えるかもしれません。 あるいはファイルが減っていることすら気づかないかも。

2012/07/24(火)

Apache のhtpasswd とhtdigest

Apache でBASIC認証する場合、htpasswd を実行してパスワードファイルを作成し、ユーザを登録します。 --help で確認できるように、htpasswd には次のようなオプションがあります。

-cBASIC認証用のパスワードファイルを新規に作成する
-D 指定ユーザをパスワードファイルから削除する
-b パスワード文字列をキーボードではなく、引数から受け取る
-p パスワードをプレインテキストで保存する(デフォルトはMD5)
-s パスワードをSHA ハッシュ形式で保存する(デフォルトはMD5)

既存ユーザのBASIC認証パスワードを変更したい場合はオプション無しで パスワードファイルとユーザ名を引数に与えてhtpasswd を実行します。変更する前の現在のパスワードは聞かれないため、 ユーザにssh でログインさせて自由に変更させられない問題があります。
また、既存ファイルが存在するのに「-c」でBASIC 認証ファイルを新規作成しようとすると、 警告なしの問答無用で既存ファイルが失われます。

DIGEST 認証の場合、ハッシュではなく復元できる形式でパスワードを保存しないと うまくいかないのではないか、DIGEST 認証のパスワードファイルは危険ではないかと 思ったのですが、ソースを確認したところ「ユーザ名:レルム名:パスワード」という 文字列をMD5 でハッシュ化したものが保存されていました。
なので、次のコマンドラインでhtdigest が作成するファイルの第3 項目と同等のハッシュ文字列を生成することが可能です。

/bin/echo -n ユーザ名:レルム名:パスワード | openssl dgst -md5

改行を抑制するために「-n」オプションが必要で、 それを使うためにはシェル組み込みのecho ではなく、/bin/echo を明示的に呼ぶことがポイントです。

htdigest のオプション引数はファイルを新規に作成する「-c」しかありません。 実はいろいろオプションがあるのでは、とソースを見たのですが、本当に-c しかないようです。 パスワードファイルからユーザを削除するには、エディタで該当ユーザを手動削除 する方法が一般的ですが、ソースを見ててアルゴリズム的に htpasswd の-D は、htdigest が作成するファイルにも適用できることに気づきました。

htpasswd -D (htdigestで作成したファイル名) (削除したいユーザ名)

でDIGEST認証のファイルからユーザを削除できます。 なんか間違いそうで少し怖いですね。 htdigest_del_user.sh とかにラッピングしとくとよさそうです。
あ、1つのファイルに同じユーザ名で複数のレルムでユーザ登録している場合、 レルムを問わず指定ユーザが全て削除されるので要注意ですね。

ユーザ名文字列に「:」を含む場合、htdigest でユーザは作れてしまいますが、 このユーザは有効なのかな? htpasswd の-D で削除はエラーになります。


2012/07/18(水)

Android のバックアップの気持ち悪い点

Google のAndroid ってひょっとして裏でこっそり無線LAN のパスワード送ってんじゃないか、と不安に思ってたのですが、なんと、 本当に送られてました

Android 端末は「データのバックアップ」の設定があります。 画面の説明では、 「アプリケーションのデータ、Wi-Fiパスワード、その他の設定をGoogle サーバーにバックアップする」とあります。記憶がないのですが、勝手にON になってました。その他の設定という言葉にひとくくりにするのではなく、 潔くはっきりとWi-Fi パスワードと明記されちゃってます。

Wi-Fi パスワード送られるの気持ち悪くないですか? バックアップ先、SDカードじゃダメなの?(私のAndroid WALKMAN にはSD ささらないけど)

仮想SD領域にあるメモ帳データの中に、出入りしているビルの休日深夜の暗証番号 とか書いてあるんだけど、こういうデータも勝手に送られたんだろうか。
Google のバックアップサーバをクラッカーがクラックすると 宝の山で優先順位の高いターゲットにならないだろうか。

このページはGoogle の検索でかからなくなるんではないだろうか。


ユーザ作成支援スクリプト

Linux(CentOS 5.8)でsamba とWebDAV(SVN) を利用しています。 ユーザを登録する場合、Linux のユーザ、samba のユーザ、WebDAV のユーザを登録します。 ユーザは多くはないのですが、 同じID・パスワードで何種類も作成するのが面倒でユーザ作成シェルスクリプト を作成したのでここに張っておきます。
Windows 上でCygwin で動作確認しながら、最後にLinux 上で調整しました。
ユーザをある特定のグループに所属させたい場合はGRPNAME=users のところを修正してください。
最近はsamba のユーザはpdbedit というコマンドで管理するんですね。

#!/bin/bash

# "create_user.sh" user create script
#

LOGFILE=create_user.log
WORK_BASE=/cygdrive/c/tmp
if [ ! -d ${WORK_BASE} ]; then
  WORK_BASE=/var/log/
fi
LOGFILE=${WORK_BASE}/${LOGFILE}
GRPNAME=users
DIGEST_PASS_FILE=/etc/httpd/apache_svn_user.htdigest
BASIC_PASS_FILE=/etc/httpd/apache_svn_user.basic

function f_infolog {
  echo "$1" >> ${LOGFILE}
  echo $1
  return 0
}

function f_tstamp {
  /bin/echo -n  "[`/bin/date '+%Y-%m-%d %H:%M:%S'`] " >> ${LOGFILE}
  return 0
}

function f_errlog {
  f_tstamp
  f_infolog "$1"
  return 0
}

function f_abend {
  f_errlog "__ABEND__ $1"
  exit $2
}

function f_chk_linux_user {
  /usr/bin/id $1 > /dev/null 2>&1
  fresult=$?
  if [ $fresult == 0 ]; then
    return 0
  fi
  return 1
}

function f_chk_linux_password {
  dgst=`/bin/grep $1 /etc/shadow | /usr/bin/cut --delimiter=: -f 2 | \
  /usr/bin/wc --bytes`
  if [ ${dgst} -gt 5 ]; then
    return 0
  fi
  retun 1
}

function f_chk_samba_user {
  /usr/bin/pdbedit -u $1 > /dev/null 2>&1
  fresult=$?
  if [ ${fresult} == 0 ]; then
    return 0
  fi
  retun 1
}

function f_chk_digest_user {
  chk_user=`/bin/grep $1 ${DIGEST_PASS_FILE} | /usr/bin/wc -l`
  if [ ${chk_user} -gt 0 ]; then
    return 0
  fi
  retun 1
}

function f_chk_basic_user {
  chk_user=`/bin/grep $1 ${BASIC_PASS_FILE} | /usr/bin/wc -l`
  if [ ${chk_user} -gt 0 ]; then
    return 0
  fi
  retun 1
}

if [ ! -O /bin/su ]; then
  echo "no enough privilege(needs root)"
  exit 100
fi

f_infolog "-------------------------------"
f_tstamp
f_infolog "`/bin/basename $0` for $1 start"

username=$1
password=$2

if [ ${username}XX == XX ]; then
  f_abend "username missing as argument" 101
fi

if [ ${password}XX == XX ]; then
  f_abend "password missing as argument" 102
fi

echo -n "0) create user [${username}]  OK [y/n] ? "
read ANS

if [ ! ${ANS} == y ]; then
  echo "bye"
  exit 0
fi

echo
echo -n "1) create linux user [y/n] ? "
read ANS

if [ ${ANS} == y ]; then
  /usr/sbin/useradd -g ${GRPNAME} -s /bin/bash -m -d /home/${username} ${username}
  result=$?
  if [ $result != 0 ]; then
    f_abend "useradd error" 110
  fi

  f_chk_linux_user ${username}
  result=$?
  if [ $result != 0 ]; then
    f_abend "useradd check error" 111
  fi
  
  f_tstamp
  f_infolog "created linux user [${username}]"
fi

echo
echo -n "2) create linux password [y/n] ? "
read ANS

if [ ${ANS} == y ]; then
  /usr/bin/expect -c "
  set timeout 20
  spawn /usr/bin/passwd ${username}
  expect ssword:\  ; send \"${password}\r\"
  expect ssword:\  ; send \"${password}\r\"
  interact
  "
  result=$?
  if [ $result != 0 ]; then
    f_abend "passwd error" 112
  fi

  f_chk_linux_password ${username}
  result=$?
  if [ $result != 0 ]; then
    f_abend "linux passwd check error" 113
  fi
  f_tstamp
  f_infolog "created linux password for user [${username}]"
fi


#
# <add new user>
#   pdbedit -a -u user
#
# <delete user>
#   pdbedit -x user
#
# <change passwd>
#   smbpasswd user

echo
echo -n "3) create samba password [y/n] ? "
read ANS

if [ ${ANS} == y ]; then
  /usr/bin/expect -c "
  set timeout 20
  spawn /usr/bin/pdbedit -a -u ${username}
  expect ssword:; send \"${password}\r\"
  expect ssword:; send \"${password}\r\"
  interact
  "
  result=$?
  if [ $result != 0 ]; then
    f_abend "pdbedit error" 114
  fi

  f_chk_samba_user ${username}
  result=$?
  if [ $result != 0 ]; then
    f_abend "samba user check error" 115
  fi

  f_tstamp
  f_infolog "created samba password for user [${username}]"
fi

echo
echo -n "4) create SVN password (BNASIC) [y/n] ? "
read ANS

if [ ${ANS} == y ]; then
  /usr/bin/expect -c "
  set timeout 20
  spawn /usr/bin/htpasswd ${BASIC_PASS_FILE} ${username}
  expect ssword:  ; send \"${password}\r\"
  expect ssword:  ; send \"${password}\r\"
  interact
  "
  result=$?
  if [ $result != 0 ]; then
    f_abend "htpasswd error" 116
  fi
  f_chk_basic_user ${username}
  result=$?
  if [ $result != 0 ]; then
    f_abend "SVN user check error" 117
  fi

  f_tstamp
  f_infolog "created apache SVN password for user [${username}]"
fi

echo
echo -n "5) create SVN password (DIGEST) [y/n] ? "
read ANS

if [ ${ANS} == y ]; then
  /usr/bin/expect -c "
  set timeout 20
  spawn /usr/bin/htdigest ${DIGEST_PASS_FILE} \"SVN Server\" ${username}
  expect ssword:  ; send \"${password}\r\"
  expect ssword:  ; send \"${password}\r\"
  interact
  "
  result=$?
  if [ $result != 0 ]; then
    f_abend "htdigest error" 118
  fi
  f_chk_digest_user ${username}
  result=$?
  if [ $result != 0 ]; then
    f_abend "SVN user check error" 119
  fi

  f_tstamp
  f_infolog "created apache SVN password for user [${username}]"
fi


f_tstamp
f_infolog "$0 normal_end time $SECONDS sec"
f_infolog "."

パスワードをコンソール入力するコマンドと対話するためにexpect を利用しています。 入ってない場合、CentOS ではyum install expectで入れてください。 使い方は、上のスクリプト名がcreate_user.sh とすると root 権限でcreate_user.sh ユーザ名 パスワードです。 質問にy かn で答えていくと、必要なユーザを作成します。
(スクリプトの改行コードがCR LFだと実行できないのでLFにしてください)

Linux ユーザを作成し、Linux パスワードは作成しない場合、 そのユーザはsamba やWebDAV(SVN) は利用できますが、Linux 自体へのログイン(ssh やコンソール)はできなくなります。

DIGEST 認証でWebDAV ユーザを作成する場合、上の「SVN Serever」 の文言は適切なレルム名に変更してください。

samba はxinetd で起動

昔samba をたてた時、ユーザやグループを新規に追加しても、 デーモンとして起動済みのsamba は追加されたユーザを認識できず、samba を再起動する必要がありました。 利用者がいると再起動できない場合があるので、ユーザを追加すると深夜に再起動を 予約(at コマンドを利用)し、確実に利用できるのは翌日から、 といった不便がありました。

これを解決するために、今回はsamba をデーモン起動するのではなく、リクエスト毎に xinetd で起動するようにしました。

/etc/xinetd.d/へ次の内容でnetbios-nsnetbios-ssn を設置し、xinetd を再起動でOK でした。 あ、xinetd は入ってなかったので、yum install xinetdで入れました。

# default: off
# description: samba nmbd
service netbios-ns
{
	disable	= no
	socket_type     = dgram
        protocol        = udp
	wait            = yes
	user            = root
	server          = /usr/sbin/nmbd
	log_on_success  =
        flags           = NOLIBWRAP
}


# default: off
# description: samba smbd
service netbios-ssn
{
	disable	= no
	socket_type     = stream
        protocol        = tcp
	wait            = no
	user            = root
	server          = /usr/sbin/smbd
	log_on_success  =
        flags           = NOLIBWRAP
}


2012/07/17(火)

stone

POP3 サーバへのアクセスを中間のサーバで中継する必要があり、Linux(CentOS 5.8) 上でフリーソフトの stone(仙石 浩明さん作) を利用させてもらってます。 POP3 のプロキシーというのははじめてやったのですが、 15名程度のユーザーで安定して動作しています。

stone はソースからmake linux でコンパイルし /usr/local/bin/ へ置きました。 次の設定を/etc/rc.d/rc.local ファイルの末尾へ追記し、OS 起動時にstone を常駐させてます。

# for POP3 proxy by S.Komatsu
#  -a  specify access log file
#  -l  use syslog for error log
/usr/local/bin/stone -a /var/log/stone/access.log \
-l (POP3 サーバのIPアドレス):110 110 &

アクセスログは-a 引数で指定したファイルへ出力しています。
CentOS ではログを自動でローテートするためにlogrotate が入ってます。 stone のログをローテートするために/etc/logrotate.d/stone を新規に作成し、vi で次のように設定しました。

/var/log/stone/access.log {
    sharedscripts
    weekly
    rotate 12
    create 0644 (ここにファイルのオーナを指定)
    compress
    missingok
    notifempty
    postrotate
      /usr/bin/killall -HUP stone > /dev/null 2>/dev/null || true
    endscript
}

ログをローテートした際にstone に通知する必要があり、最初はkillall で stone を終了して新規にstone を起動していたのですが、 何故かうまくいきませんでした。

ソースを確認したところ、stone もSIGHUP を送るとログを開き直すようなので、 killall -HUP stone でSIGHUP シグナルを送るようにしてうまくローテートできるようになりました。

上の設定の中で、sharedscripts はローテート対象として複数のログファイルを指定する場合に、 前後で起動するスクリプトをログファイルごとではなく、 全体で1回だけ起動する設定です。 上の例ではログファイルは1つだけなので、なくても同じになります。

stone のアクセスログに不審な文字列が多数出力されるので驚いて調べたのですが、 /etc/services でクライアントのポート番号から対応する名前を引いて出しているようです。
ほとんどのポートに名前がついていて、それが出てくるわけですね。 ユーザが様々な受信IDでPOP3 サーバにアタックしているのか、とびっくりしました。


2012/07/15(日)

sendmail で送信先を限定する設定

メールの送信を中間のサーバで中継し、 その際に送信先を特定のドメインに限定する必要があり、調べたところsendmail で簡単にできることがわかりました。

(メーラ)→(中継サーバ: sendmail)→(SMTPサーバ: sendmail)

以下、CentOS 5.8 での話になります。 /etc/mail/mailertable ファイルに次のように中継してもよい宛先と、それ以外はエラーにする設定をします。

localhost local:
.example.com smtp:<中継先SMTPサーバのFQDNを設定>
. error:5.7.1:553 Relaying denied

上の設定例では*.example.com 宛てのメールのみ中継し、それ以外へ 送信しようとすると中継を拒否してメーラへエラーが返ります。
* の部分はかならず1以上である必要があります。daresore@example.com のように、 サブドメインがあて先に入らない場合は「.example.com」ではなく、「example.com」 のように先頭に「.」をつけないように注意します。
sendmail が出力する/var/log/maillog に利用状況のログも記録される ので、正規のSMTPサーバへssh ログインする権限がなくても、 中継サーバの管理者権限があれば利用状況を監視することができます。

mailertable を利用するためには、/etc/mail/sendmail.mc へ次の設定を追加する必要があります。

  :
  :
FEATURE(`access_db', `hash -T -o /etc/mail/access.db')dnl
  :
  :
FEATURE(`mailertable', `hash -o /etc/mail/mailertable.db')dnl
  :
  :

なお、インターネットサービスプロバイダが提供するSMTPサーバへ中継する 場合などで、ポート25ではなく、587(サブミッションポート)へ接続する必要が ある場合は、sendmail.mc に 次の内容を定義した上で、
define(`confRELAY_MAILER_ARGS',`esmtp')
define(`RELAY_MAILER_ARGS',`TCP $h 587')

mailertable ファイル中の「smtp:」を「relay:」に変更するとうまくいく 場合があるようです。
(もちろん、SMTP認証も求められる場合、その設定も必要となります)

その他、メール中継サーバとして必要な設定を記述して/etc/mail/ ディレクトリでmake sendmail.cf を実行するとsendmail.cf が自動生成され、/etc/init.d/sendmail restart でsendmail を再起動すると設定が有効になります。

中継サーバによる送信先の限定は、メール送信を機能に含むシステム開発の テストで送ってはならない宛先へメールが行ってしまう 誤送信を防止するためにも非常に有効だと思います。

開発中システムのサーバ設定に本物のSMTP サーバを直接指定するのではなく、 中継サーバをたててそこへメール送信を向けるように設定し、 中継サーバで送信先を自社に限定(それ以外は中継を拒否) すれば本番データのマスク漏れ等のために お客様へメールを送信してしまう誤送信の事故を防止できそうです。
中継サーバであれば、正規のメールサーバの管理者権限がなくても設定可能です。


2012/07/13(金)

TortoiseSVN はDIGEST 認証のWebDAV に接続できない

Apache のWebDAV でSubversion のサーバをたてました。
認証はBASIC認証ではなく、セキュリティに優れるDIGEST 認証を用いるよう設定 しました。すると、eclipse のプラグインからは接続できるのですが、TortoiseSVN からは接続できない問題が発生しました。

現在のTortoiseSVN v1.7.7 はWebDAV に対してBASIC 認証を用いて接続する必要があるとわかりました。 仕方がなく、認証をBASIC 認証へ変更したところ、TortoiseSVN からも接続できるようになりました。 SVN(WebDAV) のユーザは全て再作成しました。


2012/07/12(木)

Cygwin のbash シェルスクリプト

WindowsXP にCygwin を入れて利用しているのですが、ふとbash スクリプトを実行できるのだろうか、と試したところ、普通にWindows 上でシェルスクリプトを動かせることがわかりました。 ただし、シェルスクリプトの改行コードはCR LF ではなくLF である必要がある点は要注意です。

いろいろいじっているうちに、スクリプトの中からCygwin のコマンドだけではなくWindows 側のプログラムを呼び出せるだろうか、 と疑問に思いました。 具体的にはJava VM(JRE: java.exe)でJava で書いたプログラムをCygwin 上のbash シェルスクリプトから起動したいと考えました。

結論としては、可能でした。
ただ、スクリプトの中でjava クラスの起動引数にファイルのパスを渡す場合に /cygdrive/c/といった 変換パスが渡される場合があるので、それをJava の中でWindows 上のパスへ変換する処理が必要となりました。


2012/07/11(水)

Apache でSSLだけをlisten する設定

Apache でSSLサイトをたてる場合で、tcp ポート443 は使うけど80 は不要な場合、 httpd.conf の「Listen 80」をコメントアウトすればOK です。


2012/01/04(水)

実家でのAndroid 無線LAN接続

年末年始に実家へ帰省しました。
実家の無線LANにAndroid WALKMAN Zシリーズを接続するために、まずノートPCを有線LAN で接続して管理用Web にアクセスしたところ、どうやらAOSS は利用していない様子でした。

無線LANルータ本体横のシールにSSIDや接続key が書かれていたので、 それをAndroid 側に設定したところつながりました。

BUFFALOから
AOSS 接続アプリがAndroid マーケットに無償で公開されていたので事前にインストールして帰省したのですが、 利用する機会がありませんでした。


Android GMail とTwitter の通信はSSL

Android WALKMAN Zシリーズ(NW-Z1070)がAndroid(v2.3.4) 標準のGMail アプリとTwitter の公式Android アプリにて通信に用いるプロトコルを確認したく、 無線LANルータ(ブリッジモード)とルータの間にポートミラーリング機能を持つ ハブ(PCi S-0116FF) を挟み、Wireshark でモニタしてみました。

確認したところ、GMail もTwitter もhttps で通信していました。
パブリックな無線LANでも安心してよさそうです。



メインメニュー へ戻る