FC5でApache/SSL/WebDAV/Digest認証
FedoraCore5 をセットアップしたので、何か新しいものに手を出してみよう、ということで、WebDAVに挑戦。
でも、単純にWebDAVを立ち上げるだけであれば、他にも資料はいくらでもありそうなので、ちょっと踏み込んでやってみた。
ポイントは
ちなみに、以前行った作業を「思い起こしながら」まとめた資料ですので、記述あやまりや矛盾など、山ほどある可能性があると思います。
ので、もし問題を見つけた方は是非激しくツッコミお願いいたします。
導入メモ
ドメイン名の取得
外部公開するということで、適当なドメイン名を取得します。
メジャー度では 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
原因調べろって?エラーログは?・・・すいません、時間が無かったので勢いでやってしまいました(^^;
サーバ証明書の作成
以下のファイルを作成するものとする
こちらをとても参考にさせてもらいました。
- サーバ用秘密鍵作成
# cd /etc/pki/tls/certs # make myserver.key
# 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 設定ファイルを変更
- 認証方法はパスワードファイルを使った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
- LimitExcept 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を有効にされている方は、その辺りの設定も必要になると思います。