CentOS51でバックアップサーバ/(9)SSLの導入

Last-modified: 2008-10-31 (金) 16:26:41 (5675d)

  • SSLはWebサーバとPC間の通信を暗号化するプロトコルである。ブラウザ側から言えば、アドレス欄に通常「http://kurarinet.com/」と入力するところが、「https://kurarinet.com/」となって、最下段のステータス欄に鍵マークが施錠状態になったりする。暗号化するので、パスワード入力や送受信データの内容が読み取られる(盗聴の)心配がなく、一般には、通販サイトのカード番号の入力画面などで使われることが多い。
  • TCPサービスのポート番号も異なる。HTTPは#80、SSLは#443である。このため、ドメイン一つでも異なるサイトを同時に運用することが可能である。(昔、個人専用のホームページを裏で運用していたことはあるのだが、その話はあらためて)
  • クラリNETは基本的に会員制で運用しているので、セキュリティを考えるともっと早くに導入してもよかったのだが、面倒と億劫でずーっと引き伸ばしてきたのだが、「いい加減にやれよ!」という天の声が聞こえたので、あわてて取り組んだ(^^;)
  • 結果的には、それほど難しいことはなかったのだが、ポイントとしては、既存のコンテンツをSSLと非SSLに振り分けるためのサーバ内DIR構成と、http:// でアクセスしてきても自動的にSSLに転送するための設定の2つ。(2008/10/14記)

SSLのインストール

ダウンロード

  • まずは、SSL用のモジュール(mod_ssl)をインストールするのだが、yumであっけなく終わってしまう。
    [root@kuraric51 ~]# yum -y install mod_ssl
    Setting up Install Process
    Parsing package install arguments
    Resolving Dependencies
    (中略)
    Transaction Summary
    ==============================================
    Install      2 Package(s)
    Update       0 Package(s)
    Remove       0 Package(s)
    
    Total download size: 203 k
    Downloading Packages:
    (1/2): distcache-1.4.5-14 100% |=========================| 119 kB    00:00
    (2/2): mod_ssl-2.2.3-11.e 100% |=========================|  84 kB    00:00
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Installing: distcache         ######################### [1/2]
      Installing: mod_ssl           ######################### [2/2]
    
    Installed: mod_ssl.i386 1:2.2.3-11.el5_1.centos.3
    Dependency Installed: distcache.i386 0:1.4.5-14.1
    Complete!

証明書の発行

  • 続いて証明書や暗号化のキーを発行する。
  • まず、当該のDIRに移動する
    [root@kuraric51 /]# cd /etc/pki/tls/certs/
    
  • 証明書作成のためのMakefileが用意されているが、有効期間が1年(365日)なので、あらかじめ10年分(3,650日)に変更しておく。sed コマンドで、Makefile内の 有効期間用の文字列を置換している。
    [root@kuraric51 certs]# sed -i 's/365/3650/g' Makefile
  • まず、サーバ用の証明書と秘密鍵を作成する。パスワードは適用に決めておく(忘れないように)【】部分が実際の入力個所。
    [root@kuraric51 certs]# make server.crt
    umask 77 ; \
            /usr/bin/openssl genrsa -des3 1024 > server.key
    Generating RSA private key, 1024 bit long modulus
    .............................................++++++....++++++
    e is 65537 (0x10001)
    Enter pass phrase:【パスワード入力】
    Verifying - Enter pass phrase:【パスワード再入力】
    umask 77 ; \
            /usr/bin/openssl req -utf8 -new -key server.key -x509 -days 3650 -out server.crt -set_serial 0
    Enter pass phrase for server.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]:【Nagano】
    Locality Name (eg, city) [Newbury]:【Nagano】
    Organization Name (eg, company) [My Company Ltd]:【Enterキー】
    Organizational Unit Name (eg, section) []:【kurarinet.com】
    Common Name (eg, your name or your server's hostname) []:【kurarinet.com】
    Email Address []:【admin@kurarinet.com】
  • サーバー用秘密鍵からパスワード削除しておく。これは、Webサーバー起動する度にパスワードを要求されないようにするためである。
    [root@kuraric51 certs]# openssl rsa -in server.key -out server.key
    Enter pass phrase for server.key:【パスワード入力】
    writing RSA key
  • 生成されファイルをチェックすると、新しいファイル2つができている。
    [root@kuraric51 certs]# ls -l
    合計 464
    -rw-r--r-- 1 root root   2247 10月 12 11:52 Makefile
    -rw-r--r-- 1 root root 441017  6月 15 08:37 ca-bundle.crt
    -rw------- 1 root root   1371  9月 22 14:52 localhost.crt
    -rwxr-xr-x 1 root root    610  6月 15 08:37 make-dummy-cert
    -rw------- 1 root root   1334 10月 12 11:54 server.crt  ★(証明書)
    -rw------- 1 root root    887 10月 14 16:05 server.key  ★(秘密鍵)

SSLの設定

  • 証明書や鍵を作成しただけでは有効にならない。これを適用すべく、SSL用の設定ファイルに指定する必要がある。
  • ApacheSSL設定ファイルを開いて編集する。デフォルトでlocalhost.crtなどが適用されているが、以下の2箇所を書き換える。
    [root@centos certs]# vi /etc/httpd/conf.d/ssl.conf
    -----------
    [サーバー用証明書を指定]
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
      ↓
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    
    [サーバー用秘密鍵を指定]
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
      ↓
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
  • 続いてDocumentRootを変更する。SSLをインストールしただけでは、コンテンツへリンクしない。とりあえず、現在のDocumentRootと同じにしておく。#を削除してコメント解除する。設定ファイルは同じく、ssl.conf。
    #  General setup for the virtual host, inherited from global configuration
    #DocumentRoot "/var/www/html"
      ↓
    DocumentRoot "/var/www/html"

Apacheの再起動とルータのポート443をオープンにする

  • ssl.confの設定変更を反映させるには、httpdを再起動する必要がある。
    [root@kuraric51 certs]# /etc/rc.d/init.d/httpd restart
    httpd を停止中:                                            [  OK  ]
    httpd を起動中:                                            [  OK  ]
  • ルータのポート443を開いておかないと、外部からSSLアクセスができない。
    router

接続時の警告画面

  • 早速、接続試験を行う。基本的に問題ないが、接続時に必ず警告が出る。
    IE_alert
  • これは、証明書が信用できませんと言っている。本来のセキュリティからすれば、なりすまし防止のために公式の認証機関の証明書をもらう必要があるのだが、年間数万円の費用がかかってしまう。それは勘弁してもらって割愛と。したがって、自己証明書(いわば、「オレオレ」証明)なので、こうした警告が出る。ご理解をいただきたい。
  • IEの場合は、この程度なのだが、新しく出たGoogleのブラウザChromeだと、激しい警告が出る。普通の人だと思わず引いてしまいそう(^^;) フィッシング対策強化と言うことだと思うが、ま、めげずに行きましょう!!
    Chrome-alert
  • なお、IEの場合、警告画面の右側のボタン[証明書の表示]をクリックすると、証明書を端末にインストールできる。『オレオレ』なりに信頼関係を確認したことになるためか、以後は警告画面が出なくなってスムーズ(^^)
  • 面白いことに、その後は Chrome でも、あの真っ赤な警告画面が消えたのだ! 特に、追加の設定をしたわけではないのだが、どこかで IE の設定を参照しているのだろうか? 

SSL化に伴う設定ポイント

コンテンツの振分

  • 以上で、サーバ側のSSL設定自体は終わった。問題は、コンテンツをどう配置するかである。
  • 現在のコンテンツを整理すると以下のようになるが、どれをSSLに移行するかという議論である。
    contents
  • 会員制で閲覧限定していたページと、くらさんブログのようにオープンにしていたページがある。この運用上の差異を踏襲することにした。前者をSSLに移行し、後者は 非SSLに残す。といっても、サーバ内でディレクトリーを分けて配置し、DocmentRootで振り分けるだけであるが。

リダイレクト

  • もう一つ問題がある。会員限定コンテンツをSSLに移行した場合、接続先が https://・・となる。ところが、お気に入りに登録済みのものは、多分、 http://・・のままである。
  • 切替え後に、知らずに http://・・で来た人はアクセスできなくなってしまう。これは困る。
  • というわけで、調べてもらったら、サーバ側で自動的に https://・・振り替えてあげる方法がわかった。「パソコンおやじ」の記事■HTTPでアクセスした時、自動的にHTTPSにrewriteする方法である。
  • 具体的には、mod_rewrite を使うのだが、サーバにはあらかじめ組み込まれているので、転送設定を書き加えるだけでよい。詳細は次項で。

切替え手順のまとめ

  • 以上で、準備が整ったので、最終的な切替え手順を整理する。
  • まず、DIRを2つに分けるが、切替えを簡単にするため、SSL化コンテンツを現状DIR構成のまま残し、非SSLコンテンツを新しいDIRに移動することにした。

①DIR構成

【SSL化コンテンツ】今のDIRにそのまま残す。
 /var/www/
  +html/
   +pastlog.html (旧ホスト過去ログメニュー)  
   +bbs16/   (イメージ掲示板のデータ類)
   +wiki/     (旧wiki)
   +past/     (旧ホストの過去ログデータ)
   +members/  (同上 past/と同じ?)
   +OpenPNE/    (SNS)
【非SSLコンテンツ】 新しいDIRに移す
 /var/www/open/
   +index.php      (トップページ類)
   +*.html(change.html、howto.html、member.html
        kurari_sys.html、kurari_ikou.html など)
   +style_top.css   (共通スタイルシート)
   +*.gif、*.jpg   (各種イメージファイル)
   +mailform.php、mailform.dat (メールフォームphp)
   +sgcouter/     (カウンターphp)
   +kurasan/      (kurasan-blogの 入り口)
   +wordpress/     (同上の本体)
   +ezm/         (pukiwikiのezm-BOX)
  • 設定変更が必要なファイルがいくつかある

②OpenPNEの設定変更

・URLを変更  https://kurainet.com/ とする
 [root@kuraric51]# vi /var/www/OpenPNE/config.php
 ーーー
 // Web上の絶対パス(URL)(最後にスラッシュを付けてください)
 define('OPENPNE_URL', 'https://kurarinet.com/sns/'); ★

・PartialSSLの設定(2ヶ所)をコメントに(詳細は略)

③ssl.conf DocumnetRootの変更(実際は、現状のまま)

[root@kuraric51]# vi /etc/httpd/conf.d/ssl.conf
ーーーー
# General setup for the virtual host, inherited from global configuration
DocumentRoot "/var/www/html"

④httpd.conf
・書換え-1  DocumentRootを修正し、関連するDirectory指定も合わせる

[root@kuraric51]# vi /etc/httpd/conf/httpd.conf
-------
 DocmentRoot "/var/www/open"
  <Directory "/var/www/open">

・書換え-2  リダイレクト処理を追加する

<IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteLog "logs/rewrite_log"
      RewriteLogLevel 0

      RewriteCond %{SERVER_PORT} !^443$
      RewriteRule ^/sns/(.*)?$ https://%{HTTP_HOST}/sns/$1 [L,R]
      RewriteRule ^/wiki/(.*)?$ https://%{HTTP_HOST}/wiki/$1 [L,R]
      RewriteRule ^/bbs16/(.*)?$ https://%{HTTP_HOST}/bbs16/$1 [L,R]
      RewriteRule ^/members/(.*)?$ https://%{HTTP_HOST}/members/$1 [L,R]
      RewriteRule ^/cgi-bin/(.*)?$ https://%{HTTP_HOST}/cgi-bin/$1 [L,R]
</IfModule>

⑤最後に、httpdを再起動する

切替え後の調整事項など

  • 基本的に切替えはうまく行ったが、細かいところでは事前に気が付かなかったなどが出てくる。いわゆるバグ取りであるが、一週間ほど尾を引いた(^^;)

トップページ二重化に伴う整理

  • トップページからのリンクの書き方に起因するのだが、相対パスで記述しているため、いったん掲示板等のSSLコンテンツからトップ画面に戻る場合は、SSLのまま遷移する形になる。
  • したがって、open/index.php と html/index.php の2つ残しておく必要がある。
  • 細かいことだが、二重化することに伴う問題点がいくつか発生した。これらの解消方法を整理しておく。

アクセスカウンタ

  • SSL接続では、カウンタの数字を表示する場所に「DENY」とでる。設定ファイルを調べてみたら、「^http」指定されていたので、これを「^https」に修正してOKに。
    [root@kuraric51]# vi /vaw/www/html/sgcouter/sgcouter.php
    ーーーーーーーーーーーーーーーー
    /*外部からの利用禁止*/
    if($refererCheck==1||$dataCreate==1){
        if($_SERVER['HTTP_HOST']!=preg_replace("/^http:\/\/(.*?)\/.*$/","$1",$_SERVER['HTTP_REFERER'])){
              ImgCount('deny');
                exit;
      }
    }
  • アクセスカウンターが2つ動くことになり、データが二重化するのはまずいので、opne/側のデータファイルに一本化した。
    [root@kuraric51]# vi /var/www/html/sgcounter/sgcounter_pref.php
    ーーーーーーーーーーーーーーーーーー
    $countDir='./data';     //カウントデータ格納ディレクトリ
           ↓
    $countDir='../../open/sgcounter/data';  ★

時計表示

  • トップの最下段にリアルタイムのデジタル時計を表示している。これは、外部のサーバを利用することで実現している。(設定一つで、アナログ時計になったり、デザインもいろいろで面白いのだ)
    <script src="http://www.clocklink.com/embed.js"></script>
    <script type="text/javascript" language="JavaScript">obj = new Object;obj.clockfile = "5010-blue.swf";obj.TimeZone = "JST";obj.width = 100;obj.height = 40;obj.wmode = "transparent";showClock(obj);</script>
  • index.php に記述するだけですみ、お手軽でよいのだが、https:// で戻ったときには、インラインで直接リンクを張っているため「警告」表示の原因になる。
  • うるさいので削除した。(もともと、お遊びの表示なので ^^; open側トップの時計は残した)

くらさんブログへのリンク

  • SSL側のトップから「くらさんブログ」へのリンクだが、これも相対パス(./kurasan/)で記述されていた。当然、SSL側にコンテンツはないので接続エラーになる。
  • SSL ⇒ 非SSL へのリダイレクトができればよいのだが、これがうまくいかなかった。httpd.confに、同じような形でスクリプトを書いてみたのだが動作しなかった(;_;)
  • リンクのタグを URL形式で、以下のように書けば済む話なので、割り切って終わり(^^;)
    <A href="http://kurarinet.com/kurasan/"><b>kurasan-blog</b></A> 

メールフォーム

  • 管理者宛にメールを送る機能を、PHPで実現している。これも二重化する形になるのだが、メールアドレスなどを記述する要素もあるので、セキュリティを考えてSSL側にだけおくことにした。
  • open側のindex.phpからのリンクをSSL側にジャンプする形にした。上と同じくURL形式でタグ記述した。
  • どれもこれも、既存のコンテンツ(php,cgi,html)をできるだけ書換えせずに済まそうという発想だったのが、力不足でやむなし。

その他のメモ

  • ブログのコンテンツ wordpress/ はDIR移動する形になったので、移動後の動作が一番心配だった。ただ、事前確認で全く問題いことがわかった。設定変更なども一切不要で、これには安心した。(SSL化するとなると、いろいろあったろうが、、)
  • SNSのOpenPNEには、「Partial SSL」 という機能が備わっていた。サーバ側にSSLを導入することが前提だが、OpenPNEの設定ファイルを2ヶ所修正するだけで、部分的なSSLを実現するもの。ログイン画面では、http://で接続しても自動的に https:// にリダイレクトし、設定変更などの個人情報に関わる画面だけがSSLになるもの。しばらくこれで運用していたが、今は全画面がSSLになっている。

(最終 2008/10/18記)


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   リンク元