メールサーバー構築

2025/10/24
Postfix + Dovecot でメールサーバーを構築します。

バーチャルドメイン運用、SPF,DKIM,DMARC対応もします。
詳細は関連記事参照。

Mailサーバー用-almalinuxセットアップ

2025/10/24

almalinuxの基礎構築 最初にやっておくこと

AlmaLinux 9.x(最小構成)をクリーンインストール直後から安全・再現性高く構築するための完全手順書です。
Postfix等の導入前に、システム基盤を整える目的です。

1. システム初期確認

目的:インストール直後のシステム情報を確認。
sudo cat /etc/almalinux-release
uname -r
ip -brief address
lsblk
df -hT
sudo dnf repolist
確認ポイント:
  • AlmaLinux 9.x と表示される
  • NIC名(例:ens160)を確認
  • `/` に十分な空き容量がある
この項目の詳しい解説はこちら。

2. ロケール設定(ja_JP.UTF-8)

sudo dnf install -y glibc-langpack-ja
sudo localectl set-locale LANG=ja_JP.UTF-8
cat /etc/locale.conf
出力:
LANG=ja_JP.UTF-8
この項目の詳しい解説はこちら。

3. タイムゾーンと時刻同期設定

sudo timedatectl set-timezone Asia/Tokyo
sudo systemctl enable --now chronyd
timedatectl status
想定結果:
Time zone: Asia/Tokyo
System clock synchronized: yes

この項目の詳しい解説はこちら。

4. SELinux 状態確認と無効化(構築が完了したら有効化する)

さくらインターネットVPSのalmalinuxでは、SElinuxは当初からdisableなので、さくらVPSの場合は不要
getenforce
sudo cp -a /etc/selinux/config /etc/selinux/config.bak-$(date +%Y%m%d)
sudo setenforce 0 || true
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
getenforce
grep '^SELINUX=' /etc/selinux/config
想定結果:
`Disabled`

この項目の詳しい解説はこちら。

5. スワップ領域(4GB)作成・永続化

VPSの契約は、メモリ4GBですので、今後のメールサーバー構築を見据え、スワップ領域4GBを確保しておきます。
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
grep -q "/swapfile" /etc/fstab || echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
確認:
swapon --show
free -h

この項目の詳しい解説はこちら。

6. 基本パッケージ導入

sudo dnf install -y epel-release
sudo dnf install -y bash-completion curl wget git tar zip unzip bind-utils firewalld glibc-langpack-ja telnet nc rsync screen  htop tree jq
この項目の詳しい解説はこちら。

7.エディタ導入

自分の好みのエディタをいれて構いませんが、ここでは vim-enhanced 、nano、microの3つを入れておきます。両方とも定評のあるエディタです。
nanoはシンプルで使いやすいですが、ショートカットキーがunixライクなので、windows環境に慣れている方はmicroのほうがいいかもしれません(好みです)。
vimは、プロには好まれますが、初学者には習熟するまで時間がかかるかも知れません。
エディタは複数インストールしておいて使いやすいのを使えばよいと思います。

nanoの導入
sudo dnf install -y nano vim-enhanced  
micro エディタは、EPELには含まれていないので、スクリプトから導入(直接バイナリ導入)する必要があります。

microの導入
cd ~
curl https://getmic.ro | bash
sudo mv ~/micro /usr/local/bin/micro

#microはそのままではパスが通らないので、通しておく。
#`sudo micro` 実行時に「command not found」になる問題の対策。
#sudo secure_path に /usr/local/bin を追加(恒久対策)

grep -Rq "/usr/local/bin" /etc/sudoers /etc/sudoers.d 2>/dev/null || {
echo 'Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin' | sudo tee /etc/sudoers.d/10-secure-path >/dev/null
sudo chmod 440 /etc/sudoers.d/10-secure-path
sudo visudo -cf /etc/sudoers.d/10-secure-path
}
#デフォルトエディタにmicoroを指定(デフォルトをnanoにしたい場合は下記のmicroをnanoに変更)
環境変数設定(冪等):
grep -q "EDITOR=micro" ~/.bashrc || echo 'export EDITOR=micro' >> ~/.bashrc
grep -q "VISUAL=micro" ~/.bashrc || echo 'export VISUAL=micro' >> ~/.bashrc
リポジトリにあるソフト(vim,nano)は、/usr/bin/ にインストールされますが、ここはOSやディストリビューションが管理するディレクトリなので、ディストリに含まれないmicroは/usr/local/binにインストールしています。今後、リポジトリにmicroが含まれるようになれば、nanoと一緒のディレクトリにインストールすることになるでしょう。


確認:
sudo -V | sed -n 's/^Secure Path: //p'

出力例:
`/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin`

この項目の詳しい解説はこちら。

8. firewalld 設定

ここでは最小限の設定。今後のメールサーバー設定時には、さらに拡張する。
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
想定結果:
services: ssh

この項目の詳しい解説はこちら。

9. fail2ban 導入

sudo dnf install -y fail2ban
sudo systemctl enable --now fail2ban
sudo mkdir -p /etc/fail2ban/jail.d
cat <<'EOF' | sudo tee /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 5
bantime = 3600
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

10. 再起動前の整合チェック

sudo systemctl is-enabled firewalld
sudo systemctl is-enabled fail2ban
sudo getenforce
sudo hostnamectl
sudo timedatectl
sudo free -h
sudo firewall-cmd --list-all

11. システム更新

sudo dnf update -y

覚え書き

SElinux有効時にswapファイルのrestoreを忘れずに!!
sudo restorecon /swapfile 

SElinuxの理解のために

2025/10/23

SELinuxという同乗者 ― rootの腕をつかむセキュリティ係

rootは万能、でも人間的

Linuxの世界では、root は絶対的な存在です。どんなファイルにもアクセスでき、どんな命令も実行できます。
しかし万能であるがゆえに、危うい瞬間があります。うっかりひとつコマンドを誤れば、システムを壊してしまう。
root は完璧ではなく、人間味を持った強力な管理者です。

SELinuxの登場

そこに登場したのが SELinux。
root の背後に控え、腕をそっとつかんで共に歩く「安全係」です。
彼(あるいは彼女)はこう言います。

> 「そこは system ファイルだから、今のあなた(postfix_t)には触れないわ。」
> 「そのスプール領域は dovecot_t の担当よ。」
> 「root さん、あなたでも、今日はそこはやめておきましょう。」

SELinux は命令を奪わず、横で見守り、ルールから外れる瞬間にだけ静かにブレーキをかけます。

ルールに従う自由

この仕組みを「強制アクセス制御(MAC)」と呼びます。
強制という言葉が堅く聞こえますが、実際には「ルールのある自由」です。
root が行う操作は、すべて *ポリシー* と呼ばれる交通法規に照らして判断されます。
許される範囲では自由に走れる。
ただし、交差点で信号が赤なら進めない。それだけのことです。

ファイルとプロセスの二人三脚

SELinuxの世界では、すべてのものが名札をつけています。
ファイルにも、プロセスにも、「これは誰で、何をしていいか」というラベルがある。
root が新しいプログラムを実行するとき、SELinux はこう言います。
「このプログラムは *postfix_exec_t*、あなた(init_t)が起動するなら *postfix_master_t* として働きなさい。」

まるで人事担当者が社員の役職を割り当てるように、プロセスは任務を与えられて動き出します。

予防的な優しさ

SELinux は攻撃者を追い出す仕組みではなく、

システムを“自ら守らせる”ための内的な安全装置**です。

root ですら例外ではありません。
権限を奪うのではなく、「もう一人の冷静な自分」として行動を監視してくれる。
そのブレーキは、ときに煩わしく感じられるかもしれませんが、
それこそが安心して全速力で走れる理由になります。

一緒に歩く技術

SELinuxを完全に無効にしてしまえば、root は再び孤独な旅人です。
代わりに、「permissive」で練習し、「restorecon」や「semanage」で信頼関係を築けば、
SELinuxは頼れる同乗者になります。
「ここは安全」「ここは危ない」と会話できる関係ができれば、
システム管理はぐっと落ち着いたものになります。

安全と自由の共存

SELinuxは、rootの自由を奪うものではありません。
rootの力を暴走させずに、**自由と安全を両立させるための知恵**です。
危険な時だけ静かに腕を引き、正しい道を示す。
その優しい制約こそ、現代のLinuxが長く走り続けられる理由なのです。