fetchmail/procmail

せっかく,dovecot でサーバを立てたので,分散しているメールを集約してみる試み.
dovecot の設定は,こちらを参照のこと→dovecotの設定 | hadacchi blog

準備

dovecot が maildir を使って動いている環境は準備すること.
ここに,何らかの手段で pop したメールを振り分けて入れれば終わり.
自動的にポーリングし,フィルタしてローカルの Maildir に配送する手段は,わりと限られている.
今回は,かつて使っていた fetchmail/procmail を使うことにした.
他の選択肢としては,getmail を使う方法もあるけど,今回の場合はどちらにせよ procmail の設定が必要なので,わざわざ mua を変える理由がなかった.
もっと無駄だけど簡単なやり方としては,Sylpheed みたいな mua を使って pop したメールを振り分け機能で振り分けても同じことはできる.
他にも,とにかく pop する機能がついていれば,何でも良い.

fetchmail の設定

ちゃんとドキュメントを読めば,結構簡単に設定できる.
man の他は,ここを参考にした → fetchmailrc - 揮発性のメモ
というか,ほとんどそのまんまになってしまった.
続きの記事にも目を通しておいた方が良いかも → fetchmailrc 注意事項 - 揮発性のメモ

# 管理者
set postmaster LOCALUSERNAME

# no bouncemail エラーメールを管理者に送信する
# bouncemail    エラーメールを差出人に返送する
set no bouncemail

# デーモン時のログファイル
set logfile "/PATH/fetchmail.log"

# メールのチェック間隔(秒)
set daemon 600

# no spambounce  スパム差し戻しを返送しない
# spambounce     スパム差し戻しを返送する
set no spambounce

# -------------------------------------
defaults
  protocol pop3

  #----- サーバオプション
  # no uidl  未読チェックをサーバ側でつける (デフォルト)
  # uidl     未読チェックをクライアント側でつける
  uidl

  #----- ユーザオプション
  # keep     既読メールを削除しない
  # no keep  問い合わせ後にサーバ上の既読メールを削除する (デフォルト)
  no keep

  # flush     問い合わせ前にサーバ上の既読メールを削除する
  # no flush  既読メールを削除しない (デフォルト)
  no flush

  # no fetchall  未読メールのみの取り込み (デフォルト)
  # fetchall     全メールの取り込み
  fetchall

  # mimedecode     MIMEデコードする
  # no mimedecode  MIMEデコードしない (デフォルト)
  no mimedecode

# -------------------------------------
poll SERVERADDR1 proto pop3
        user    "USERNAME1"
        pass    "PASSWORD1"
        mda     "/usr/bin/procmail -m /PATH/SERVER1.procmailrc"

# -------------------------------------
poll SERVERADDR2 proto pop3
        user    "USERNAME2"
        pass    "PASSWORD2"
        mda     "/usr/bin/procmail -m /PATH/SERVER2.procmailrc"
        ssl

だいたいこんな感じ.
daemon モードで起動するには,fetchmail -d 600 とかする.
起動時に自動で daemon モードで起こしたい場合,root で使うなら /etc/default/fetchmail で daemon=yes とかで良いと思う.
ただしこの場合,/etc/fetchmailrc が必要.
ユーザー権限の場合,cron で @reboot fetchmail -d 600 とかするのが簡単.
.fetchmailrc は 700 に指定しておかないとエラーを吐いて動かないので注意.

久々に man 読むと,勉強になる.port という指定は古いぜ,って書かれていた.今はserviceで指定するらしい.

procmail の設定

fetchmailrc の mda で procmail を指定すると,.procmailrc とかに従って振り分けされる.
ただし今回は,宛先を見て振り分けるのが難しいので(Bcc で配送されたメールを振り分けられない),
procmail -m procmailrc_file と指定する方法を取る.
Maildir の場合,配置先の文字列の最後を「/」で終わらないといけないので注意.
procmailrc_file の例はこんな感じ.
単にサブディレクトリに突っ込む場合.

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/.INBOX.SERVER1/
LOGFILE=$MAILDIR/SERVER1.log

振り分けする場合.

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/.INBOX.SERVER2/
LOGFILE=$MAILDIR/SERVER2.log

:0 H
* ^From:.*(address1@host\.domain|address2@host\.domain)
.INBOX.SERVER2.From/

:0 H
* ^FROM_MAILER
.INBOX.SERVER2.DAEMON/

:0 H
* ^TO:.*address3@host\.domain
.INBOX.SERVER2.To/

man procmailrc とか読むと,^TO とか ^FROM_MAILER とかの正規表現が書かれているので,必要に応じてどうぞ.

Ubuntu 管理系の tips

知らんかったことをメモる.

linux-image は,新しいものを入れても古いものが残る.
apt-get autoremove で昔は消えていたが,最近は消えないらしい.
dpkg -l | grep linux-image として,出てくる 2つ前までのものは remove で消しても良いかも.
今のカーネルは,/proc/version を見るか,uname -r

apt による管理では,remove しても,設定ファイルが残る.
設定ファイルも消す時は,purge

その他の設定は,Ubuntu Server で単純にパッケージを削除しても設定ファイルは残る、残った設定ファイルを一括削除するには? | レンタルサーバー・自宅サーバー設定・構築のヒント を参考にすると良いかも.

dovecotの設定

  • apt-get install dovecot-imapd
    でインストール
  • /etc/dovecot/dovecot.conf へ listen = * を追記
  • /usr/share/dovecot/protocols.d/imap.protocol は protocols = imapがあればOK
    (dovecot 1.x とは異なり,2.x では pops とか imaps はプロトコル名として定義されていない)
  • conf.d/10-master.conf で,imaps のみ有効にしたい時は,imap-login の inet_listener imap でport=0と指定する.
    pop3 を殺す時は,inet_listener pop3-login のブロックを丸ごとコメントアウトすると共に,service pop3 のブロックもコメントアウトする.
  • conf.d/10-ssl.conf で,ssl = yes としつつ,cert,key,ca を指定する. "<" を path の直前に入れるのを忘れがちなので注意.
    ssl_key にパスワード付の鍵を使う場合,ssl_key_password で指定できる.
  • 必要に応じて,conf.d/10-logging.conf にログファイルを指定.基本的には,log_path を指定しておけばOK
  • その他,メモ
    • imapd: IMAPサーバ
    • sieve: メール振り分けの規格…らしい
    • lmtpd: メール配送プロトコル…らしい

cram-md5 を指定すると,何故かうまく動作しなかったので入れてない.md5 関連の何かパッケージが入ってないのだと思うけど,面倒くさいので放置.ssl でいいよ.

今後やりたいことは,

  • ローカルメール配送も dovecot にさせる
  • imaps 内で plain で認証かけている場合,本当に平文が流れていないかパケットキャプチャ

skkime で半角カナを入力できなくなった時の対処

skkime では、キーマップを変更してユーザー定義にすると、C-q で半角カナへ変換したり、半角カナモードに入れなくなってしまう。
参考→skkime 1.5 で [Ctrl]+[q] 問題(半角カナ)に立ち向う 仁義偉王のブログ/ウェブリブログ
まれに、(女の子に可愛い顔文字を送る時とかに)半角カナが必要になることがあるので、入力できないと困ってしまう。

というわけで、リンク先にもある方法を使えばまた入力できるようになる

レジストリを編集する。
HKEY_CURRENT_USER\Software\TT\Windows\CurrentVersion\SKKIME\1.5\Generic の MajorModeMap で、
0010行の左から2番目(0x11アドレス)の値を "59" とする。
レジストリの読込のため、ログオフ→ログオンとすることで、C-q が復活する。
(Win7の場合、プロセスを再起動してもOKだと思うけど、バックグラウンドプロセスを再起動するのがWinは面倒臭いのでオススメしない)

sshd 設定メモ

設定したものの中で知らなかったものや,設定してないけど man を読んで気になったものをメモ.
ssh v1 は使ったことないので,知らない.

設定項目 意味とか
Port セッションを受け付けるポートの指定.複数行記述することで,複数のポートで待てる.
UsePrivilegeSeparation sshの子プロセスの権限をユーザー `sshd' (yesの時) とするか,`root' (noの時) とするか.
LoginGraceTime ログインプロセスのタイムアウト.これ以上時間が経過してもユーザー名とか入れなかったら落ちる.
StrictModes 鍵の置いてあるところ (/home) の o に w 権限が付与されていたら拒否する.
RSAAuthentication ssh v1 の RSA 公開鍵認証の許可.
PrintMotd /var/run/motd の中身をログイン時に表示するか否か.yes だと表示するが,ログインメッセージが 2回表示されてしまう場合があるらしい.
TCPKeepAlive (ssh の man より)
(ClientAliveCountMax の項より) The TCP keepalive option enabled by TCPKeepAlive is spoofable.
(TCPKeepAlive の項より) Specifies whether the system should send TCP keepalive messages to the other side. If they are sent, death of the connection or crash of one of the machines will be properly noticed. However, this means that connections will die if the route is down temporarily, and some people find it annoying.
つまり,暗号化セッションの外で ack を投げる設定であって,途中経路で 1 回途絶えたら落ちて,ack の乗っ取りができるというもの.
ClientAliveCountMax (ssh の man より)
If this threshold is reached while client alive messages are being sent, sshd will disconnect the client, terminating the session. (中略) The client alive messages are sent through the encrypted channel and therefore will not be spoofable.
つまり,この数だけ ack が落ちたら切断するよ.TCPKeepAlive と違って乗っ取りされませんよ.という keepalive のこと.
ClientAliveInterval ClientAliveCountMax で言う ack が落ちる,の定義秒.
MaxStartups 認証セッションの許可数.x:y:z の形式で指定するもので,x セッションまでは 100% 受け付けるが,x+1 セッションからは確率 y で拒絶し,z セッションに達するまで拒絶率が線形に増加し,z セッションに達した後には全てのセッションを拒絶する,というパラメタ.
MaxAuthTries 1回の接続における認証のリトライ数の上限.
MaxSessions ssh は 1 接続で複数セッションを貼って通信ができ,その上限.具体的に,どのように動作に効いてくるかは不明…

あんま設定を載せたくないので,具体的にどうしてるかは秘密だけど,かなり固めに設定したと思う.
毎回,設定後に sshd を restart して,再接続を試験する時は緊張するぜ…勿論,既設のセッションは 1 つは残してテストするけど…接続できなくなった時の事を考えると怖い.

Ubuntu カスタマイズ

apt-get upgrade で出てきたパッケージ(apport)が聞いたことのないものだったので,調べたついで.
Ubuntu Server では関係ないかも知れんけど.
Ubuntu 12.04 LTS の便利なカスタマイズ方法 » Libre Free Gratis! | Libre Free Gratis!

それにしても,1分くらいで再起動してくれた我が家の Ubuntu Server 12.04 LTS … 早い.

2013/1/27 追記するよー.

apt on ubuntu

sources.list 作りはこちら → Ubuntu Sources List Generator

apt-get update のエラーについて.

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used.
GPG error: http://extras.ubuntu.com precise Releas: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 16126D3A3E5C1192
W: Failed to fetch http://extras.ubuntu.com/ubuntu/dists/precise/Release

なんか,上みたいな GPG 鍵でエラーが出たら,これ.

# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 16126D3A3E5C1192

そうしたら,普通に apt-get update が通る.

Ubuntu Server の auth.log に定期的に出力されるログ

我が家のサーバーでも、この記事とモロに同じことが起こっていた。
cron と anacron | ちりぢりな記憶の寄せ集め
もうひとつの cron | ちりぢりな記憶の寄せ集め

17分のログは記事の通りで、/etc/crontab に記載された、/etc/cron.hourly を呼び出すルーチンのログだということが分かった。
9分と39分のログも記事の通りで、/etc/cron.d/php5 に記載されたルーチンのログっぽい。
なお /etc/cron.d/php5 のログは、php5 の GC らしい。sessionとgc [wiki.catatsumuri.org]
ということで、今回は意外とあっさり分かって良かった。

WinSCP を使って Win から Linux サーバのバックアップ

前提:

  • Linux サーバを多重化したり RAID を組む予算がないために,シングル構成をとらざるを得ない.
  • Win マシン上には大事なデータがあるので多重化している.
  • Linux サーバには,SSH 公開鍵を使った入力レスの SSH セッションが疎通.
  • Win マシン上には WinSCP 導入済.

準備1 Linux サーバ

バックアップしたいパスを決定し,アーカイブを自動化.
例)cron 利用

# crontab -l
0 10 * * * rm /bkup/var.cache.bind.zip;zip -P `cat ZIPPWDFILE` -rq /bkup/var.cache.bind.zip /var/cache/bind
0 40 * * * mysqldump -u MYSQLUSER -p`cat MYSQLPWDFILE` --opt DBNAME --net_buffer_length=8000 | gzip > /bkup/mysql.sql.gz

準備2 Winマシン

  • WinSCP で動作させるスクリプトの作成.
    例)ファイル名「backup_script」とする.

    open PAMUSER@host.domain -privatekey="c:\PATH\.ssh\id_rsa.ppk"
    cd /bkup
    lcd c:\STORAGEPATH
    get var.cache.bind.zip mysql.sql.gz .\
    exit
    
  • WinSCP を呼ぶスクリプトの作成.
    例)ファイル名「backup.bat」とする.

    c:\PATH\winscp437\winscp.com /script=c:\PATH\backup_script
    

実施

  • backup.bat を実行する.

追記(Feb 13 2013)
info-zip の場合, –f オプションで差分だけ上書きできるよ!(新規ファイルの追加はなし)
更新(上書き+新規追加)したい時は,–u オプションでいいよ!
消えたファイルはアーカイブからも消したい時は,–FS オプションでいいよ!
–x オプションで除外できるよ!
除外リストでワイルドカードを使う時は,\ でエスケープしないといけないよ!

apache2 の設定メモ

毎回,OS を入れ直す度に忘れるので,今回こそはきちんとメモるぞー.
記事の趣旨が趣旨なので,この記事は随時アップデートされると思う.

前提

LAMP サーバが入った状態で Ubuntu server をインストールしたことが前提.
自分しか使わないサーバなので,mod_php5 で勘弁する.
(この後の予定) SSL 対応と,vhost 対応.←済

設定

  • dir.conf を編集して,いらん index ファイル指定を消す.
  • userdir を使うので,有効化する.
    # a2enmod userdir
    良く考えたら,VirtualHost を使うので,なくて良い気がする.
  • php5 自体は有効化されているが,userdir では無効になってるので,有効化する.
    php5.conf を開いて,userdir のディレクティブに記述されている,php_admin_value engine Offをコメントアウト.
  • directory 内のファイルリストが見えるのは困ることがあるので,デフォルトオフにしておく.
    userdir.conf の Indexes を削除.
  • 多言語対応は,userdir.conf の MultiViews を有効にしておいて,hoge.html.ja hoge.html.en とかを用意する.
    ユーザーが hoge.html にアクセスした時,その人の言語優先度に従って表示するファイルが選択される.
    更新し忘れが多発しそうなので,管理はそれなりに考えないといかんかも.
  • favicon の設定に,rewrite モジュールを使う.
    # a2enmod rewrite
    ただし,RewriteEngine を使う場合,AllowOverride FileInfoと,Options SymLinksIfOwnerMatch辺りを
    許可しておかなければならないので,要注意.
  • DocumentRoot が /var/www とかになっているため,絶対パスで / から指定しているリンクが悉く死ぬ.
    DocumentRoot を変更しても良いけど,最終的に userdir でアクセスさせないので, sites-available に VirtualHost の設定を書いた方が良い.
  • VirtualHost ディレクティブの ErrorLog は,ログ出力先.
    LogLevel は,ログ出力レベル.指定するレベルはググること.
    CustomLog は,アクセスログの出力先.
  • VirtualHost ディレクティブでは,ServerName を指定しないと apache2 が warn を吐くが,
    設定していたとしても,サーバの hostname.domainname と一致していないと同様に warn を吐く.
    設定は,/etc/hostname を FQDN で書いてしまい,networking の restart でとりあえず動く.(←動かない時は,再起動したら動いたりする)
  • ServerTokens ディレクティブや ServerSignature ディレクティブは,conf.d/security に書かれているので,この後に読まれるよう記載する.
    ServerTokens では HTTP のヘッダの出力のサーバ情報の出力を制御でき (ErrorDocument も,この制御された token を出力する),
    ServerSignature ディレクティブでは ErrorDocument 下部のサーバ情報の出力を制御できる.
  • php のヘッダー出力の抑制は,php.ini で行なう.
    /etc/php5/apache2/php.ini の expose_php を Off とする.
  • digest 認証はモジュールをロードさせないといけない.
    # a2enmod auth_digest
  • deflate モジュールでファイルを gzip 圧縮して転送できるが,転送サイズがファイルサイズより大きいことがある.
    その時は,SSI とか PHP とかで include していないか思い返してみること…
    これでハマった.
  • SSL対応。
    署名要求ファイルを当該サーバ上で生成して、証明機関に送信して証明書が作成される。
    まずは、署名要求ファイルの作成から。

    1. 秘密鍵を作成する。
      openssl genrsa -aes256 2048 > server.key

      秘密鍵は、パスフレーズで保護する。
      server.key が秘密鍵。

    2. 秘密鍵を使って、署名要求ファイルを作成する。
      openssl req -new -key server.key > server.csr
      openssl req -new -sha256 -key server.key -out server.csr # sha-2署名を要求する
      秘密鍵のパスフレーズを求められるので、入力する。
      証明書へ埋め込みたい情報の入力が求められるので、入力する。
      とりわけ、Common Name は使いたい web site のホスト・ドメイン名と一致させておくこと。
      server.csrが署名要求ファイル。
  • 続いて、StartSSL を例にドメイン名の検証 (validation) を行なう。
    詳しくは、[無料 SSL 証明書 StartSSL を使う](http://futuremix.org/2009/02/startssl)などを参照。

    1. サインアップから名前とか住所とかを登録。
    2. クライアント証明書をインストール。(次回からのログインにはクライアント認証が必須)
    3. ドメイン名検証を通過させる。独自ドメインのメールか、ドメイン登録に使っているメールの受け取り環境が必要。
  • web サーバの検証を行なう。
    1. 登録済みサブドメインの失効は有料といわれたので、ここで手順は中止。HW 交換したら、全てのキーを保存しておかんといかんなぁ。。。
    2. 別ドメインを建ててみる.
      CSR ファイルを作る画面が出てくるが,ローカルで作成しているので skip する.
    3. トップレベルドメインは,検証済のドメインを選択する.
      次にサブドメインを入力させられるので,検証させたいサブドメインを入力する.
    4. Save Certificate という画面で,crt ファイルの中身が出てくるので,
      コピーして server.crt とかのファイル名でテキストファイルにペースト.
      改行コードは LF.
    5. 同じ画面からリンクされている「intermediate」と「root」の CA certificates をダウンロードする.
  • web サーバの設定
    1. /etc/apache2/ports.conf を編集し,mod_ssl.c のモジュール設定の部分に,
      NameVirtualHost *:443
      とか書いておく.Listen が書かれてなければ,Listen 443 も書いておく.
    2. これまで準備したファイルのうち,必要なものを配置.
      /path に放り込んだとすると,次のファイルが必要.
      /path/server.key
      /path/server.crt
      /path/sub.class1.server.ca.pem (← intermediate CA Certifications)
      /path/ca.pem (← root CA Certifications)
    3. SNI を定義しているファイル (site-enabled にあると思われる) の中で,
      ssl 用の設定を書く.
      その中で,配置したファイルを指定する.ついでに簡単な雛形も載せておく.

      
              ServerAdmin     MAIL_ADDR
      
              DocumentRoot    ROOT_DIR
              ServerName      DOMAIN_NAME
              SSLEngine       on
              SSLCertificateFile      /path/server.crt
              SSLCertificateKeyFile   /path/server.key
              SSLCertificateChainFile /path/sub.class1.server.ca.pem
              SSLCACertificateFile    /path/sslfiles/ca.pem
              
                      ...
              
              
                      ...
              
      
              ...
      
      
  • 上述のままだと,apache 起動時に server.key のパスフレーズを求められる.
    自動リブートとかさせていると問題があるので,解除する.

    # openssl rsa -in  server.key.org > server.key

-- 追記
いつからか,apache2 の再起動時に,以下のエラーを吐くようになった.
いろいろと対処しているうちに名前解決が怪しいと気付き,syslog を見て原因が分かった.
ホスト名を変更した時に,旧ホスト名を現ホスト名の CNAME にしたにも関わらず,ローカルに立てている DNS の SOA レコードとか NS レコードとかもろもろを書き換え忘れていたことが原因.

httpd: apr_sockaddr_info_get() failed for hoge.hadacchi.com
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

どうやらこれは,二つのエラーを意味しているようだ.
多分
1行目:ServerName の設定がないから自分で取ろうとしたけど,うまくいかないぜ!
2行目:なんか,ちゃんとした答えが得られないから,これこれを ServerName に使うぜ!
とうことなんだろうと思う.対応とその結果を書いておく.

  • 対処1:自分の使用しているホスト名 (# hostname -f で表示されるものの FQDN) を /etc/hosts の 127.0.0.1 の別名として併記する.
    ただし,今回のように bind の設定ミスがある場合は,hostname -f でエラーが返る.

    • 結果1:1行目のエラーのみ消え,2行目の 127.0.0.1 の部分が,/etc/hosts に設定したホスト名となる
  • 対処2:(VirtualHost を使っているとしても) httpd.conf あたりに,ServerName 定義行を追記する.値は,デフォルトで使いたいサーバ名.
    通常は,最初に apache に読み込まれる VirtualHost 名.

    • 結果2:対処1をしなくても,エラーが両方消える.
      ServerName の設定が静的に記述されているので,この一連の動作自体が発生しないのだと思う.
  • 対処3:localhost に DNS サーバを立てる.
    • 対処1,2をしなくても,エラーが両方消える.

regsvr32.exe

いつも忘れてしまうのでメモっておく。

SysWOW64 は x64 上で x86 をエミュレートするための仕組み。
SysWOW64\○○.exe は x86 エミュレータ用バイナリ。

なので、C:\Windows\System32\regsvr32.exe を実行してダイアログが表示されている状態でプロセスモニタを見れば x64 の regsvr32.exe が上がっているのが確認できるし、
C:\Windows\SysWOW64\regsvr32.exe を実行してダイアログが表示されている状態でプロセスモニタを見れば x86 の regsvr32.exe が上がっているのが確認できる。