ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2013/10/09

z-pushとの闘い

まずは何も考えずダウンロードしてみる。

http://z-push.sourceforge.net/soswp/

# tar xzf z-push-2.1.0-1750.tar.gz
# cd z-push-2.1.0-1750
# ls
INSTALL  LICENSE  backend  config.php  include  index.php  lib  tools  version.php  z-push-admin.php  z-push-top.php

とりあえずINSTALLを読む。

サーバ要件:PHP5.1以上

ということは、PHP5.1とapacheの環境があればよいということか。

まずはDNS名(app.example.net)を用意する。

続いて鍵+証明書を作り、これをSSLサイトに食わせておく。

# openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout app.example.net.key -out app.example.net.crt

インストールは書いてある通りにやってみよう。prefixは/usr/localにしてみる。
# sudo tar xzf z-push-2.1.0-1750.tar.gz -C /usr/local/share
# mkdir /var/lib/z-push /var/log/z-push
# chown apache:apache /var/lib/z-push /var/log/z-push
# vi /etc/httpd/conf.d/ssl.conf
# httpd -t
# service httpd reload

--- /etc/httpd/conf.d/ssl.conf      (before)
+++ /etc/httpd/conf.d/ssl.conf      (after)
@@ -81,5 +81,14 @@
        AllowOverride   all
   </Directory>

+
+       Alias /Microsoft-Server-ActiveSync /usr/local/share/z-push/index.php
+  <directory /usr/local/share/z-push>
+       php_flag magic_quotes_gpc off
+       php_flag register_globals off
+       php_flag magic_quotes_runtime off
+       php_flag short_open_tag on
+  </Directory>
+
  </VirtualHost>
 </IfModule>
というわけで、予想通りはまる。
なんか言ってる。
PHP-MAPI extension is not available

調べてみたところ、一部のパッケージが足りていなかったもよう。
# yum install php-imap php-soap php-process

と思ったら、php-processはPHP5.3のパッケージなのね。
あきらめて、php-*系のパッケージを全部捨てて、php53-*をインストール。

# rpm -e php php-たくさん
# yum install php-process php

やってみたがまだ動かぬ。
php-mapiってどこにあるんだよ!!
とりあえず「php-mapi rpm」で適当に探してくる。

.....fedoraprojectに落ちてたぽい。

# rpm -ivh php53-mapi-7.0.13-1.el5.i386.rpm
エラー: 依存性の欠如:
libicudata.so.36 は php53-mapi-7.0.13-1.el5.i386 に必要とされています
libicui18n.so.36 は php53-mapi-7.0.13-1.el5.i386 に必要とされています
libicuuc.so.36 は php53-mapi-7.0.13-1.el5.i386 に必要とされています
libinetmapi.so.1 は php53-mapi-7.0.13-1.el5.i386 に必要とされています
libmapi.so.0 は php53-mapi-7.0.13-1.el5.i386 に必要とされています

ぬおー。片っ端から探していれちまえ。
# rpm -ivh libmapi-7.0.13-1.el5.i386.rpm php53-mapi-7.0.13-1.el5.i386.rpm
エラー: 依存性の欠如:
libboost_filesystem-mt.so.5 は libmapi-7.0.13-1.el5.i386 に必要とされています
libboost_system-mt.so.5 は libmapi-7.0.13-1.el5.i386 に必要とされています
libical.so.0 は libmapi-7.0.13-1.el5.i386 に必要とされています
libicalss.so.0 は libmapi-7.0.13-1.el5.i386 に必要とされています
libvmime.so.0 は libmapi-7.0.13-1.el5.i386 に必要とされています
zarafa-client = 7.0.13-1.el5 は libmapi-7.0.13-1.el5.i386 に必要とされています

えー。zarafa-clientが出てきたってことは、結局zarafaから落とした方がいいの?
でもさっきからEPELのパッケージ使ってるし….よし、ポリシーを緩めてEPEL解禁!
# rpm -ivh epel-release-5-4.noarch.rpm
# yum install php53-mapi
Dependencies Resolved
========================================================================================================================
Package                           Arch               Version                                  Repository          Size
========================================================================================================================
Installing:
php53-mapi                        i386               7.0.13-1.el5                             epel               217 k
Installing for dependencies:
boost141-filesystem               i386               1.41.0-4.el5                             epel                73 k
boost141-system                   i386               1.41.0-4.el5                             epel                25 k
libgsasl                          i386               0.2.29-1.el5                             epel               100 k
libical                           i386               0.48-1.el5                               epel               202 k
libmapi                           i386               7.0.13-1.el5                             epel               904 k
libntlm                           i386               1.0-1.el5                                epel                43 k
libvmime                          i386               0.9.2-0.1.20110626svn.el5                epel               887 k
zarafa-client                     i386               7.0.13-1.el5                             epel               1.3 M
zarafa-common                     i386               7.0.13-1.el5                             epel                22 k
Transaction Summary
========================================================================================================================
Install      10 Package(s)
Upgrade       0 Package(s)
Total download size: 3.7 M

Is this ok [y/N]: 

まぢで?そういうオチ?
とりあえず入れてみる…..入った。
気を取り直してapacheリロード。
# httpd -t
Syntax OK
# service httpd reload

とりあえず500はなくなった。

続いて、config.phpをいじって、imapバックエンドを使うように変更。
--- /usr/local/share/z-push/config.php     (before)
+++ /usr/local/share/z-push/config.php     (after)
@@ -45,7 +45,7 @@
*  Default settings
*/
// Defines the default time zone, change e.g. to "Europe/London" if necessary
-    define('TIMEZONE', '');
+    define('TIMEZONE', 'Asia/Tokyo');
// Defines the base path on the server
define('BASE_PATH', dirname($_SERVER['SCRIPT_FILENAME']). '/');
@@ -90,7 +90,7 @@
define('LOGFILE', LOGFILEDIR . 'z-push.log');
define('LOGERRORFILE', LOGFILEDIR . 'z-push-error.log');
define('LOGLEVEL', LOGLEVEL_INFO);
-    define('LOGAUTHFAIL', false);
+    define('LOGAUTHFAIL', true);


// To save e.g. WBXML data only for selected users, add the usernames to the array
@@ -185,7 +185,7 @@
*  Backend settings
*/
// the backend data provider
-    define('BACKEND_PROVIDER', '');
+    define('BACKEND_PROVIDER', 'BackendIMAP');

/**********************************************************************************
*  Search provider settings

んで、imap側のconfig.phpもいじる。
--- /usr/local/share/z-push/backend/imap/config.php     (before)
+++ /usr/local/share/z-push/backend/imap/config.php     (after)
@@ -46,13 +46,13 @@
// ************************

// Defines the server to which we want to connect
-define('IMAP_SERVER', 'localhost');
+define('IMAP_SERVER', '127.0.0.1');
// connecting to default port (143)
-define('IMAP_PORT', 143);
+define('IMAP_PORT', 993);
// best cross-platform compatibility (see http://php.net/imap_open for options)
-define('IMAP_OPTIONS', '/notls/norsh');
+define('IMAP_OPTIONS', '/tls/norsh');

// overwrite the "from" header if it isn't set when sending emails
// options: 'username'    - the username will be set (usefull if your login is equal to your emailaddress)

で、iPhone側でExchangeアカウントをセット。
やってみるが"Connection Serfer Failed."などと言って一歩も動かない。
アカウント追加時の認証チェックは通っていたぽいので、パスワード周りは間違っていないはず。。。

しかし動かず。
とりあえず、いろんなところのデバッグフラグをONにしてみる。

--- /usr/local/share/z-push/config.php (before)
+++ /usr/local/share/z-push/config.php (after)
@@ -89,7 +89,7 @@
     define('LOGFILEDIR', '/var/log/z-push/');
     define('LOGFILE', LOGFILEDIR . 'z-push.log');
     define('LOGERRORFILE', LOGFILEDIR . 'z-push-error.log');
-    define('LOGLEVEL', LOGLEVEL_INFO);
+    define('LOGLEVEL', LOGLEVEL_DEBUG);
     define('LOGAUTHFAIL', true);

--- /usr/local/share/z-push/config.php  (before)
+++ /usr/local/share/z-push/config.php  (after)
@@ -52,7 +52,7 @@
 define('IMAP_PORT', 993);

 // best cross-platform compatibility (see http://php.net/imap_open for options)

-define('IMAP_OPTIONS', '/tls/norsh');
+define('IMAP_OPTIONS', '/tls/norsh/debug');

 // overwrite the "from" header if it isn't set when sending emails
 // options: 'username'    - the username will be set (usefull if your login is
equal to your emailaddress)

しかしまだ動かない。
webでアクセスしてみても、しばらく待ってから再度認証を求められ、その直前に下記のようなログが出る。
/usr/local/share/z-push-2.1.0-1750/backend/imap/imap.php:99 imap_open(): Couldn't open stream {127.0.0.1:993/imap/tls/norsh/debug} (2)

気づいた。オレオレ証明書じゃん。
というわけで、接続オプションを変更。
--- /usr/local/share/z-push/config.php  (before)
+++ /usr/local/share/z-push/config.php  (after)
@@ -52,7 +52,7 @@
 define('IMAP_PORT', 993);

 // best cross-platform compatibility (see http://php.net/imap_open for options)

-define('IMAP_OPTIONS', '/tls/norsh/debug');
+define('IMAP_OPTIONS', '/tls/norsh/novalidate-cert');

 // overwrite the "from" header if it isn't set when sending emails
 // options: 'username'    - the username will be set (usefull if your login is
equal to your emailaddress)
まだ動かない。
imap_open()でコケると言っているが、dovecotのログがぜんぜんにぎやかじゃない。どーゆーことだ???
ということは、認証かセッション確立でこけてると予想。
imap_open()を使って直接たたいてみる。

imap_open("{127.0.0.1/tls/norsh/novalidate-cert}INBOX", $username, $password);


しっかり60秒待ってからエラーが表示された。
うーん、セッション確立の影響だなぁ。

で、下記のように変えてみた。
--- /usr/local/share/z-push/config.php  (before)
+++ /usr/local/share/z-push/config.php  (after)
@@ -52,7 +52,7 @@
 define('IMAP_PORT', 993);

 // best cross-platform compatibility (see http://php.net/imap_open for options)

-define('IMAP_OPTIONS', '/tls/norsh/novalidate-cert');
+define('IMAP_OPTIONS', '/ssl/norsh/novalidate-cert');

 // overwrite the "from" header if it isn't set when sending emails
 // options: 'username'    - the username will be set (usefull if your login is equal to your emailaddress)

StartTLSによるSSL確立ではなく、最初からSSLで突っ込むようにしてみた。
お!動いた!!



というわけで、今回の反省。
いろんな環境を整理して調査にあたる必要がありますね。
  • imapのSSL状態。 どっちが直接の原因となるかは分からないけど、iPhoneでUse SSLを有効にしてるため、もしくはdovecot.confで「protocols=imaps」としているため、のいずれかもしくは両方の理由により、imap_open()のフラグに「/ssl」が必要。「/tls」ではだめ。
  • 証明書。 自前でやる場合はそんなにお金かけてられないので、往々にしてオレオレ証明書を利用することに。dovecotから見れば、z-pushは当然普通のクライアントなので、当然証明書はチェックされます。なので、人的介入無しに証明書エラーをくぐり抜ける必要があります。
  • ログはよく観察すること! いろんなログ(今回の場合はapache/dovecot/z-push)を見ましたが、特定のログだけを見ていても気づかないことが多いです。それぞれのコンポーネントがどのように連携しているのか?イベントが発生したタイミングで、どのログが流れてどのログが流れないのか?このあたりをちゃんと考慮してログを見ると、どこの部分でエラーが発生しているかのアタリがつけやすくなります。
というわけで、おしまいっ

2013/03/04

logwatchについてるpostfixのスクリプトをちょっと直してみた

logwatchでpostfixのログをパースさせてたんですが、最近Unmatched Entriesが増えてきたので、
Unmatchedを減らすべく、既存のフィルタを改造してみました。

対象にしたのはこれ。

# rpm -q logwatch
logwatch-7.3-9.el5_6

オリジナルを直接触るのは気が引けるので、ローカル用にコピーします。
# cp -p /usr/share/logwatch/scripts/services/postfix /etc/logwatch/scripts/services/
# vi /etc/logwatch/scripts/services/postfix

というわけで、オリジナル版のフィルタとdiffを取ってみました。

# diff -u /usr/share/logwatch/scripts/services/postfix /etc/logwatch/scripts/services/postfix
--- /usr/share/logwatch/scripts/services/postfix     2011-03-31 06:57:37.000000000 +0900
+++ /etc/logwatch/scripts/services/postfix     2013-03-02 10:37:16.000000000 +0900
@@ -224,7 +224,7 @@
    } elsif (($User) = ($ThisLine =~ /^[a-zA-Z0-9]+: to=\<([^ ]*)>,(?: orig_to=\<(?:[^ ]*)>,)? .*, status=bounced .*: User unknown in virtual (alias|mailbox) table/)) {
       # another unknown user probably could combine with local unknown but again my perl is weak
       $UnknownUsers{$User}++;
-   } elsif (($Dest, $Relay, $Msg) = ($ThisLine =~ /^[a-zA-Z0-9]+: to=\<([^ ]*)>,(?: orig_to=\<(?:[^ ]*)>,)? relay=([^ ]*).*, delay=-?[0-9]+, status=bounced \(([^)]*)/ )) {
+   } elsif (($Dest, $Relay, $Msg) = ($ThisLine =~ /^[a-zA-Z0-9]+: to=\<([^ ]*)>,(?: orig_to=\<(?:[^ ]*)>,)? relay=([^ ]*).*, delay=[^ ]*,(?: delays=[^ ]*,)?(?: dsn=[^ ]*,)? status=bounced \(([^)]*)/ )) {
       # unknown user
       # $Msg = " hello "
       # print "bounce message from " . $Dest . " msg : " . $Relay . "\n";
@@ -394,6 +394,10 @@
       $UnknownWarnings{$Warn}++;
    } elsif (($Host,$Filter) = ($ThisLine =~ /RCPT from ([^ ]*\[[^ ]*\]): <[^ ]*\[[^ ]*\]>: Client host triggers FILTER (\S*)/)) {
       $HostTrigFilter{"$Host,$Filter"}++;
+   } elsif ( ($Server, $Helo) = ($ThisLine =~ /^NOQUEUE: reject: RCPT from ([^ ]*\[[^ ]*\]): 450 4.7.1 Client host rejected: cannot find your hostname, [^ ]*; from=<[^ ]*> to=<[^ ]*> proto=[^ ]* helo=<([^ ]*)>$/)) {
+      $InvalidClientHostName{"$Server"}++;
+   } elsif ( ($Server, $Helo) = ($ThisLine =~ /^NOQUEUE: reject: RCPT from ([^ ]*\[[^ ]*\]): 504 5.5.2 <[^ ]*>: Helo command rejected: need fully-qualified hostname; from=<[^ ]*> to=<[^ ]*> proto=[^ ]* helo=<([^ ]*)>$/)) {
+      $InvalidHeloName{"RCPT from $Server: HELO=$Helo"}++;
    } else {
       push @OtherList,$ThisLine;
    }
@@ -691,6 +695,40 @@
    }
 }

+if (keys %InvalidClientHostName) {
+   if($Detail >= 5) {
+      print "\n\nInvalid client hostname:\n";
+      foreach $Message (sort {$a cmp $b} keys %InvalidClientHostName) {
+         print "   $Message: $InvalidClientHostName{$Message} Time(s)\n";
+      }
+   }
+   else {
+      $n=0;
+      $mn=scalar(keys %InvalidClientHostName);
+      foreach $Message (keys %InvalidClientHostName) {
+         $n+=$InvalidClientHostName{$Message};
+      }
+      print "\n\nInvalid client hostname:\n: $mn Message(s), $n Time(s)";
+   }
+}
+
+if (keys %InvalidHeloName) {
+   if($Detail >= 5) {
+      print "\n\nInvalid HELO command:\n";
+      foreach $Message (sort {$a cmp $b} keys %InvalidHeloName) {
+         print "   $Message: $InvalidHeloName{$Message} Time(s)\n";
+      }
+   }
+   else {
+      $n=0;
+      $mn=scalar(keys %InvalidHeloName);
+      foreach $Message (keys %InvalidHeloName) {
+         $n+=$InvalidHeloName{$Message};
+      }
+      print "\n\nInvalid HELO command:\n: $mn Message(s), $n Time(s)";
+   }
+}
+
 if (keys %LocalBounce) {
    if ($Detail >= 5) {
       print "\n\nLocal Bounce:\n";

各chunkのコメントです。
1つめ
bounceした記録の書式が多少変わっていたので、オリジナルの機能を失わないように正規表現を書き足してみました。
2つめ
postfixで下記の設定をした時に出るエラーに対応してみました。
  smtpd_client_restrictions = reject_unknown_client
  smtpd_helo_restrictions = reject_non_fqdn_hostname
3つめ
2つめでマッチしたログの出力部分です。

/etc/logwatch配下に置いたスクリプトは標準のスクリプトに優先して使われるようで、
期待通りの動作となりました。

2012/06/17

OpenLDAP2.4での設定スキームの移行

「そういえばdebianも6になったし、家のサーバも上げるか」という軽い気持ちで踏み出したdebian6。 ログをちゃんと確認しなかった自分が悪いんですが、後で見てみるとopenldapが2.3から2.4ベースに変わってる。 それよりも何よりもこのslapd.dディレクトリってなんじゃ?ってことになったので、軽く調べてみると.....。

OpenLDAP Software 2.4 Administorator's Guide: Configuring slapd
The older style slapd.conf(5) file is still supported, but its use is deprecated and support for it will be withdrawn in a future OpenLDAP release.
これまでのslapd.conf(5)形式のファイルは引き続きサポートされますが、この形式の利用は推奨されず、今後のOpenLDAPのリリースの中でいずれサポートされなくなる予定です。
がーん。slapd.conf使えなくなるんか。
これはslapd.confの保険があるうちにslapd-config(5)での設定変更方法を学んでおかなくちゃならんな。

上記ページのセクション5.1に設定用ツリーの概略が書いてあります。ってさらっと書いてあるけど、自分は実際の入っている状態を見てさわらないと理解できないおこちゃまなので、触ってみてはじめて意味が分かりました。
普段利用するdcである「dc=example,dc=com」の配下ではなく、これと独立した「cn=config」をトップとするツリーが生成・利用されるようです。

ここで疑問。「/etc/ldap/slapd.d配下にあるファイルは自分でインポートする用のテンプレートなのか?」
というわけでいろいろ試してみましたよ。

# ldapadd -x -W -D cn=admin,dc=example,dc=com -f cn\=config.ldif
Result: Insufficient access (50)
# ldapadd -x -W -D cn=config,cn=admin,dc=example,dc=com -f cn\=config.ldif
ldap_bind: Invalid credentials (49)
# ldapadd -x -W -D cn=config,cn=admin -f cn\=config.ldif
ldap_bind: Invalid credentials (49)
# ldapadd -x -W -D cn=config -f cn\=config.ldif
ldap_bind: Invalid credentials (49)

無理じゃん。どんなやったって入んないじゃん。
もう一度ドキュメントを読んでみるか。
slapd.d配下のファイルは手で直接いじるな....ですか。
ということは、net-snmpにおける/var/lib/net-snmp/snmpd.confと似たイメージで、メモリ上に保持されている各種設定の退避・保存先として使われるってことなのかな。
 もひとつ。-Fオプションと-fオプションについて。
  1. -fオプションのみの場合、slapd.confを使って動作してくれる。
  2. -Fオプションのみの場合、slapd.d配下の構成を使って動作してくれる。
  3. -fオプションと-Fオプションを併用した場合、slapd.confを使って動作し、その状態をもとにしてslapd.d配下を構築してくれる。
お。3つめがいい感じ。debianだと、/etc/default/slapdのSLAPD_CONFを空にしておくと、初期値で/etc/ldap/slapd.confを使ってくれます。また、SLAPD_CONFを設定した場合、slapd.confを与えると勝手に-fオプションで、slapd.dを与えると勝手に-Fオプションで起動してくれるようです。
ただ、3つめをやるには、上記の「SLAPD_CONFが空の場合」のロジックに乗っかりつつ、SLAPD_OPTIONSで「-F /etc/ldap/slapd.d」とするのが良さそう。ひとまずは下記のような感じで起動してみましょう。

vi /etc/default/slapd
SLAPD_CONF=
SLAPD_OPTIONS="-F /etc/ldap/slapd.d"

ちゃんと起動したようです。

 4195 ?        Ssl    0:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d

この状態になったはいいけど.....まだslapd.confから離れられない。。。そもそもcn=configのツリーはどうやって見るんだ??

で、いろいろ調べてみた結果、下記のpostが参考になりました。

http://serverfault.com/questions/272125/how-do-i-install-a-new-schema-for-openldap-on-debian-5-with-dynamic-config-cn-ba

「slapd.d/cn=config/olcDatabase{0}=config.ldif にolcRootPWを追加して起動しろ」って言ってますね。やってみました。

vi slapd.d/cn=config/olcDatabase{0}=config.ldif
olcRootPW: haraheriherihara

/etc/init.d/slapd restart

ちゃんと読めました!!!やっとconfigがいじれるようになりました!!!




で、この記事を書きながら当初のAdministrator's Guideを読み直していると、こんな記述が。。。。。

5.4. Converting old style slapd.conf(5) file to cn=config format

Before converting to the cn=config format you should make sure that the config backend is properly configured in your existing config file. While the config backend is always present inside slapd, by default it is only accessible by its rootDN, and there are no default credentials assigned so unless you explicitly configure a means to authenticate to it, it will be unusable.

cn=configフォーマットへの変換を行う前に、既存の適切な設定ファイルに対してconfigバックエンドの設定をする必要があります。configバックエンドはslapdの内部で常に存在していますが、初期設定ではrootDNでしかアクセスできず、初期クレデンシャルもないため、明示的に設定しない限り利用できません。

If you do not already have a database config section, add something like this to the end of slapd.conf
database config
rootpw VerySecret


利用中の設定ファイルにまだdatabase configセクションを追加していないなら、下記のような行をslapd.confの末尾に追加してみてください。
database config
rootpw VerySecret

な、なんだってー!ちゃんと移行方法が書いてあるじゃないか!
というわけで試してみました。
  
lennyで新規にslapdを導入すると、2.4ベースではあるものの、設定パターンは2.3を踏襲するため、slapd.confベースになっています。この状態から、適当にいくつかエントリを作成し、slapcatでも見えることを確認しておきます。エントリの作成にはphpLdapAdminを使いました。検証用のエントリなので手抜きも重要。
apt-get -y install slapd phpldapadmin
slapcat

つづいて、設定の移行をしてみます。slapd.dディレクトリ自体は作らないとダメなんですね。
/etc/init.d/slapd stop
mkdir /etc/ldap/slapd.d
chown openldap:openldap /etc/ldap/slapd.d
chmod 700 /etc/ldap/slapd.d
echo database config &gt;&gt;etc/ldap/slapd.conf
echo -n "rootpw " &gt;&gt;/etc/ldap/slapd.conf
slappasswd &gt;&gt;/etc/ldap/slapd.conf
New password:
Re-enter new password:

そして起動。ちゃんとslapd.d配下に設定が展開されているのが確認できます。
/etc/init.d/slapd start

この状態でldapsearchを実行。ちゃんと見えましたね。
ldapsearch -x -w haraheriherihara -D cn=config -b cn=config -s base
Enter LDAP Password:

ここまでくればしめたもんです。slapd.confからslapd.dへの完全移行の後始末をしましょう。
mv /etc/ldap/slapd.conf /etc/ldap/slapd.conf.old
vi /etc/default/slapd
SLAPD_CONF=/etc/ldap/slapd.d
SLAPD_OPTIONS=""
/etc/init.d/slapd restart

ちゃんと動きましたか?

2010/10/07

rsyslogのタイムスタンプ

しばらく前にsyslogをrsyslogに置き換えて運用していたんですが、そのせいでawstatsがまともに動かなくなっていたようです。

普通のログだとタイムスタンプが

MMM DD hh:mm:ss

とかになってるんですが、rsyslogがタイムスタンプの標準(?)が

YYYY-MM-DDThh:mm:ss:uuuuuu[+-]zz:zz

になってるみたい。

解除するには、rsyslog.confの各ログの書式に「;RSYSLOG_TraditionalFormat」をつければ良いそうで。
サンプルをば。

mail.* /var/log/maillog

を

mail.* /var/log/maillog;RSYSLOG_TraditionarFormat

とする。

でも、高精度タイムスタンプが使えるんならその方がいいなぁ。
何とかしてawstatsに食わせるために、

sed -e 's/^\([0-9][0-9]*-[0-9][0-9]-[0-9][0-9]\)T\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\)\.[0-9]*[+-][0-9][0-9]:[0-9][0-9]/\1 \2/g'

なんて小賢しいフィルタも考えてみたんだけど、maillogconvert.plがうんともすんとも言わない。


さて、どうしたものか.....

2010/10/06

携帯宛のメールが届かない?

友達から「MLに送ったメールが1通だけ届かない」なんてメールがきた。
ログを見てみると、確かにその時間帯に着信したメールがその友達「だけ」に送信されていない。
.....なんでだ?

とりあえず分からないので、postfixをいじってみた。

main.cfに追記

transport_maps = hash:/etc/postfix/transport


transportを作成、ハッシュ化

softbank.ne.jp smtp-softbank:
ezweb.ne.jp smtp-ezweb:
docomo.ne.jp smtp-docomo:


master.cfにカスタムトランスポートを追加

smtp-softbank unix - - n - 1 smtp
-o smtp_destination_concurrency_limit=1
smtp-ezweb unix - - n - 1 smtp
-o smtp_destination_concurrency_limit=1
smtp-docomo unix - - n - 1 smtp
-o smtp_destination_concurrency_limit=1


とりあえず様子を見てみましょ。

2010/10/02

DNSサーバ、そしてお手軽セカンダリDNS

いままで会社のやつに滑り込ませていたので、ちょっと申し訳ない感じがありましたが、やっとDNSを自前運用にしました。
これでDNS/web/mailが全て自前運用になったので、やっと次のステップに進めそうです。

やったこと。
1.使っているサーバ)Centベース)にbindとbind-chrootを入れる
2./var/named/chroot/etc/named.confを編集
2-1.internalセクションの中は全部コメントアウト
2-2.keyセクションもコメントアウト(次の機会にでもいじる予定)
3.sampleディレクトリにあるnamed.*を/var/named/chroot/var/named/にコピー
4.ゾーンファイルを/var/named/chroot/var/namedに作成(命名はドメイン名.zone)
5./var/named/chroot/etc/named.confを編集
さっき作ったゾーンの設定を追記
6.起動!

ちなみに、利用しているお名前.comだと、セカンダリDNSサービスってのがあります。これはラクでいいですね。しかも、自分が利用しているサーバと全く管理形態が異なるので、同時に落ちる心配もほぼ皆無といっていいでしょうし。自分で2台もDNSサーバが用意できない方にオススメ。
ドメインNaviの手順に従って設定し、最後にネームサーバを変更して無事完了です。

というわけで、次は「完全手動ダイナミックDNS」を「ちゃんとしたダイナミックDNS」にしようと思います。

2010/08/16

apacheのコツ

apacheのコツをいくつか。

configはどこにある?

まず、プロセスを見ましょう。すると、httpdなプロセスがいくつかいるはず。
このバイナリに"-V"オプションをつけて実行してみましょう。
ファイルシステムのパーミッションに阻まれない限り、non-rootユーザでも実行できます。
すると、こんな感じの情報が出てきます。

# httpd -V
Server version: Apache/2.2.3
Server built: Apr 4 2010 17:19:54
Server's Module Magic Number: 20051115:3
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

で、何を見るべきかというと、-Dオプションに続く「HTTPD_ROOT」と「SERVER_CONFIG」を見るのです。このふたつをくっつけたところを見に行ってみると、httpd.confがいるはずです。


ここから先はソースで入れるような人には向かないかもしれませんが、RPM版apacheについていくつか。

httpd.confは初期設定を除いてできるだけいじらない

httpd.confはグローバルな設定(スコープがGlobalなconfig)に止めて、それ意外はできる限り書かないようにしましょう。
VirtualHostの設定なんて書くべきじゃありません。入れておくべきはこのぐらいでしょうか。
  • グローバルパラメータの設定
  • MPMの設定
  • モジュールの読み込み設定
  • 各種インクルード

じゃあ、それ以外はどこに書くの?


Includeを活用しましょう

それは、役割ごとにIncludeするんです。
RPM版apacheのデフォルトでは、こんな記述があります。

Include conf.d/*.conf

サーバ上のパスだと/etc/httpd/conf.d/になります。

ここにいくつかファイルがあるはずですが、不要なものは名前を変えてincludeされないようにしましょう。mod_perlを使わないのであれば、perl.confをperl.conf.offとかに変えるだけ。拡張子が".conf"のものしか読まれないので、これで充分です。

バーチャルホストについてはいろいろやり方がありますが、自分のやりかたを参考までに書いておきます。
  • conf以下にvhostsというディレクトリを掘る
  • vhostsの中に、バーチャルホストのコモンネーム.confでファイルを作成し、該当するバーチャルホストの設定を書く
  • conf.dの下にvhosts.confというファイルを作成する
  • このvhosts.confに、必要なNameVirtualHostを列記し、その下に、Includeでバーチャルホストファイルを読み込んでいく。
こうすることで、httpd.confに余計な改変を加えず、好きな順番でバーチャルホストを読み込ませることができます。
何でバーチャルの順番に気を遣うか。IPアクセスされた際に、最初に設定されたバーチャルホストが反応してしまうので、どのバーチャルホストを先頭に持ってくるかが重要なのです。


まとまりのない文章ですいません。

2010/06/10

smtp-authの認証バックエンドをdovecotにしてみる

postfixでsmtp-authを利用するのに、以前の知識ではsaslpasswdを使った認証方法しか知らなかったんですが、どうも認証バックエンドにdovecotが使えるようなので、それを試してみました。

というのも、パスワード管理をするのに、dovecotとsaslpasswdで別なのも気持ち悪いし、ましてやアカウント情報となると、これにさらにpostfixが加わるので、いちいち設定なんぞしていられない状況なわけです。
とりあえずpostfix側の設定(必要な部分)はこんな感じです。smtpd_sasl_typeでdovecotを選択し、smtpd_sasl_pathで問い合わせ先を(後で作る)dovecotのソケットに向けます。あと、 smtpd_recipient_restrictionsでちゃんと制限もちゃんとかけておかないと、儀式だけのsmtp-authになっちゃいますの でご注意(笑)。
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $mydomain

んで、dovecot.confの側はこんな感じ。ファイルソケットを作って待ち受けるのがミソですね。この環境では認証データベースをpasswdにし ているので、他の認証バックエンドを使いたい方は、適宜調整するといけるかもしれません。
auth default {
mechanisms = plain login
passdb shadow {
args = /etc/shadow
}
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}