WebDAV + SSL + SNI + SVN

WebDAV+SSL+SNIを進行中。
SSL+SNIの設定は、通常通り。
WebDAVは、

a2enmod dav
a2enmod dav_fs

とした上で、site-enabled にある記述に、SSLを行なうSNIの設定を記載。
dav_fs.conf で設定している事例を良く見るが、SNI で動かすためには VirtualHost ディレクティブで記載しないといけないので、site-enabled からリンクしているサイト設定に記載した。
なので dav_fs.conf はこんな感じで小さい。

DAVLockDB ${APACHE_LOCK_DIR}/DAVLock
DAVMinTimeout 600

で、サイト設定はこんな感じ。


        ServerName host.domain
        ServerAdmin user@domain
        DocumentRoot /webdav
        SSLEngine on
        # 他、SSLの設定とか

        
                DAV On
                Options Indexes
                SSLRequireSSL
                # 他にdigest認証とかここに書いてもいいし、.htaccessを置いてもいい
        

現在、WebDAVクライアントで動作確認済。Windowsファイルシステムから直接アクセスするのは諦めた。

今後の計画

  • DAV+SVN で、SVN over SSL を通す
  • WPのspam投稿の分析プラグインの作成
  • 最初は、WPのダッシュボードから、手動でのアク禁適用
    • 投稿をフックしてスパムフラグのあるものは別DBにも格納
    • DBには、IPを8bitずつのアドレスに分割して、格納?
    • ネットマスクの短さとspamアクセスの多さの閾値から、自動的にアクセス拒否をさせる
    • 拒否後も403のアウトプットでphpを呼び出して、投稿されたのと同じ扱いでアクセス数をカウント
    • アクセス数の増により、長いネットマスクでアク禁した複数のアドレスを統合するなど

mod_php が作ったファイルとか /etc などのバックアップ

DMZ 上のサーバーのシステムファイルを、LAN 上のマシンへバックアップしたいが、一部の一般ユーザーにアクセス権を付与していないファイルをどうバックアップするか、という話。

状況:

  • サーバーへ、root ログインなどさせたくない
  • クライアント側からユーザー権限でアクセスして rsync を走らせるのでは sync できない。
  • DMZ のサーバーなので、サーバーからLAN へのアクセスをさせたくないため、sudo つきのコマンドを cron で回すわけにも行かない

やったこと:

  • apache2 の実行ユーザーのグループへバックアップユーザーを追加し、php で作成されるファイルにはグループ向けの読み込み属性をつけておく。
  • root の cron で、システム設定ファイル等のバックアップをバックアップユーザー権限のファイルに固めて、バックアップユーザーの読めるディレクトリへ移す。
  • バックアップユーザーで rsync を走らせる

なんか綺麗じゃないな…
でも睡眠時間を削るほどのことでもないので気にしないことにしよう。
意外と、DMZ 面倒くさい。

StartCom の SSL 証明書を使う時の備忘

登録後のログインには、クライアント証明書が必要。
Apache サーバーに SSL 証明書をインストールした後、CAの証明書等を同じく設定してやらないと Firefox でエラーが出る。
ドメイン管理者でないと証明書を発行できない。サブドメインの管理者でもダメ。

オレオレ証明書

概要:SSL通信をするためだけに証明書を作る場合、オレオレ証明書で十分だと思うので、作った。
作成にあたっては、ここを参考にした。
Apache/SSL自己証明書の作成とmod sslの設定 - maruko2 Note.

注意:VirtualHostを使っている場合、SNI対応のブラウザでないと正しくアクセスできない。

  1. opensslをインストールする
  2. 証明書を作成する
    1. 秘密鍵を作成する。
      openssl genrsa -aes256 2048 > server.key
      秘密鍵は、パスフレーズで保護する。
      server.key が秘密鍵。
    2. 秘密鍵を使って、署名要求ファイルを作成する。
      openssl req -new -key server.key > server.csr
      秘密鍵のパスフレーズを求められるので、入力する。
      証明書へ埋め込みたい情報の入力が求められるので、入力する。
      とりわけ、Common Name は使いたい web site のホスト・ドメイン名と一致させておくこと。
      server.csrが署名要求ファイル。
    3. 署名要求ファイルからデジタル証明書を作成する。
      第三者機関を使う場合、この工程を当該機関にさせるらしい。
      オレオレ証明書の場合、署名要求ファイルの作成に使った秘密鍵で証明書を作成する。
      openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt
      秘密鍵のパスフレーズを求められるので、入力する。
      server.crt がデジタル証明書。
  3. apache で SSL を有効化する。
    1. VirtualHost を使う場合は、設定する。
      /etc/apache2/ports.conf へ NameVirtualHost *:443 を追記。
      sites-enabled で使っているディレクティブの、対象 VirtualHost の設定をコピペし、*:80 の部分を *:443 に書き換え。
      下記を、DocumentRoot とかと同じく、ディレクティブの外に追記。

      SSLEngine on
      SSLCertificateFile /path/server.crt
      SSLCertificateKeyFile /path/server.key
      
    2. SSL を有効化。
      a2enmod ssl
      でモジュールを読み込ませ、apache2 の再起動で完了。
  4. 設置場所にもよるけど、上記で作った全ファイルは chmod 400 * とかしといた方がいいと思う。
    400 なのに apache サーバーが読み込みできているのは、謎。

で、せっかくなんで、StartSSL™ Certificates & Public Key Infrastructure でデジタル証明書を作った。
ここは、フリーで証明書発行できるくせに、Firefox に登録されているという稀有なルート証明機関。
ここでの発行にも手間がかかるが、いい加減眠いので、メモはこのへんで終了。
このサイトへ、https でアクセスしてもらえば、見えるはず。

注意:

  1. SNI 未対応のブラウザでは見られない。IEとか。(Vista 以降の OS 上で IE8 以降を使えば見られるはずが、何故か我が家の IE9 では不可だった。不思議だ。)
    IEは、TLS 1.1、TLS1.2を有効にすればOK。
  2. WordPress は、テーマやプラグインに SSL 未対応のものが多くあり、SSL で表示するはずのページ上に SSL を使わない URL 表記のソースが出力されてしまうことから、エラーが出る。
    add_filter とかで http を https に書き換えたり、相対パスに変換したりすれば良いのだが、面倒くさいので本サイトではやってない。

Linux の設定とか

昔は研究室のメインマシンとして使っていた Linux も、遠ざかってはや 6年… すっかり忘れてしまった。
でも鯖を立てるにあたって色々不便なので調べたりしたことをメモにする。
Ubuntu Server の固有の話も混ざっていると思うので、注意すること。

zsh の設定ファイルは、~/.zshenv になる。この中で ZDOTDIR を指定しても、ログインシェルでは適用されないので、source で読み込んでおくおと。

export ZDOTDIR=hogehoge
source $ZDOTDIR/.zshenv

最近は、LANG だけ設定しておけば他のロケール設定も勝手に変えてくれる。
あと便利なロケールとして、C.UTF-8 というのが登場したらしい。基本英語になるけど、UTF-8 の文字コードも認識してくれる。

今、自分のサーバに入っているロケールは、locale -a で見ることができる。
入れられるロケールは、/usr/share/i18n/SUPPORTED に記載されている。
特に、昔の設定ファイルを引っ張りだすと、ロケールの呼び名が変わっていることがあるので、たまにチェックする。

vim を入れただけでは、vi で起動しないので、alias することを忘れないようにする。

自宅にサーバを立てる 第3弾

Local Area Network
Local Area Network

一応、DMZ を設けてみた。
右図みたいな感じ。
詳しい設定は秘密だよ。

  • DB として、mysql をインストール。
    • mysql_secure_installation で初期設定。
    • test database はいらない
    • root の remote login は off にしても、ssh コンソールからは普通に使える
  • localhost のユーザー用DBを作る。
    • 権限付与。不要な権限を削除。そして適用。
      grant all privileges on databasename.* to username@localhost identified by "password";
      revoke all privileges on test.* from username@localhost;
      flush privileges;
    • で、該当ユーザーになって、
      mysql -u username(アカウント名と同じなら省略可) -p
      create database databasename;

      とすれば DB 自体は作成完了。
  • ヨソから DB の出力を持ってきた場合は、
    mysql databasename -p < sqlfile

外から sql 叩くのに、ssh の口を空けないためには、phpmyadmin とかを入れると良い。
apt-get installphpmyadmin
dbconfig-common yes

その後、/etc/phpmyadmin/apache.conf で /phpmyadmin を alias している行を任意のディレクトリへ変更すること。
また、最近のアップデートを当てたところ、/usr/share/phpmyadmin のディレクティブに Allow from 行を記載しないとアクセスできなくなってしまった。なんでやねん。

おまけ。
WordPress を移設した場合にも使える SQL 文集。 → WordPressで使える知ってると便利な13のSQL文 | Web活メモ帳
WordPress のリビジョン削除 → WordPress でリビジョンと自動保存を簡単に停止する方法 | ウェブル

自鯖のwebサーバ化

我が家のLAN
我が家のLAN

我が家では、web 公開にあたり、DMZ を設けたので、もはや左の構成では動作していないが、まぁ参考まで。

下記は、自鯖の公開にあたり修正中のメモ。

php 動かす。

a2enmod php5

ドメインで飛んできた時に、ユーザーディレクトリを DocumentRoot にする

具体的には、http://www.hadacchi.com/ で、/home/user/public_html を DocumentRoot として動作させる
VirtualHost または VirtualDocumentRoot あたりで Alias するらしい
ただし、DNS で引けないとダメ。

DNS サーバを立てる。

bind9 の設定

…前職では、職場のローカル DNS の管理してたのになぁ; さっぱり覚えとらん
master ファイルの名前の付け方は、自由にできるらしい。
最近は named.conf から import するのが主流っぽい。

bash は糞面倒くさいので、zsh 入れる。

ローカルの .zsh/.zshrc が動かないので改行コードを置換する。
vi しかエディタいれてなくて、tr は苦手なので vi で置換する。
vi::何かを改行に置換 - そらまめ備忘録 で C-v C-m で ^M を入力できることを知る。

named-checkconf が通っても、普通に起動しないことがあるので注意。例えばファイル名の指定ミスとか。

zone ファイルは、1 ファイル内に複数 zone を記載してもいいはずなのに、うまく動かなかったので、ちゃんと zone 毎に分ける。

例えば、192.168.1.1 に DNS もやってくれる R があったとして、192.168.1.2 = ns.hadacchi.com なる DNS を立てる時、
named.conf.local では次のように記載し、

zone "hadacchi.com" {
    type master
    file "hadacchi.db"
}
zone "1.168.192.in-addr.arpa" {
    type master
    file "1.168.192.db"
}

各 zone ファイルでは、

$TTL 86400
$ORIGIN hadacchi.com.  ; @ means $ORIGIN
@       IN      SOA     ns.hadacchi.com.       test.hadacchi.com.    (
        2012032701 ; serial
        86400      ; refresh
        1200       ; retry
        2419200    ; expire
        1200 )     ; minimum
        IN      NS      ns          ; NS is name server which defined as A record
        IN      A       192.168.1.2 ; short for above label
ns      IN      A       192.168.1.2 ; A record
www     IN      CNAME   ns          ; CNAME is alias

とか

$TTL 86400
$ORIGIN 1.168.192.in-addr.arpa.
@       IN      SOA     ns.hadacchi.com.       test.hadacchi.com     (
        2012032701 ; serial
        86400      ; refresh
        1200       ; retry
        2419200    ; expire
        1200 )     ; minimum
2       IN      PTR     ns.hadacchi.com.

とかいう感じ。

キャッシュは、named.conf.options で

options {
        directory "/var/cache/named";

        forwarders {
                192.168.1.1;
        };

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

とか。

PC に LAN 内の DNS を参照させる。

まず、自分で立てた DNS 自身が外のエントリよりも自分の持つエントリを優先するように設定。
DHCP を動かしている場合、DNS 設定も一緒に配信されてしまうので、クライアント側で弾く。
Ubuntu の場合、/etc/dhcp/etc/dhcp3 の下に
dhclient.conf というファイルがあるので、その中のrequest 行でDNSに関する記述をコメントアウトする。

request subnet-mask, broadcast-address, time-offset, routers,
#       domain-name, domain-name-servers, domain-search, host-name,
        netbios-name-servers, netbios-scope, interface-mtu,
        rfc3442-classless-static-routes, ntp-servers,
        dhcp6.domain-search, dhcp6.fqdn,
        dhcp6.name-servers, dhcp6.sntp-servers;

で、/etc/resolv.conf を書き換える

domain hadacchi.com
search hadacchi.com
nameserver 192.168.x.x
nameserver 192.168.x.1 # 元々の記述

それから、networking を restart

/etc/init.d/networking restart

これで、名前を引けるようになる。

自分の PC が参照する DNS をサーバにすれば、その PC からアクセスした時だけ hadacchi.com をローカルサーバに飛ばすことができるので、テスト用に良い。

VirtualHost の設定。

VirtualDocumentRoot と違って、静的に書くことになる。
しかし、他人に鯖を貸すことはあったとしても、web I/F で自動受付とかはやらないと思うので、これでいこう。
/etc/apache2/sites-available にある default を コピーして、hadacchi とでもしておく。
hadacchi を編集して、ドメイン名とドキュメントルートを追記する。

# Other diretive

<VirtualHost *:80>
    ServerAdmin mail@domain.com
    DocumentRoot /home/user/path
    ServerName subdomain.domain.com
</VirtualHost>

これで、subdomain.domain.com でアクセスされた時には、/home/user/path をドキュメントルートとして表示し、他のアクセスでは /var/www など元のドキュメントルートを表示されるよう設定できる。
この時、追加した内容を元の記述より上に記載すると、IP アドレスでアクセスされた時に subdomain 用のドキュメントルートが表示されるので注意。

www を外向けに空ける。

FTPS を外に向けて空ける

切れたセッションに再接続するために、screen を入れようと検索していたら、tmux を知る。

Terminal Multiplexer(tmux)の紹介|サイバーエージェント 公式エンジニアブログ
とか、
時代はGNU screenからtmuxへ - Dマイナー志向
が詳しい。上のリンクの設定では、 h の設定が重複しているので注意。

会社でも使えそうな、Windows 上での仮想デスクトップソフトを発見した。

Windowsに仮想デスクトップを設定、拡張機能も便利「VirtuaWin 4.3」
で紹介されている、VirtuaWin - Virtual Desktops for Windows が便利。
最初は、窓の杜 - 【REVIEW】WindowsのデスクトップをAndroid風に操作できるようにする「Blacksmith」で紹介されているソフトを試してみた。
このソフト、ランチャもついているのは良いのだが…
hotkey の変更ができないことと、一部のアプリケーションが全仮想デスクトップ上に残ることが不便なため、使うのを止めた。
今のところ、上の VirtuaWin は、Windows 7 SP1 では、問題なく動作しているので、しばらくこれを使うつもり。

妻のおばあちゃんがくれた、かえりちりめんがすげー美味い。貪り食っていたら、妻からキレられた。でもうまいし。

Ubuntu Server のインストール

ドハマりしたので、メモ。

  • USB メモリに焼いた Ubuntu server 11.10 からインストーラを起動したが、USB キーボード&マウスを認識しない
    → PS/2 キーボードは認識した。
  • Ubuntu server インストール後、Ubuntuが起動せず、busybox が起動する。
    エラーメッセージを見るに、HDD を認識していないような…?
    mount: Mounting /dev/disk/by-uuid/{なんかUUIDっぽい文字列} on /root failed: Device or resource busy
    RAID コントローラを積んでいない M/B (E45m1-I DELUXE) を使っているにも関わらず、
    One or more drives containing Serial ATA RAID configurations have been found. Do you wish to activate these RAID devices?
    などと表示されることと関連があるような予感がする。
    → HDD を前に使っていた時の RAID の array 構成情報が残っていることが原因かも? web の情報によれば、array 構成情報が残っていることにより、OS インストーラが正しく動作しないことがあるようだ。
    解決方法は、その RAID を構成したコントローラ上で、array を削除するなど。
  • sources.list が変
    Ubuntu Sources List Generator で作成。
    Ubuntu Branches の全て、Ubuntu Updates の Security と Updates、Canonical、Extras を選択。
  • 何故か、BIOS のスプラッシュ画面以外が出力されない。具体的には、grub4 での kernel 選択の画面から出力されない…
  • WLAN で、何故か AP とアソシエートできない。wpa-ssid の値をダブルクォートで括ってないからだろうか…?今度ためす。

自作PC 2号

E45M1-I DELUXE in ISK-100

先の記事で書いていた通り、

が届いた。

ケースは、作りがいいのか悪いのか…
HDD を取り付けするブラケットの部分が 4 本のネジで固定されていて、M/Bの背面の作りや HDD の形状に合わせて、向きを変えることができる。で、このネジを金属製のシャーシに取り付け、締めたところ、空回りした… ハイ、ネジ穴死んだー! 自作は 2 台目なものの、パーツの取扱なんて山ほどやっている私だが、こんなの初めてだーよ。
ケースが狭いのは前評判から分かっていたので、特に深く言及はしない。コードの取り回しはそれなりに苦労した。

マザボは、色々あった。
SATA ケーブルで、いつも取り外しが固いと思っていたコードを使ってみたところ、コネクタが抜けた。SATA コネクタが抜けた時のあの絶望感は凄い。戻そうと思って頑張ってみたけど、結局電極が曲がって折れてしまい、戻らなかった。まぁ、2台しか内蔵 HDD をインストールできないケースに、5 つもついている SATA コネクタは不要なので、問題ないことにする。
BIOS が GUI 仕様で、マウスが利く。マウスを使える BIOS は初めてだったので、驚いてしまった。
USB キーボード/マウス + Ubuntu Server インストールディスク on USB メモリ の組み合わせでインストールしようとしたら、上手くインストールできなかった。BIOS まではキーもマウスも動くのに、Ubuntu に入ると効かなかった。原因は調査中。どこかから PS/2 キーボードとマウスを調達するしかないか。

E45M1-I DELUXE in ISK-100
E45M1-I DELUXE in ISK-100

ISK-100
ISK-100

で、とりあえず HW だけインストールしたので写真を撮った。
インストールディスクから USB デバイスを認識しないのだけど、どうしようかしら…

スパマーの REMOTE_ADDR

spammer の中でも,頻繁にアクセスのあるホストをアク禁にしているのは,トップページからもリンクしているアクセス禁止リストの通りだが,
その集計結果を spammer viewer | hadacchi blog に出力させてみた.
このうち,どの程度が踏み台にされている一般PCなのかは,よく分からない.
1つ1つ,whois を引けば分かるように思うが,時間がない.

これだけ弾いていても,現在なお 100件/日 の spam 投稿がなされる.
特に今月に入って, Akismet が検出できない記事が増えている (2件/日) ので,困っている…

逆に,投稿したハズなのに表示されないということがあれば,誤検出している可能性が高いので,右下にあるフォームから苦情を飛ばして欲しい.
これだけスパムが届くと,誤検知がないか,チェックしていられない.