[apache2+SSL] SSLの構築・設定

SSLサイトを構築するために、当サイト用の公開鍵・秘密鍵・認証局提出用の認証鍵の作成をしてみます。

本当は…ベリサインとか、その手の認証局に提出して認証鍵に承認してもらうものですが、実験として自分で認証をすることにします。暗号化目的だけであれば、これはこれでいいのかもしれません(^^;

[ 秘密鍵の作成 ]

> openssl genrsa -des3 -rand /var/log/messages -out www.kenti.jp.pem
1024

23168 semi-random bytes
loaded

Generating RSA private key, 1024 bit long modulus

…….++++++

……….++++++

e is 65537 (0x10001)

Enter PEM pass phrase:
(パスフレーズを入力します)

Verifying password – Enter PEM
pass phrase:
(同じものをもういちど)

こうして、www.kenti.jp.pem という秘密鍵ファイルが出来ます。間違ってもweb領域に置かないように…。

それと、パスフレーズを忘れないようにしましょう。忘れると、以下の公開鍵などができませんです。。。

[ 認証局への認証鍵作成 ]

> openssl req -new -key www.kenti.jp.pem -out www.kenti.jp.csr

Using configuration from /etc/ssl/openssl.cnf

Enter PEM pass phrase: (秘密鍵を作成したパスフレーズを入力)

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) [AU]:JP

State or Province Name (full name) [Some-State]:Fukushima

Locality Name (eg, city) []:Koriyama

Organization Name (eg, company) [Internet
Widgits Pty Ltd]:
kenti

Organizational Unit Name (eg, section)
[]:

Common Name (eg, YOUR name) []:www.kenti.jp

Email Address []:info@kenti.jp

Please enter the following ‘extra’ attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

ここで、www.kenti.jp.csr というファイルができあがります。本来はこのファイルを認証局へ送って、費用を払えばいいらしいです。(^^ゞ

でも今回は、自分で認証してしまいます。

[ 自分が認証局のつもりで認証をし、公開鍵の作成 ]

> openssl x509 -req -days 365 -in www.kenti.jp.csr -signkey
www.kenti.jp.pem -out www.kenti.jp.crt

Signature ok

subject=/C=JP/ST=Fukushima/L=Koriyama/O=kenti/CN=www.kenti.jp/Email=info@kenti.jp

Getting Private key

Enter PEM pass phrase: (秘密鍵のパスフレーズを入力)

これで、自分が認証・署名した公開鍵、www.kenti.jp.crt ができあがります。

ここまでできあがれば大丈夫でしょう。

あとは、秘密鍵の中に、パスフレーズを埋め込んでおくと、SSLページを表示させるときにパスフレーズを入力する必要がなくなりますので、やっておくといいのかな…。

(我が家はこの方法じゃないと、SSLページをうまく表示してくれませんでした。)

[ 秘密鍵にパスフレーズを埋め込む ]

> mv www.kenti.jp.pem www.kenti.jp.pem.buckup (念のためバックアップ)

> openssl rsa -in www.kenti.jp.pem.buckup -out www.kenti.jp.pem

read RSA key

Enter PEM pass phrase: (秘密鍵のパスフレーズを入力)

writing RSA key

こうして、www.kenti.jp.pem という秘密鍵ファイルに、パスフレーズが埋め込まれました。

次に、ApacheのSSL設定を行います。設定は、ssl.confに書きます。

基本的には、デフォルトの設定のままで大丈夫ですが、当サイトの設定は以下の通りです。

(webからのパスワード変更、メールの転送設定のページなどに使っています。)

[ /usr/local/apache2/conf/ssl.conf
] ※白地部分が書き換えた場所です

<IfDefine SSL>

Listen 443

AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl .crl

SSLSessionCache dbm:logs/ssl_scache

SSLSessionCacheTimeout 300

SSLMutex file:logs/ssl_mutex

SSLRandomSeed startup builtin

SSLRandomSeed connect builtin

<VirtualHost 61.206.126.90:443>

ServerName www.kenti.jp:443

ServerAdmin info@kenti.jp

DocumentRoot “/home/www/sslpage_html”

ScriptAlias /cgi-bin/ /home/www/sslpage_html/cgi-bin/

SSLEngine on

SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

(公開鍵の場所を指定します)

SSLCertificateFile /usr/local/www/www.kenti.jp.crt

(秘密鍵の場所を指定します)

SSLCertificateKeyFile /usr/local/www/www.kenti.jp.pem

SetEnvIf User-Agent “.*MSIE.*”
¥

nokeepalive ssl-unclean-shutdown ¥

downgrade-1.0 force-response-1.0

</VirtualHost>

</IfDefine> 

我が家はIPベースで動かす方法をとったので、通常のwebページにもVirtualの設定を行いました。

こうすることで、普通のwebページと、SSLページを同居させることが出来ます。

[ /usr/local/apache2/conf/httpd.conf
] ※一番最後に追加

NameVirtualHost 61.206.126.90:80

<VirtualHost 61.206.126.90:80>

ServerName www.kenti.jp

DocumentRoot /home/www/html

</VirtualHost>

あとは、ApacheをSSL機能付きで、以下のように起動させます。

気をつけることは、通常の起動方法とは少しだけ変わります。

# /usr/local/apache2/bin/apachectl
stop (既に動作していたら、止めます)

# /usr/local/apache2/bin/apachectl sslstart (SSL機能付きでスタート)

普通に、start ではないことに注意して下さい。

無事起動したか、アクセスして確認してみて下さい。

[ 通常のwebページ ] http://www.kenti.jp

[ SSLのページ ] https://www.kenti.jp/

(自己認証のため、警告が出ますがそのまま進むとSSLページに行きます)

サーバを入れ替える。

自宅にあるこのwebサーバ(道楽サーバ?)ですが、Celeron300MHz/128MBで動いているマシンから、Pentium3 450MHz/320MBに入れ替えてみました。

HDDはそのまま引っこ抜いてなんとか動くだろう…ぐらいの甘い考えだったのですが、以下のような問題にぶち当たりました。

[/boot/loader.conf] hw.ata.ata_dma=”0″ ;HDDのDMA転送を無効にする。

…よくやるのです。。。これ。(上記を一時的に指示するには、起動する前に set hw.ata.ata_dma=0 をして boot でも可能です。)
ちなみに、FreeBSD4系の時は、起動時にHDDのDMA転送がうまくいかないとき、3回ほどDMA転送ができるか試した後に、PIO4とか切り変わるのですが、FreeBSD5系からは自分で明示的に指示しないとだめなようです。

なんだろうなぁ…。
あとは、ネットワークアダプタも若干変更があったため、インターフェースにあわせて書き換えます。

[/etc/rc.conf] #ifconfig_fxp0=”inet 192.168.1.1 netmask 255.255.255.0″ ifconfig_xl0=”inet 192.168.1.1 netmask 255.255.255.0″

Linuxと違って、1つのファイルにこうやって書けるのはありがたいなぁ、と思う今日この頃です。

で、今回なんでサーバを入れ替えたかといいますと、『MovableTypeでエントリーを投稿したとき、再構築がもうちょっと早くならないん?』というのがきっかけでして、ここに至る次第でございます。

しかし、入れ替えましたものの…気持ちホンワカ少しだけ早く…なったような気がします。。。

RTA55i VPNの注意事項

過去のメモです。

[拠点1]
LAN(Private) 192.168.10.0/24
LAN(global) 111.222.120.128/29 (129-134)
NATに使うアドレス 111.222.120.137

[拠点2]
LAN(Private) 192.168.12.0/24
LAN(global) 111.222.51.136/29 (137-142)
NATに使うアドレス 111.222.51.142

1側 
  LAN1          +---------+     LAN2(111.222.120.129) 
----------------|  RTA55i |-------------- 
192.168.10.0/24 +---------+ 111.222.120.128/29 
                                      | 
                                      | 
                                      |(ここをPPTPで接続) 
                                      | 
2側 
  LAN1          +---------+     LAN2(111.222.51.137) 
----------------|  RTA55i |-------------- 
192.168.12.0/24 +---------+ 111.222.51.136/29

※注意事項
まず、お互いのフィルタを必ず通すこと。
拠点1がサーバなら、拠点2の 111.222.51.136/29 をpassにする。
なぜなら、PPTP(VPN)クライアントはNATで使用するアドレスから接続しようとするから!
ip lan1 secondary のアドレスではない!!!

あとはwebからのかんたん設定で大丈夫。
なお、かんたん設定にて設定されると、configは以下のようになる。

(拠点1側)
ip lan1 address 192.168.10.1/24
ip lan1 secondary address 111.222.120.129/29
ip lan1 routing protocol none
ip lan1 rip listen none
ip lan1 secure filter in 100000 100001 100002 100003 100004 100005 100006 100007 100099
ip lan2 routing protocol none
ip lan2 rip listen none
ip route 192.168.12.0/24 gateway tunnel 1 metric 1
ip route default gateway pp 1 metric 1
nat descriptor type 1000 masquerade
nat descriptor address outer 1000 111.222.120.134
nat descriptor address inner 1000 192.168.10.1-192.168.10.254
nat descriptor masquerade static 1000 1 192.168.10.1 tcp 1723
nat descriptor masquerade static 1000 2 192.168.10.1 gre *

(拠点2側)
ip lan1 address 192.168.12.1/24
ip lan1 secondary address 111.222.51.137/29
ip lan1 routing protocol none
ip lan1 rip listen none
ip lan1 secure filter in 100000 100001 100002 100003 100004 100005 100006 100007 100099
ip lan2 routing protocol none
ip lan2 rip listen none
ip route default gateway pp 1 metric 1
ip route 192.168.10.0/24 gateway tunnel 1
nat descriptor type 1000 masquerade
nat descriptor address outer 1000 111.222.51.142
nat descriptor address inner 1000 192.168.12.1-192.168.12.254
nat descriptor masquerade static 1000 1 192.168.12.1 tcp 1723
nat descriptor masquerade static 1000 2 192.168.12.1 gre *

 

IP電話とPBX。

つい最近、我が家に050番号のIP電話を導入してみました。

会社の人と通話して…それで今のところ終わっていますが、なかなか便利な時代になったものです。

それと、OpenSource PBXというもので、Asteriskというものがありますが、まだ遊んでません…。
(SIPも立ててみたいので、partySIPも入れてみるものの、時間がなさげ…。)

プロバイダの変更。

今まで使用していたプロバイダを解約し、Interlinkの接続だけになったとたん、我が家のクライアントPCが一斉にネットへでれなくなりました。まいったなこりゃ。(泪

原因を探ってみると、2つありました。

1つはゲートウェイ。
今までデフォルトゲートウェイの設定は個別にしてました。

ip route default gateway pp 1 filter 501060 gateway pp 2 filter 501050 gateway pp 1
ip filter 501050 pass [サーバのIP] * * * *
ip filter 501060 pass [ルータのIP] * tcp,udp * smtp,pop3
※pp1がDTI、pp2がInterlink接続

こうすることで、「501060」つまりサーバ以外ははpp1、サーバはpp2を経由してネットに行きなさい、というようなルーティングができるようです。私がやってしまったのは、pp1を消しちゃってるのに、pp1へ行きなさいと言っている(矛盾した)設定でした。これでは意図したとおり動かないわけですね。。。

2つめはDNS。
我が家のサーバはDNSサーバも兼ねており、ルータでDNSポートへのNAT割り当てをしています。ということは、DNS要求は全てサーバでやらなくちゃいけないということ?
あと、今まではpp1でDNSを外へ聞くことができたからうまくいっていたのかも?なかなかむずかしいですね。
はいはいということで、我が家のクライアントは全て自前のDNSを参照するようにしてみました。

勉強になりますよ。もぅ。

chflagsでアキレス腱解消!!

前回、アキレス腱であるファイルを消してしまい、とんでもない事態に陥りましたが、そのアキレス腱を打破すべく以下のコマンドを使ってみました。

コマンド : chflags

フラグの設定 フラグの解除 フラグの内容 必要な権限
arch noarch archived root
opaque noopaque opaque 所有者またはroot
nodump nonodump nodump 所有者またはroot
sappnd nosappnd system append-only root
schg noschg system immutable root
sunlnk nosunlnk system undeletable root
uappnd nouappnd user append-only 所有者またはroot
uchg nouchg user immutable 所有者またはroot
uunlnk nouunlnk user undeletable 所有者またはroot

なんだかはよくわかりませんが、immutableは変更不可、undeletableは削除不可なのだそうです。

ということは…。

# chflags schg /libexec
# chflags schg /libexec/ld-elf.so.1
#
#
# mv ld-elf.so.1 ld-elf.so.1.1
mv: rename ld-elf.so.1 to ld-elf.so.1.1: Operation not permitted
#

とりあえず移動やリネームによるアキレス腱は消えました。
そして、肝心の削除ですが、

# rm ld-elf.so.1
override r-xr-xr-x root/wheel schg for ld-elf.so.1? y
rm: ld-elf.so.1: Operation not permitted

消せなくなりました。よかったー。(^^;

PostgreSQLのDBバックアップ&復旧方法

PostgresのDBをバックアップし、その後復旧する方法です。
(._.) φ メモメモ

バックアップ方法
(postgresqlは起動した状態にしておく)

% pgdumpall > backup.db

復旧方法
(postgresqlを起動し、initdbだけしておく)

% psql -e template1 < backup.db

復旧時の注意点は、やっぱり -e をつけないとだめなようです。

恐ろしきかなld-elf.so.1の罠。

なんとなく会社でFreeBSDにantivirをインストールしていたarakawaさんが、こんな事を言いました。

「ELF interpreter /libexec/ld-elf.so.1 not found」 が出るのですよ。

そういえばうちのサーバくんでも出たっけ。

そのときはとりあえずしのぎで、/usr/libexec/ld-elf.so.1 を /libexec/ld-elf.so.1 にコピーして終了。
その後なんとなく気持ち悪いので、以下のコマンドを入れてシンボリックリンクにでもしたいなぁ、と思いやってしまいました。

# cd /libexec
# mv ld-elf.so.1 ld-elf.so.1.orm (ormではなくorgのタイプミス…今後オルムファイルと呼びましょう。)

そして、シンボリックリンクでも張ろうと思った矢先、

# cd /
# mv libexec libexec.orm
ELF interpreter /libexec/ld-elf.so.1 not found
Aborted.

なぬ……………………………………………………。

これ、とんでもなく大事なファイルなんですね。(泪
調べたら、ld-elf.so.1さんはFreeBSDのバイナリを実行するのにとても大事そうなファイルなんだそうです。

おかげで、cpもlsもmvもなにもできないし、新たにsshでログインしてもまるでダメ。
あーあ、CD起動でなおさなくちゃいけないのかなぁとか思った矢先、そうだlinx_baseがたしか入っていたな、FreeBSDのELFバイナリじゃなければ…ということで、以下のコマンドを入れてみるわけです。

# /compat/linux/bin/bash
bash#

助かった…。ありがとうLinuxカーネルさん。あんたにちょっとだけ感謝するよ。

その後、慣れないbashでなんとかシンボリックリンクを作って逃げました。

うーん、これとても驚異ですね。。。まさしく「アキレス腱」です。

BIND8

昔の記事をblog側に持ってきて編集してみました。
書いた当初からずいぶん時間が経っているので、ちょっとおかしなところがあるかもしれません。

ドメインを取得・申請したので、ネームサーバを立ててみます。

今回はよく使われている(と思われる)bind8を、FreeBSDに入れてみましょう。
bind8のソースプログラムは、Internet Software Consortium (ISC)から持ってきます。

まずは、ダウンロードをして、展開、コンパイルまでしましょう。

> fetch ftp://ftp.isc.org/isc/bind/src/8.4.1/bind-src.tar.gz Receiving bind-src.tar.gz (1432277 bytes): 100%
> tar xzf bind-src.tar.gz
(カレントにsrcというディレクトリができます。)

> cd src
> make
Making /usr/home/kentaro/src/.systype
Making .settings
/usr/home/kentaro/src/include
…あとは気長に待ちましょう(^^;

コンパイルが無事完了したら、インストールします。この場合では、/etc/namedb以下にインストールされます。
(Linuxはどうなのでしょう…?/var/namedとか?)

>su Password:(rootになりましょう)
# make install
mkdir -p /usr/local/bind/include/arpa
set -x; for x in inet.h nameser.h nameser_compat.h; do install -c -m 444 $x /usr/local/bind/include/arpa/$x; done
+ install -c -m 444 inet.h /usr/local/bind/include/arpa/inet.h
……………

インストールが終わりましたら、設定ファイルを書きます。

[ /etc/namedb/named.conf ]options {
directory “/etc/namedb”;
};

zone “.” {
type hint;
file “named.root”;
};

zone “localhost” {
type master;
file “localhost”;
allow-query { any; };
};

zone “0.0.127.IN-ADDR.ARPA” {
type master;
file “localhost.rev”;
};

//
// kenti.jp
zone “kenti.jp” {
type master;
file “db/kenti.jp.zone”;
allow-update { none; };
};

設定で注意するのは、赤字にしたところです。/etc/namedbをホームとして、それぞれのファイルを参照する形になります。今回、kenti.jpはそこにディレクトリを作成し、kenti.jp.zoneというゾーンファイルを作成する形となりますので、さらに以下のファイルを作成しました。
(名前→IPを表す正引きファイル)

[ /etc/namedb/db/kenti.jp.zone ]$ORIGIN kenti.jp.
$TTL 3600
@ IN SOA ns.kenti.jp. postmaster.kenti.jp. (
2002120801 ;serial
10800 ;refresh
3600 ;retry
604800 ;expiry
86400 ) ;minimum
;
IN NS ns.kenti.jp.

;
IN MX 10 mx.kenti.jp.
* IN MX 10 mx.kenti.jp.
;
;
; KENTI ZONE
;
ns IN A 61.206.126.90
www IN A 61.206.126.90
mx IN A 61.206.126.90

なにやら不可思議な記述が書いてありますが、順に説明すると以下のようになります。

$ORIGIN
ゾーンセクション。この場合kenti.jp.となる。
$TTL
有効時間。秒単位で指定するので、この場合3600秒=1時間。
@
$ORIGINで指定されたもの(ここでは、kenti.jp.)を指す言葉になります。
SOA
SOAの後ろの@は、ns.kenti.jpのようにホスト名で書き換えます。次にあるpostmasterは、自分のメールアドレス(ユーザ名+ドメイン名)を指定します。何かあった場合、このアドレスに対して問い合わせがくるようになります。注意点は、メールアドレスの@を、「.」(ピリオド)に直して書くことです。
;
セミコロンの後は、コメントになります。
;serial
シリアルナンバー。内容を更新したら、かならずこの数値を変化させて、変更があったことを他DNSサーバへ知らせます。シリアルは、1,2,3…と適当な数字で増やしていってもいいのですが、上記のように日付+2桁の数字、で入れておくと管理しやすいです。
;refresh
リフレッシュ時間。このゾーンを確認する間隔を指定。この場合10800秒=180分=3時間。
;retry
上のリフレッシュ時間において、ゾーン確認に失敗した場合の再試行までの待ち時間。この場合3600秒=1時間。
;expiry
このファイルで定義されている内容の有効期限。この場合604800秒で7日(1週間)。
;minimum
ファイル自体の有効期限。この場合86400秒=24時間。
NS
NSレコード(ネームサーバ)の指定。
ここでは、一般的にこのDNSサーバの名前を指定しています。
MX
MXレコード(メールサーバ)の指定。
メールサーバの名前を指定します。なお、サーバ名の前にある「10」はメールサーバの優先度を指定しています。複数メールサーバがあれば、20,30といったように記述することも出来ます。
A
Aレコードの指定。
この場合、ns.kenti.jp.のIPアドレスはいくつか、を指定しています。これが設定できてないと、www.kenti.jpはどのIPなのか、といった参照が出来ません。
ほかに、mailにもAレコードが指定してあります。これがないと、MXで指定した名前のIPがわからなくなってしまうからです。
CNAME
今回は出てきませんが、別名という意味で使われます。
ftp IN CNAME www
とすれば、ftp.kenti.jpはwww.kenti.jpの別名だよ、と指定することが出来ます。
※トラブルの原因になるので、なるだけAレコードで書いた方が良いと思われます。特に、MXはCNAMEで書きますとトラブルの元になります。
PTR
これも今回は出てきません。IPから名前を表す、逆引きに使用するレコードです。
61.206.126.90 IN PTR ns.kenti.jp.
という具合で書きます。
kenti.jpで使用しているIPは、プロバイダから既に逆引きの名前が割り当てられており、変更することが出来ないので逆引きのゾーンは作成しませんでした。

設定ファイルが出来たので、namedを起動します。

# /usr/sbin/ndc start
new pid is 708

起動後、/var/log/messageなどを見て、エラーが出てないことを確認しましょう。(^_^)v
動いているようであれば、以下のように名前が解決できるようになります。

# nslookup www.kenti.jp Server: localhost Address: 127.0.0.1Name: www.kenti.jp
Address: 61.206.126.90

また、OS起動時(この場合は、FreeBSD)にnamedを起動させるようにするには、以下の方法があります。

[ /etc/rc.conf ] 以下の2行を追加するnamed_enable=”YES”
named_program=”/usr/sbin/named”

Linuxのような起動方法として、FreeBSDでは以下のスクリプトを書いてあげれば自動起動してくれます。
(パーミッションの設定は755としておくといいのかな…。)

[ /usr/local/etc/rc.d/named ] 新規に作成します#!/bin/sh

case “$1” in

start)
if [ -x /usr/sbin/named ]; then
echo named
/usr/sbin/ndc start
fi
;;
stop)
/usr/sbin/ndc stop
;;
*)
echo “$0 start|stop”
;;
esac

とりあえず、そんなこんなで一段落といったところでしょうか。(^^;

ネットワーク管理・サーバ管理はどうあるべきか。

職場から家に帰ってくると、なんともPCの電源をいれるのがかったるい今日この頃です。

なんとも最近は、仕事にたいして憂鬱というかなんというか、すべてに対してかったるいです(笑)。
私のやっている仕事はネットワーク管理・サーバ管理なのですが、そもそも本来どういう仕事なのでしょうか。

(今日はちょっと愚痴っぽい表記です。笑)

ネットワーク管理者の仕事として、一般的には

・ネットワークトラフィックの監視

・ネットワーク機器状態の把握、設定情報の把握

・クライアントに対する接続設定などのサポート

・情報セキュリティへの機敏な対応

というのがあげられるだろうと思います。
一方、サーバ管理者の仕事として、

・サーバ動作の監視

・ハッキング、クラック、ウィルス対策

・サーバ内におけるユーザ情報の把握

・サーバ内で動作しているソフトウェアの把握

・クライアントへの利用方法などの徹底

等があげられると思います。なんでこんなことを今自分が書いているのかというと、本来のネットワーク管理・サーバ管理とはかけ離れた業務をしていたり、いろんな事情もありますが前任者からの引き継ぎもうまく出来ていなかったり、いつのまにか面倒なことに巻き込まれていたり(笑)することが多いなぁ…と思うのです。
(まぁ、それはそれで退屈するよりも幸せですが。)

話はそれますが、ある案件を処理するのに、

・客先への訪問

・提案してみる

・見積をだす

・注文を受ける

・場合によっては外注処理をする

・クライアント対応
・請求書を出す

・入金の確認をする

・場合によっては集金してくる

・外注したものの支払い手続きを済ます

というような内容が必要になってくると思います。また、これは日頃から考えなくちゃいけないのですが、どうやったら顧客拡大ができるだとか、売り上げを伸ばそうだとか、そういう問題もあります。

正直、なんだか自分は一人で会社をやっているような認識をしてしまうので、最近はとても疲れたような気がします…。

そんなわけで、今日はもう寝まーす。