FreeBSDでApacheを使用する。

FreeBSDにApacheをインストールするメモ。

httpとhttpsをnamebased virtual hostで動作させてみます。

Apacheはportsからインストール(現在のバージョンは2.2.16の模様)

portinstall  -f www/apache22

ちなみにコンパイルオプションはこんな感じに。

インストール終了後、Apacheの設定ファイルを修正。

portsのapahce22をインストールすると、設定ファイル関連は/usr/local/etc/apache22に置かれる。

  • /usr/local/etc/apache22/httpd.confの修正
    httpd.confはapacheの基本設定を行うファイル。ホスト毎の設定は別にファイルを作ってインクルードするので、修正は最小限にとどめる。

    • 待ち受けポートを80番に指定(3行目)
    • Server管理者をwebmaster@hogehoge.jpに(68行目)
    • サーバ名をwww.hogehoge.jpに(70行目)
    • ディレクトリインデックスにindex.shtml・index.cgi・index.phpを追加(88行目)
    • mime関連見直し(125~140行目)
    • バーチャルホスト設定ファイルインクルード(161行目)
    • SSL/TLS設定ファイルインクルード(173行目)

    57行目にあるようにphp5_moduleの設定は、ports経由でphp5をインストールすると自動で定義されるので、手動追加しない。

    [sourcecode lang=”text”]
    ServerRoot <"/usr/local">

    Listen 80

    LoadModule authn_file_module libexec/apache22/mod_authn_file.so
    LoadModule authn_dbm_module libexec/apache22/mod_authn_dbm.so
    LoadModule authn_anon_module libexec/apache22/mod_authn_anon.so
    LoadModule authn_default_module libexec/apache22/mod_authn_default.so
    LoadModule authn_alias_module libexec/apache22/mod_authn_alias.so
    LoadModule authz_host_module libexec/apache22/mod_authz_host.so
    LoadModule authz_groupfile_module libexec/apache22/mod_authz_groupfile.so
    LoadModule authz_user_module libexec/apache22/mod_authz_user.so
    LoadModule authz_dbm_module libexec/apache22/mod_authz_dbm.so
    LoadModule authz_owner_module libexec/apache22/mod_authz_owner.so
    LoadModule authz_default_module libexec/apache22/mod_authz_default.so
    LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
    LoadModule auth_digest_module libexec/apache22/mod_auth_digest.so
    LoadModule file_cache_module libexec/apache22/mod_file_cache.so
    LoadModule cache_module libexec/apache22/mod_cache.so
    LoadModule disk_cache_module libexec/apache22/mod_disk_cache.so
    LoadModule dumpio_module libexec/apache22/mod_dumpio.so
    LoadModule reqtimeout_module libexec/apache22/mod_reqtimeout.so
    LoadModule include_module libexec/apache22/mod_include.so
    LoadModule filter_module libexec/apache22/mod_filter.so
    LoadModule charset_lite_module libexec/apache22/mod_charset_lite.so
    LoadModule deflate_module libexec/apache22/mod_deflate.so
    LoadModule log_config_module libexec/apache22/mod_log_config.so
    LoadModule logio_module libexec/apache22/mod_logio.so
    LoadModule env_module libexec/apache22/mod_env.so
    LoadModule mime_magic_module libexec/apache22/mod_mime_magic.so
    LoadModule cern_meta_module libexec/apache22/mod_cern_meta.so
    LoadModule expires_module libexec/apache22/mod_expires.so
    LoadModule headers_module libexec/apache22/mod_headers.so
    LoadModule usertrack_module libexec/apache22/mod_usertrack.so
    LoadModule unique_id_module libexec/apache22/mod_unique_id.so
    LoadModule setenvif_module libexec/apache22/mod_setenvif.so
    LoadModule version_module libexec/apache22/mod_version.so
    LoadModule ssl_module libexec/apache22/mod_ssl.so
    LoadModule mime_module libexec/apache22/mod_mime.so
    LoadModule dav_module libexec/apache22/mod_dav.so
    LoadModule status_module libexec/apache22/mod_status.so
    LoadModule autoindex_module libexec/apache22/mod_autoindex.so
    LoadModule asis_module libexec/apache22/mod_asis.so
    LoadModule info_module libexec/apache22/mod_info.so
    LoadModule suexec_module libexec/apache22/mod_suexec.so
    LoadModule cgi_module libexec/apache22/mod_cgi.so
    LoadModule dav_fs_module libexec/apache22/mod_dav_fs.so
    LoadModule vhost_alias_module libexec/apache22/mod_vhost_alias.so
    LoadModule negotiation_module libexec/apache22/mod_negotiation.so
    LoadModule dir_module libexec/apache22/mod_dir.so
    LoadModule imagemap_module libexec/apache22/mod_imagemap.so
    LoadModule actions_module libexec/apache22/mod_actions.so
    LoadModule speling_module libexec/apache22/mod_speling.so
    LoadModule userdir_module libexec/apache22/mod_userdir.so
    LoadModule alias_module libexec/apache22/mod_alias.so
    LoadModule rewrite_module libexec/apache22/mod_rewrite.so
    LoadModule php5_module libexec/apache22/libphp5.so

    <IfModule !mpm_netware_module>
    <IfModule !mpm_winnt_module>

    User www
    Group www

    </IfModule>
    </IfModule>

    ServerAdmin webmaster@hogehoge.jp

    ServerName www.hogehoge.jp:80

    DocumentRoot "/usr/local/www/apache22/data"

    <Directory />
    AllowOverride None
    Order deny,allow
    Deny from all
    </Directory>

    <Directory "/usr/local/www/apache22/data">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>

    <IfModule dir_module>
    DirectoryIndex index.html index.shtml index.cgi index.php
    </IfModule>

    <FilesMatch "^.ht">
    Order allow,deny
    Deny from all
    Satisfy All
    </FilesMatch>

    ErrorLog &amp;quot;/var/log/httpd-error.log&amp;quot;
    LogLevel warn

    <IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
    # You need to enable mod_logio.c to use %I and %O
    LogFormat "%h %l %u %t \"%r" %>s %b \"%{Referer}i" \"%{User-Agent}i" %I %O" combinedio
    </IfModule>

    CustomLog "/var/log/httpd-access.log" combined
    </IfModule"

    <IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/local/www/apache22/cgi-bin"
    </IfModule>

    <Directory "/usr/local/www/apache22/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
    </Directory>

    DefaultType text/plain

    <IfModule mime_module>
    TypesConfig etc/apache22/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    AddHandler cgi-script .cgi

    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml

    # PHP
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

    </IfModule>

    # Server-pool management (MPM specific)
    #Include etc/apache22/extra/httpd-mpm.conf

    # Multi-language error messages
    Include etc/apache22/extra/httpd-multilang-errordoc.conf

    # Fancy directory listings
    #Include etc/apache22/extra/httpd-autoindex.conf

    # Language settings
    Include etc/apache22/extra/httpd-languages.conf

    # User home directories
    #Include etc/apache22/extra/httpd-userdir.conf

    # Real-time info on requests and configuration
    #Include etc/apache22/extra/httpd-info.conf

    # Virtual hosts
    Include etc/apache22/extra/httpd-vhosts.conf

    # Local access to the Apache HTTP Server Manual
    #Include etc/apache22/extra/httpd-manual.conf

    # Distributed authoring and versioning (WebDAV)
    #Include etc/apache22/extra/httpd-dav.conf

    # Various default settings
    #Include etc/apache22/extra/httpd-default.conf

    # Secure (SSL/TLS) connections
    Include etc/apache22/extra/httpd-ssl.conf

    <IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    </IfModule>

    Include etc/apache22/Includes/*.conf[/sourcecode]

  • 証明書関連
    自己認証局による認証はあまり意味が無いので認証を行わない証明書を作成する(暗号化通信が出来れば良いので)。

    • 証明書用ディレクトリ作成
      /usr/local./etc/apache22の下にCERTという名称でディレクトリを作成する。以下の操作はこのディレクトリに移動して行う。
    • サーバ用秘密鍵(server.key)の生成

      dns# openssl genrsa -des3 -out server.key -rand rand.dat 1024
      0 semi-random bytes loaded
      Generating RSA private key, 1024 bit long modulus
      ...........++++++
      ....++++++
      e is 65537 (0x10001)
      Enter pass phrase for server.key:サーバ用パスワードを入力
      Verifying - Enter pass phrase for server.key: サーバ用パスワードを再入力

    • サーバ用公開鍵(server.csr)の生成
      ワイルドカード対応で作成するには、ドメイン名の入力時に「*.ドメイン」のように指定する。

      dns# openssl req -new -key server.key -out server.csr
      Enter pass phrase for server.key: RastafactoryServerPass
      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]:Tokyo(県名)
      Locality Name (eg, city) []:Shinjuku(都市名)
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:HOGEHOGE(組織名)
      Organizational Unit Name (eg, section) []:Admin(部署名)
      Common Name (eg, YOUR name) []:*.hogehoge.jp(ドメイン名)
      Email Address []:webmaster@hogehoge.jp(管理者のメールアドレス)
      Please enter the following 'extra' attributes
      to be sent with your certificate request
      A challenge password []:リターンのみ
      An optional company name []:リターンのみ

    • 起動時のパスフレーズ削除
      このままサーバ証明書を作成すると、Apacheの起動時にserver.keyで指定したサーバ用パスワードを入力する必要が出てくるので、server.keyからパスワードを削除する。

      dns# openssl rsa -in server.key -out server.key
      Enter pass phrase for server.key:サーバー用パスワードを入力
      writing RSA key

    • サーバ用証明書の生成
      -daysオプションの最後は有効期間(日)となる。自己証明書なので3650日(10年)としてある。

      dns# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
      Signature ok
      subject=/C=JP/ST=Tokyo/L=Shinjuku/O=HOGEHOGE/OU=Admin/CN=*.hogehoge.jp/emailAddress=webmaster@hogehoge.jp
      Getting Private key

    • 証明書インポートファイル作成

      dns# openssl x509 -in server.crt -out server.der -outform DER

  • /usr/local/etc/apache22/extra/httpd-ssl.confの修正
    httpd-ssl.confはssl関連の設定ファイル。
    先程作成したSSL関連ファイルを、SSLCertificatefileでサーバ証明書、SSLCertificateKeyfileでサーバ暗号キーファイルを指定する。

    [sourcecode lang=”text”]
    Listen 443
    SSLStrictSNIVHostCheck off

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

    SSLPassPhraseDialog builtin

    SSLSessionCache "shmcb:/var/run/ssl_scache(512000)"
    SSLSessionCacheTimeout 300

    SSLMutex "file:/var/run/ssl_mutex"

    <VirtualHost *:443>

    DocumentRoot "/usr/local/www/apache22/data"
    ServerName www.hogehoge.jp:443
    ServerAdmin webmaster@hogehoge.jp
    ErrorLog "/var/log/httpd-error.log"
    TransferLog "/var/log/httpd-access.log"

    SSLEngine on

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

    SSLCertificateFile "/usr/local/etc/apache22/CERT/server.crt"
    SSLCertificateKeyFile "/usr/local/etc/apache22/CERT/server.key"

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory "/usr/local/www/apache22/cgi-bin">
    SSLOptions +StdEnvVars
    </Directory>

    BrowserMatch ".*MSIE.*" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0

    CustomLog "/var/log/httpd-ssl_request.log" \
    "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

    </VirtualHost>[/sourcecode]

  • /usr/local/etc/apache22/extra/httpd-vhosts.confの修正
    httpd-vhosts.confはバーチャルホスト関連の設定ファイル。
    httpとhttpsの両ポートをネームベースのバーチャルホスト運用として設定する。

    [sourcecode lang=”text”]
    NameVirtualHost *:80
    NameVirtualHost *:443[/sourcecode]

  • ホスト毎の設定ファイル作成
    ホスト毎の設定ファイルを作成する。設置場所は/usr/local/etc/apache22/Includesの下とし、各ファイルの最後を.confとすることで、自動で読込まれる。
    以下の例は、Wordpressを運用しているwp.hogehoge.jpの例。

    • httpとhttpsの両方をネームベースのバーチャルホスト運用する最低限の設定としている。
    • ドキュメントルートは/usr/local/www/jp/hogehoge/wpとした。
    • httpsのVirtualHostディレクティブ内でもDirectoryディレクティブを使用してドキュメントルートなどの設定を行う必要がある。

    [sourcecode lang=”text”]
    <VirtualHost *:80>
    ServerAdmin webmaster@hogehoge.jp
    DocumentRoot /usr/local/www/jp/hogehoge/wp
    ServerName wp.hogehoge.jp
    LimitRequestBody 1048576
    UserDir disabled
    HostNameLookups ON
    ScriptAlias /cgi-bin/ "/usr/local/www/jp/hogehoge/wp/cgi-bin
    ErrorLog /usr/local/www/jp/hogehoge/wp/log/httpd-error.log
    CustomLog /usr/local/www/jp/hogehoge/wp/log/httpd-access.log combined

    <Directory /usr/local/www/jp/hogehoge/wp/data>
    AllowOverride FileInfo AuthConfig Limit Options
    Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS PROPFIND>
    Options ExecCGI Includes
    Order allow,deny
    Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS PROPFIND>
    Order deny,allow
    Deny from all
    </LimitExcept>
    </Directory>

    <Directory /usr/local/www/jp/hogehoge/wp/cgi-bin>
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
    </Directory>

    </VirtualHost>

    <VirtualHost *:443>
    DocumentRoot /usr/local/www/jp/hogehoge/wp/data
    ServerName wp.hogehoge.jp:443

    SSLEngine on
    SSLCertificateFile "/usr/local/etc/apache22/CERT/server.crt"
    SSLCertificateKeyFile "/usr/local/etc/apache22/CERT/server.key"

    <Directory /usr/local/www/jp/hogehoge/wp/data>
    AllowOverride FileInfo AuthConfig Limit Options
    Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS PROPFIND>
    Options ExecCGI Includes
    Order allow,deny
    Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS PROPFIND>
    Order deny,allow
    Deny from all
    </LimitExcept>
    </Directory>

    </VirtualHost>[/sourcecode]

  • /etc/rc.confの修正
    OS起動時にApacheが自動起動できるようにrc.confファイルに下記行を追加。

    [sourcecode lang=”text”]
    # Apache22
    apache22_enable="YES"
    [/sourcecode]

Apacheの設定は以上で終了なので、rebootするかrehash等をして/usr/local/etc/rc.d/apache22 startを行う。

Apache起動後該当サイトにブラウザで接続して正しくコンテンツが参照できることを確認。

ネームベースバーチャルホストでのhttpsは証明書がおかしいとブラウザに言われる。ECサイトのように顧客に対して信頼性を提供するのであれば、費用が掛かるが対象となるブラウザでサポートされている認証局に証明書を認証してもらうべき。

社内用途で、セキュアなアクセスが必要な場合は、認証されていない証明書で十分。この場合はブラウザ側で証明書の取り込みを行えばよい。

  • Firefoxの場合
    「接続の安全性が確認できません」とアラートが表示される。
    画面上の「危険性を理解したうえで接続するには」をクリックすると、「例外の追加」ボタンが表示される。
    「例外の追加」ボタンをクリックすると「セキュリティ例外の追加」ウィンドウが表示されるので、その中の「次回工以降にもこの例外を有効にする」にチェックマークが入っていることを確認した後、「セキュリティ例外を承認する」ボタンをクリックする。
  • IE(8)の場合
    証明書の不備なサイトにアクセスすると、アドレスバーの横に「証明書のエラー」と表示される。
    この部分をクリックすると、
    と表示されるので、「証明書の表示」をクリックする。
    証明書が表示されたら「証明書のインストール」ボタンをクリックする。クリックすると証明書のインポートウィザードが起動する。
    証明書のインポートウィザードが表示されたら「次へ」ボタンをクリック。
    証明書ストア選択が表示されるので、そのまま「次へ」ボタンをクリックする。
    セキュリティ警告が表示されるので「はい」ボタンをクリックする。
    インポートが正常に終了すると完了画面が表示されるので「完了」ボタンをクリックしてウィザードを終了させる。

上記操作以降はとりあえずSSLでアクセスしても、ブラウザに怒られることはなくなる。

以降、同じサーバで別のサイトを運用する場合は、DNSにAレコードでマシン名を追加して、/usr/local/etc/apache22/Includesの下に設定ファイルを追加すればよい。

コメント

タイトルとURLをコピーしました