AlmaLinux9をドメイン参加させてファイルサーバーにする

環境

ここの手順で構築したドメインコントローラーで認証する。

・ AlmaLinuxのバージョン: 9.4
・ ホスト名: samba.ad.example.jp
・ IPアドレス: 192.168.1.13
・ realmdのバージョン: 0.17.1
・ sambaのバージョン: 4.19.4

FQDNでホスト名を設定する。

# hostnamectl set-hostname samba.ad.example.jp

必要なパッケージをインストールする。

# dnf install realmd samba

参照するDNSをドメインコントローラーに変更する。

# nmcli connection modify [コネクションID] ipv4.dns [ドメインコントローラーのIPアドレス]
# nmcli connection up [コネクションID]

smb.confをバックアップする。

# mv /etc/samba/smb.conf /etc/samba/smb.conf.backup

ドメインコントローラーにjoinする。
※ドメインのメンバーとして機能するためのソフトウェアにsambaを指定
※ドメインユーザーの認証を処理するソフトウェアにwinbindを指定

# realm join --membership-software=samba --client-software=winbind ad.example.jp

共有ディレクトリを作成する。
※root以外がアクセスできないようにする

# mkdir -p /data/samba/share
# chmod 770 /data/samba/share

初期設定されたsambaの設定ファイルを編集して最下行に追記する。
※「force user」にrootを指定してファイル操作をrootで実行させる

[share]
path = /data/samba/share
create mask = 0660
directory mask = 0770
force user = root
writable = yes
valid users = @"example\domain users" "example\administrator"

ファイアウォールに例外を登録する。

# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload

SELinuxのラベル付けを行う。

# semanage fcontext -a -t samba_share_t "/data/samba/share(/.*)?"
# restorecon -RF /data/samba/share/

SELinuxにsmbdによるパブリックディレクトリへの書き込みを有効にする。

# setsebool -P allow_smbd_anon_write true

サービスを有効にして起動する。

# systemctl enable --now smb

AlmaLinux9でdhcpとbindを連携させ家庭内DDNS

DNSサーバーもDHCPサーバーも1台で兼任させるが、冗長化のためゾーン転送を利用して2台分を設定する。

・ AlmaLinux: 9.4
・ bind: 9.16.23
・ dhcp-server: 4.4.2
・ プライマリIPアドレス: 192.168.1.11
・ セカンダリIPアドレス: 192.168.1.12

プライマリサーバーの設定

パッケージをインストールする。

# dnf install bind dhcp-server

DNSサーバーの設定ファイルを変更または追記する。

options {
    listen-on port 53 { any; };
    listen-on-v6 { none; };
    directory "/var/named/";
    …
    // LAN内からの問い合わせを許可
    allow-query {
        localhost;
        192.168.1.0/24;
    };
    …
    // ゾーン転送を許可するIPを設定
    allow-transfer {
        192.168.1.12;
    };
    // 自分で名前解決できないときの丸投げ先
    forwarders {
        192.168.1.254;
        8.8.8.8;
    };
};
…
zone "example.jp." {
    type master;
    file "example.jp.zone";
    // 自身からの変更を許可
    allow-update {
        localhost;
        192.168.1.12;
    };
};
…

さっき指定したzoneファイルを作成する。
※LAN内のDDNSに使用するため更新間隔を短く
※”admin.example.jp.”は”admin@example.jp”という管理者のE-mailという意味らしい

$TTL 86400
@    IN    SOA    sv1.example.jp.    admin.example.jp. (
           2024071501
           300
           60
           3600
           300
)

        IN    NS   sv1.example.jp.
        IN    NS   sv2.example.jp.
sv1     IN    A    192.168.1.11
sv2     IN    A    192.168.1.12

作成したらファイルの所有者をnamedに変更する。

# chown named:named /var/named/example.jp.zone

DHCPサーバーの設定ファイルに下記を追記する。

# DNSサーバーに更新要求を送信する設定
ddns-update-style interim;
# 普通のDHCPの設定
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.101 192.168.1.120;
    option routers 192.168.1.254;
    option domain-name "example.jp";
    option domain-name-servers 192.168.1.11, 192.168.1.12;
    # 更新を通知するDNSサーバーを指定
    zone example.jp. {
        primary localhost;
    }
}

SELinuxとファイアウォールに例外を追加する。

# setsebool -P named_write_master_zones true
# firewall-cmd --add-service=dns --permanent
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --reload

サービスを有効にして起動。

# systemctl enable --now named
# systemctl enable --now dhcpd

セカンダリサーバーの設定

パッケージをインストールする。

# dnf install bind dhcp-server

DNSサーバーの設定ファイルを変更または追記する。

options {
    listen-on port 53 { any; };
    listen-on-v6 { none; };
    directory "/var/named/";
    …
    allow-query {
        localhost;
        192.168.1.0/24;
    };
    …
    forwarders {
        192.168.1.254;
        8.8.8.8;
    };
};
…
zone "example.jp." {
    type slave;
    file "example.jp.zone";
    masters {
        192.168.1.11;
    };
};
…

DHCPサーバーの設定ファイルに下記を追記する。

ddns-update-style interim;
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.121 192.168.1.140;
    option routers 192.168.1.254;
    option domain-name "example.jp";
    option domain-name-servers 192.168.1.11, 192.168.1.12;
    zone example.jp. {
        primary 192.168.1.11;
    }
}

SELinuxとファイアウォールに例外を追加する。

# firewall-cmd --add-service=dns --permanent
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --reload

サービスを有効にして起動。

# systemctl enable --now named
# systemctl enable --now dhcpd

補足

ゾーンを再読み込みする

保持しているゾーンの情報をリロードする。mastersのシリアルが保持しているシリアルよりも大きければゾーン転送が行われる。

# rndc reload example.jp
現在のDNSレコードの確認

rndcでdumpして現在のDNSレコードを確認する。

# rndc dumpdb -zones
# less /var/named/data/cache_dump.db 
DNSレコードの更新テスト

nsupdateを使用してDNSサーバーを更新をテストするにはbind-utilsをインストールし、nsupdateコマンドを実行する。実行したら対話型コンソールになるので下記のような感じで入力する。何もエラーが出なければOK。

>server 127.0.0.1
>update add test.example.jp. 3600 A 192.168.1.222
>send
>server 127.0.0.1
>update delete test.example.jp.
>send

AlmaLinux9のシャットダウン時にgrubが表示するdracutの警告を隠す

AlmaLinux9.3をノートパソコンにインストールしてみると、シャットダウン時に下記の警告が表示され、カーネルパラメーターに”loglevel=0″を設定しても表示されてしまう。色々調べて試したが、どうにもならないし、なんとなく無視してよさそうなメッセージなので、とりあえず隠したい。

dracut Warning: Killing all remaining processes
dracut Warning: Cannot umount /oldroot

かなり無理矢理な手段だが、文字色を黒にしてしまう手段で対処する。ちなみに0x00の最後の1桁が前景色で最後から2桁目が背景色。ディストリビューションによって色の定義が異なる場合がある。
(0:黒/1:青/2:緑/3:シアン/4:赤/5:マゼンタ/6:黄/7:薄灰/8:灰/9:薄青/10:薄緑)

# grubby --args vt.color=0x00 --update-kernel ALL

これでgrubが出力するメッセージは隠れてる。我ながらかなりの強行策だ。ただ、Ctrl+Alt+F1〜F6で切り替えられる仮想コンソールも隠れる。ログインぐらいは何も映らなくてもできるので、ログイン後の”.bashrc”の最後に下記を追記して対処する。

…
if [ "$TERM" == "linux" ]; then
    setterm --foreground white --store
fi

AlmaLinux9でのOpenVPNサーバーの設定

前提条件

※tun(ルーティング)方式で設定する
※自宅用なのでセキュリティリスク(CAの秘密鍵へのアクセス)を承知した上でOpenVPNサーバーとCAを同じマシンにインストールする

・ AlmaLinux: 9.1
・ openvpn: 2.5.8-1
・ easy-rsa: 3.0.8-3
・ openssl: 3.0.1-43

サーバー設定手順

openvpnとeasy-rsaをインストールする。

# dnf install epel-release
# dnf install openvpn easy-rsa

ルート証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CA_EXPIRE=7300

公開鍵基盤(PKI)を初期化して認証局(CA)を設置する。CA作成時に秘密鍵のパスフレーズを聞いてくる。このパスフレーズは新しい証明書発行時に必要になる。
※このときのopensslにはバグがあり2度パスフレーズを聞かれるが最初のは無視される

# cd /usr/share/easy-rsa/3.0.8/
# ./easyrsa init-pki
# ./easyrsa build-ca

認証局(CA)が発行する証明書の有効期間(日数)を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_EXPIRE=3650

VPNサーバー用の証明書を作成する。
※パスフレーズは不要なのでnopassを指定

# ./easyrsa build-server-full vpn.example.com nopass

Diffie-Hellmanパラメーターファイルを作成する。

# ./easyrsa gen-dh

TLS-AuthのHMACに使用する共通鍵を作成する。

# openvpn --genkey secret /etc/openvpn/server/ta.key

OpenVPNサーバーの設定ファイルをサンプルからコピーする。

# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/

設定ファイルを下記のように変更する。
※重要そうな箇所のみ記載
※serverにはクライアントに割り当てられるipアドレスを定義
※push(route)にはクライアントにアクセスを許可するサーバーのプライベートネットワークを指定
※push(redirect-gateway)でクライアントのIPトラフィックがVPNを通過するよう設定
※push(dhcp-option DNS)でクライアントが使用するDNSサーバーを指定
※client-to-clientでクライアント同士の通信を許可
※duplicate-cnで同じ証明書を使用した複数のクライアント接続を許可(非推奨)

port 7716
proto udp
dev tun
ca /usr/share/easy-rsa/3.0.8/pki/ca.crt
cert /usr/share/easy-rsa/3.0.8/pki/issued/vpn.example.com.crt
key /usr/share/easy-rsa/3.0.8/pki/private/vpn.example.com.key
dh /usr/share/easy-rsa/3.0.8/pki/dh.pem
server 172.16.1.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.1.11"
push "dhcp-option DNS 8.8.8.8"
client-to-client
duplicate-cn
tls-auth ta.key 0

IPフォワードを有効にして、異なるネットワーク(NIC)間でパケットが転送されるように設定変更する。

# echo -e "\n# Controls IP packet forwarding\nnet.ipv4.ip_forward = 1" >>/etc/sysctl.conf
# sysctl -p

ファイアウォールに使用するポートを例外登録し、IPマスカレードも有効に設定する。

# firewall-cmd --permanent --add-port=7716/udp
# firewall-cmd --permanent --add-masquerade
# firewall-cmd --reload

SELinuxのポリシー変更を行うためのユーティリティをインストールする。

# dnf install policycoreutils-python-utils

SELinuxがopenvpnに通信許可するポートを追加する。
※-lオプションで確認したタイプ名はopenvpn_port_t

# semanage port -t openvpn_port_t -a -p udp 7716

サービスを有効化して起動する。

# systemctl enable --now openvpn-server@server

クライアント証明書の発行

クライアントに配る*.ovpnを作成するのが面倒なのでスクリプトを作成した。地味にハマったポイントはTLS-Authの「key-direction 1」サーバーの設定が0なら1にする必要がある。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa/3.0.8
sample_config_location=/usr/share/doc/openvpn/sample/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "作成するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
echo "クライアント接続設定ファイル「$id.ovpn」を作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa build-client-full $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にしてスクリプトを実行すれば対話型でクライアント用の*.ovpnを作成できる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x build-client-ovpn.sh
# ./build-client-ovpn.sh

クライアント証明書の更新

更新が可能になる期間を変更したい場合、事前に下記を参考に環境変数を変更する。

# export EASYRSA_CERT_RENEW=365

これも面倒なので更新用のスクリプトを作成した。

#!/bin/bash
easyrsa_location=/usr/share/easy-rsa/3.0.8
sample_config_location=/usr/share/doc/openvpn/sample/sample-config-files
takey_location=/etc/openvpn/server/ta.key
server=vpn.example.com
port=7716
echo "更新するユーザーIDを入力してください。"
read -p "ユーザーID:" id
if [ -z "$id" ]; then
    exit 0
fi
fullname=$id.$server
echo
if [ ! -f "$easyrsa_location/pki/issued/$fullname.crt" ]; then
    echo "既存の証明書が見つかりませんでした。"
    exit 1
fi
echo "クライアント接続設定ファイル「$id.ovpn」を再作成します。"
read -p "Enterキーで続行します。" result
if [ ! -z "$result" ]; then
    exit 0
fi
echo
default_location=$(pwd)
cd $easyrsa_location
./easyrsa renew $fullname nopass
if [ ! $? -eq 0 ]; then
    exit 0;
fi
cd $default_location
cp $sample_config_location/client.conf $id.ovpn
sed -i "s/my-server-1 1194/$server $port/g" $id.ovpn
sed -i "s/ca ca.crt/#ca ca.crt/g" $id.ovpn
sed -i "s/cert client.crt/#cert client.crt/g" $id.ovpn
sed -i "s/key client.key/#key client.key/g" $id.ovpn
sed -i "s/tls-auth ta.key 1/#tls-auth ta.key 1\nkey-direction 1/g" $id.ovpn
echo "" >>$id.ovpn
# CA
echo "<ca>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/ca.crt >>$id.ovpn
echo "</ca>" >>$id.ovpn
echo "" >>$id.ovpn
# Key
echo "<key>" >>$id.ovpn
grep -A 100 'BEGIN PRIVATE KEY' $easyrsa_location/pki/private/$fullname.key >>$id.ovpn
echo "</key>" >>$id.ovpn
echo "" >>$id.ovpn
# Cert
echo "<cert>" >>$id.ovpn
grep -A 100 'BEGIN CERTIFICATE' $easyrsa_location/pki/issued/$fullname.crt >>$id.ovpn
echo "</cert>" >>$id.ovpn
echo "" >>$id.ovpn
# TLS-auth
echo "<tls-auth>" >>$id.ovpn
cat $takey_location >>$id.ovpn
echo "</tls-auth>" >>$id.ovpn
echo "" >>$id.ovpn
echo "作成が完了しました。"

実行可能にすれば対話型で更新ができる。作成された*.ovpnのパーミッションには気をつけが方が良い。

# chmod +x renew-client-ovpn.sh
# ./renew-client-ovpn.sh

AlmaLinux8のPostfixでEメールをDKIMで送信する

この記事で設定したPostfixを使用する。

AlmaLinux release 8.5 (Arctic Sphynx)
postfix 3.5.8
opendkim 2.11.0

EPELリポジトリを追加する。

# dnf install epel-release

必要なパッケージをインストールする。

# dnf install opendkim
# dnf install opendkim-tools

鍵を格納するディレクトリを作成する。

# cd /etc/opendkim/keys/
# mkdir hirohiro716.com alias.hirohiro716.com
# chmod 750 *

鍵を作成する。–selectorオプションは1つのドメインに複数の鍵を設定する場合を除き指定する必要はない。

# opendkim-genkey -D /etc/opendkim/keys/hirohiro716.com/ -d hirohiro716.com
# opendkim-genkey -D /etc/opendkim/keys/alias.hirohiro716.com/ -d alias.hirohiro716.com
# chown -R opendkim:opendkim /etc/opendkim/keys/

作成されたdefault.txtを参考にDNSレコードを登録しておく。

default._domainkey.hirohiro716.com TXT 0 v=DKIM1; k=rsa; p=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
_adsp._domainkey.hirohiro716.com TXT 0 dkim=unknown
default._domainkey.alias.hirohiro716.com TXT 0 v=DKIM1; k=rsa; p=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
_adsp._domainkey.alias.hirohiro716.com TXT 0 dkim=unknown

opendkimの設定を変更する。
※変更箇所のみ記載

Mode  sv
SoftwareHeader  no
KeyTable  /etc/opendkim/KeyTable
SigningTable  refile:/etc/opendkim/SigningTable

KeyTableを変更して使用する秘密鍵を指定する。

default._domainkey.hirohiro716.com hirohiro716.com:default:/etc/opendkim/keys/hirohiro716.com/default.private
default._domainkey.alias.hirohiro716.com alias.hirohiro716.com:default:/etc/opendkim/keys/alias.hirohiro716.com/default.private

SigningTableを変更して署名するドメインを指定する。

*@hirohiro716.com default._domainkey.hirohiro716.com
*@alias.hirohiro716.com default._domainkey.alias.hirohiro716.com

サービスを有効化して実行する。

# systemctl enable --now opendkim

Postfixの設定ファイルの最下部に下記を追記する。

# DKIM settings.
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

Postfixの設定を再読み込みする。

# systemctl reload postfix

Apacheが動いているAlmaLinux8でPostfix用のLet’sEncryptの証明書を取得する

AlmaLinux release 8.5 (Arctic Sphynx)
certbot 1.22.0
apache 2.4.37
postfix 3.5.8

Let’sEncryptの証明書を発行するためのcertbotをインストールする。

# dnf install epel-release
# dnf install certbot

ACMEプロトコル用にApacheの設定を行う。

<VirtualHost *:80>
        ServerName test.example.com
        DocumentRoot /var/lib/letsencrypt/
        <Directory /var/lib/letsencrypt/>
            AllowOverride None
            Options IncludesNoExec
            Require method GET
        </Directory>
</VirtualHost>

Apacheの設定を再読み込みする。

# systemctl reload httpd

SSL証明書を発行する。何度も失敗したりしても制限がかかるので、–dry-runオプションを指定してテストする。

# certbot certonly --webroot -w /var/lib/letsencrypt/ -d test.example.com
-------------------------------------------------------------
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): admin@test.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, 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: N
Account registered.
Requesting a certificate for test.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/test.example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/test.example.com/privkey.pem
This certificate expires on 2022-08-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

発行が成功すると下記の場所に証明書が作られる。ほかのサーバーに移行する場合は/etc/letsencrypt/ごとコピーすればOKだった。

/etc/letsencrypt/live/test.example.com/cert.pem
/etc/letsencrypt/live/test.example.com/privkey.pem
/etc/letsencrypt/live/test.example.com/chain.pem
/etc/letsencrypt/live/test.example.com/fullchain.pem

cronで毎朝4時にSSL証明書を更新するジョブを追加する。更新されるかは自動で決定され、更新された場合のみ–deploy-hookオプションで指定されたコマンドが実行される。

0 4 * * * certbot renew --deploy-hook "systemctl reload postfix"

Postfixのmain.cfを編集して証明書の設定をする。
※変更箇所のみ記載

# Certificate settings.
smtpd_tls_cert_file = /etc/letsencrypt/live/test.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/test.example.com/privkey.pem

AlmaLinux8をPostfix+dovecotでE-mailサーバーにする

・ システムアカウントとE-mailアカウントは別にしたい
・ user1@hirohiro716.comのようなアドレスで主に送受信する
・ 別名でuser1@alias.hirohiro716.comでも受信したい
・ メーリングリストも使用したい
・ AlmaLinuxのバージョン: 8.5
・ Postfixのバージョン: 3.5.8
・ Dovecotのバージョン: 2.3.8
・ プロトコル: smtp/smtps/imaps/pop3s

DNSレコード

先にDNSレコードを登録しておく。
mydomain: email.hirohiro716.com
virtual_mailbox_domains: hirohiro716.com
virtual_alias_domains: alias.hirohiro716.com

email.hirohiro716.com A 0 153.126.160.145
hirohiro716.com A 0 153.126.160.145
hirohiro716.com MX 10 hirohiro716.com
hirohiro716.com TXT 0 v=spf1 +mx ~all
alias.hirohiro716.com A 0 153.126.160.145
alias.hirohiro716.com MX 10 alias.hirohiro716.com
alias.hirohiro716.com TXT 0 v=spf1 +mx ~all

SSL証明書

この手順ではZeroSSLで発行した証明書を使用する。ZeroSSLにログインして発行した証明書のzipファイルを解凍する。

# unzip email.hirohiro716.com.zip -d /etc/ssl/email.hirohiro716.com/

解凍されたファイルは「ca_bundle.crt」「certificate.crt」「private.key」で、中間CA証明書がないので作成する。

# cd /etc/ssl/email.hirohiro716.com/
# cat certificate.crt ca_bundle.crt > fullchain.crt

証明書のSELinuxコンテキストのラベル付けを復元する。

# restorecon -RF /etc/ssl/email.hirohiro716.com/

Dovecot

Dovecotをインストールする。

# dnf install dovecot

SSL証明書の設定をする。
※変更箇所のみ記載

ssl_cert = </etc/ssl/email.hirohiro716.com/fullchain.crt
ssl_key = </etc/ssl/email.hirohiro716.com/private.key

使用するプロトコルを設定する。
※変更箇所のみ記載

protocols = imap pop3

認証の際に受け付けるポート、Postfix認証用ソケットファイルの設定をする。ソケットファイルのパーミッションとか所有者とかはコメントを読む限り0666で問題なさそうなのでそのまま。
※変更箇所のみ記載

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
}

バーチャルメールボックス用のシステムアカウントとディレクトリを作成する。

# groupadd -g 5000 vmail
# useradd -u 5000 -g vmail -s /sbin/nologin vmail
# mkdir /var/spool/mail/virtual
# chown vmail:vmail /var/spool/mail/virtual
# chmod 770 /var/spool/mail/virtual

Dovecotにバーチャルメールボックスの場所を設定する。
※変更箇所のみ記載

mail_location = maildir:/var/spool/mail/virtual/%d/%n/Maildir

Dovecotの認証方法に関する設定を変更する。システムアカウントで認証はしない。
※変更箇所のみ記載

#!include auth-system.conf.ext
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext

auth-passwdfile.conf.extはデフォルトのまま使用する。

passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}
userdb {
  driver = passwd-file
  args = username_format=%u /etc/dovecot/users
}

auth-passwdfile.conf.extで指定されているusersファイルを作成する。

user1@hirohiro716.com:{PLAIN}password-1234
user2@hirohiro716.com:{PLAIN}password-5678

auth-static.conf.extを編集して作成したアカウント「vmail」を指定する。homeの指定はしなくても大丈夫だと思われる。
※変更箇所のみ記載

userdb {
  driver = static
  args = uid=vmail gid=vmail
}

Postfix

基本的な設定

Postfixをインストールする。

# dnf install postfix

main.cfを編集して基本的な設定をする。
※変更箇所のみ記載

# Not matching the actual hostname.
myhostname = email.hirohiro716.com
mydomain = $myhostname
myorigin = $mydomain

# Receive mail on all network interfaces.
inet_interfaces = all

# Disable IPv6.
inet_protocols = ipv4

# Specifies the domain that this machine delivers locally.
mydestination = $myhostname, localhost.$mydomain, localhost

# Not publish.
smtpd_banner = $myhostname ESMTP unknown

# Certificate settings.
smtpd_tls_cert_file = /etc/ssl/email.hirohiro716.com/fullchain.crt
smtpd_tls_key_file = /etc/ssl/email.hirohiro716.com/private.key

# Disable user search.
disable_vrfy_command = yes

# SASL settings.
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination

# Client restriction settings.
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client, permit

# HELO restriction settings.
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_unknown_hostname, reject_non_fqdn_hostname, reject_invalid_hostname, permit

# Sender restriction settings.
smtpd_sender_restrictions = permit_mynetworks, reject_unknown_sender_domain, reject_non_fqdn_sender

master.cfを編集して利用するプロトコルの種類を設定する。smtpsのsmtpd_tls_wrappermodeを有効にしないとtcp/465でもSTARTTLSが試行される。
※変更箇所のみ記載

smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
メールの容量に関する設定

現在のサイズに関する設定値を確認する。

berkeley_db_create_buffer_size = 16777216
berkeley_db_read_buffer_size = 131072
body_checks_size_limit = 51200
bounce_size_limit = 50000
header_size_limit = 102400
lmdb_map_size = 16777216
mailbox_size_limit = 51200000
message_size_limit = 10240000
tcp_windowsize = 0

メールボックスが50MB、メッセージが10MBに制限されている。ちょっと少ないので設定変更する。再度「main.cf」を編集して最下部に追記する。
※追記する箇所のみ記載

# Maximum mailbox size 1GB. Maximum message size 20MB.
mailbox_size_limit = 1024000000
message_size_limit = 20480000
バーチャルメールボックスの設定

バーチャルメールボックスの設定をする。再度「main.cf」を編集して最下部に追記する。
※追記する箇所のみ記載

# Virtual mailbox settings.
virtual_mailbox_domains = hirohiro716.com
virtual_mailbox_base = /var/spool/mail/virtual
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

main.cfで指定したバーチャルメールボックスの場所を定義するファイルを作成する。

user1@hirohiro716.com hirohiro716.com/user1/Maildir/
user2@hirohiro716.com hirohiro716.com/user2/Maildir/

作成したvmailboxから検索テーブル(vmailbox.db)を生成する。

# postmap /etc/postfix/vmailbox
バーチャルエイリアスの設定

バーチャルエイリアスの設定をする。再度「main.cf」を編集して最下部に追記する。
※追記する箇所のみ記載

# Virtual ailias settings.
virtual_alias_domains = alias.hirohiro716.com
virtual_alias_maps = hash:/etc/postfix/virtual

main.cfで指定したバーチャルエイリアスの転送先を定義するファイルを作成する。

@alias.hirohiro716.com @hirohiro716.com

作成したvirtualから検索テーブル(virtual.db)を生成する。

# postmap /etc/postfix/virtual
メーリングリストの設定

メーリングリストはバーチャルエイリアスの設定で実現する。再度「main.cf」を編集して「virtual_alias_maps」に「regexp:/etc/postfix/ml」をカンマ区切りで追記する。
※変更箇所のみ記載

virtual_alias_maps = hash:/etc/postfix/virtual, regexp:/etc/postfix/ml

main.cfで指定したメーリングリストの設定を定義するファイルを作成する。

# Group1
/^group1@(hirohiro716\.com|alias\.hirohiro716\.com)$/
        user1@hirohiro716.com,
        user2@hirohiro716.com,

# Team2
/^team2@(hirohiro716\.com|alias\.hirohiro716\.com)$/
        user1@hirohiro716.com,

ファイアウォールの例外設定をする。

# firewall-cmd --permanent --add-service={smtp,smtp-submission,smtps,imaps,pop3s}
# firewall-cmd --reload

サービスを有効化して実行する。

# systemctl enable --now dovecot
# systemctl enable --now postfix

AlmaLinux8にkernel5.4をインストールする

環境

・ ディストリビューション: AlmaLinux 8.5
・ Linuxカーネル: 4.18.0-348.20.1.el8_5.x86_64

手順

ELRepoを利用してインストールを行うので、GPGキーをインポートする。

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

ELRepoリポジトリを追加する。

# dnf install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm

kernel-ltの中身を確認する。ltはLTSの略。

名前         : kernel-lt
バージョン   : 5.4.189
リリース     : 1.el8.elrepo
Arch         : x86_64
サイズ       : 70 k
ソース       : kernel-lt-5.4.189-1.el8.elrepo.src.rpm
リポジトリー : elrepo-kernel
概要         : The Linux kernel. (The core of any Linux-based operating system.)
URL          : https://www.kernel.org/
ライセンス   : GPLv2
説明         : The kernel-lt meta package.

kernel-ltをインストールする。

# dnf --enablerepo=elrepo-kernel install kernel-lt kernel-lt-devel kernel-lt-headers

再起動してブート時に新しくインストールしたカーネルを選択する。

# reboot

AlmaLinux8.5にリモートデスクトップで接続する

EPELリポジトリを追加する。

# dnf install epel-release

xrdpをインストールする。

# dnf install xrdp

ファイアウォールに例外を追加する。

# firewall-cmd --permanent --add-service=rdp
# firewall-cmd --reload

サービスを有効化して起動する。

# systemctl enable xrdp
# systemctl start xrdp

PostgreSQLストリーミングレプリケーション設定(AlmaLinux8)

OS規定のversion:10を使用。

2台構成

host:sv1 ip:192.168.0.100 略称:プライマリ
host:sv2 ip:192.168.0.101 略称:セカンダリ

プライマリとセカンダリの共通設定

インストールする。

# dnf install postgresql-server postgresql-devel postgresql-contrib

ファイアウォールに例外を追加する。

# firewall-cmd --add-service=postgresql --permanent
# firewall-cmd --reload

データベースを初期化してデータベースクラスタを作成する。

# postgresql-setup initdb

サービスを有効化する。

# systemctl enable postgresql

プライマリの設定

サービスを起動する。

# systemctl start postgresql

レプリケーション用ユーザーを作成する。

# su postgres
$ psql
=# CREATE USER replication_user REPLICATION PASSWORD 'password';
=# \q

外部からの通信を許可。最下部に下記を追記する。

host    replication    replication_user    192.168.0.0/24    md5

postgresql.confを編集して下記8行を変更する。
※synchronous_commitはシステム要件によって変更した方が良い

listen_addresses = '*'
wal_level = hot_standby
fsync = on
synchronous_commit = off
wal_sync_method = fsync
max_wal_senders = 2  ※プライマリを含んだレプリケーションサーバーの数を入れる
wal_keep_segments = 32  ※8~32が目安らしい
synchronous_standby_names = '*'

ついでに下記設定値がシステム要件に合っているか確認する。

max_connections = 300  ※同時接続数
shared_buffers = 1024MB  ※物理メモリの1/4程度
work_mem = 8MB  ※物理メモリの1/500程度だが最大8MB
effective_cache_size = 2048MB  ※物理メモリの1/2程度

サービスを再起動する。

# systemctl restart postgresql

セカンダリの設定

postgresqlサービスが停止した状態でdataを空にする。

# rm -r -f /var/lib/pgsql/data/*

先程作成したレプリケーション用ユーザーを使用してプライマリからデータをコピーする。
※-Rオプションはrecovery.confを自動作成する指定
※-Pオプションは進捗を表示する指定

# su postgres
$ pg_basebackup -R -h 192.168.0.100 -p 5432 -U replication_user -D /var/lib/pgsql/data/ -P

/var/lib/pgsql/data/内のすべてのファイルの所有者/所有グループがpostgresになっているか確認する。

ll /var/lib/pgsql/data/

/var/lib/pgsql/data/postgresql.confを編集して設定を変更する。

hot_standby = on

postgresqlサービスを起動する。

# systemctl start postgresql

プライマリサーバーで下記SQLを実行するとレプリケーションされているか確認できる。

SELECT * FROM pg_stat_replication;

フェイルオーバーする際はセカンダリで下記コマンドを実行する。

# su postgres
$ pg_ctl promote -D /var/lib/pgsql/data/