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

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

状況:

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

やったこと:

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

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

速度測定

追記 (5/23)
下記にて、NAPTや無線を介した時にスループットが落ちる減少について、解説されていた。
スループットが落ちる、と一言でまとめてしまったが、RTT が延びる→パケット送出回数が減る→スループットが落ちる、だった。
綺麗に解説されていたのを初めて見たので、メモメモー。
教科書には載っていない ネットワークエンジニアの実践技術:第1回 FTPでスループット計測するときの注意事項|gihyo.jp … 技術評論社


自宅のフレッツ・光プレミアム+ISPの速度測定をしてみた。
NATがかなりボトルネックであることが分かった。

測定環境

測定に用いた計算機 (HW)
CPU: AMD Athlon II X2 245 (2.9GHz)
I/F (LAN): On board (M4A78T-E) LAN (Atheros AR8121/AR8113/AR8114 PCI-E Ethernet Controller)
LAN Cable: ELECOM Laneed CAT 5e Ethernet cable (3m)
I/F (WLAN): Baffalo WLI-UC-AG
WLAN ch: 48ch (IEEE 802.11a)
測定に用いた計算機 (SW)
OS: Windows 7 Pro
Browser: Firefox 12.0 (通信高速化のためのカスタマイズなし)
running processes:
dropbox, gladinet, MSE, daemon tools, VirtuaWin, 付箋帳, nrLaunch, Q-button など…
測定日時
5/11(Fri) 0:20 am ~ 0:40 am
測定方法
試験1&2
・アクセスライン速度測定: フレッツ・光プレミアム 速度測定サイト を利用 (シングルセッション、マルチセッション)
試験3
インターネット接続速度測定: BNR スピードテスト(回線速度/通信速度 測定ページ) を利用
NW構成
構成1 (有線・1NAPT)
+----+               +-----+
| PC +---[ Ether ]---+ CTU +---[ VDSL ]---[フレッツ・光プレミアム]---[ ISP ]
+----+               +-----+

構成2 (有線・2NAPT)

+----+               +------------------+
| PC +---[ Ether ]---+ Baffalo WHR-AMPG |
+----+               +--+---------------+
                        |
                     +--+--+
                     | CTU +---[ VDSL ]---[フレッツ・光プレミアム]---[ ISP ]
                     +-----+

構成3 (無線・2NAPT)

+----+                      +------------------+
| PC + > > > [ WLAN ] > > > + Baffalo WHR-AMPG |
+----+                      +--+---------------+
                               |
                            +--+--+
                            | CTU +---[ VDSL ]---[フレッツ・光プレミアム]---[ ISP ]
                            +-----+
論理構成
構成1: CTU にて NAPT
構成2、構成3: CTU、WHR-AMPG それぞれにて NAPT

測定結果 (平均)

Wired 1NAT Wired 2NAT Wireless 2NAT
試験1 73.41Mbps 43.36Mbps 22.84Mbps
試験2 87.87Mbps 40.96Mbps 22.82Mbps
試験3 63.22Mbps 47.82Mbps 23.55Mbps

まとめ

  • NAPT (WHR-AMPG) を 1 段追加することで、通信速度は半減する
  • 無線区間 (IEEE 802.11a) を通ると、通信速度は更に半減する
  • 有線で NAT を 1 段(フレッツ・光プレミアム標準)とすると、平日深夜の社会人向け
    集合住宅では、アクセスサービスの理論値 100Mbps に近い結果を叩き出せる場合がある

CAT 5e のケーブルは、多分 100Mbps 以上出そうに見える。ここがボトルネックとなっている印象はない。
WHR-AMPG をかますことでスループットが落ちるのが、WHR-AMPG 内蔵のスイッチングの問題か、NAPT の処理による問題かは不明。
NAPTを切って試験するのは面倒で眠いのでまた今度としたい…
インターネット接続上での速度測定の方が好成績を示す構成2&3については、不明。
無線経由での成績の悪さについて、BNR の試験中に表示される進捗バーの表記から、パケットロスが生じているわけでは
なさそうであり、無線への/からの信号変換のロスである可能性が高い。

Android 4.0 で Apache SNI 対応

追記
びっくりしたので思わず記事にしてしまったが、ApacheのSNIはAndroidブラウザで使えない - isherの日記 のコメントにもあるように、Honeycomb から対応していたらしい。
今頃気付いたよ…


対応っつーか、普通に接続できた。
hadacchi が使っている CM9 on NOOK Color (CM9 は、当時より新しい版) で試してみたところ、SNI を使っているサイトを普通に表示できた。

先日書いた、SSL 対応の設定 を当サイトでは施しており(word press は SSL 対応に手間がかかるので放置中)、www.hadacchi.com (SSL) へアクセスしてもらえば、Windows Vista 以降、または Firefox や Opera 利用の場合には問題なく表示されるはず。
SNI 非対応の Win XP IE8 とかでアクセスすると、証明書エラーが表示された挙句に、Forbidden が返るはず。

さて、Android は、2.3 までは SNI 対応しておらず、Win XP と同様に Forbidden が返っていた。
しかし、ICS が対応しているのか、CM9 が対応しているのか、少なくとも私のタブレットでは上記 URL へアクセスして、正しくページが表示される。

というお話。

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 に書き換えたり、相対パスに変換したりすれば良いのだが、面倒くさいので本サイトではやってない。

ul/ol のネスト

知らんかった… HTML の ul とか ol は子要素に li しか持てないらしい。
なのでネストさせる時はliの中でネストさせる。

ということで、コードは、

  • a
  • b
  • c
    • c-1
    • c-2
  • d

と書いて、見た目は下みたいな。

  • a
  • b
  • c
    • c-1
    • c-2
  • d

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 の値をダブルクォートで括ってないからだろうか…?今度ためす。