FC5でApache/SSL/WebDAV/Digest認証

FedoraCore5 をセットアップしたので、何か新しいものに手を出してみよう、ということで、WebDAVに挑戦。
でも、単純にWebDAVを立ち上げるだけであれば、他にも資料はいくらでもありそうなので、ちょっと踏み込んでやってみた。
ポイントは

  • 外部公開。証明書は自己証明。
  • 当然、日本語対応。
  • SSLの暗号強度は高めで(AES-256bit-CBC)。
  • 使えない環境があろうが構いません。Digest認証で。

ちなみに、以前行った作業を「思い起こしながら」まとめた資料ですので、記述あやまりや矛盾など、山ほどある可能性があると思います。
ので、もし問題を見つけた方は是非激しくツッコミお願いいたします

環境

  • OS :Fedora Core5
  • Apache HTTP Server 2.2.2-1.2
  • OpenSSL 0.9.8a-5.2
  • mod_ssl 2.2.2-1.2

導入メモ

ドメイン名の取得

外部公開するということで、適当なドメイン名を取得します。
メジャー度では DynDNS あたり、容易さでは ddo.jp あたりでしょうか。
ここでは「myserver.hogehoge.com」というドメイン名を取得したとしましょう。

各パッケージの導入

Apache HTTP Server、OpenSSL、mod_ssl などがインストールされていなければ導入します。

(例:確認)
# rpm -qa | grep httpd
# rpm -qa | grep openssl

インストールされていないものについては yumにて導入します。

(例:導入)
# yum install openssl

など。

日本語対応のため mod_encoding を導入

こちらで、FC5 の apache 2.2 対応版、mod_encoding のrpmを作成されているすばらしい方がいらっしゃいます。こちらからmod_encoding-2.2.0-1.i386.tar.gzをダウンロードして導入します。

(例:確認)
# wget http://www.aconus.com/~oyaji/ftp/download_f.cgi?name=fc5/mod_encoding/mod_encoding-2.2.0-1.i386.tar.gz
# tar zxvf ./mod_encoding-2.2.0-1.i386.tar.gz
# rpm -e mod_encoding
# rpm -ivh ./mod_encoding-2.2.0-1.i386.rpm

ちなみに私の環境ではどうも上手く導入できなかったので、強引に入れてしまいました。

rpm -ivh --nodeps --force ./mod_encoding-2.2.0-1.i386.rpm

原因調べろって?エラーログは?・・・すいません、時間が無かったので勢いでやってしまいました(^^;

サーバ証明書の作成

以下のファイルを作成するものとする

  • サーバ用証明書 myserver.pem
  • サーバ用公開鍵 myserver.csr
  • サーバ用秘密鍵 myserver.key

こちらをとても参考にさせてもらいました。

# cd /etc/pki/tls/certs
# make myserver.key


AES-256bit-CBC秘密鍵を作成

# umask 77 ; openssl genrsa -aes256 > myserver.key

最低限の入力で済まそうとする場合は
最初の「Enter pass phrase:」「Verifying - Enter pass phrase:」には任意のパスワードを入力。
「Country Name 」に「JP」
「Common Name」にサーバ名(今回は「myserver.hogehoge.com」)
でいいと思います。他はデフォルト(Enter押下)でOK。
最後のほうで聞かれるパスワードも空でよいです。


httpd起動時のパスワード入力を不要にするため、サーバー用秘密鍵からパスワード削除

# openssl rsa -in myserver.key -out myserver.key

パスワードを聞かれたら、秘密鍵作成時に入力したパスワードを入力してください。

  • サーバ用公開鍵作成
# cd /etc/pki/tls/certs
# make server.csr
# umask 77 ; openssl req -new -key myserver.key -out myserver.csr

サーバ証明書を作成するためには、mod_sslに付属する「sign.sh」を使用します。
恐らくrpmでmod_sslを導入した場合には存在しないと思われるので、このあたりからダウンロードします。
例えば mod_ssl-2.8.28-1.3.37.tar.gz ならば

# cd /etc/pki/tls/certs
# wget http://www.modssl.org/source/mod_ssl-2.8.28-1.3.37.tar.gz
# tar zxvf .//mod_ssl-2.8.28-1.3.37.tar.gz

などとする。そこで

# ./mod_ssl-2.8.28-1.3.37/pkg.contrib/sign.sh myserver.csr

Sign the certificate? [y/n]:」には「y」
「1 out of 1 certificate requests certified, commit? [y/n]」にも「y」を入力する。


CA証明書をブラウザにインポートするための myserver.pem ファイル作成

(有効期間[-days オプション]は適当に設定。私は10年にしてしまいました・・・)
# openssl x509 -in myserver.csr -out myserver.pem -req -signkey myserver.key -days 3650
(root のみ参照できるようにパーミッション変更)
# chmod 400 myserver.*

なお、上記の例では「/etc/pki/tls/certs」にダウンロードしたり、展開したりとしてしまっていますが、その辺りは上手く読み替えてください。

ファイル名や配置先は、後の手順にある ssl.conf の設定とあわせます。

# cd /etc/pki/tls/certs
(サーバ秘密鍵:ssl.conf の SSLCertificateKeyFile の設定とあわせる)
# mv myserver.key /etc/pki/tls/private
(サーバ証明書:ssl.conf の SSLCertificateFile の設定とあわせる)
# mv myserver.pem /etc/pki/tls/certs  (今回の場合は同じ場所なので、このコマンドは不要ですね)

サーバの公開鍵については、証明書を作成する過程での成果物のようなので、気になるのであれば消してもOKと思われます。

apache 設定ファイルを変更
(サーバ名)
ServerName www.example.com:80
↓
#ServerName www.example.com:80
ServerName myserver.hogehoge.com:80

上記の設定は、HTTPS限定であれば必須では無いかな?まぁおまけってことで。
また、以下の設定があることを確認します。

(ダイジェスト認証用モジュール)
LoadModule auth_digest_module modules/mod_auth_digest.so
(WebDAV用モジュール)
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
(WevDAVモジュール用設定)
#
# WebDAV module configuration section.
#
<IfModule mod_dav_fs.c>
    # Location of the WebDAV lock database.
    DAVLockDB /var/lib/dav/lockdb
</IfModule>


それと、

<IfModule mod_headers.c>
        Header add MS-Author-Via "DAV"
</IfModule>

という記述を追加します。私は末尾に追加しました。
Windows2000/XP から Webフォルダ接続する場合の対応だそうです。

(サーバ名)
#ServerName www.example.com:443
↓
#ServerName www.example.com:443
ServerName myserver.hogehoge.com:443
(サーバ証明書(公開鍵)指定)
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
↓
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/pki/tls/certs/myserver.pem
(サーバ証明書の秘密鍵指定)
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
↓
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/pki/tls/private/myserver.key

まぁ、鍵ファイルの名前や場所は、先の手順で作成した鍵の結果と合わせてもらえれば任意です。

  • /etc/httpd/conf.d/mod_encoding.conf の内容の確認。

私の環境の場合は以下の通り。

LoadModule encoding_module modules/mod_encoding.so
<IfModule mod_encoding.c>
    EncodingEngine on
    NormalizeUsername on
    SetServerEncoding UTF-8
#    DefaultClientEncoding UTF-8 CP932 JA-AUTO-SJIS-MS SJIS
    DefaultClientEncoding JA-AUTO-SJIS-MS UTF-8 CP932 SJIS
    AddClientEncoding "Microsoft .* DAV 1.1" ASCII CP932 UTF-8
    AddClientEncoding "Microsoft .* DAV" UTF-8 CP932
    AddClientEncoding "(Microsoft .* DAV $)" UTF-8 CP932
    AddClientEncoding "(Microsoft .* DAV 1.1)" CP932 UTF-8
    AddClientEncoding "Microsoft-WebDAV*" UTF-8 CP932
    AddClientEncoding "RMA/*" CP932
    AddClientEncoding "xdwin9x/" CP932
#    AddClientEncoding "cadaver/" UTF-8 EUCJP-MS
    AddClientEncoding "cadaver/" EUCJP-MS UTF-8
    AddClientEncoding "Mozilla/" EUCJP-MS
</IfModule>

「EncodingEngine」は当然「on」であること、また「NormalizeUsername」はWindowsからのWebフォルダ接続の場合の不具合を解消してくれるらしいので、忘れずに「on」にすること。

WebDAV 設定ファイルを変更

/etc/httpd/conf.d/webdav.conf

  • 認証方法はパスワードファイルを使ったDigest認証とする
  • 公開URLは「https://myserver.hogehoge.com/web/dav」とする
  • 公開先のローカル位置は「/var/pub/webdav」とする
  • アクセスできるユーザは「myuser」とする
  • httpd.confの「User」「Group」で指定されているユーザ、グループに即したアクセス権を設定しておく
Alias /web/dav "/var/pub/webdav"
<Location "/web/dav">
        DAV On
        SSLRequireSSL
        ##ファイル置き場は自動インデックスリスト表示
        Options FollowSymLinks Indexes
        ## 認証設定
        ## Digest認証:AuthNameはRealm名(htdigestで指定)
        AuthType Digest
        AuthName "member"
        AuthDigestProvider      file
        AuthUserFile    conf/.htdigest
        AuthDigestDomain /web/dav/
        ##
        AuthGroupFile   /dev/null
        <LimitExcept OPTIONS>
                Require user myuser
        </LimitExcept>
        ## 名前解決できるアクセス元のみ許可
        HostnameLookups On
        ## アクセス制限
        Order deny,allow
        Deny from all
        Allow from all
</Location>
  • DAV
    • 当然「on」で。
  • SSLRequireSSL
    • HTTPS必須としたいので、忘れずに記述する。
  • Options
    • 任意に設定してください。私はファイル一覧表示ぐらいはしたかったので、上記の設定となっています。
  • AuthType
    • 当然「Digest」で。
  • AuthName
    • ブラウザによっては、ユーザ・パスワード入力ダイアログの表示名となるが、Basic認証と違って単なる表示用の文字列ではありません。この後の手順でユーザを作成する際の realm(groupのようなもの?権限セットらしいです)名となるので、その辺りを考慮して設定すること。
  • AuthDigestProvider
    • 今回はパスワードファイルを使用しますので「file」で。
  • AuthUserFile
    • パスワードファイルの配置先。相対パスで記述した場合は、httpd.conf の「ServerRoot」の位置からの相対パスになる模様。
  • LimitExcept OPTIONS
    • WindowsWebDAVクライアントではDigest認証時にOPTIONSでエラーになることへの対応。こちらを参照。
WebDAV アクセス用のユーザを作成
  • WebDAVでDigest認証を行うためのユーザを作成します。
  • OSユーザを合わせて作成する必要はありません。むしろ作らないほうがよいでしょう。
# htdigest -c /etc/httpd/conf/.htdigest 'member' myuser

パスワードファイルへのユーザ作成が初回の場合のみ「-c」をつけます。
1つ目のパラメータは、パスワードファイルのパスを指定します。
2つ目のパラメータは「realm」(ssl.conf の AuthName とあわせる)を指定します。
3つ目のパラメータは、追加するユーザ名を指定します。
パスワードの入力を求められるので、任意のパスワードを設定してください。

httpd の起動
# service httpd restart

として、httpdを起動(再起動)して、確認してみましょう。
ブラウザで「https://myserver.hogehoge.com/web/dav」にアクセスすると認証ダイアログが出るので、ユーザ名とパスワードを入力してうまく閲覧できればOKです。


以上。と思う。漏れありそうだな。。。

ちなみに
  • WindowsXPからWebフォルダ接続した場合は、日本語も問題なく使用できるのですが、Windows2000からだと日本語ファイル名を扱おうとするとエラーではじかれてしまいます。調査中です・・・。
  • 2006/08/23 追記:ちなみにFC5標準のapache2.2 では、HTTPSを使用するにあたり、起動時にパラメータを指定する必要はありません(従来の -DSSL)。ですので、/etc/sysconfig/httpd などへの設定も不要です。
  • 2006/08/29 追記SELinuxは無効にした状態で作業を行いました。ですので、SELinuxを有効にされている方は、その辺りの設定も必要になると思います。