NginxでHTTPヘッダのログをとる

Search Consoleのフォーラムで、WordPressのGoogle XML Sitemapsプラグインで出力したサイトマップをSearch Consoleで登録しようとすると受け付けてくれないという話題が出ていた。 自分のところでは何の問題もないのでプラグインが悪いのかGoogleが悪いのか、ウェブサーバの応答が遅いからとか別に問題があるのかよくわからない。
ところで、Search Consoleにサイトマップを登録する際に、確認のためにGoogleのクローラーがサイトを訪れるのだが、どのような遣り取りをするのかしら?(古めのChromeが来るのと同じというように聞いてたけど)
あいにく、手持ちのすべてのサイトがSSL対応になっているのでパケットキャプチャで通信を見るというのは無理。
そこでウェブサーバのログを見ることにした。普通のアクセスログだけでは何もわからないのでHTTPヘッダ周り、リクエストとレスポンス部分。

その前に、ウェブサイトにGoogleではない普通のブラウザでアクセスしたのと似た状態で遣り取りを見る。これはcurlで簡単に見ることができる。

sitemap.xmlをリクエストしてsitemap.xml.gzが返されることを期待して、curlのオプションとしてクライアント側がgzip圧縮のエンコーディングに対応しているという通知を付ける。もっと今時のブラウザっぽくならgzip, deflate, brの3種類を指定する。

% curl -H "Accept-Encoding: gzip" -v https://gato.intaa.net/sitemap.xml
*   Trying 2001:2c0:d800:6701::3000...
* TCP_NODELAY set
* Connected to gato.intaa.net (2001:2c0:d800:6701::3000) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /usr/local/share/certs/ca-root-nss.crt
  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=gato.intaa.net
*  start date: May 25 18:50:54 2019 GMT
*  expire date: Aug 23 18:50:54 2019 GMT
*  subjectAltName: host "gato.intaa.net" matched cert's "gato.intaa.net"
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x800b8d000)
> GET /sitemap.xml HTTP/2
> Host: gato.intaa.net
> User-Agent: curl/7.64.1
> Accept: */*
> Accept-Encoding: gzip
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200 
< server: nginx
< date: Thu, 06 Jun 2019 12:30:55 GMT
< content-type: text/xml; charset=utf-8
< x-robots-tag: noindex
< content-encoding: gzip
< vary: Accept-Encoding
< strict-transport-security: max-age=31536000;
< access-control-allow-credentials: true
< x-content-type-options: nosniff always
< content-security-policy: default-src * 'self' data: 'unsafe-inline' 'unsafe-eval'; child-src * 'self';

行頭が > がリクエストヘッダ。行頭が < が応答側でレスポンスヘッダ・エンティティヘッダ。

サーバーから返されるHTTPヘッダだけ見たいなら-Iオプションを付けて-vオプションを除く。
% curl -I -H "Accept-Encoding: gzip" https://gato.intaa.net/sitemap.xml
HTTP/2 200 
server: nginx
date: Thu, 06 Jun 2019 06:45:47 GMT
content-type: text/xml; charset=utf-8
x-robots-tag: noindex
content-encoding: gzip
vary: Accept-Encoding
strict-transport-security: max-age=31536000;
access-control-allow-credentials: true
x-content-type-options: nosniff always
content-security-policy: default-src * 'self' data: 'unsafe-inline' 'unsafe-eval'; child-src * 'self';

gzipによる圧縮を受け入れ可能だという条件付きでsitemap.xmlを要求しているので、ウェブサーバ側はcontent-encoding: gzipであると返答してsitemap.xmlではなくsitemap.xml.gzを渡す。(ただし上のcurlコマンドではバイナリファイルのダウンロードは保留される)

ブラウザでHTTPヘッダを確認する
curlコマンドではなく、ブラウザでも確認できる。上の画像はChromeブラウザだがFirefoxでもほぼ同じ。
目的のページを表示する。(今回はサイトのsitemap.xml)
[F12]を押して検証・開発者用窓を開く。
タブから「Network」を選択する。
ページを再表示する(重要)
目的のページやその構成ファイルなどを1つ選択する。
右列上部の「Headers」タブを選択する。
右列下部にリクエストヘッダとレスポンスヘッダが表示される。

このように、自分側のcurlとウェブサーバの通信は見るのは簡単だが、クローラー(や他所からのビジター)とウェブサーバの通信はSSLだとパケットキャプチャしても基本的には内容がわからない。
そこで、ウェブサーバ(Nginx)にHTTPヘッダ関係のログを取る設定を追加する。先のcurlで見たような通信時に送った・送られた全てのリクエストヘッダ・レスポンスヘッダ・エンティティヘッダが得られるわけではないが、取得したい内容を指定することである程度の情報は取得できる。

/usr/local/etc/nginx/nginx.conf (Nginxのメインの設定)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
http {

    log_format  main   '既存のまま';

    log_format  ssl    '既存のまま';

    log_format  header  '[$time_local] '
                        'host: $remote_addr\t'
                        'user: $remote_user\t'
                        'request: $request\t'
                        'status: $status\t'
                        'size: $body_bytes_sent\t'
                        'referer: $http_referer\t'
                        'http_host: $http_host\t'
                        'request_time: $request_time\t'
                        'content_type: $sent_http_content_type\t'
                        'accept_encoding: $http_accept_encoding\t'
                        'accept_language: $http_accept_language\t'
                        'user_agent: $http_user_agent\t';           

    その他の指定

    include /usr/local/etc/nginx/Includes/*.conf;   #vHostの設定ファイル読み込みを想定
}

ログとして取得する内容の内、上の例ではリクエストヘッダ・レスポンスヘッダ・エンティティヘッダが混ざってる。スミマセン。
もちろん、これだけしか取れないというわけではないので欲しい情報があれば項目を足したり不要な情報の項目を消したり。

/usr/local/etc/nginx/Includes/hoge.conf (Nginxの或るバーチャルホストの設定部分)
1
2
3
4
5
6
7
8
9
server {

    #ログファイル指定部分
    access_log /var/log/hoge-access.log;   #これはmain
    access_log /var/log/hoge-ssl.log ssl;     #ssl
    access_log /var/log/hoge-header.log header;  #←今回追加分header

    その他の指定
}
ログには下のように記録される。(これはChromeブラウザからのアクセス) [06/Jun/2019:11:17:27 +0900] host: ***.***.***.*** user: - request: GET /test.html HTTP/2.0 status: 200 size: 3078 referer: - http_host: hoge.example.com request_time: 0.097 content_type: text/html; charset=UTF-8 accept_encoding: gzip, deflate, br accept_language: ja,ja-JP;q=0.9,en-US;q=0.8,en;q=0.7 user_agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36

Search Consoleでサイトマップを登録しようとしたときにやってくるクローラーのアクセスは下のようなの。(わかりやすいように項目別に改行した。)

[06/Jun/2019:10:44:37 +0900]
host: 66.249.79.81
user: -
request: GET /sitemap.xml HTTP/1.1
status: 200
size: 640
referer: -
http_host: hoge.example.com
request_time: 0.100
content_type: text/xml;charset=utf-8
accept_encoding: gzip,deflate,br
accept_language: -
user_agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

上の例ではヘッダフィールドの種類が混じっているので判りにくいが、欲しい値だけを書くとこうなった。真面目な人は混ぜずにきっちり設定して欲しい。
http_hostはウェブサーバ側のホスト名このページではhoge.example.com(仮名)に書き換えている。
http_accept_encodingがgzip, delfate, brになっているのでbrotli圧縮にも対応してたのね。

通常の運用時にはHTTPヘッダのログなんて取る必要がないのでこのページの設定は無効にしておく。

情報セキュリティ Windows 10でUSBメモリの自動実行を不可にする

© いらすとや

前回と同じくだけど、USBメモリなどを迂闊にPCに挿すのは怖い。そう意識していれば自分自身は出処不明のUSBメモリやUSBドングル或いはUSBの周辺機器っぽいものをPCに挿すことは警戒しているかもしれない。でも、家族や従業員はそうじゃないかもしれないし、外出先では予想外に他人にUSBポートに「何か」を挿されるかもしれない。そんなことは殆どないとは思うけど。
前回はリムーバブルなストレージを使えなくするというのはやった。でも、単なるリムーバブルストレージであれば勝手にPCに挿されてもファイル操作をされなければ怖くはない。でも、USBポートに「何か」を挿されたときに何かを「自動実行」されるととても危険(かもしれない)。普通に、家族用・従業員用のPCのUSB(など)は「自動実行」は要らんでしょ。そこで、「自動実行」を無効化する。

Windows 7あたりから自動実行の初期値は無効にはなったとは聞いているが、ユーザーが何かを触っていたら自動実行の設定値が変わっているかもしれないので設定の確認と変更は行うべき。

ある程度大きな会社・組織ではおそらくユーザーのPCを集中管理するだろうからActive Directoryでグループポリシー管理をやって貰うとして、この記事の対象外。
Windowsをスタンドアロンで管理するような個人・家族・SOHOレベルでは1台ずつ設定する。今回は、Windowsの基本的なUIによる設定方法、Windows 10 Proエディションのグループポリシーエディタ、Windows 10 コントロールパネルによる設定方法、Windows 10 Homeエディションのレジストリエディタ(レジストリファイル)の4種類。

WIndowsの設定で変更

Windows 10でUSBの自動実行を無効化 1
画面1 :
(スタートボタン)から (設定)アイコンをクリック。

Windows 10でUSBの自動実行を無効化 2
画面2 :
「デバイス」をクリック。

Windows 10でUSBの自動実行を無効化 3
画面3 :
左列の「自動再生」をクリック。

Windows 10でUSBの自動実行を無効化 4
画面4 :
右列の「リムーバブルディスク」の項目を「なにもしない」「毎回動作を確認する」などに変更する。 右列の「メモリ カード」の項目を「毎回動作を確認する」などに変更する。

または、

Windows 10でUSBの自動実行を無効化 5
画面5 :
「すべてのメディアとデバイスで自動再生を使う」のスイッチをオフにする。

簡単ではあるが、家族・従業員に全権を与えていると勝手に設定を変更するかもしれないのでユーザーアカウント権限の選択を適切に行う。

Windows 10 Pro グループポリシーエディタで変更

こちらはグループポリシーエディタを使う方法。Windows 10 Homeエディションにはグループポリシーエディタが無いのでこの方法はできません。

Windows 10でUSBの自動実行を無効化 6
画面6 :
[Win] + [R]で「ファイル名を指定して実行」の小窓が開くので、「gpedit.msc」と入力して[OK]を押す。

Windows 10でUSBの自動実行を無効化 7
画面7 :
ローカルグループポリシーエディタが開く。
左列のツリーで一番上から「コンピューターの構成」 「 管理者用テンプレート」「Windows コンポーネント」を開く。 右列で「自動再生のポリシー」をクリック。(左列のツリーの「Windowsコンポーネント」の下層にもある)

Windows 10でUSBの自動実行を無効化 8
画面8 :
「自動再生のポリシー」の中の項目から「自動再生機能をオフにする」をクリック。

Windows 10でUSBの自動実行を無効化 9
画面9 :
「自動再生機能をオフにする」の設定画面であることを確認する。
左のラジオボタンを「未構成」から「有効」に変える。「オフにするのを有効にする」の意味なので「無効」ではない。
右下の[適用]を押す。(この画面では要らない気もするけど一応)
[OK]を押す

上の画面8の他の項目も変更したいものがあれば変更する。(意図しない動作になったら、その項目の「画面9」相当の画面の①で「未構成」を選択して「適用」すれば初期値に戻る。

Windows 10 コントロールパネルで変更

Windows 10の1809からはコントロールパネルでも設定できる。

Windows 10でUSBの自動実行を無効化 10
画面10 :
[Win]+[R]で「ファイル名を指定して実行」の小窓が開くので control と入力して[Enter]

Windows 10でUSBの自動実行を無効化 11
画面11 :
コントロールパネルが開く。
「ハードウエアとサウンド」をクリックする。

Windows 10でUSBの自動実行を無効化 12
画面12 :
「自動再生」をクリックする。

Windows 10でUSBの自動実行を無効化 13
画面13 :
「すべてのメディアとデバイスで自動再生を使う」にチェックが入っていたら外す。
リムーバブルドライブやメモリカードのドロップダウンメニューで項目で「なにもしない」や「毎回動作を確認する」にする。初期値は「ストレージ設定の構成(設定)」
下の方にスクロールして他のドライブなども必要に応じて変更する。
右下の「保存」ボタンをクリックする。

Windows 10 レジストリエディタで変更

Windows 10でUSBの自動実行を無効化 14
画面14 :
[Win]+[R]で「ファイル名を指定して実行」の小窓が開くので regedit と入力して[Enter]

Windows 10でUSBの自動実行を無効化 15
画面15 :
左列のツリーの上から「コンピューター」「HKEY_LOCAL_MACHINE」「SOFTWARE」「Microsoft」「Windows」「CurrentVersion」「Policies」「Explorer」をクリックして開く(辿る)。
コンピューター \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer になるのを確認する。 を辿る。黄字の部分はHKEY_LOCAL_MACHINEなので注意。(ネットの情報で間違っているのがチラホラ)
おそらく、右列にはNoDriveTypeAutoRunという項目は存在無い筈。

Windows 10でUSBの自動実行を無効化 16
画面16 :
右下の方の空白部分で右クリックする。
「新規」をクリックする。
「DWORD(32ビット)値」をクリックする。

Windows 10でUSBの自動実行を無効化 17
画面17 :
「新しい値#1」という項目が名前未確定の状態で作成される。
「新しい値#1」を「NoDriveTypeAutoRun」に変える。途中で間違って確定してしまった場合は右クリックで表示されるメニューに「名前の変更」があるのでそれで名前を未確定状態にして「NoDriveTypeAutoRun」にする。
ちょっとした操作ですぐに名前が確定してしまうのでちょっと難しい。

Windows 10でUSBの自動実行を無効化 18
画面18 :
「NoDriveTypeAutoRun」を(左)ダブルクリックする。

Windows 10でUSBの自動実行を無効化 19
画面19 :
「表記」を「16進数」にする。
値を変更する。(この下)
[OK]ボタンを押す。

値 内容
1 不明な種類のドライブの自動実行を無効
4 リムーバブル ドライブの自動実行を無効
8 固定ドライブの自動実行を無効
10 ネットワーク ドライブの自動実行を無効
20 CD-ROM ドライブの自動実行を無効
40 RAM ディスクの自動実行を無効
80 不明な種類のドライブの自動実行を無効 (1と同じ)
FF すべての種類のドライブの自動実行を無効
⬆すべて16進数
上の複数の項目を組み合わせるならその数値を足す。

Windows 10でUSBの自動実行を無効化 20
画面20 :
「NoDriveTypeAutoRun」行の「種類」列は「REG_DWORD」であること。「データ」列に指定した値が入っていることを確認する。入力した値込みで0x+8桁で表示される。括弧の中はその値を10進数にしたもの。
上の画像は「ff」を入力したので0x000000ffと表示されている。16進数のffは10進数では255。

一応、システムを再起動する。

または、レジストリエディタを操作して設定変更するのがイヤな場合は下のレジストリファイルをダウンロードしてファイルをダブルクリックするという方法もアリ。ファイルの内容は以下のようなテキストファイルだが、一応ダウンロードした後にメモ帳などで開いて内容を確認してから実行して欲しい。

 autorun_all_disable.reg
すべての自動実行の無効化 (ff を指定したもの)
1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDriveTypeAutoRun"=dword:000000ff
 autorun_delete.reg
動実行の無効化のNoDriveTypeAutoRunを削除 (戻し用)
1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDriveTypeAutoRun"=-

上の方法ではあくまでも「一応」レベルで自動実行を停めることはできるが、過信は禁物。怪しいUSBデバイスは挿さないのはもちろん、USBポート自体に物理的に挿せないように対策することも考えるのもアリ。

情報セキュリティ Windows 10でUSBメモリの読み書きを不可にする

© いらすとや

PCにUSBメモリを挿してファイルをコピーというのは便利ではあるけど、迂闊にやると、または利用者を放任するのは危険でもある。それが自分自身の行動でということなら「私ってバカ」で後は粛々と対応すれば良いが、従業員や家族が利用するPCで勝手にとか自分のPCでもちょっと目を離した隙きに他人に勝手に挿されたらそれはとても怖い。
キーボード・マウスがPS/2コネクタで、プリンタがセントロニクスのケーブルでPCと繋がる時代ならUSBのポートを物理的に使えなくするとかUSBポートを無効にしてしまうでも良かったのだろうが、今はUSB自体は生かしてUSBストレージだけ利用禁止にするのが良さげ。もちろん、カメラの画像を転送したいとかUSBストレージを使う用事がないわけではないだろうから、そういう用途専用機を1台くらいは用意する。それ以外のWindows端末は全台USBストレージは禁止というのが今回やりたいこと。

ある程度大きな会社・組織ではおそらくユーザーのPCを集中管理するだろうからActive Directoryでグループポリシー管理をやって貰うとして、この記事の対象外。
Windowsをスタンドアロンで管理するような個人・家族・SOHOレベルでは1台ずつ設定する。Windows 10のProエディションでは似たようなグループポリシーエディタで設定。Homeエディションにはグループポリシーエディタが無いのでレジストリエディタ(レジストリファイル)で変更する。

Windows 10 Proエディション

こちらはグループポリシーエディタを使う方法。

Windows 10でリムーバブルストレージを無効化 1
画面1 :
[Win] + [R]で「ファイル名を指定して実行」の小窓が開くので、「gpedit.msc」と入力して[OK]を押す。

Windows 10でリムーバブルストレージを無効化 2
画面2 :
ローカルグループポリシーエディタが開く。
左列のツリーで一番上から「コンピューターの構成」 「 管理者用テンプレート」「システム」を開く。 右列で「リムーバブル記憶域へのアクセス」をクリック。(左列のツリーの「システム」の下方にもある)

Windows 10でリムーバブルストレージを無効化 3
画面3 :
「リムーバブル記憶域へのアクセス」の中の項目から「リムーバブル ディスク: 読み取りアクセス権の拒否」をクリック。

Windows 10でリムーバブルストレージを無効化 4
画面4 :
左のラジオボタンを「未構成」から「有効」に変える。「拒否を有効にする」の意味なので「無効」ではない。
右下の[適用]を押す。[OK]を押すと前の画面に戻ってしまうので押さない。
上部の[次の設定]を押す。これで「リムーバブル ディスク: 書き込みアクセス権の拒否」の設定画面に移る。

Windows 10でリムーバブルストレージを無効化 5
画面5 :
「リムーバブル ディスク: 書き込みアクセス権の拒否」の設定画面であることを確認する。
左のラジオボタンを「未構成」から「有効」に変える。「拒否を有効にする」の意味なので「無効」ではない。
右下の[適用]を押す。(この画面では要らない気もするけど一応)
[OK]を押す。

Windows 10でリムーバブルストレージを無効化 6
画面6 :
「リムーバブル ディスク: 読み取りアクセス権の拒否」が「有効」であること、
「リムーバブル ディスク: 書き込みアクセス権の拒否」が「有効」であること。
2箇所を確認したらローカルグループポリシーエディターは閉じる。

Windows 10でリムーバブルストレージを無効化 7
画面7 :
このやり方の場合はUSBメモリを挿すと、リムーバブルディスクとして認識はされる。

Windows 10でリムーバブルストレージを無効化 8
画面8 :
ただし、その認識されたリムーバブルディスクを操作しようとしても「アクセスが拒否されました」になる。「取り外し」も同じくアクセスが拒否されるので挿したUSBメモリなどは基本的にはそっと抜き取るだけ。

Windows 10 Homeエディション

以下は、上のProエディションでやったことと全く同じ結果になるわけではありません。また、Homeエディション専用ということではなく、Proエディションでも使えます。

Windows 10でリムーバブルストレージを無効化 9
画面9 :
[Win]+[R]で「ファイル名を指定して実行」の小窓が開くので regedit と入力して[Enter]

Windows 10でリムーバブルストレージを無効化 10
画面10 :
左列のツリーの上から「コンピューター」「HKEY_LOCAL_MACHINE」「STSTEM」「CurrentControlSet」「Services」をクリックして開く(辿る)。
次に続く。

Windows 10でリムーバブルストレージを無効化 11
画面11 :
「Services」の中(項目多い)の「USBSTOR」をクリック。
右列の「Start」をクリックする。

Windows 10でリムーバブルストレージを無効化 12
画面12 :
「値のデータ」を「3」から「4」に書き換える。
[OK]を押す。

Windows 10でリムーバブルストレージを無効化 13
画面13 :
この方法の場合は、USBメモリなどのリムーバブルディスクをPCに挿しても認識されない(筈)。

元に戻す(リムーバブルディスクを有効化する)場合、画面12で「値のデータ」を「4」から「3」に書き換える。

または、レジストリエディタを操作して設定変更するのがイヤな場合は下のレジストリファイルをダウンロードしてファイルをダブルクリックするという方法もアリ。ファイルの内容は以下のようなテキストファイルだが、一応ダウンロードした後にメモ帳などで開いて内容を確認してから実行して欲しい。

 usb_storage_disable.reg
リムーバブルディスクの無効化
1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]
"Start"=dword:00000004
 usb_storage_enable.reg
リムーバブルディスクの有効化 (戻し用)
1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]
"Start"=dword:00000003

家族・従業員などによる勝手なUSBメモリの読み書きとそれによる情報漏えいはこれで防ぐことが可能になった。(リムーバブルメディアだけだが)
次回はウイルス入りUSBメモリによる感染を防ぐための「自動実行を防ぐ」の予定。