web-dev-qa-db-ja.com

このApache401エラーの原因は何ですか?

私はApache2.4をDebian9.9にインストールしており、基本的にはRoundcube(現在は1.4 RC-1)のインスタンスを提供するだけです。

Apacheのドキュメントルートは/home/web(理由による)であり、Roundcubeインスタンスは/home/web/mailにインストールされます。

Apacheユーザー(www-data)は、/home/webディレクトリツリー全体への完全な読み取り/書き込みアクセス権を持っています。

ドキュメントルートには、www.mydomain.co.uk/mailにリダイレクトするインデックスファイルがあり、mod_rewriteを使用してHTTPリクエストをHTTPSに変更しています。

今日、私はmydomain.co.ukを押すと、Apacheで401エラーがログに記録されることに気づきました(そして、それがどのくらい続いているかはわかりません)。

192.168.10.79 - - [09/Jun/2019:18:49:59 +0100] "GET /mail/ HTTP/1.1" 401 2955 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0)
Gecko/20100101 Firefox/67.0"

これは、fail2banルールをトリガーし、クライアントを禁止するため、外部からアクセスする場合に特に問題になります。

401エラーは「認証に失敗しました」を意味しますが、AIUIが.htpasswdファイルの存在を必要とするApacheを使用してこのディレクトリに認証を設定していません-Apacheドキュメントルートにこのファイルが存在するかどうかを確認しました、および仮想ホストファイルでのauth句の使用はありません。これもありません。

この401エラーの原因を特定し、防止するにはどうすればよいですか?

Fiddlerからのいくつかのデバッグ情報:

GET https://www.mydomain.co.uk/mail/ HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: en-GB
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: www.mydomain.co.uk
Connection: Keep-Alive
Cookie: roundcube_sessid=sadh0s1j2rn769rvebhpsv6m81

HTTP/1.0 401 Unauthorized
Date: Mon, 10 Jun 2019 08:27:28 GMT
Server: Apache/2.4.25 (Debian)
Strict-Transport-Security: max-age=63072000; includeSubdomains;
Expires: Mon, 10 Jun 2019 08:27:28 GMT
Cache-Control: private, must-revalidate
Pragma: private
Last-Modified: Mon, 10 Jun 2019 08:27:28 GMT
X-UA-Compatible: IE=Edge
X-Frame-Options: sameorigin
Content-Language: en
Vary: Accept-Encoding
X-Robots-Tag: noindex, nofollow
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Length: 5435

「Auth」タブの下のFiddlerを見ると:

No Proxy-Authenticate Header is present.

No WWW-Authenticate Header is present.

Wgetからのいくつかのさらなるdegug情報:

DEBUG output created by Wget 1.18 on linux-gnueabi.

Reading HSTS entries from /home/darren/.wget-hsts
URI encoding = ‘UTF-8’
Converted file name 'mail' (UTF-8) -> 'mail' (UTF-8)
--2019-06-10 13:34:43--  https://www.mydomain.co.uk/mail
Certificates loaded: 151
Resolving www.mydomain.co.uk (www.mydomain.co.uk)... XX.XX.XX.XX
Caching www.mydomain.co.uk => XX.XX.XX.XX
Connecting to www.mydomain.co.uk (www.mydomain.co.uk)|XX.XX.XX.XX|:443... connected.
Created socket 3.
Releasing 0x004bf2e0 (new refcount 1).

---request begin---
GET /mail HTTP/1.1
User-Agent: Wget/1.18 (linux-gnueabi)
Accept: */*
Accept-Encoding: identity
Host: www.mydomain.co.uk
Connection: Keep-Alive

---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 301 Moved Permanently
Date: Mon, 10 Jun 2019 12:34:43 GMT
Server: Apache/2.4.25 (Debian)
Strict-Transport-Security: max-age=63072000; includeSubdomains;
Location: https://www.mydomain.co.uk/mail/
Content-Length: 331
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

---response end---
301 Moved Permanently
Registered socket 3 for persistent reuse.
Parsed Strict-Transport-Security max-age = 63072000, includeSubDomains = true
Added new HSTS Host: www.mydomain.co.uk:443 (max-age: 63072000, includeSubdomains: true)
URI content encoding = ‘iso-8859-1’
Location: https://www.mydomain.co.uk/mail/ [following]
Skipping 331 bytes of body: [<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a hreSkipping 157 bytes of body: [f="https://www.mydomain.co.uk/mail/">here</a>.</p>
<hr>
<address>Apache/2.4.25 (Debian) Server at www.mydomain.co.uk Port 443</address>
</body></html>
] done.
URI content encoding = None
Converted file name 'mail' (UTF-8) -> 'mail' (UTF-8)
--2019-06-10 13:34:43--  https://www.mydomain.co.uk/mail/
Reusing existing connection to www.mydomain.co.uk:443.
Reusing fd 3.

---request begin---
GET /mail/ HTTP/1.1
User-Agent: Wget/1.18 (linux-gnueabi)
Accept: */*
Accept-Encoding: identity
Host: www.mydomain.co.uk
Connection: Keep-Alive

---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.0 401 Unauthorized
Date: Mon, 10 Jun 2019 12:34:43 GMT
Server: Apache/2.4.25 (Debian)
Strict-Transport-Security: max-age=63072000; includeSubdomains;
Set-Cookie: roundcube_sessid=9dd09n33d6k3f1kil69f90bkk6; path=/; secure; HttpOnly
Expires: Mon, 10 Jun 2019 12:34:43 GMT
Cache-Control: private, no-cache, no-store, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Last-Modified: Mon, 10 Jun 2019 12:34:43 GMT
X-Frame-Options: sameorigin
Content-Language: en
Vary: Accept-Encoding
X-Robots-Tag: noindex, nofollow
Connection: close
Content-Type: text/html; charset=UTF-8

---response end---
401 Unauthorized

Stored cookie www.mydomain.co.uk -1 (ANY) / <session> <secure> [expiry none] roundcube_sessid 9dd09n33d6k3f1kil69f90bkk6
Disabling further reuse of socket 3.

Username/Password Authentication Failed.
Saving HSTS entries to /home/darren/.wget-hsts
1
Darren

これはRoundcubeの新しい「機能」です。

ユーザーがログインしていない場合は401を返します。コードはindex.phpにあり、プラグインで変更できます。

ソース

Roundcubeindex.phpの問題のある行は次のとおりです。

    $plugin = $RCMAIL->plugins->exec_hook('unauthenticated', array(
            'task'      => 'login',
            'error'     => $session_error,
            'http_code' => !$session_error ? 401 : 200
    ));

    $RCMAIL->set_task($plugin['task']);

//    if ($plugin['http_code'] == 401) {
//        header('HTTP/1.0 401 Unauthorized');
//    }

401エラーの生成を停止するために、最後の3行をコメントアウトしました。

1
Darren

401 Unauthorized Errorは、クライアントから送信された要求を認証できなかったことを示すHTTP応答ステータスコードですが、多くの原因が考えられます。

私は提案します:

  • 調査のために、リクエストとレスポンス全体をテキストで投稿してください。特に興味深いのはWWW-Authenticate応答ヘッダー。1つ以上のチャレンジ文字列が含まれ、それぞれが要求されたリソースにアクセスするために適切な認証を取得する方法を示します。

  • Apacheサーバーログを確認します(詳細ログを有効にする必要がある場合があります)。

  • クライアントが禁止されている場合、エラーコードは通常401です。

  • クライアントブラウザのすべてのCookieとブラウザキャッシュをクリアします。

  • すべての拡張機能を無効にしてブラウザを使用してください。 Firefoxでは、これはセーフモードであり、Chromeシークレットモードです。

  • アプリケーションがこのエラーコードを返すように設定されている場合は、サーバーを検索してください。

1
harrymc