メールサーバ_DNS関連の学習記録③_受信サーバ構築

## 2つの受信メール形式
### 〇mbox形式
送信元と宛先の複数のやり取りが一つのメールファイルで保存されるのがmbox形式

・保存箇所
/var/mail/ユーザー名 （Unix系のOSで使用されている。Ubuntu、Debian、Solarisなど
/var/spool/mail/ユーザー名 (CentOS / RedHatで使用使用されている。RHEL、Fedoraなど）

### 〇Maildir形式
1通につき一つのメールファイルで保存されるのがMaildir形式
ユーザーのホームディレクトリに保存される。

・保存箇所
/home/ユーザー名/Maildir/


## メールの受信プロトコル
### 〇POP（Post Office Protocol）
メールをサーバーからクライアントにダウンロードし、通常はサーバー上のメールを削除する。

郵便局で郵便物を受け取って自宅に持ち帰るようなもの。一度持ち帰れば郵便局（サーバー）には郵便物（メール）が残らないため。

・主な特徴:
ローカル環境でメールが保存される。
サーバー上のストレージ消費を抑えられる。
オフラインでメールが閲覧可能。

〇使用例
・複数デバイスで同じメールにアクセスする必要がない場合。
・制限されたストレージ:
　サーバーの容量が少なく、古いメールをサーバー上に保存したくない場合。


### 〇IMAP （Internet Message Access Protocol）

メールをサーバー上に保持したまま、クライアントから閲覧や操作を行う。

・主な特徴:
サーバー上でメールを管理。
フォルダ構造や既読/未読の状態を複数デバイス間で同期。
オフライン時は一部のメールのみキャッシュ可能。

図書館で本を読むようなもの。本（メール）は図書館（サーバー）に保管され続け、どこでも同じ状態の本が読める。

## Dovecotの構築
Dovecotをインストールする。
```
sudo yum install dovecot -y
```
必要なプロトコルを有効化する。
```
protocols = imap pop3 lmtp
```
メールボックスの形式と場所を指定する
```
mail_location = maildir:~/Maildir
```

## SSL/TLSの設定
秘密鍵の作成をする。
```
openssl genrsa -out server.key 2048
```

秘密鍵を使用してCSRを作成する。
```
openssl req -new -key server.key -out server.csr
```

このコマンドでは、対話形式で情報（国名、組織名、コモンネームなど）を入力する必要がある。

〇実行時に求められる情報（例）:
・Country Name (C): JP（日本の場合）
・State or Province Name (ST): Tokyo
・Locality Name (L): koutou-ku
・Organization Name (O): Example Inc.
・Organizational Unit Name (OU): IT Department
・Common Name (CN): example.com（証明書を適用するFQDN）
・Email Address: admin@example.com

csrファイルを作成したら認証局に申請する。

### SSL/TLS証明書を発行する際に、申請者が証明書で保護しようとしているドメインを本当に所有しているか確認する。
・メール確認: WHOIS登録された管理者メールに確認リンクを送付。
・DNSレコード確認: 指定されたTXTレコードをDNSに追加。
・HTTP/HTTPS確認: CAが指定するファイルをウェブサーバー上に配置。

### なぜこれらのことを行うのか？
なりすましの防止:攻撃者が他人のドメインに対して証明書を発行し、不正アクセスを試みるリスクを回避するため
信頼性の保証:証明書が発行されるドメインが正当な所有者に帰属していることを証明する。これにより、ユーザーが安心してそのドメインに接続できる。

作成した server.csr を認証局（GlobalSign、Symantecなど）に送信する。

## サーバー証明書と中間証明書

認証局から署名されたサーバー証明書を受け取る。
必要に応じて中間証明書（intermediate.crt）も提供されるため、両方をサーバーに設定する。

### 中間証明書はなぜ必要か？
・ルート証明書は極めて重要であり、直接使用すると盗難や改ざんのリスクがあるためルートCAは中間CAを発行し、ルート証明書自体の使用を最小限に抑える。

・中間証明書は「証明書チェーン」を構成する。証明書チェーンが完全でない場合、ブラウザはエラーを表示し、証明書を信頼しないため。

署名された証明書をサーバーに設定する。
```
ssl = required
ssl_cert = </path/to/server.crt
ssl_key = </path/to/server.key
ssl_ca = </path/to/intermediate.crt
```

## ユーザー認証の設定
パスワードファイルの設定（簡易設定）
/etc/dovecot/conf.d/10-auth.conf 内の以下を編集する。

・プレーンテキスト認証を無効化して、暗号化された接続（TLS/SSL）がない場合に認証情報が平文で送信されることを防ぐ。
・サポートする認証方式を「plain」と「login」に設定する。（クライアントとの認証通信をシンプルかつ効率的に行うため、SSL/TLSによる暗号化を前提とする）


```
disable_plaintext_auth = yes
auth_mechanisms = plain login
```

## パスワードファイルを有効化するためにシンボリックリンクを設定する
/etc/dovecot/conf.d/auth-passwdfile.conf.extを有効化する。
Dovecotでパスワードファイルを用いた認証を有効化するために、適切な設定ファイルを指定する。
・auth-passwdfile.conf.extは、パスワードファイルを認証バックエンドとして使用するための具体的な設定を含むテンプレート。
・このテンプレートをauth.conf.extとして利用することで、Dovecotはパスワードファイルを認証に使用する。
・作成されたリンクにより、Dovecotはauth.conf.extを通じてauth-passwdfile.conf.extの内容を参照し、パスワードファイルを利用した認証が可能になる
```
sudo ln -s /etc/dovecot/conf.d/auth-passwdfile.conf.ext /etc/dovecot/conf.d/auth.conf.ext
```
## なぜシンボリックリンクを使用するのか？
柔軟性の向上:必要に応じて異なるテンプレートファイルを切り替え可能。
管理の簡素化:元のテンプレートファイルを変更するだけで、新しい設定を反映できる。
誤設定防止:オリジナルのテンプレートファイルはそのまま残るため、設定変更による影響を抑えられる。

## パスワードファイルを作成
usernameという名前のユーザーを追加し、そのパスワードとしてpasswordを登録する。
{PLAIN}:パスワードが平文で保存されることを示す。
認証時にDovecotがこの形式を解釈して認証を行う。
```
echo "username:{PLAIN}password" >> /etc/dovecot/users
chmod 600 /etc/dovecot/users
```

## システムユーザーを使用する場合
Dovecotがシステムユーザーを用いた認証を行う場合の設定を示す。
```
passdb {
  driver = pam
}
userdb {
  driver = passwd
}
```
・passdb:
認証データベースを指定する。この例ではPAM（Pluggable Authentication Module）を使用。
・userdb:
ユーザー情報（メールボックスの場所など）を取得するデータベース。passwdはLinuxの標準ユーザーデータベース（/etc/passwd）を指す。


### システムユーザーと通常のLinuxユーザーの違い
〇システムユーザー
・特徴:
サーバー内部のプロセスやサービスのために作成されるユーザー。
通常のログインシェルを持たない（/bin/falseや/usr/sbin/nologinが指定される）。
特定のサービスにのみアクセスが許可される。
・例: dovecot, www-data, postfixなど。
使用パターン:
メールボックスの管理。
サービスが実行するプロセスの権限管理。
直接ログインは許可されない。

〇通常のLinuxユーザー
・特徴:
サーバーへのログインが許可された一般的なユーザー。
ホームディレクトリ、ログインシェルを持つ（/bin/bashなど）。
・使用パターン:
ユーザーがメールを受信/送信する際の認証。
SSHやターミナルを介したサーバー管理。

## サービスの起動と自動起動設定
```
sudo systemctl enable dovecot
sudo systemctl start dovecot
```

## 正常性の確認：ポートの確認
ソケットの統計を表示するコマンド、tulnのオプションでTCP、UDPプロトコルのソケットを表示
リッスン中のみのソケットで数値形式で表示する。
grep dovecotで結果をフィルタリングしてDovecot関連のエントリのみを表示する。
```
sudo ss -tuln | grep dovecot
```
正常である場合、下記のような出力結果がでる。
```
tcp    LISTEN  0       128       0.0.0.0:143       0.0.0.0:*    users:(("dovecot",pid=1234,fd=12))
tcp    LISTEN  0       128       0.0.0.0:993       0.0.0.0:*    users:(("dovecot",pid=1234,fd=13))
```
・ポート143: IMAPプロトコル（非暗号化）。
・ポート993: IMAP over SSL/TLS（暗号化通信）。

※dovecot: プロセス名が表示され、Dovecotがポートをリッスンしていることが確認できる。
※リッスン状態とは、サーバーがクライアントからの接続要求を受け入れる準備が整っている状態である。

※LISTENの次に表示される数値 128 は、ソケットのバックログキューの上限を示す。
バックログキューはクライアントからの接続要求を一時的に保持するキュー。
サーバーがリクエストを処理する前に、複数の接続を順番に待機させることができる。

※tcp    LISTEN  0はバックログキューに待機している接続要求がないことを意味する。
128はバックログキューの最大容量の数値。

## こんな記事も書いています！

https://qiita.com/mmurm/items/27066d690136db9a03ba

https://qiita.com/mmurm/items/5bee49bd4b912a4a185d

https://qiita.com/mmurm/items/06d6f0cb7e449aaed35d

## 参考にしたドキュメント

https://wa3.i-3-i.info/word17318.html

https://www.ssl.com/how-to/manually-generate-a-certificate-signing-request-csr-using-openssl/

https://blog.serverworks.co.jp/mail-server-basics-with-postfix-dovecot

https://doc.dovecotpro.com/3.0.0/