SSL+Basic認証の設定で意外に苦労しました(技術的な話題)
珍しく、ITの話題です。
技術的な内容ですので、興味のない方はスルーして下さい。
Web上のシステムを開発し、その管理システムにアクセスするのにセキュリティ保護のための認証を付けることにしました。
SSL(暗号化通信)+Basic認証で簡単に行うこととしましたが、サーバーの仕様のために妙な苦労をすることとなりました。
問題解決のためWebで調べておりましたら、意外と同じことで苦労されている方が時々いました。ほとんどの方は解決できたようですが、同じ方法では私の方は解決できませんでした。
そこで、ひょっとしたら誰かの役に立つかもしれませんので、ちょっと書いておきます。
尚、私はあくまでソフト開発者であり、しかもマイクロソフト系ですので、LinuxやApacheはあまり詳しいわけではありません。
□サーバーOS、WebOS
Linux ES release 3
Apache 2.0
Basic認証を通常の方法で設定しました。
一般的には、httpd.conf で設定しますが、Pleskを使用していることから、vhost.confに設定しました。vhost.confは私のサーバーでは、
/home/httpd/vhosts/ドメイン名/conf
の中にあります。
<Directory /home/httpd/vhosts/ドメイン名/httpdocs/directry>
AuthUserFile /usr/local/pass/.htpasswd
AuthGroup /dev/null
AuthName "Admin Only"
AuthType Basic
Require valid-user
</Directory>
そして、
# /etc/rc.d/init.d/httpd restart
でApacheを再起動し、設定完了です。
ユーザー、パスワードは、2ユーザー分のものを
# htpasswd -c /usr/local/pass/.htpasswd user-1
および
# htpasswd /usr/local/pass/.htpasswd user-2
とし、設定完了です。(それぞれにパスワードを2回入力します)
まず、httpプロトコルでアクセスし、問題なくBasic認証が有効になっていました。
しかし、httpsプロトコルでアクセスしたところ、Basic認証の認証画面が現れず、素通りでアクセスしてしまいました(ブラウザは事前に再起動させました)。
これでは意味がありませんので、SSLRequireSSL を追加し、httpsプロトコル以外でのアクセスを禁止してみました。
<Directory /home/httpd/vhosts/ドメイン名/httpdocs/directry>
AuthUserFile /usr/local/pass/.htpasswd
AuthGroup /dev/null
AuthName "Admin Only"
AuthType Basic
Require valid-user
SSLRequireSSL
</Directory>
Apacheを再起動し、再度試しましたところ、httpプロトコルでのアクセスはできなくなりましたが、httpsプロトコルでアクセスすると、やはり認証せずにアクセスしてしまいます。
では、Basic認証とSSLの両方でのチェックがかかるよう期待して、Satisfy allを付けてみました。
<Directory /home/httpd/vhosts/ドメイン名/httpdocs/directry>
AuthUserFile /usr/local/pass/.htpasswd
AuthGroup /dev/null
AuthName "Admin Only"
AuthType Basic
Require valid-user
SSLRequireSSL
Satisfy all
</Directory>
状況は変わりませんでした。
他にもいろいろやりましたが、ついに諦めて(笑)、Digest(ダイジェスト)認証に変えました。
<Directory /home/httpd/vhosts/ドメイン名/httpdocs/directry>
AuthDigestFile /usr/local/pass/.htpasswddj
AuthGroup /dev/null
AuthName "Admin Only"
AuthType Digest
Require valid-user
</Directory>
1行目のAuthDigestFileは、Apache2.0を使っているからで、Apache2.2ならAuthUserFileで良いはずです。
ユーザーとパスワードは、Basic認証のものとよく似ていて、
# /usr/bin/htdigest -c /usr/local/pass/.htpasswddj 'Admin Only' user-1
および
# /usr/bin/htdigest /usr/local/pass/.htpasswddj 'Admin Only' user-2
で設定します。
結果は、Basic認証時と同じ。
<Directory /home/httpd/vhosts/ドメイン名/httpdocs/directry>
AuthDigestFile /usr/local/pass/.htpasswddj
AuthGroup /dev/null
AuthName "Admin Only"
AuthType Digest
Require valid-user
SSLRequireSSL
Satisfy all
</Directory>
としても、やはりBasic認証の時と同じでした。
ところで、サーバー管理会社に問い合わせると、認証設定はPleskで行って欲しいとのこと。
ただこれが、初めて見ると解りにくい。
単に「新しいディレクトリを追加」というメニューがあり、単なるmkdirの代用かと思ったら、Basic認証ディレクトリの作成のようです。
しかも、ディレクトリ入力欄は
[/ ]
です(笑)。
当然、絶対パスで入れようかと思ったのですが、その割には表示が狭い。
Web閲覧用ディレクトリですから httpdocsからで良いと思い、
https://www.(URL)/basic-test/
のつもりで、
[/basic-test ]
としました。正解でした。
そして、
□非SSL
□SSLのみ
の両方にチェックを入れ、ユーザーを追加したら、あっさりと目的を達成できました。
さて、私の設定の何がいけなかったのだろうかと思い確認することとしました。
Pleskでは、設定内容は、httpd.include に記述されるはずです。
(httpd.includeを自分で上書きしても、強制的に元に戻される)
要するに、
<VirtualHost (IPアドレス):443>
</VirtualHost>
内に、認証の設定を書かないといけないというだけの話でした。
httpとhttpsの両方で認証を行う場合は、
<VirtualHost (IPアドレス):443>
</VirtualHost>
と
<VirtualHost (IPアドレス):80>
</VirtualHost>
の両方に認証の設定を記述すれば良いわけです。
もっとも、このhttpd.includeはPleskで行った設定しか反映されませんので、Pleskを無視して自分で設定を行う場合は、vhost.confに VirtualHost設定を全て記述し、上書き設定されるようにすれば良いわけです。
PleskではDigest認証の設定は出来ませんが、この方法ならば可能になります。
ただ、Basic認証とDigest認証の違いは、認証時にユーザー名やパスワードが、Basic認証では暗号化されずにネットに流れるのに対し、Digest認証では暗号化されるとはいえ、認証後の通信は、そのままではいずれもネットに暗号化されずに流れます。よって、機密情報に関してはSSLを使いhttpsプロトコル通信で暗号化して通信しなければなりませんのでSSLは必須となり、よって、Basic認証のパスワードもそれで暗号化すれば、特にDigest認証を利用する必要はないと思われます。
さて、以上の設定で良いのですが、オペレータが誤ってhttpプロトコルでログインしては、ユーザー名とパスワードが漏れる恐れがあります。
オペレータにhttpsのみでアクセスするよう指示すれば良いのですが、「マーフィーの法則」にも、「不安な箇所はかならずコケる」とあり、間違う可能性を残しておけば、かならず間違いは起こります。
よって、強制的に、httpsのみでアクセスできるようにしないといけません。
これは簡単で、vhost.conf に、
<Directory /home/httpd/vhosts/ドメイン名/httpdocs/directry>
SSLRequireSSL
</Directory>
だけ記述しておけば良いことになります。
Comments
もうかなり前のお話かもしれませんが、SSLOptions +StrictRequireを入れないと、、Satisfy Anyを通過してしまう現象のようですね。
Posted by: | 2010.05.31 at 12:15 PM