快適個人用Linuxサーバー構築記

はじめに
サーバーを調達
Virtual Private Server を調達
SSHの設定
SSHでサーバーにログインして、SSHの設定を行う。
iptables
iptablesを設定してファイアウォールをつくる。
認証局
公開鍵の認証局をつくる。
Postfix
SMTPサーバー。
IMAPサーバー
IMAP & POP3サーバー。

ソフトウェアのつかいこなし

はじめに
Linuxのソフトウェア
Linuxで動く便利なソフトの使い方。
PHP
Excel
バーコードの作り方
バーコードを生成するプログラム。
Perlのスクリプト
Perlで開発したソフト。

開発室

はじめに
主にLAPPの話
ZendFramework Application
ZendFrameworkのApplicationを使って開発する。
文献職人
論文の引用文献(Reference)を作成するソフト
Google Logo Collector
Googleのロゴ収集プログラム。
Loading Circle Maker
コンピュータの待ち時間に表示する時計を作成するプログラム。
アクリルアミドゲル作成
希望する濃度のアクリルアミドゲル(SDS-PAGE用)を作成するのに必要な試薬量を計算します。
算数のおけいこ
小学生の算数のおけいこ。

クラスターコンピュータをつくる

雑記帳

はじめに
RAD-tag
ゲノムを二種類の制限酵素で切ったときに適当な長さの断片はどのぐらいとれるのか。
bwa
マッピングツールとしてbwaを使ってみる。
stats
PHPの統計ライブラリstats。

基礎知識

PKIはPublic Key Infrastractureの略で公開鍵を認証するしくみです。 PKIでは認証局(CA: Certificate Authority)が公開鍵に署名をし、その公開鍵の身元を保証します。 公開鍵を渡された人はそれが正しいものか偽装されたものかを認証局に問い合わせることで判断することができます。 認証局はVeriSign社などの広く認知されている会社などが運営している場合もありますが、個人で運営することもできます。

公開鍵暗号を用いてインターネットの通信を暗号化する方法がSSL(Secure Socket Layer)またはTLS(Transport Layer Security)プロトコルです。 SSLではサーバーが認証局で署名された公開鍵をクライアントに送信し、クライアントで公開鍵を確認したあと共通鍵暗号方式の鍵を作成しサーバーの公開鍵で暗号化して送り返します。 以後の通信ではでこの作成した鍵を用いて暗号化と復号化を行い通信します。

自宅サーバーではウェブやメールのサーバーを運営していますが、これらとユーザーの通信を暗号化する(したい)ことがあります。 サーバーの証明書を作成し、自前で認証局を運営して安全な通信を行うことができます。

参考資料

認証局(CA)の作成

PKIの認証局を作成します。といっても認証局自身の秘密鍵、公開鍵を作成するだけです。

設定

SSLに必要なものはすべてopensslに含まれています。opensslをインストールすると /etc/pki 以下に認証局の鍵をおく場所ができます。opensslの設定ファイルは /etc/pki/tls/openssl.cnf です。以下に修正した項目を記します。

証明書の作成時に尋ねられるCountry Nameなどのデフォルト値を設定しておいてもいいかもしれません。

/etc/pki/tls/openssl.cnf

[ CA_default ]
default_days	= 1825

[ req_distinguished_name ]
countryName_default		= JP
stateOrProvinceName_default	= Aichi
localityName_default		= Nagoya
0.organizationName_default	= Takamasa Home

[ usr_cert ]
basicConstraints=CA:TRUE
nsCertType			= server

[ v3_ca ]
nsCertType = sslCA, emailCA

鍵の作成

以下のようにして認証局に必要な鍵を作成します。

# cd /etc/pki/tls/misc/
# ./CA -newca
CA certificate filename (or enter to create)
# enter キーを押して新しく作成する
Making CA certificate ...
Generating a 1024 bit RSA private key
.......................................++++++
.....++++++
writing new private key to '../../CA/private/./cakey.pem'
Enter PEM pass phrase:              # cakey.pemを保護するためにパスワードを設定
Verifying - 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) [JP]:
State or Province Name (full name) [Aichi]:
Locality Name (eg, city) [Nagoya]:
Organization Name (eg, company) [Takamasa Home]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Private CA
Email Address []:root@thaliana.myhome.cx

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ../../CA/private/./cakey.pem:  # CAの証明書にcakey.pemで署名を入れるために先に
設定したcakey.pemのパスワードを入力する
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Jan  2 14:33:15 2009 GMT
            Not After : Dec 31 14:33:15 2018 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Aichi
            organizationName          = Takamasa Home
            commonName                = Private CA
            emailAddress              = root@thaliana.myhome.cx
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:TRUE
            Netscape Cert Type:
                SSL Server
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                D2:83:2F:8E:EE:DC:C2:7E:BE:0C:B9:38:F1:35:8E:2F:AF:C3:A0:AC
            X509v3 Authority Key Identifier:
                keyid:D2:83:2F:8E:EE:DC:C2:7E:BE:0C:B9:38:F1:35:8E:2F:AF:C3:A0:AC

Certificate is to be certified until Dec 31 14:33:15 2018 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

以上で /etc/pki/CA 以下に認証局に必要なファイルが作成されました。特に重要なのが /etc/pki/CA/private/cakey.pem で、これが認証局の秘密鍵です。この秘密鍵は途中入力したパスフレーズにより保護されていますが、よりいっそうの安全を期すにはUSBメモリなどの外部記憶装置に移して(コピーではない)おくといいでしょう。

/etc/pki/CA/careq.pem が自己署名前の公開鍵で、これに cakey.pem で署名したのが /etc/pki/CA/cacert.pem です。公開鍵は署名されないと信用されないので作成直後はreq(uest)となっていて、署名するとcert(ificate)となるようです。cakey.pem、careq.pem、cacert.pemのいずれもPEM形式のファイルなので拡張子がpemとなっています。PEMはPrivary Enhanced Mailの省略で元々はメールを暗号化するための形式で、テキストファイルです。

証明書が間違っていないか、改ざんされていないかを確認するために鍵のハッシュ値が用いられます。認証局の証明書(cacert.pem)のハッシュ値は openssl x509 -sha1 -noout -fingerprint -in /etc/pki/CA/cacert.pem で求められます。ちなみにthaliana.myhome.cxのCAのハッシュ値は F9:11:EC:4D:E8:40:59:CE:D8:3D:FA:10:24:88:FB:28:88:9A:FC:D2 となっています。

クライアントへのインストール

自分の認証局の証明書をクライアントへインストールします。

Windows Vista

Windowsは拡張子がpemのファイルでは証明書として認識されないのでcacert.pemをca.crtなどの名前で保存します。このファイルをダブルクリックで開くと証明書の情報が表示されます。「詳細」タブを開くと証明書の内容が表示されます。拇印の値を確認します。

「全般」タブに戻り、「証明書のインストール」をクリックします。証明書ストアで「証明書をすべて次のストアに配置する」を選択し、「信頼されたルート証明機関」を証明書ストアに選択します。

Firefox

/etc/pki/CA/cacert.pemをブラウザーでアクセスできる場所にcrtという拡張子をつけて保存します。そしてこのファイルにブラウザーからアクセスすると「証明書のインポート」が始まります。「証明書を表示」をクリックしてSHA1フィンガープリントを確認します。

「この認証局による...」はすべてチェックし、OKをクリックします。

サーバー証明書の作成

各種サーバー(httpdとかimapd)が使用するサーバー証明書(認証局により署名された公開鍵)を作成します。

まず秘密鍵と公開鍵を作成します。

# cd /etc/pki/tls/misc/
# ./CA -newreq
Generating a 1024 bit RSA private key
.....................................++++++
...............................................................................................................................................++++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
(省略)
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Aichi]:
Locality Name (eg, city) [Nagoya]:
Organization Name (eg, company) [Takamasa Home]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:thaliana.myhome.cx  # 使用するサーバーと同じ名前(FQDN)にする
Email Address []:root@thaliana.myhome.cx

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem

秘密鍵(newkey.pem)と公開鍵(newreq.pem)が作成されました。続いてこの公開鍵を認証局で署名します。

# ./CA -sign
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ../../CA/private/cakey.pem: # 認証局の秘密鍵のパスフレーズを入力する
Check that the request matches the signature
Signature ok
(省略)
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Dec 26 07:42:03 2008 GMT
            Not After : Dec 26 07:42:03 2009 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Aichi
            localityName              = Nagoya
            organizationName          = Takamasa Home
            organizationalUnitName    = mail
            commonName                = thaliana.myhome.cx
            emailAddress              = postmaster@thaliana.myhome.cx
        X509v3 extensions:
(省略)
Certificate is to be certified until Dec 26 07:42:03 2009 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Certificate:
(省略)
-----BEGIN CERTIFICATE-----
MIIDLzCCApigAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMCSlAx
(省略)
Luzx
-----END CERTIFICATE-----
Signed certificate is in newcert.pem

認証局に署名された証明書(newcert.pem)が作成されました。

作成した秘密鍵にかかっているパスワードをはずします。パスワードをはずしたファイルをサーバーの鍵ファイルとして以後使用します。

# openssl rsa -in newkey.pem -out /etc/pki/tls/private/thaliana.myhome.cx.key
Enter pass phrase for newkey.pem:
writing RSA key
# chmod 400 /etc/pki/tls/private/thaliana.myhome.cx.key

できた証明書に名前をつけて保存します。

# mv newcert.pem /etc/pki/tls/certs/thaliana.myhome.cx.crt

なぜか最初につくったサーバー証明書はシリアル番号が重なっていけないというエラーがでるので./CA -newreqをもう一度行ってつくるとよい。

アプリケーションごとの設定

httpdの設定

/etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/tls/certs/thaliana.myhome.cx.crt
SSLCertificateKeyFile /etc/pki/tls/private/thaliana.myhome.cx.key

postfixの設定

/etc/postfix/main.cf

smtpd_tls_cert_file = /etc/pki/tls/certs/thaliana.myhome.cx.crt
smtpd_tls_key_file = /etc/pki/tls/private/thaliana.myhome.cx.key

dovecotの設定

/etc/dovecot.confを編集する

ssl_cert_file = /etc/pki/tls/certs/thaliana.myhome.cx.crt
ssl_key_file = /etc/pki/tls/private/thaliana.myhome.cx.key