muninのapache_accessesプラグインがSSL対応になったサーバステータスページへアクセスできない問題に対応

OS: Ubuntu 18.04.1 LTS
Apache 2.4.35
munin-node 2.0.37-1ubuntu0.1

ApacheにSSLサーバ証明書を導入して以来、muninのapache_accessesプラグインの調子が頗る良くない。munin-run --debug apache_accesses を実行してもaccesses80.value Uとなるばかりでちっとも数値をひらえない。

$ sudo vi /usr/share/munin/plugins/apache_accesses
154         my $response = $ua->request(HTTP::Request->new('GET',$url));
155 print $response->message;

埒が明かぬのでapache_accessesプラグインの155行目に print $response->message;を挿入しても少し具体的な手がかりを得ようと試みたところこういう始末であった。

$ sudo munin-run --debug apache_accesses
(snip)
Can't connect to 127.0.0.1:80 (SSL connect attempt failed error:1408F10B:SSL routines:ssl3_get_record:wrong version number)accesses80.value U

SSL3.0での接続が具合悪いように見えるけれどもそも80番ポートへアクセスしているの為に処理がわやになっているのかと思うから設定ファイルでURLとポートを指定して伝えた。

$ sudo vi /etc/munin/plugin-conf.d/munin-node
[apache_*]
env.url https://127.0.0.1:%d/server-status?auto
env.ports 443

改めてmunin-runコマンドで以ってデバッグをおこなうと今度はこういう有様である。hostname verification failedという事は詮ずればサーバ証明書のCommon Nameは127.0.0.1とはぜんぜんチグハグであることが原因であろうと思う。

$ sudo munin-run --debug apache_accesses
(snip)
Can't connect to 127.0.0.1:443 (hostname verification failed)accesses443.value U

LWP::UserAgentの手引きを紐解くとデフォルトではホストネームの検証が実施される模様であるから此れを無理に取りやめる為の記述をapache_accessesプラグインの150行目にしたためる。

$ sudo cp -av /usr/share/munin/plugins/apache_accesses{,.orig}
$ sudo vi /usr/share/munin/plugins/apache_accesses
148 my $ua = LWP::UserAgent->new(timeout => 30,
149                 agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
150 $ua->ssl_opts(verify_hostname => 0);

あとはmunin-nodeを再起動して様子を伺っているとどうやら宜しく動作しているようである。

$ sudo systemctl restart munin-node
$ systemctl status munin-node
● munin-node.service - Munin Node
   Loaded: loaded (/lib/systemd/system/munin-node.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-10-22 04:28:32 JST; 3s ago

参考:
LWP::UserAgent – Web user agent class – metacpan.org

nginxにSSLサーバ証明書の設定をおこなう

OS: Ubuntu Server 16.04.5 LTS
Nginx 1.14.0
OpenSSL 1.0.2g 1 Mar 2016

HTTPSで通信するための最低限の設定は公式サイトに示されているけれどもこれだけではセキュリティレベルに懸念が残るから此れを払拭するためにはMozilla SSL Configuration Generatorを活用するのが早いし容易い。

returnディレクティブによってHTTPへのアクセスをHTTPSへリダイレクトする設定も併せて表示してくれる心配りもあるからSSL設定に与って力があるサイトだとおもう。然し乍らHTTP/2での接続を受け付ける設定をも積極的に盛り込もうとするから、nginxをHTTP/2プロトコルに対応させるなり設定から除去するなどの始末をせねばコンフィグテストから剣突を食らうことは言を俟たない。

$ sudo /usr/local/nginx/sbin/nginx -t
nginx: [emerg] the "http2" parameter requires ngx_http_v2_module in /usr/local/nginx/conf/nginx.conf:25
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

nginxをHTTP/2プロトコルに対応させるならばコンフィグオプションで --with-http_v2_module をつけて再度ビルド・インストールすれば宜しい。

ApacheのSSL設定を見直してセキュリティレベルを向上させる

OS: Ubuntu Server 18.04.1 LTS
Apache 2.4.35
OpenSSL 1.1.0g 2 Nov 2017

ApacheでSSLサーバ証明書の設定をこなしたけれども殆どデフォルトの儘に任せていたからQualysのSSL Server Testを実施するとこういう有様である。

前方秘匿性をサポートしていないからB判定という次第である。RSAによる鍵交換が有効になっていると此れは前方秘匿性が無いから誠に遺憾であってECDHE(楕円曲線ディフィー・ヘルマン鍵共有)を活用なさいという旨、記載があったけれども意味を飲み込める範疇を遥かに超えているのである。

こうなるとApacheの設定を如何にしたらいいかぜんぜん想像が及ばないから、も少し手軽に設定を何とかできないかと調べていくとMozilla SSL Configuration Generatorという大変心強いサイトをmozillaが用意して呉れていた。

Webサーバの種類とバージョン、OpenSSLのバージョンを選択してやるだけで設定をパッと示してくれるから実に有り難い仕組みである。Modern、Intermediate、Oldの選択肢はサポートするブラウザの後方互換性をどれだけ確保するか決定できる。Oldは随分昔のブラウザまで対応する代わりに脆弱性が確認されているSSLv3を使うし、Modernは今の所安心できそうなSSLプロトコルと暗号スイートで構えるけれども古いブラウザは切り捨ててゆく方針となるようである。

$ openssl version
OpenSSL 1.1.0g  2 Nov 2017

$ /usr/local/apache2/bin/httpd -v
Server version: Apache/2.4.35 (Unix)
Server built:   Oct  3 2018 13:34:46

パッと示された設定をうまい具合にhttp-ssl.confへ書き込んだらQualysのサイトへアクセスしてClear cacheをクリックし、再度SSL Server Testを執り行うと何だか分からないけれども大変よさそうな評価である。

検査結果

参考:
SSL Server Test (Powered by Qualys SSL Labs)
Mozilla SSL Configuration Generator
Security/Server Side TLS

ApacheにSSLサーバ証明書の設定をおこなう

OS: Ubuntu Server 18.04.1 LTS
Apache 2.4.35

SSLサーバ証明書を取得したらWebサーバの設定もアタボウに必要である。ソースからインストールしたApache2の設定ファイルを編集してゆく。幸い conf/extra/httpd-ssl.conf に雛形が用意されているので大きく書き換える必要が無くて大変有難いものである。

暗号化通信をおこなうためのモジュールがロードされていないと

AH00526: Syntax error on line 2 of /usr/local/apache2/conf/extra/httpd-ssl.conf:
Invalid command 'SSLCipherSuite', perhaps misspelled or defined by a module not included in the server configuration

というエラーメッセージを頂戴したり

AH00526: Syntax error on line 8 of /usr/local/apache2/conf/extra/httpd-ssl.conf:
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).

という具合にSSLセッションをキャッシュする機能を活用するためのモジュールが必要である旨、知らされるから予めモジュールをロードするように各項目をコメントアウトしておく。

$ sudo vi /usr/local/apache2/conf/httpd.conf 
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

あとはhttpd-ssl.confの雛形を利用してVirtualHostの設定をしたり証明書や秘密鍵を読み込むようよしなに書き換えてconfigtestでSyntax OKが出れば終いである。

$ sudo vi /usr/local/apache2/conf/extra/httpd-ssl.conf
SSLCertificateFile "/etc/letsencrypt/live/www7390uo.sakura.ne.jp/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/www7390uo.sakura.ne.jp/privkey.pem"

mod_rewriteで以ってHTTPでのアクセスをHTTPSへリダイレクトさせる為に.htaccessも追加してやった。クライアントへ返すHTTPステータスコードは301 Moved Parmanentlyにしてやれば良さそうな情勢である。

$ vi .htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Let’s EncryptでSSLサーバ証明書を取得

OS: Ubuntu 18.04.1 LTS
Apache 2.4.34
certbot 0.23.0-1

HTTPによる通信の暗号化をせっせと進めてゆこうという世論の高まりにおされてLet’s Encryptが発行する無料のSSLサーバ証明書の取得を試みるものである。

SSLサーバ証明書の発行にはACME(Automated Certificate Management Environment) clientであるCertbotというツールがLet’s Encryptによって薦められているようである。

CertbotはGitHubより取得できるけれどもUbuntu Server 18.04.1にはcertbotパッケージが用意されているから此れを用いる。

$ sudo apt install certbot

多数のpythonパッケージと共にcertbotがインストールされる。そうしたら早速certbotの実行をする。サブコマンドはデフォルトで run が指定されて此れは証明書の取得からインストールまでこなすけれども、ひとまず証明書だけ取得したいから certonly を指定した。

--webroot--webroot-pathwebrootプラグインで以って証明書を発行するという注文である。--webroot-pathで指定したパスに一時ファイルが作成され此れをLet’s Encryptが検証の為にアクセスするからくりのようである。

あとは--emailでメールアドレスを、--domainでCommon Nameを指定してコマンドを実行するばかりであるけれども最初は如何な落ち度が潜んでいるか知れないから --dry-runを追加してテストをした。

$ sudo certbot certonly --webroot --webroot-path /home/guro/public_html/ --email www7390uo@gmail.com --domain www7390uo.sakura.ne.jp --dry-run

IMPORTANT NOTES:
 - The dry run was successful.

問題が無いようであれば--dry-runを外して実行である。最初はサービスの利用規約に同意するか否かを問われる。常に合意する心持ちがあれば --agree-tos オプションで以ってこの問いかけをスキップできるようである。

$ sudo certbot certonly --webroot --webroot-path /home/guro/public_html/ --email www7390uo@gmail.com --domian www7390uo.sakura.ne.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel:

次は登録するメールアドレスをElectronic Frontier Foundation(EFF、電子フロンティア財団)と分かち合って良いか尋ねられる。分かち合えば登録したメールアドレス宛にEFFからのニュースやキャンペーンの報せが届くという。

Let’s Encryptプロジェクトの共同創設者でありCertbotを開発する非営利組織たるEFFからのお誘いであるけれどもNoと返答した。これは --no-eff-email オプションで予めNoを突きつけることができるし --eff-email オプションでYesと答える手間を省ける。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

するとこうである。証明書の発行数制限に抵触した模様であってこうなるとどうも為す術がない。ドメインあたり週に50までと云う規制が課されているから今週分の注文については一足遅かったようである。なんて日だとおもう。

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www7390uo.sakura.ne.jp
Using the webroot path /home/guro/public_html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
An unexpected error occurred:
There were too many requests of a given type :: Error finalizing order :: too many certificates already issued for: sakura.ne.jp: see https://letsencrypt.org/docs/rate-limits/
Please see the logfiles in /var/log/letsencrypt for more details.

翌週までじっと堪えてから改めてコマンドを実行するとまだ発行数の上限には達していないものと見られ、恙無く証明書が発行された。証明書と中間証明書が一体になったfullchain.pemと秘密鍵privkey.pemだけでなく証明書単体cert.pemと中間証明書単体chain.pemも併せて/etc/letsencrypt/archive/www7390uo.sakura.ne.jpディレクトリに作成されるからサーバの環境に合わせて用いると良さそうな風情である。

$ sudo certbot certonly --webroot --webroot-path /home/guro/public_html/ --email www7390uo@gmail.com --domian www7390uo.sakura.ne.jp
(snip)
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www7390uo.sakura.ne.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www7390uo.sakura.ne.jp/privkey.pem
   Your cert will expire on 2019-01-11. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"

証明書の内容を覗いてみればこうである。有効期限は90日間であるから期限切れの前に更新する段取りを立てておく必要がある。

# openssl x509 -text -in /etc/letsencrypt/live/www7390uo.sakura.ne.jp/cert.pem
Certificate:
(snip)
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
        Validity
            Not Before: Oct 15 16:41:16 2018 GMT
            Not After : Jan 13 16:41:16 2019 GMT
        Subject: CN=www7390uo.sakura.ne.jp
(snip)

なおアクセスログを眺めているとLet’s Encrypt validation serverからアクセスがあって /.well-known/acme-challenge/ 内に生成された一時ファイルを読み取っている模様である。

Let’s Encrypt validation serverには13.58.30.69、34.213.106.112、52.29.173.72、66.133.109.36の少なくとも4つIPアドレスがあったからこれらの接続を妨げないようファイアウォールやWebサーバの設定をよしなに改める必要があるけれどもIPアドレスは変更される可能性もあるから油断ならない。

$ tail -f /usr/local/apache2/logs/access_log.guro
66.133.109.36 - - [13/Oct/2018:15:23:28 +0900] "GET /.well-known/acme-challenge/ab4cOkLSd034tdoxftVHDpgrLVsC4oz5N_8H5ySX7_3 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" 267 361