とーますメモ

Ruby on Rails / Goなどの学習メモ

Zohoメール内で可能なセキュリティ設定と迷惑メール設定

前回の記事からの続き
thoames.hatenadiary.jp

SPF

送信元IPアドレスが入ったSPFレコードをDNSに入れることで、受信先のサーバが送信元IPアドレスがSPFレコードに登録されているかを確認し、詐称(なりすまし)メールなのかを確認する仕組み。
インターネット用語1分解説~SPFとは~ - JPNIC

DKIM

電子署名を使って改竄の有無を確認できる仕組み。
送信者はDNSに公開鍵を登録し、自分のみ知っている秘密鍵でメールに電子署名を付与する。受信側がDNSに公開鍵を問い合わせて電子署名を検証する。
SPF, DKIMの特徴と違い | SendGridブログ

DMARC

ドメイン所有者(送信側)がメールの認証失敗時の対処方法をDMARCに対応している受信側に指示することができる仕組み。SPFまたはDKIMが設定されている前提で設定可能。
この設定を行うことで、なりすましメールの送信元IPなどが記載されたレポートを受信側から受け取ることができる。

通常、SPFおよびDKIMを用いて送信元ドメインを認証する際には、 認証に失敗したメールをどのように取り扱うかは、受信者の判断に任せられています。 これまでは、送られたメールがなりすましメールだったとしても(SPF・DKIMの認証に失敗した場合でも)、受信側が「受信する」というポリシーだった場合、なりすましメールは受信者の意向に沿って、そのままユーザのメールボックスで受信されていました。

DMARCとは?送信ドメイン認証の仕組みを理解して、なりすまし対策をしよう! | メルラボ

対象方法は以下の3種類がある
1)何もしない(none)
2)隔離をする(quarantine)
3)受信拒否をする(reject)

DMARC検証に応じた2種類のレポートを受け取る設定もでき、なりすましメールの頻度や送信元IPなどの解析に活かすこともできる。
検証結果の統計情報を示した「ruaレポート」と、「隔離」または「拒否」した場合に送信される「rufレポート」がある。
送信ドメイン認証技術「DMARC」によるなりすましメール対策とDMARCレポートの活用 |

二段階認証

ダッシュボードから全体に対して二段階認証を付与できるし、
「ユーザーの詳細」=> 「2段階認証」からは個別にも設定できるよう。

パスワードポリシー

自分の中で色んなサイトを参考にし以下のルールにした。

1) パスワードの有効期限(日数):設定無し
パスワードの変更回数を多くしても対策効果は無いとのこと。
参考: 総務省が「パスワードの定期変更は不要」に転換!安全性を高めるパスワードの作り方は? - U-NOTE[ユーノート] - 仕事を楽しく、毎日をかっこ良く。 -

2) 最小文字数: 12文字
3) パスワード履歴の最小数: 設定無し。1)を設定無しにしているため。
4) 最小文字数(特殊文字): 2文字
5) 最小文字数(数字): 3文字

迷惑メール設定

1) SPF

スパムやウイルスを含んだメールの可能性が高いが、念の為に「永続的な拒否」ではなく
個人設定は「検疫に移動」を設定。Soft failも同じく。

2) DKIM

スパムやウイルスを含んだメールの可能性が高いが、念の為に「永続的な拒否」ではなく
個人設定は「検疫に移動」を設定

3) DMARC

DMARC導入時は、DMARC検証に失敗(フェール)するケースが、色々とあるため最初のポリシーは「none」で様子を見て、レポートを見て
逐次、隔離または拒否するといったポリシーに段階的に変更していくほうが良さそう。
そのため個人設定は「なし」を設定

どれくらい自社ドメインがなりすまされているか、ご存知ですか? | IIJ Engineers Blog

MacのThunderbirdをダウングレードする

現時点で最新の78では、Enigmailというアドオンがうまく動作しないことが判明したため
動作確認ができていた68に戻す作業を行ったので、作業記録をとる。

1) プロファイルのバックアップ

超重要。[Thunderbirdを起動]→[メニューバーのヘルプ]→[トラブルシューティング情報]内の[プロファイルフォルダ]からFinderを開けるので
その中のプロファイルをバックアップする。

2) 指定のバージョンをダウンロードし、上書きインストール。

以下からダウンロードし、上書きインストール。
Directory Listing: /pub/thunderbird/releases/

3) 起動する。

普通に起動すると「古いバージョンの Thunderbird を起動しました」というエラーが表示され、新しいプロファイルを作らない限りThunderbirdが開けない。
そのため、上書きインストール後の初起動時は、Macでは以下のコマンドを叩いてから、プロファイルマネージャーを起動させ、既存のプロファイルを選択して
Thunderbirdを起動させる必要がある。コマンドは以下。

$ /Applications/Thunderbird.app/Contents/MacOS/thunderbird -profilemanager --allow-downgrade

これでThunderbirdは起動できる。

4) Enigmailを再インストール

自分の場合、EnigmailもThunderbird68に対応させたバージョンにダウングレードする必要があったので
68に対応したものを以下のサイトからダウンロードし、インストールした。

Enigmail :: Versions :: Add-ons for Thunderbird


[参考]
Thunderbird ダウングレード -Mac- | Kinchan's Blog
Mozilla、Thunderbird 68.0デスクトップ向け最新版をリリース。 | moshbox
How can I install a usable version of Thunderbird over 68.3.1? | Thunderbird Support Forum | Mozilla Support
h.ogi blog (jp): Thunderbird 78.xの注意点

MacでVSCodeを使用してみた

公式サイトからダウンロードして解凍し起動。
以下が設定した内容

日本語化

拡張機能から「Japanese Language Pack for Visual Studio Code」をインストールし設定

配色

Atomのデフォルト配色である「One Dark」と同じものが使用したかったので
拡張機能から「One Dark Pro」という拡張機能をインストールして設定

Emmet

デフォルトでEmmetが使用できるようだが、
erb拡張子でEmmetを使用するには以下の設定が必要

1)設定 => 拡張機能 => Emmetを選択
2)Include Languagesより以下を設定

"emmet.includeLanguages": { "erb": "html", "ruby": "html"}

3)Trigger Expansion On Tabを有効化

以上で、キーワードを入力後、Tabを押せばEmmetが動作する。

How to configure Emmet in VS Code for erb files | by Nick Haralampopoulos | Medium

その他拡張機能

1)Ruby => Ruby言語をサポート
2)RailsとRuby on Rails => Railsをサポート
3)Rails DB Schema => DB Schemaに沿って、モデルのカラム名を補完
4)endwise => endを自動挿入
5)Material Icon Theme => ファイル毎に固有のアイコンを設定してくれる。vscode-iconsもあるが個人的にはこっちのほうが好み
6)Git Lens => 以前の状況との比較がしやすい
7)Git History => ログが読みやすい
8)TODO Highlight => TODOやFIXMEがハイライト表示される。
9)Rainbow CSV => CSVが列ごとに色付けされて、列がみやすくなる。

その他設定

・Tab size: 2を設定
・Render Whitespace: allを有効
・Trimで検索し「Trim Final Newlines」と「Trim Trailing Whitespace」を有効
・プロジェクト毎に色を付ける。
Visual Studio Codeエディタの色をプロジェクトごとに違うものにする - Qiita

Zohoメールを使ってみた

個人的なサイトに使用する用途だったので、Freeプランで十分。
詳細は参考にしたサイトさんが詳しく説明されているが大事なのは以下。

1)SPF、DKIM、DMARCのセキュリティ対応
2)mail-testerでスコアを確認
thoames.hatenadiary.jp

[参考]
ZOHOでセキュアな独自ドメインメールを無料で運営する - BAOOKUN
独自ドメインで運用中のZoho Mailから送ったメールがスパム扱いされないように設定してみた | WorP@holic わ〜ぱほりっく

NinjaFirewallとCloudflareを併用時の設定

Cloudflareを使用すると、CloudflareのIPからのアクセスのみが記録されてしまうので
オリジナルからのIPを取得したい場合は、別途設定が必要になる。
以下の記事を参考に.htninjaファイルを作成し、ドキュメントルートの親ディレクトリにデプロイする。
NinjaFirewall (WP Edition): The .htninja configuration file – NinTechNet

<?php
/*
 +===========================================================================================+
 | NinjaFirewall optional configuration file                                                 |
 |                                                                                           |
 | See: https://blog.nintechnet.com/ninjafirewall-wp-edition-the-htninja-configuration-file/ |
 +===========================================================================================+
*/

// Users of Cloudflare CDN:
if (! empty($_SERVER["HTTP_CF_CONNECTING_IP"]) &&
 filter_var($_SERVER["HTTP_CF_CONNECTING_IP"],FILTER_VALIDATE_IP)) {
   $_SERVER["REMOTE_ADDR"] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}

ex) ドキュメントルートが/var/www/html/projectなら/var/www/html/にデプロイ。

正しく設定ファイルが設定されるとNinjaFirewallのDashboardに「Optional configuration file」という項目が追加され、設定パスと共に表示されるようになる。

【Lightsail】Ubuntu上でNginxにSSL証明書を設定してみた

近々リリース予定のサイトがあるのだが、Let's Encryptの無料SSL証明書ではなく
ちゃんとした有料の証明書を使用しようと思ったのでその過程を書いてみる

SSL証明書はNamecheapからPositiveSSLを1年契約で$5.88で購入
ドメインの種類としては3つあるなかで一番安いDV-SSL。
【保存版】やさしく分かる!SSL移行の全手順(WordPress対応) | 株式会社シャーロック | 大分市にある、インターネット集客・ウェブマーケティング専門のコンサルティング会社。

SSLについての説明は以下のサイトがわかりやすい。
【図解】よく分かるデジタル証明書(SSL証明書)の仕組み 〜https通信フロー,発行手順,CSR,自己署名(オレオレ)証明書,ルート証明書,中間証明書の必要性や扱いについて〜│SEの道標
SSLって何?意味や仕組みをわかりやすく解説! | さくらのSSL
SSLサーバー証明書の発行手順 | ラボラジアン

[SSL申請から設定までの流れ]

1) 秘密鍵の作成
2) CSR(証明書発行要求: Certificate Signing Request) の作成
3) サーバ証明書の取得
4) 秘密鍵と証明書を設置し、Nginx設定変更する

1)と2)を同時に行うコマンドもあるが、長いので噛み砕いて説明する意味を込めてコマンドを分けることにする。

1) 秘密鍵の作成

秘密鍵の作成と、以降で説明するCSRの作成には、opensslコマンドを使用する。

バージョンの確認

$ openssl version
OpenSSL 1.1.1g  21 Apr 2020

秘密鍵の作成は、サーバ上で行うため、まずは鍵と証明書を配置するためのディレクトリを作成する。以降の作業は全てこのディレクトリ内で行う。
また権限を厳しく設定する。

$ mkdir /etc/nginx/ssl
$ chown root:root -R /etc/nginx/ssl/
$ chmod 700 /etc/nginx/ssl

以下のコマンド入力後、パスフレーズを聞かれるので任意のパスフレーズを入力する。
openssl genrsaは秘密鍵を生成するコマンドで、以下のコマンドでは暗号化方式に「des3」を使用し、2048ビットのRSA秘密鍵を作成する。
また秘密鍵を「private.key」というファイル名で保存する。

$ openssl genrsa -des3 -out private.key 2048

暗号化方式には「-aes128 | -aes192 | -aes256 | -des | -des3」のどれかが選べるが、正直どれが良いのかとかは分からない...
色んなサイトを見て多かった設定が「-des3」なのでとりあえずこの方式を選ぶ。

またサーバ再起動時に毎回パスフレーズを聞かれるのを避けるため、オリジナルはバックアップし、パスフレーズは秘密鍵から削除しておく。

$ cp private.key private.key.with_pass_phrase
$ openssl rsa -in private.key -out private.key

バックアップしたオリジナル秘密鍵は別の媒体にもバックアップしておけば、サーバトラブル時などで秘密鍵が失われてしまってもうまく対応できる。

2) CSR(証明書発行要求: Certificate Signing Request) の作成

上記の1)で作成した秘密鍵を指定し、以下のコマンドでCSRを作成する。

$ openssl req -new -key private.key -out server.csr
  • new: CSR新規作成
  • key: 秘密鍵を指定
  • out: CSRの出力先ファイル名を指定

コマンドを入力されると以下の項目を聞かれる。以下の項目以外は必須ではないので、Enterを押してスキップする。

Country Name・・・2文字の国コード (ex: JP)
State or Province Name・・・都道府県 (ex: Fukuoka)
Locality Name・・・市区町村 (ex: Hakata-city)
Organization Name・・・組織 (ex: 任意の組織名)
Organizational Unit Name・・・部署名(ex: Admin、Webmaster、System Team)
Common Name・・・SSL接続に使用するドメイン名 (ex: blog.example.jp)

Common Name は、SSL接続する際に使われるドメイン名(FQDN)を入力する
例えばhttps://blog.example.jp/page/というURLの場合、blog.example.jpを入力する
またワイルドカード証明書はサブドメイン名を「*」にする(例:*.example.jp)。

更新の際のことを考えて、上記の設定を記入した設定ファイルを読み込むことでも作成できる
OpenSSLによるSSL証明書の発行の準備 - Qiita

3) サーバ証明書の取得

2)で作成したCSRをNamecheapに送信し、サーバ証明書を取得する。

Namecheapの設定するにあたり、以下のサイトさんを参考にさせてもらった。
SSL証明書を$9で購入し、Apacheサーバに設定してみました | たけぞうBLOG
Namecheapで$9のSSL(PositiveSSL)を購入してApache mod-sslに設定する

手順は以下

(1) CSRをコピーする

Acount => Dashboard => Product Listから対象のSSLのActivateボタンを押す。
f:id:Thoames1212:20200722022257p:plain

(2) Enter CSR箇所にCSRをペースト

ペーストすると、自動的に「Primary domain」の箇所が自動入力される。そして後Nextボタンを押す
f:id:Thoames1212:20200722022501p:plain

(3) Server Typeを選択

自分の場合はNginx上に設定するので「Any other server (cPanel, Apache, NGINX, etc.)」を選択
f:id:Thoames1212:20200722022745p:plain

(4) ドメイン管理者認証

証明書申請者がドメインの正式な所有者かどうかを認証する。方法は以下の3種類がある。

・メール認証
・HTTPベース認証
・DNSベース認証

上記の中では「メール認証」が一般的ではあるが、「Approver email」として指定できるのは当然のことながら「SSL証明書を設定するドメイン名」に紐付いたメールアドレスでないといけない。
ex) admin@example.com, administrator@example.com, postmaster@example.com, webmaster@example.com, hostmaster@example.com

本来ならばPostfixなどのメールサーバを予め設定しておいたり、Zohoメールなど設定を予め済ませておくのが良いのだろうが、
自分の場合は、未だにその設定をしていないため、このオプションは除外し、「DNSベース認証」を使用することにした。
この方法を選んだ場合、指定されたCNAMEレコードをDNSサーバに設定すればよいだけ。
ちなみにHTMLベースの認証は、指定されたファイルを特定のディレクトリに公開するという方法。
どっちでもよかったが、DNSベース認証のほうが、気持ち的に楽だったので、DNSベース認証にした。

f:id:Thoames1212:20200722030809p:plain

f:id:Thoames1212:20200722030820p:plain
ここで指定したメールアドレス宛に証明書が送られてくる

f:id:Thoames1212:20200722030859p:plain
f:id:Thoames1212:20200722031154p:plain


詳細は以下のページで。
How can I complete the domain control validation (DCV) for my SSL certifica

10分ぐらいで、指定してメールアドレス宛に証明書が発行された旨のメールが届いた。
メールにはzipファイルが添付されており、解凍すると以下のファイルが入っている。

・ドメイン名.ca-bundle (ルート証明書と中間証明書が連結されたファイル。詳細:
What is CA bundle? - SSL Certificates - Namecheap.com
)
・ドメイン名.crt (SSL証明書)

またメール添付されているzipファイルはNamecheapの管理画面でいつでもダウンロード可能。
ちなみに中間証明書については以下のサイトさんの説明が良かった。

中間CA証明書はなぜ必要なのでしょうか
秘密鍵は削除したらダメ?!SSL化に必要なファイルの種類を詳しく解説 | さくらのSSL

4) 秘密鍵と証明書を設置し、Nginx設定変更する

まずは3)で取得したca-budleファイルとcarファイルを連結する。
やり方は以下のサイトを参照。
Installing an SSL certificate on Nginx - Hosting - Namecheap.com

$ cat your_domain.crt your_domain.ca-bundle >> your_domain_chain.crt

その後、1)の秘密鍵と、証明書を連結したファイルをサーバに設置し、Nginxの設定をそれに併せて変更する。

server {
    listen 80;
    server_name example.com;
    # httpsにリダイレクト処理
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    # 自己署名証明書
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    # 暗号化鍵
    ssl_certificate_key /etc/nginx/ssl/private.key;
}

最後に秘密鍵や証明書が入っているディレクトリ内のファイル全てに対し権限設定を行う。

$ chmod 600 /etc/nginx/ssl/*

[参考]
NginxでSSL(HTTPS)設定!オレオレ(自己署名)証明書を作成しよう! | キツネの惑星
自己証明書でnginxにSSL(TLS)対応する - Qiita

備考

自己署名証明書(オレオレ証明書)の作成方法
以下のサイトを参考
CentOS7.2 64bit OpenSSLを使用して秘密鍵と自己署名のSSLサーバー証明書を同時に作成 | kakiro-web カキローウェブ

以下のコマンドだけで、秘密鍵と証明書を生成してくれる。

$ openssl req -x509 -newkey rsa:2048 -nodes -keyout server.key -sha256 -days 3650 -out server.crt

※3650というのは、期限なので、この場合は10年という事になる

また対話形式の質問は「Common Name」以外は全てEnterでスキップしてもOK

ちなみにMac Catalina経由でChromeからアクセスすると、「NET::ERR_CERT_INVALID」のエラーが表示されるようになった。
以下のサイトさんのように、Safari経由で見ることで、証明書をキーチェーンにダウンロードし、その設定を「常に信頼」へ変更することで
アクセスできるようになる。

macOS CatalinaでChromeからオレオレ証明書のHTTPSサイトにアクセスできない場合の対処法 - Qiita
macOS 10.15 (Catalina) で自己証明書を用いた Web サイトへアクセスする - らくがきちょう
Self-Signed SSL Certificate - Luke Armstrong


[その他参考]
SSLって何?意味や仕組みをわかりやすく解説! | さくらのSSL
CSRの作成方法が知りたい(VPS全般) – お客さまサポート
個人でSSL証明書を取得してHTTPS化してみた話 | 😁planet-green.com
秘密鍵は削除したらダメ?!SSL化に必要なファイルの種類を詳しく解説 | さくらのSSL

↓ Apacheの場合
さくらのSSLで、SSL証明書を取得してHTTPS対応 – gomokulog

【Lightsail】DNS設定とWordPressでwww有・無の設定

以下の説明では対象とするドメインをwww.example.comとexample.comで説明する

digを多用するので以下の記事を参考
thoames.hatenadiary.jp

DNS設定

LightsailのDNSレコード設定を以下にする

Aレコード: @.example.com、解決先: StaticIp-1 (静的IPと結びついている)
CNAMEレコード: www.example.com、解決先: example.com

上記の設定で、www有り無しのどちらでも、結びついている静的IPにアクセスできる

[Tips]

Chromeでwww.exampleと表示すると、https/httpのどちらも関係なく、またwwwの有り無しにも関係なく、example.comとして表示される。
以前はchrome://flagsから「Omnibox UI Hide Steady-State URL Trivial Subdomains」を「Disabled」に設定することで
https/httpとwww有り無しも表示できたが、現在は設定できなくなっている。

そこで見つけたのがこちらのサイト
Google ChromeのURLバーに https・http と www を表示する拡張機能 | 海外SEO情報ブログ

Chrome拡張の「Suspicious Site Reporter」を入れることで、https/httpとwww有り無しが表示されるようになる。
これはただ拡張をインストールするだけでOK

WordPressの設定

管理画面のSettings => General内の「WordPress Address (URL)」と「Site Address (URL)」に設定したいURLを入れればよいだけ。
仮にこの設定にwwwのサブドメインからなるドメインを設定したとして、www無しでアクセスした場合、
WordPressが「X-Redirect-By: WordPress」レスポンスヘッダー含めた301リダイレクトをしてくれる。また逆も然り。

[参考]
My website is showing a redirection error! - catalyst2
WordPressのサイトのwwwあり・なしを変更・統一する手順 | iscle [イズクル]

備考

nginxでwww有り・無しのserverディレクティブをそれぞれ作ったとしても、結局はWordPress側でリダイレクトするので
恐らく見れなくなるのではと思う。