rsyncd.conf ディレクトリ除外

lsyncd でコンテンツの同期を行っていたところ大量のエラーが 😥

rsync error: some files could not be transferred (code 23) at main.c(892) [sender=2.6.8]

php のファイルアップロード処理で一時保存用のディレクトリを同期対象にしているのがエラーの原因と推測しました 💡

そこで、tmp ディレクトリを除外してみたところエラーが収まりました 🙂

ディレクトリの除外ではまったので設定をメモしておきます。

/home/hoge/syncdir/ が同期対象のディレクトリです。
その配下にある cms/tmp ディレクトリを除外します。

rsyncd.conf

[hoge]
        path=/home/hoge/syncdir/
        uid = hoge
        gid = hoge
        read only = false
        exclude from = /etc/rsyncd.exclude

そして/etc/rsyncd.exclude

- cms/tmp
- cms/tmp/*

いろいろ試行錯誤した結果この設定になりました。
これで今のところうまく除外できています。 :mrgreen:

lsyncd 便利ですね 😎

HDDの温度

前回 HDD の交換をした際に並んでいた HDD を離して設置しました。

そのおかげで?

10℃近く HDD の温度が下がりました。
ちょっとした事ですが効果大でした!

HDD temp

Software RAID 障害復旧

Software RAID のハードディスクが壊れたっぽいのでディスクを交換して RAID の復旧を行いました。

ハードディスクが壊れたっぽい、もしくはそろそろ壊れそうと思ったのはこんなメールが送られて来たからです。

Jun 30 10:55:21 ns1 smartd[3428]: Device: /dev/hdc, FAILED SMART self-check. BACK UP DATA NOW!

RAID の状態は以下のとおり正常だったのですが、早めの対処という事でディスク交換しました。

[root@ns1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hdc2[1] hda2[0]
      2096384 blocks [2/2] [UU]
 
md2 : active raid1 hdc3[1] hda3[0]
      75762432 blocks [2/2] [UU]
 
md0 : active raid1 hdc1[1] hda1[0]
      264960 blocks [2/2] [UU]
 
unused devices: <none>
  1. 準備
  2. ディスク交換をする前に現在の設定を控えておきました。

    [root@ns1 ~]# fdisk -l /dev/hda
     
    Disk /dev/hda: 80.0 GB, 80000000000 bytes
    255 heads, 63 sectors/track, 9726 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hda1   *           1          33      265041   fd  Linux raid autodetect
    /dev/hda2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hda3             295        9726    75762540   fd  Linux raid autodetect
     
    [root@ns1 ~]# smartctl -a /dev/hdc
    結果が長いので省略しました。

    それと、IDE のディスクだったのでセカンダリコントローラのマスターに接続されている事や、ディスクのジャンパーをどうすればよいのか調べておきました。

  3. RAID デバイスから /dev/hdc を削除
  4. [root@ns1 ~]# mdadm --manage /dev/md0 --fail /dev/hdc1
    mdadm: set /dev/hdc1 faulty in /dev/md0
    [root@ns1 ~]# mdadm --manage /dev/md1 --fail /dev/hdc2
    mdadm: set /dev/hdc2 faulty in /dev/md1
    [root@ns1 ~]# mdadm --manage /dev/md2 --fail /dev/hdc3
    mdadm: set /dev/hdc3 faulty in /dev/md2
     
    すると mdstat はこんな風になります。
    [root@ns1 ~]# cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hdc2[2](F) hda2[0]
          2096384 blocks [2/1] [U_]
     
    md2 : active raid1 hdc3[2](F) hda3[0]
          75762432 blocks [2/1] [U_]
     
    md0 : active raid1 hdc1[2](F) hda1[0]
          264960 blocks [2/1] [U_]
     
    unused devices: <none>
     
    さらに続けて以下を実施。
    [root@ns1 ~]# mdadm --manage /dev/md0 --remove /dev/hdc1
    mdadm: hot removed /dev/hdc1
    [root@ns1 ~]# mdadm --manage /dev/md1 --remove /dev/hdc2
    mdadm: hot removed /dev/hdc2
    [root@ns1 ~]# mdadm --manage /dev/md2 --remove /dev/hdc3
    mdadm: hot removed /dev/hdc3
     
    /dev/hdc が RAID デバイスから削除されました。
    [root@ns1 ~]# cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hda2[0]
          2096384 blocks [2/1] [U_]
     
    md2 : active raid1 hda3[0]
          75762432 blocks [2/1] [U_]
     
    md0 : active raid1 hda1[0]
          264960 blocks [2/1] [U_]
     
    unused devices: <none>
  5. ディスク交換
  6. [root@ns1 ~]# sync;sync;sync;shutdown -h now
    電源停止後ディスク交換。
  7. パーティショニング
  8. デフォルトの状態はこんな風になっていました。
    [root@ns1 ~]# fdisk /dev/ -l /dev/hdc
    last_lba(): I don't know how to handle files with mode 41ed
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
    Disk /dev/hdc doesn't contain a valid partition table
     
    で、/dev/hda と同じようにパーティションを切りました。
     
    [root@ns1 ~]# fdisk /dev/hdc
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-9729, default 1):
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-9729, default 9729): 33
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 2
    First cylinder (34-9729, default 34):
    Using default value 34
    Last cylinder or +size or +sizeM or +sizeK (34-9729, default 9729): 294
     
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 3
    First cylinder (295-9729, default 295):
    Using default value 295
    Last cylinder or +size or +sizeM or +sizeK (295-9729, default 9729): 9726
     
    Command (m for help): t
    Partition number (1-4): 1
    Hex code (type L to list codes): fd
    Changed system type of partition 1 to fd (Linux raid autodetect
    Command (m for help): t
    Partition number (1-4): 2
    Hex code (type L to list codes): fd
    Changed system type of partition 2 to fd (Linux raid autodetect)
    Command (m for help): t
    Partition number (1-4): 3
    Hex code (type L to list codes): fd
    Changed system type of partition 3 to fd (Linux raid autodetect)
     
    Command (m for help): p
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdc1               1          33      265041   fd  Linux raid autodetect
    /dev/hdc2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hdc3             295        9726    75762540   fd  Linux raid autodetect
     
    Command (m for help): a
    Partition number (1-4): 1
    Command (m for help): p
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdc1   *           1          33      265041   fd  Linux raid autodetect
    /dev/hdc2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hdc3             295        9726    75762540   fd  Linux raid autodetect
     
    Command (m for help): w
    The partition table has been altered!
     
    Calling ioctl() to re-read partition table.
    Syncing disks.
     
    そして、以下で確認しました。
    [root@ns1 ~]# fdisk -l /dev/hdc
     
    Disk /dev/hdc: 80.0 GB, 80026361856 bytes
    255 heads, 63 sectors/track, 9729 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
     
       Device Boot      Start         End      Blocks   Id  System
    /dev/hdc1   *           1          33      265041   fd  Linux raid autodetect
    /dev/hdc2              34         294     2096482+  fd  Linux raid autodetect
    /dev/hdc3             295        9726    75762540   fd  Linux raid autodetect
  9. リシンク
  10. RAID デバイスに各パーティションを追加するとリシンクします。

    [root@ns1 ~]# mdadm --manage /dev/md0 --add /dev/hdc1
    mdadm: hot added /dev/hdc1
    [root@ns1 ~]# mdadm --manage /dev/md1 --add /dev/hdc2
    mdadm: hot added /dev/hdc2
    [root@ns1 ~]# mdadm --manage /dev/md2 --add /dev/hdc3
    mdadm: hot added /dev/hdc3
     
    mdstat を見るとリシンクしている状況を確認できます。
    [root@ns1 ~]# cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hdc2[2] hda2[0]
          2096384 blocks [2/1] [U_]
          [=====>...............]  recovery = 25.7% (540800/2096384) finish=0.9min speed=27040K/sec
    md2 : active raid1 hdc3[2] hda3[0]
          75762432 blocks [2/1] [U_]
            resync=DELAYED
    md0 : active raid1 hdc1[1] hda1[0]
          264960 blocks [2/2] [UU]
     
    unused devices: <none>
     
    立て続けに複数のパーティションを --add しても同時に複数のリシンクが走らないみたいです。
     
    最終的に完了すると以下のようになります。
     
    [tatsu@ns1 ~]$  cat /proc/mdstat
    Personalities : [raid1]
    md1 : active raid1 hdc2[1] hda2[0]
          2096384 blocks [2/2] [UU]
     
    md2 : active raid1 hdc3[1] hda3[0]
          75762432 blocks [2/2] [UU]
     
    md0 : active raid1 hdc1[1] hda1[0]
          264960 blocks [2/2] [UU]
     
    unused devices: <none>

    これで RAID デバイスの復旧は完了ですが、交換したディスクからも起動できるようにする為にブートローダをインストールする必要があります。

  11. ブートローダのインストール
  12.  
    [root@ns1 ~]# grub
        GNU GRUB  version 0.95  (640K lower / 3072K upper memory)
     
     [ Minimal BASH-like line editing is supported.  For the first word, TAB
       lists possible command completions.  Anywhere else TAB lists the possible
       completions of a device/filename.]
     
    grub> device (hd0) /dev/hdc
     
    grub> root (hd0,0)
     Filesystem type is ext2fs, partition type 0xfd
     
    grub> install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf
    grub> quit
     
    確認はこうするようです。
    [root@ns1 ~]# dd if=/dev/hdc bs=512k count=1 | strings
    ZRrI
    D|f1
    GRUB
    Geom
    Hard Disk
    Read
     Error
    ZRrI
    D|f1
    GRUB
    Geom
    Hard Disk
    Read
     Error
    qH*L
    sH*L
    1+0 records in
    1+0 records out

    これで復旧作業は完了です 🙂

    Software RAID はリシンク中に OS を起動してサービスをすぐに再開させる事ができて
    ダウンタイムが短くて良いですね。

    以下を参考にさせていただきました。
    大変助かりました。ありがとうございました。

    http://centossrv.com/ RAID構成ハードディスク交換

fail2ban インストール

ssh brute force attack 対策に fail2ban を試してみました。

ssh でログインを試みる攻撃が沢山来ているので、fail2ban を使って同じ IP から指定した回数以上認証に失敗した場合には、その IP からのアクセスを一定期間拒否しするようにしました。

  1. インストール
  2. # yum install --enablerepo=rpmforge fail2ban
  3. 設定
  4. jail.conf を変更しました。

    # cd /etc/fail2ban
    # cp -p jail.conf jail.conf.ORG
    # vi jail.conf

    [DEFAULT] と [ssh-iptables] の部分を変更しました。

    [DEFAULT]
    ignoreip = 127.0.0.1 10.0.0.0/24
    maxretry = 5
    [ssh-iptables]
    enabled  = true
    filter   = sshd
    action   = iptables[name=SSH, port=ssh, protocol=tcp]
               sendmail-whois[name=SSH, dest=root, sender=foo@example.com]
    logpath  = /var/log/secure
    maxretry = 5
  5. 自動起動設定
  6. # chkconfig fail2ban on
    # chkconfig --list fail2ban
    fail2ban        0:off   1:off   2:on    3:on    4:on    5:on    6:off
  7. 起動
  8. # service fail2ban start
    Starting fail2ban:                                         [  OK  ]

    起動するとログファイルができます。

    # ll /var/log/fail2ban.log
    -rw-------  1 root root 2306 May 10 10:42 /var/log/fail2ban.log

実際にアタックを受け、fail2ban が動作すると以下のようなメールが jail.conf で指定したアドレスに届きました。(アドレスなどは書き換えてあります)

Subject: [Fail2Ban] SSH: banned 111.222.333.444
From: Fail2Ban <foo@example.com>
To: root@example.com
Date: Tue, 11 May 2010 14:23:00 +0900 (JST)
 
Hi,
 
The IP 111.222.333.444 has just been banned by Fail2Ban after
5 attempts against SSH.
 
 
Here are more information about 111.222.333.444:
 
[Querying whois.arin.net]
[Redirected to whois.lacnic.net]
[Querying whois.lacnic.net]
[whois.lacnic.net]
 
% Joint Whois - whois.lacnic.net
%  This server accepts single ASN, IPv4 or IPv6 queries
 
% LACNIC resource: whois.lacnic.net
 
 
% Copyright LACNIC lacnic.net
%  The data below is provided for information purposes
%  and to assist persons in obtaining information about or
%  related to AS and IP numbers registrations
%  By submitting a whois query, you agree to use this data
%  only for lawful purposes.
%  2010-05-11 02:22:59 (BRT -03:00)
 
inetnum:     111.222/14
status:      allocated
owner:       XXXXXXX
ownerid:     XX-XX-XX-XX
responsible: XXXXXXXX
address:     XXXXX,1,2,3
address:     12345
country:     XX
phone:       +11 11 1111111
owner-c:     XXX
tech-c:      XXX
abuse-c:     XXX
inetrev:     111.222/16
nserver:     NS.example.com
nsstat:      2010XXXX AA
nslastaa:    2010XXXX
nserver:     NS2.example.com
nsstat:      2010XXXX AA
nslastaa:    2010XXXX
created:     2010XXXX
changed:     2010XXXX
 
nic-hdl:     XXX
person:      XXXXX
e-mail:      XXX@example.com
address:     XXXX 1 2 3
address:     1 XX
address:     XXXX 1 2 3
address:     1 XX
country:     XX
phone:       +XX XX XXXXXXX
created:     20010XXXX
changed:     2010XXXX
 
% whois.lacnic.net accepts only direct match queries.
% Types of queries are: POCs, ownerid, CIDR blocks, IP
% and AS numbers.
 
 
Regards,
 
Fail2Ban

また、/var/log/secure を見たところ実際に該当する IP からの ssh 認証失敗が数回(5回?)でストップしていました 🙂

これなかなか良いですね。
やられっぱなしではないというところが精神的に良いです :mrgreen:

WordPress MU と /server-status

WPMU を利用しているサイトに munin をセットアップしたところ /server-status へのアクセスができなくてはまりました。

http://example.com/server-status へアクセスすると WPMU トップページへmod_rewrite によってリダイレクトされてしまいます 😥

色々なサイトに記載されている設定を試してみましたが思うように行かず mod_rewrite 以外の方法で何とかしようか…と悩んでいたところHF164.comさんの記事を読んで解決できました 🙂

# for server-status
RewriteCond %{REQUEST_URI} =/server-status
RewriteRule ^.*$ server-status [L]

hf164さんありがとうございます、助かりました 🙂

mobileimap起動方法

起動方法を忘れるのでメモしておきます。

携帯電話から PC 宛てのメールを読めるように以前から
mobileimap を利用させていただいております。

その mobileimap が昨日突然
利用できなくなってしまいました 😥

2 つのアドレスで利用していたのですが、片方だけ利用できません 😥

調べてみたところ利用できなくなったアドレス用の mobileimap
停止してしまったのが原因と分かりました。

数年ぶりに mobileimap を起動する事になりましたが
起動方法をすっかり忘れていました 🙁

次にまた忘れないようにメモしております :mrgreen:

$ path/to/mobileimap --mobileimaprc=~/.mobileimaprc_for_addr1 -d

~/.mobileimaprc_for_addr1 はアドレス毎の設定ファイルです。

WordPress 予約投稿

WordPress の予約投稿が上手くいきませんでしたが、解決できました 🙂

ただし cron と wget が使える事が前提条件となります。

例えば blog の URL が http://example.com/myblog/ だった場合、
example.com 上で、cron から wget で以下のように wp-cron.php に
アクセスすると上手くいくようです。

* * * * * wget http://localhost/myblog/wp-cron.php 
--header="Host: example.com"

私は WordPress MU で全てのブログで予約投稿ができるように
以下のようなスクリプトを作成して cron から実行しています。
(WordPress MU 2.8.4a で実際に使っています)

#!/bin/sh
MYSQL=/usr/bin/mysql
OUT=/tmp/wp-cron.out
paths=`$MYSQL --user=DBユーザ名 --password=DBパスワード -D DB名 
-e "SELECT path FROM wp_blogs" -N -s`
 
for path in ${paths[0]}
do
wget http://localhost${path}wp-cron.php 
--header="Host: example.com" 
-O $OUT
rm -f $OUT
done

上記スクリプトに実行権(chmod +x)をつけて cron から実行しています。

* * * * * /usr/local/path/to/wpcron.sh

今のところ問題なさそうです 🙂

※ ❗ スクリプトに MySQL のパスワードなどが記述されているので注意してください
※ ❗ スクリプトは自分だけ、または管理者だけが読めるようにしましょう :mrgreen:

rock-solid

RSSリーダに登録してあったあるサイトでこんな記事を見つけました。

自分も仕事で良く CentOS のお世話になっておりまして rock-solid な OS だなと。

CentOSを使う3つの理由

いろいろな理由がありますが、多いのは以下の 3 つです。

  • Stable
  • Free
  • long-term support

頷ける結果ですね :mrgreen:

他にも RHEL をベースにしている事、互換性が高い事などがありました。

その中にいくつか ”rock-solid” というのがありまして、なんだろ?と気になりました。
辞書を見ると “石のように固い~” とか “悠然とした~” なんて書いてありました。

石のように固い OS、つまり強固で安定して信頼できるという事でしょうか?
確かにその通りですね、自分もそう思います。

CentOS いつもありがとう 🙂

sendmail nocanonify

サーバのドメインをサブドメインに変更したらメールを受信してブログ記事を
投稿する処理がエラーになってしまう現象が発生 😥

開発用のサーバなので良かったのですが 😐

調べるのに結構時間がかかってしまったのでメモ。

調べてみたところ記事投稿用アドレスにサブドメインを付けると
sendmail がサブドメインを削除していて、メールアドレスの
validate でエラーになっている事がすぐに分かりました。

原因が分かったのですぐに解決できると思い軽い気持ちで、
Google で「sendmail アドレス書き換え」などで色々と調べてみましたが
答えに辿り着く事ができませんでした 😥

そこで基本に帰ってアドレステストモードしてみました。

# /usr/sbin/sendmail -bt -C/etc/mail/sendmail.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /parse foo@sub.example.com
Cracked address = $g
Parsing envelope recipient address
canonify           input: foo @ sub . example . com
Canonify2          input: foo < @ sub . example . com >
Canonify2        returns: foo < @ example . com . >
canonify         returns: foo < @ example . com . >
parse              input: foo < @ example . com . >
Parse0             input: foo < @ example . com . >
Parse0           returns: foo < @ example . com . >
ParseLocal         input: foo < @ example . com . >
ParseLocal       returns: foo < @ example . com . >
Parse1             input: foo < @ example . com . >
Recurse            input: moblog
canonify           input: moblog
Canonify2          input: moblog
Canonify2        returns: moblog
canonify         returns: moblog
parse              input: moblog
Parse0             input: moblog
Parse0           returns: moblog
ParseLocal         input: moblog
ParseLocal       returns: moblog
Parse1             input: moblog
Parse1           returns: $# local $: moblog
parse            returns: $# local $: moblog
Recurse          returns: $# local $: moblog
Parse1           returns: $# local $: moblog
parse            returns: $# local $: moblog
2                  input: moblog
2                returns: moblog
EnvToL             input: moblog
EnvToL           returns: moblog
final              input: moblog
final            returns: moblog
mailer local, user moblog
>

※ moblog というのはブログを投稿する為の alias です

canonify2 で sub が削除されている事がわかりました ❗

そこで今度は Google で「canonify」を検索したところ情報が出てきました。

RBBTODAY

sendmail.mc に nocanonify を追加して sendmail を再起動して解決できました :mrgreen:

FEATURE(nocanonify)dnl

基本に立ち返る事が基本 ❗

SSL自己署名

久し振りに SSL テスト環境をセットアップしたので書いておきます。

証明書を作成する部分だけです。
出来上がったサーバ証明書を apache にセットするところは省略しました。

  1. 秘密鍵作成
  2. ランダムなデータを作成します。

    # openssl md5 /usr/local/bin/* > rand.dat

    秘密鍵を作成します。

    # openssl genrsa -rand rand.dat -des3 1024 > example.com.key
    56935 semi-random bytes loaded
    Generating RSA private key, 1024 bit long modulus
    ..............++++++
    ........................................++++++
    e is 65537 (0x10001)
    Enter pass phrase:
    Verifying - Enter pass phrase:
  3. CSR 作成
  4. # openssl req -new -key example.com.key -out example.com.csr
    Enter pass phrase for example.com.key:
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [GB]:JP
    State or Province Name (full name) [Berkshire]:Tokyo
    Locality Name (eg, city) [Newbury]:Minato-ku
    Organization Name (eg, company) [My Company Ltd]:example
    Organizational Unit Name (eg, section) []:HQ
    Common Name (eg, your name or your server's hostname) []:example.com
    Email Address []:info@example.com
     
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
  5. 自己署名証明書作成
  6. # openssl x509 -in example.com.csr -out example.com.crt -req -s
    ignkey example.com.key -days 3650
    Signature ok
    subject=/C=JP/ST=Tokyo/L=Minato-ku/O=example/OU=HQ/CN=example.com/emailAddress
    =info@example.com
    Getting Private key
    Enter pass phrase for example.com.key:
  7. 秘密鍵からパスフレーズを削除
  8. # openssl rsa -in example.com.key -out example.com.key_without_pp
    Enter pass phrase for example.com.key:
    writing RSA key