OpenSSLをビルドしてApacheで利用する:仕事で使える魔法のLAMP(17)
今回は、Apache HTTP Serverに追加モジュールを組み合わせてビルドしてみます。失敗したときの対策も紹介します(編集部)
セキュリティにかかわるOpenSSLは自分でビルドすべき
第14回からApache HTTP Server(以下Apache)をビルドする方法を解説していますが、今回はちょっと寄り道をしまして、OpenSSLをビルドする方法を紹介します。OpenSSLはApacheをSSLに対応させるために必要になる、重要な外部ソフトウェアです。
OpenSSLのようなライブラリはわざわざビルドすることなく、前回説明したようにディストリビューションが提供するパッケージを使うこともできます。しかし、もしディストリビューションが古くなり、セキュリティアップデートの提供が期待できないとしたら、そのまま使うのは問題があります。SSLのような信頼性が大切なものではなおさらです。そこで今回は、そういった事態も想定して、あえてビルドしてみることにします。
また、OpenSSLはこれまで解説してきたソフトウェアとは異なり、ビルドにconfigureスクリプトを使わないソフトウェアでもあります。configureを使わないときの例として、参考になればと思います。
OpenSSLには、configureの代わりになるような、ビルド設定スクリプトが付属しています。configureを利用しないのは、異なるプラットフォームへの移植をしやすくするという目的があると思われます。configureにも、ソフトウェアの移植をしやすくするという狙いがありましたが、これは基本的にUNIX系のシステム間の移植を想定しています。OpenSSLは、Windowsなどの大きく異なるOSにも容易に移植できるように、独自のツールを使っているのでしょう。
ビルドのために必要なものとしては、コンパイラなど、ごく普通のツール以外に、Perl 5が必要になります。これは、上記の独自ツールがPerlで記述されているためです。Perl 5はLinux OSなら初期状態でインストールされていると思いますが、インストールされていなければ次のようにしてインストールします。
$ sudo yum install perl
また、絶対に必要なライブラリではありませんが、今回はzlibも利用します。第15回で、mod_deflateをビルドするためにインストールしたものです。インストールがまだでしたら、第15回を参考にインストールしてください。
OpenSSLにはバージョン1.0.0系とバージョン0.9.8系の2系統があり、どちらもメンテナンスが続いています。現在のLinuxディストリビューションでは0.9.8系が主流ですが、そろそろ1.0.0系に切り替わっていくでしょう。ということで今回は1.0.0系を使うことにします。最新のバージョンは1.0.0dです。
configスクリプトを利用する
UNIX系OSでは、configというスクリプトでインストール先などを設定します。configure同様に、引数で設定を指定するのです。「--prefix」でインストール先を指定できるのはまったく同じです。今回は「/opt/openssl-1.0.0d」にインストールすることにします。さらに、シェアードライブラリ(第7回参照)としてビルドすると指定する「shared」、zlibを利用すると指定する「zlib」を引数にします。
まとめると、次のようなコマンドラインになります。
./config --prefix=/opt/openssl-1.0.0d \ shared \ zlib \ 2>&1 | tee config_log.txt
ビルドおよびインストールは、いつも通り「make」「sudo make install」です。
OpenSSLはSSLのライブラリだけでなく、SSLの証明書作成などの機能を持つopensslコマンドと一体になっているソフトウェアです。インストールが終わったら、opensslコマンドが正しく起動するか、次のように確認します。
$ /opt/openssl-1.0.0d/bin/openssl version OpenSSL 1.0.0d 8 Feb 2011
次に、シェアードライブラリが正しくリンクできているかも確認しましょう。
$ /opt/openssl-1.0.0d/bin/openssl linux-vdso.so.1 => (0x00007fff77443000) libssl.so.1.0.0 => /opt/openssl-1.0.0d/lib/libssl.so.1.0.0 (0x00002b174310d000) libcrypto.so.1.0.0 => /opt/openssl-1.0.0d/lib/libcrypto.so.1.0.0 (0x00002b1743364000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003430600000) libz.so.1 => /usr/lib64/libz.so.1 (0x0000003431200000) libc.so.6 => /lib64/libc.so.6 (0x0000003430200000) /lib64/ld-linux-x86-64.so.2 (0x000000342fe00000)
OpenSSLのライブラリであるlibsslとlibcryptが/opt/openssl-1.0.0dにあるものとリンクしていること、libzがリンクできていることが確認できます。
OSにもOpenSSLをインストールしている場合、ビルドツールなどのバグで、リンク先を間違えていないとも限りません。lddコマンドによるライブラリの確認は忘れずに実施しましょう。
OpenSSLを使うようにApacheをビルド
OpenSSLがインストールできましたら、このOpenSSLを使うようにApacheをビルドしましょう。「--with-ssl=/opt/openssl-1.0.0d」とOpenSSLのインストールディレクトリを指定します。前回はパッケージでインストールした標準の場所にあるOpenSSLを使ったため、ディレクトリは指定せずに「--with-ssl」を使いました。
コマンドラインは次のようになります。
./configure \ --prefix=/opt/apache-httpd-2.2.19 \ --enable-mods-shared=all \ --enable-ssl \ --with-ssl=/opt/openssl-1.0.0d \ --with-mpm=prefork \ 2>&1 | tee configure_log.txt
この状態でビルド、インストールしたとします。次のようにlddコマンドで、sslモジュール(mod_ssl)のリンク状況を調べてみます。
$ ldd /opt/apache-httpd-2.2.19/modules/mod_ssl.so linux-vdso.so.1 => (0x00007fff547fc000) libssl.so.1.0.0 => not found libcrypto.so.1.0.0 => not found libdl.so.2 => /lib64/libdl.so.2 (0x00002b812f930000) libz.so.1 => /usr/lib64/libz.so.1 (0x00002b812fb34000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b812fd49000) libc.so.6 => /lib64/libc.so.6 (0x00002b812ff64000) /lib64/ld-linux-x86-64.so.2 (0x000000342fe00000)
libsslとlibcryptoがnot foundとなってしまい、リンクするライブラリが見つからない状態です。これではApacheは起動すらしません。標準ではないディレクトリにあるライブラリとリンクしたときに、よく起こる問題です。
解決方法はいくつかありますが、今回は環境変数LD_LIBRARY_PATHを使う方法を紹介します。LD_LIBRARY_PATHは、ライブラリのサーチパスを指定するものです。環境変数を設定してコマンドを実行するenvコマンドを使い、次のように実行します。
$ env LD_LIBRARY_PATH=/opt/openssl-1.0.0d/lib ldd /opt/apache-httpd-2.2.19/modules/mod_ssl.so linux-vdso.so.1 => (0x00007fff50bfc000) libssl.so.1.0.0 => /opt/openssl-1.0.0d/lib/libssl.so.1.0.0 (0x00002b2ae3d08000) libcrypto.so.1.0.0 => /opt/openssl-1.0.0d/lib/libcrypto.so.1.0.0 (0x00002b2ae3f60000) libdl.so.2 => /lib64/libdl.so.2 (0x00002b2ae430d000) libz.so.1 => /usr/lib64/libz.so.1 (0x00002b2ae4511000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b2ae4726000) libc.so.6 => /lib64/libc.so.6 (0x00002b2ae4941000) /lib64/ld-linux-x86-64.so.2 (0x000000342fe00000)
今度は無事、2つのライブラリをリンクできました。Apacheの環境変数はbin/envversファイルで設定できますので、次の行を同ファイルに追加することで起動するようになります。
LD_LIBRARY_PATH="/opt/openssl-1.0.0d/lib:$LD_LIBRARY_PATH"
今回解説したケースでは、ライブラリがnot foundとなり、Apacheは起動すらしませんでした。OS側にインストールされているOpenSSLは0.9.8系で、バージョンが一致していないため、どう転んでもnot foundのままです。シェアードライブラリはバージョン番号を含めたファイル名になっているためです。
独自インストールしたOpenSSLが0.9.8系である場合、OSとバージョンが一致してしまい、使用者が意図しないライブラリで起動できてしまう可能性もあります。これは起動できないという状態より、問題に気付きにくく、危険と言えます。繰り返しになりますが、lddコマンドでのチェックは怠らないようにしましょう。
次回はldapモジュールについて解説します。
- CMakeでMySQLをビルドしてみる
- MySQLのビルドに欠かせないCMakeを準備する
- いよいよMySQL編、ソースからビルドすべきか?
- PHPでセッションを利用するための設定
- クライアントがアクセスできる範囲を制限する
- エラーメッセージをどう扱うか?
- ファイルのアップロードを制限する
- リクエストデータを受け取る変数の扱い
- マジッククオート機能には頼らない
- 安全を考えてPHPの実行時設定を調整する
- Apacheの設定ファイルでPHPの設定を変える
- PHPの設定ファイルを作って配置してみる
- PHPスクリプトを実行できるようにする準備
- PHPエクステンション組み込みの仕上げ
- 単純なデータを管理するDBMを使えるようにする
- エクステンションの組み込み状況を確認する
- PHPでデータベースを使う準備をする
- XMLを処理できるようにする
- エクステンションを有効にしてビルドに挑戦!
- PHPテスト失敗の原因を追究する
- 早速PHPをビルド! そしてテスト!
- PHP編に突入! まずはソースをダウンロード
- 設定ファイルを作成してApacheを動作させる
- 設定ファイルや公開ドキュメントの配置を考える
- 1つのサーバに複数の仮想サーバ?
- Apacheの設定ファイルを記述する前に
- サードパーティのApacheモジュールをビルドする
- 認証DBにアクセスするライブラリを組み込む
- Apache同梱ソフトウェアに引数を渡してビルド
- OpenSSLをビルドしてApacheで利用する
- proxyやsslのモジュールを使ってみる
- ライブラリが足りなくてビルドできないときは?
- Apache HTTP Serverのビルドを始めよう
- configureでソフトウェア固有の設定を変更してみる
- configureの設定を変更してみる
- 配布パッケージの中身と、configureの役目を知る
- ダウンロードファイルが真正なものであるかを確認
- Makefileをいろいろ書き換えながらビルドしてみよう
- makeを使ってソフトウェアをビルドしてみよう
- ダイナミックリンクとスタティックリンク
- 「ビルド」という作業は何を指しているのか
- 公開鍵認証でsshを安全に使う
- sshを便利にする公開鍵暗号
- アクセス制限の設定とCentOSのアップデート
- サーバに接続して、一般ユーザーのアカウントを作る
- LAMP環境、自分で作りませんか?
Copyright © ITmedia, Inc. All Rights Reserved.