MIRACLE Linux install memo

2023/02/22版

研究室のLinuxサーバー群をインストールする際の備忘録として立ち上げたこのページだが,今回が第9版となる.前回は2022年4月,Vine LinuxサーバーをMIRACLE Linux 8.4に換装した経過を報告した.今回のメモはそのアップデート版.2023年2月現在の最新,8.6を使ってテスト環境を構築したところ,Samba導入の手順がずっと楽になったので,それ以外の手順も確認しつつメモを改訂する.

というわけで,これは,これからAT コンパチブルのデスクトップ機にMIRACLE Linux8.6をインストールしてサーバーを構築する人達に少しでも役立てればと思い,実際に成功した手順を記したものである. マシン構成はごく一般的な,Windows 10が動く程度のスペックだ.

1. インストールディスクの入手
2. インストール作業
3. 最初に行う作業
4. SSH接続を制限
5. パッケージのアップデートとリポジトリ追加
6. リモートデスクトップでWindowsからリモートアクセス
7. Webminのインストール
8. OpenVPNによる仮想hub設置
9. SambaによるActive Directory構築
10. DHCPとNATの設定
11. Webサーバー(Apache2)の設定
12. メールサーバーの設定
13. メーリングリストサーバーMailmanのインストール
14. swatchによるログ監視
15. pflogsummによるメールサーバー監視

改訂履歴


追記1:LVMシステムディスクの修復とディスク交換


以下の記述では,ホスト名およびIPアドレスを以下の通りとする.

ホスト名alpha4
IPアドレス150.7.xx.xx
FQDNalpha4.u-tokai.ac.jp
外部DNS(東海大学)150.7.3.5
sshで接続するPCのIPアドレス150.7.AA.AA


1. インストールディスクの入手
MIRACLE Linuxのサイトでインストールディスクのイメージを配布している.無償のOSにもかかわらず,企業ユーザーから早くも信頼を得ているらしい.関係者に感謝しつつダウンロード.USBメモリーにブータブルでコピー.ダウンロードからインストールまでは,ここで説明するよりは丁寧な解説サイトに解説を譲る.

今回,まな板に載ったのは自作PCで,M/BはASUS P8Z68-V LE.ついこの前までデスクトップ機として現役だった.CPUはCore i5の第2世代,メモリだけは潤沢に16GB積んでいる.オンボードEthernetに加え,外付けのPCI Ethernetカードを刺した.スペック的にはWindows 10がギリギリ快適に使えるレベル.


2. インストール作業
現代においては,Linuxインストールの障害は,USBフラッシュメモリからの起動かもしれない.これは機種依存なのでここでは説明しない.無事にインストーラーが起動したら,あとはオプションパッケージを選び, パーティション作成も全部お任せでインストール.インストール時にはオンボードのEthernetのほか,Buffalo LCI-G1000T32を予め刺しておいたが難なく認識. インストールオプションは以下の通り.
  • サーバー(GUI)を選択.
  • アドオンパッケージは選択しない.その都度,必要に応じて導入.
  • ネットワーク設定は,あらかじめ与えられた学内のグローバルipアドレスを手動入力.
  • 一般ユーザーendoを管理者アカウントとして作成.
  • ネットワーク設定でホスト名を"alpha4"に設定.
という選択でインストールした.あとは待つだけ.15分ほどでインストール終了.※最新型ならたぶん数分.


3. 最初に行う作業
(1)ホスト名確認
最初にホスト名を変更.後から変えるとSambaのDCが動かなくなる.

# vi /etc/hostname

alpha4


(2)NICの動作確認

ユーザendoでログイン.セットアップで,NICの自動接続を有効にしておかないと,起動直後にネットが使えない.「設定」→「ネットワーク」から,グローバル側のNICをonにして,起動時に自動で有効になるようにセット.

ネットワークに接続できることを確認.

(3)SELinux解除
参考にしたサイト:SELinuxの無効化 - Qiita
Red Hat系Linuxで最近導入されたSELinuxは何かと評判がよろしくない.「解除する」というページが数多く見つかるのもその証拠.無効化する.

/etc/selinux/configを編集.
# vi /etc/selinux/config

SELINUX=disabled


サーバーを再起動して完了.
# shutdown -r now


確認作業.
# getenforce
Disabled



4. SSH接続を制限
参考にしたサイト:SSHのIP制限【CentOS 8】 - sanosoft @ ウィキ - atwiki(アットウィキ)
 ここからの作業は基本ネットワーク越しにSSHで行う.安全のため,接続可能なIPアクセスを制限しよう.

Firewallのssh接続に対する接続許可を特定のアドレスからのみに制限する方法.2行めで,元々許可されていたssh接続を不許可にする.
# firewall-cmd --add-rich-rule="rule family="ipv4" source address="150.7.AA.AA" service name="ssh" accept" --zone=public --permanent
# firewall-cmd --remove-service=ssh --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


許可されていない端末からssh接続を試み,拒否されることを確認.


5. パッケージのアップデートとリポジトリ追加
インストールディスクからインストールした状態ではパッケージは最新版ではない.セキュリティ強化のためアップデートしておきましょう.

コンソールからスーパーユーザーになって,アップデート→再起動.
# dnf update -y
# shutdown -r now


カーネルのバージョンを確認.
# uname -r


カーネル更新の履歴を知りたければ
# rpm -q kernel

とタイプ.

MIRACLE LinuxはCentOS互換を謳っているが,そのままではCentOSの解説ページのとおりに操作しても上手くいかないことがある.例えば,パッケージ管理についてはCentOSでよく使われるEPELが 標準では有効になっていない.これからの設定で出てくるので有効にしておく.
# dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf -y update miraclelinux-repos
# dnf -y config-manager --set-enabled 8-latest-PowerTools
# dnf -y module enable javapackages-tools:201801
# dnf -y config-manager --set-enabled 8-latest-HighAvailability

参考にしたサイト:MIRACLE LINUX 8.4 でいろんなリポジトリを使ってみよう|BLOG|サイバートラスト


6. リモートデスクトップでWindowsからリモートアクセス
参考にしたサイト:AlmaLinux windowsからリモート接続できるように「xrdp」をインストールする | mebee

以前は大変苦労したこのステップだが,RHEL互換のMIRACLE Linuxなら楽勝.解説ページはAlmaLinuxのものだが,完全互換.

インストール.
# dnf -y install xrdp tigervnc-server


自動起動の設定.
# systemctl enable xrdp
# systemctl start xrdp


Firewallに穴を開ける.
# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


これで,WindowsからサーバーのIPアドレスを直接叩くと,ログイン画面が現れる.


xrdpに対する接続許可を特定のアドレスからのみに制限する方法.2行めで,元々許可されていたssh接続を不許可にする.
# firewall-cmd --add-rich-rule="rule family="ipv4" source address="150.7.AA.AA" port port="3389" protocol="tcp" accept" --permanent --zone=public
# firewall-cmd --remove-port=3389/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public

許可されていない端末からリモートデスクトップ接続を試み,拒否されることを確認.


7. Webminのインストール
参考にしたサイト:Server World - ネットワーク・サーバー構築

Webminとは,サーバーの設定のほとんどをブラウザーから行うことができるツールである.設定は簡単.パッケージからインストール可能.

インストール.
# dnf -y install http://download.webmin.com/download/yum/webmin-2.013-1.noarch.rpm


miniserv.confを編集,最終行にアクセスを許可するIPアドレスを列挙.
# vi /etc/webmin/miniserv.conf

allow=127.0.0.1 150.7.AA.AA 


Firewallに穴を開ける.
# firewall-cmd --add-port=10000/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


miniserv.confをセーブしたら,webminをリスタート.
# /etc/webmin/restart


ローカルからWebブラウザを起動,アクセステスト.アドレスバーに「https://127.0.0.1:10000/」と入力する.Webminnの画面が出たら成功!

次は,アクセスを許すIPアドレスから,https://150.7.xx.xx:10000でアクセステスト.これで,ログインダイアログが出たら成功.

[Webmin]→[Webmin Configuration]のペーンに入り,[Language and Locale]アイコンをクリック.言語を「日本語」に変更.以降は,Webmin関連の設定は日本語ダイアログを前提とする.

RPMインストールだとWebminが自動起動するよう設定されるので,systemctlの設定は不要.


8. OpenVPNによる仮想hub設置
参考にしたサイト:CentOS8でOpenVPN - Qiita

OpenVPNでVPN環境を作る.

(1)OpenVPNのインストール
# dnf -y install openvpn easy-rsa

たったこれだけ.

(2)easy-rsaでサーバ証明書やクライアント証明書を作成

認証局を初期化
# cd /usr/share/easy-rsa/3/
# ./easyrsa init-pki


認証局を作成
# ./easyrsa build-ca
Enter New CA Key Passphrase: 任意のパスワード
Re-Enter New CA Key Passphrase: 任意のパスワード
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: [ENTER]


DHパラメータを生成
# ./easyrsa gen-dh


サーバ秘密鍵の作成から証明書の署名まで
# ./easyrsa build-server-full server nopass
Enter pass phrase for /usr/share/easy-rsa/3/pki/private/ca.key: 認証局の作成の時に設定したパスワードを入力


TLS秘密鍵の生成
# cd /etc/openvpn/server
# openvpn --genkey --secret ta.key 


(3)サーバー設定ファイルのserver.confの編集
ひながたはgithubから.変更した行のみ抜粋.
※ここで,他のサーバーから設定をコピーするときは注意.存在しないディレクトリが指定されているとOpenVPNが起動しない.
# listen on? (optional)
local 150.7.xx.xx

# the firewall for the TUN/TAP interface.
dev tap
;dev tun

# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca /usr/share/easy-rsa/3/pki/ca.crt
cert /usr/share/easy-rsa/3/pki/issued/server.crt
key /usr/share/easy-rsa/3/pki/private/server.key

# Diffie hellman parameters.
# Generate your own with:
# openssl dhparam -out dh2048.pem 2048
dh /usr/share/easy-rsa/3/pki/dh.pem

server 10.8.0.0 255.255.255.0  ←仮想NICのIPアドレス.お好みで.

# Maintain a record of client <-> virtual IP address
# associations in this file. If OpenVPN goes down or
# is restarted, reconnecting clients can be assigned
# the same virtual IP address from the pool that was
# previously assigned.
ifconfig-pool-persist /etc/openvpn/server/ipp.txt

# will also need to appropriately firewall the
# server's TUN/TAP interface.
client-to-client


# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
ncp-ciphers AES-256-GCM:AES-128-GCM:AES-128-CBC

# Enable compression on the VPN link and push the
# option to the client (v2.4+ only, for earlier
# versions see below)
compress lz4-v2
push "compress lz4-v2"

tcp/udpはudpを選択する.※UDP接続のほうが断然パフォーマンスが高い.

dev tapの選択はtunでも構わないのだが,tapを選択しておくとipアドレスの選択が割合自由になる.dev tunを選択するとクライアントのipアドレス選択に制限が生じるので注意.詳しくはこちらを参照のこと.なお実測したがパフォーマンスは変わらなかった.

できたserver.confを/etc/openvpn/serverに置く.

(4)サービス起動

早速,起動してみましょう.
# systemctl enable openvpn-server@server
# systemctl start openvpn-server@server


(5)ファイヤーウォールに穴を開ける
# firewall-cmd --add-service=openvpn --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


(6)クライアント証明書,秘密鍵の作成(パスフレーズ認証なし)
要領はサーバー秘密鍵と同じ.キー名はクライアントPCの名前にすると良いでしょう.ここではclient0とする.途中パスフレーズを聞かれるが,これはCA秘密鍵を作ったときのものを使う. パラメータnopassをつけることによってVPN接続時にパスワードを聞かれなくなる.
# cd /usr/share/easy-rsa/3/
# ./easyrsa build-client-full client0 nopass
Enter pass phrase for /usr/share/easy-rsa/3/pki/private/ca.key: 認証局の作成の時に設定したパスワードを入力


出来た鍵
/usr/share/easy-rsa/3/pki/ca.crt
/usr/share/easy-rsa/3/pki/issued/client0.crt
/usr/share/easy-rsa/3/pki/private/client0.key
/etc/openvpn/server/ta.key
をクライアントPCへコピーする.

(7)クライアントPCへのOpenVPNインストール
ダウンロードサイトから,Windows版のインストールファイルをダウンロード,インストールする.オプションは全てデフォルトでオッケー.インストールが完了すると新しいLANカードがインストールされ,ネットワークに繋がっていないことを示すアイコンがタスクトレイに現れる.

(8)クライアント設定ファイルの編集
C:\Program Files\OpenVPN\sample-configに「client.ovpn」というサンプルファイルがある.これをC:\Program Files\OpenVPN\config-autoフォルダにコピー,編集.赤字のところがデフォルトの設定ファイルからの変更点.ほとんど変更無しでオッケー.
# the firewall for the TUN/TAP interface.
dev tap
;dev tun

# to load balance between the servers.
remote 150.7.xx.xx

# file can be used for all clients.
ca ca.crt
cert client0.crt
key client0.key

# See also the data-ciphers option in the manpage
cipher AES-256-GCM

「remote」エントリは当然VPNサーバーのIPアドレス.キーファイル,証明書ファイル名はサーバーで作成したものに変更する.

(9)クライアント起動テスト
サーバーから持ってきたca.crt,client0.crt,client0.key,ta.keyをC:\Program Files\OpenVPN\config-autoにコピー.正常にインストールされてれば,サービスに登録されているから,Windowsを再起動するとVPNサーバーへの接続が完了している.上手くいかないときはC:\Program Files\OpenVPN\logディレクトリのログを確認しましょう.

Windowsのコマンドプロンプト(DOS窓)で「ping 10.8.0.1」と打ってみよう.返事が返ってきたら,それはVPNサーバーに接続が完了している証拠.

あとは,(7)~(10)の手続きをくり返せば,幾らでもクライアントをつなぎ込んで行くことが出来る
(鍵はクライアントごとにユニークな名前で作成すること).そして,クライアント同士は「ping クライアント名」でpingが通るようになっている.

これで終了.お疲れ様.

(10)追記1:クライアントのIPアドレス制御
上記設定ではipアドレスはサーバーが自動的に付与することになっているが,このipを任意に指定する技がある.サーバーの/etc/openvpn/server/の下に ccdというディレクトリを作り,クライアント名のファイルを以下の内容で置く.10.8.0.xxxは仮想hubのサブネット.今までの設定なら,ファイル名はclient0となる.
ifconfig-push 10.8.0.xxx 255.255.255.0


続いて,server.confの以下の行をアンコメント.
# EXAMPLE: Suppose you want to give
# Thelonious a fixed VPN IP address of 10.9.0.1.
# First uncomment out these lines:
client-config-dir ccd


openvpnを再起動.
# systemctl restart openvpn-server@server


(11)追記2:Linuxマシンが他のOpenVPNのクライアントになる方法
設定ファイルはPCと同じ.ファイル名をclient.confとして,キーファイル等々と一緒に/etc/openvpn/clientに置く.

daemon起動は以下のコマンド.
#systemctl start openvpn-client@client



9. SambaによるActive Directory構築
参考にしたサイト:Samba 4.13.xでActive Directoryを1から立てる(SELinux設定無視版)
WindowsのActive Directory(AD)とは,ドメインコントローラー(DC)がWindowsユーザーの情報を一元管理するシステムである.非常に大きな規模のADは私の手にあまるので,最も簡単な形態について説明すると,システムは1台のDCと複数台のWindows10 Professional端末からなる.ユーザーは,どの端末でも,同じユーザー名とパスワードでログインができ,ログイン後のデスクトップはどの端末でも同じになるというものだ.この仕組みを実現するため,DCは各ユーザーのログイン情報のほか,デスクトップや「ユーザー」下フォルダの情報を持っていて,ログイン毎に最新版がWindowsクライアントにコピーされ,ログオフ毎に書き戻される.

正統なADはWindows Serverを用いて構築するが,値段が高い.ところが,ほぼ同等の機能をLinuxとSambaで実現する仕組みが提供されている. 我が研究室では2005年ころからLinux+SambaでADを構築,運用しているが,サーバー設定で最もややこしいのがこのステップだ.
※正確に言えば,Samba3はNTドメインで,Samba4からはWindows互換のADを構築.

我が研究室の独特な使用条件から,以下のようなドメインを構築している.
  • ファイルサーバーはLinuxのSamba上でなく,ファイルサーバー(Windows10 Pro.)上に置く.従って,Sambaサーバーにはファイルサーバー機能は求めない. ただし,各ユーザー専用の「Zドライブ」を提供.
  • 全てのクライアントにおいて,全てのユーザーがAsministrator相当の権限を持ちうる.研究室という特殊な環境なので勘弁してほしい.

(1)Sambaの動作に必要なパッケージを予めインストール

参考にしたサイト:Package Dependencies Required to Build Samba
以下のコマンドラインを実行すれば自動的に必要なパッケージがインストールされる.ただし,あらかじめ必要なリポジトリが適用されていること.
参考:5. パッケージのアップデートとリポジトリ追加
# yum install docbook-style-xsl gcc gdb gnutls-devel gpgme-devel jansson-devel \
      keyutils-libs-devel krb5-workstation libacl-devel libaio-devel \
      libarchive-devel libattr-devel libblkid-devel libtasn1 libtasn1-tools \
      libxml2-devel libxslt lmdb-devel openldap-devel pam-devel perl \
      perl-ExtUtils-MakeMaker perl-Parse-Yapp popt-devel python3-cryptography \
      python3-dns python3-gpg python36-devel readline-devel rpcgen systemd-devel \
      tar zlib-devel


上記だけでは足りない.以下を追加でインストール.
# dnf -y install flex bison dbus-devel python3-markdown


さらに,PerlのJSONモジュールをインストールする必要がある.
# cpan JSON
Loading internal null logger. Install Log::Log4perl for logging messages

CPAN.pm requires configuration, but most of it can be done automatically.
If you answer 'no' below, you will enter an interactive dialog for each
configuration option instead.

Would you like to configure as much as possible automatically? [yes] y
CPAN: HTTP::Tiny loaded ok (v0.074)

膨大なメッセージ...

Appending installation info to /usr/lib64/perl5/perllocal.pod
  MLEHMANN/JSON-XS-4.03.tar.gz
  /usr/bin/make install  -- OK


(2)Samba4のダウンロード,インストール
# wget https://download.samba.org/pub/samba/samba-latest.tar.gz
# tar xfz samba-latest.tar.gz
# ls   <- Sambaのバージョンを確認する
# cd samba-4.17.5
# ./configure
# make
# make install


(3)起動前の下準備
ファイアーウォールに穴を開ける.
# firewall-cmd --permanent --zone=public --add-service=samba
# firewall-cmd --permanent --zone=public --add-service=samba-dc
# firewall-cmd --permanent --zone=public --add-service=ntp
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


/etc/hostsの修正.赤字の行を追加.
# vi /etc/hosts
127.0.0.1       localhost. localdomain localhost
150.7.xx.xx     endolab endolab.local


Sambaに(一時的に)パスを通す.
# export PATH="/usr/local/samba/bin:/usr/local/samba/sbin:${PATH}" 


インストールの確認.
# samba -V
Version 4.17.5


(4)ADのセットアップ

ドメイン「endolab.local」を作成.
# samba-tool domain provision --use-rfc2307 --interactive
Realm [LOCALDOMAIN]: endolab.local
Domain [endolab]:[Enter]
Server Role (dc, member, standalone) [dc]:[Enter]
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:BIND9_DLZ
Administrator password:パスワード入力.記号を含む8文字以上でないと跳ねられる
Retype password:パスワード入力.
INFO 2022-03-23 12:26:09,414 pid:37640...
        ・
        ・


smb.confの生成を確認する.
# cat /usr/local/samba/etc/smb.conf

# Global parameters
[global]
        dns forwarder = 150.7.3.5
        netbios name = ALPHA3
realm = ENDOLAB.LOCAL
        ・
        ・ 


移動ユーザープロファイルを有効にするため,以下のエントリーを追加する.
参考にしたサイト:Windowsの移動ユーザープロファイル - 雑廉堂Wiki
※ここで,他のサーバーから設定をコピーするときは注意.存在しないディレクトリが指定されていると後ろのテストで躓く.
# vi /usr/local/samba/etc/smb.conf

[Profiles]
	path = /home/samba/profiles
	browseable = no
	read only = No
	force create mode = 0600
	force directory mode = 0700
	csc policy = disable
	store dos attributes = yes
	vfs objects = acl_xattr


resolv.confを変更,自身がDNSになるようにする.
# vi /etc/resolv.conf

search endolab.local
nameserver 150.7.xx.xx  <- 自身の外向きアドレス


NetworkServiceが,起動時にresolv.confを書き換える.結構有名な問題.抑制方法がRedHatのサイトにあった.
参考にしたサイト:第34章 /etc/resolv.conf ファイルの手動設定 Red Hat Enterprise Linux 8 | Red Hat Customer Portal

/etc/NetworkManager/conf.d/90-dns-none.confという名前のファイルを作り,以下の内容を記述.
# vi /etc/NetworkManager/conf.d/90-dns-none.conf 

[main]
dns=none 


ネットワーク再起動
# systemctl restart NetworkManager

resolv.confが書き換わっていないことを確認,終了.

(5)/etc/krb5.confの書き換え
ステップ(4)で/usr/local/samba/private/krb5.confが生成される.これを/etc/に上書きでコピー.
# cp /usr/local/samba/private/krb5.conf /etc/krb5.conf
cp: '/etc/krb5.conf' を上書きしますか? y


確認
# cat /etc/krb5.conf 
[libdefaults]
        default_realm = ENDOLAB.LOCAL
        dns_lookup_realm = false
        dns_lookup_kdc = true

[realms]
        ・
        ・
        ・


(6)Samba起動,動作確認

起動前に,ポート53が使われていないことを確認する.
# netstat -tulpn | grep ":53"
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      2911/dnsmasq
udp        0      0 192.168.122.1:53        0.0.0.0:*                           2911/dnsmasq
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           1225/avahi-daemon:
udp6       0      0 :::5353                 :::*                                1225/avahi-daemon:


dnsmasqが53番ポートを掴んでいる.この先の作業の邪魔になるので殺す.
参考にしたサイト:Sambaが同じポートを使用中で起動しない場合 -Port53 - Qiita
# kill 2911


dnsmasqはDNSサーバーだが,単純にsystemctlで起動不可にしてもダメ.コイツは,仮想ネットワークスイッチから呼ばれている.libvirtdのサービスの自動起動を削除.
参考にしたサイト:CentOS7でifconfigで表示されるvirbr0(libvirtd)を無効にする手順 - ITよろづや
# systemctl stop libvirtd.service
# systemctl disable libvirtd.service

※全部入りにするんじゃなかった.

起動する.
# samba
# ps -ef|grep samba
root 5433 1 0 09:58 ? 00:00:00 /usr/local/samba/sbin/samba
root 5434 5433 0 09:58 ? 00:00:00 /usr/local/samba/sbin/samba
root 5435 5434 0 09:58 ? 00:00:00 /usr/local/samba/sbin/samba
root 5436 5433 0 09:58 ? 00:00:00 /usr/local/samba/sbin/samba
root 5437 5435 0 09:58 ? 00:00:00 /usr/local/samba/sbin/samba
root 5438 5436 0 09:58 ? 00:00:00 /usr/local/samba/sbin/samba
        ・
        ・

# smbclient --version
Version 4.17.5

# smbclient -L localhost -U%

        Sharename       Type      Comment
        ---------       ----      -------
        sysvol          Disk
        netlogon        Disk
        IPC$            IPC       IPC Service (Samba 4.17.5)
SMB1 disabled -- no workgroup available


# smbclient //localhost/netlogon -UAdministrator -c 'ls'
Enter ENDOLAB\Administrator's password:Administratorのパスワード
  .                                   D        0  Wed Apr  6 12:34:51 2022
  ..                                  D        0  Wed Apr  6 12:34:58 2022

                71724152 blocks of size 1024. 58627792 blocks available


(7)AD DNSのテスト

# /usr/local/samba/bin/samba-tool dns zonelist localhost -UAdministrator
Password for [ENDOLAB\Administrator]:Administratorのパスワード
  2 zone(s) found

  pszZoneName                 : endolab.local
  Flags                       : DNS_RPC_ZONE_DSINTEGRATED DNS_RPC_ZONE_UPDATE_SECURE
  ZoneType                    : DNS_ZONE_TYPE_PRIMARY
  Version                     : 50
  dwDpFlags                   : DNS_DP_AUTOCREATED DNS_DP_DOMAIN_DEFAULT DNS_DP_ENLISTED
  pszDpFqdn                   : DomainDnsZones.endolab.local

  pszZoneName                 : _msdcs.endolab.local
  Flags                       : DNS_RPC_ZONE_DSINTEGRATED DNS_RPC_ZONE_UPDATE_SECURE
  ZoneType                    : DNS_ZONE_TYPE_PRIMARY
  Version                     : 50
  dwDpFlags                   : DNS_DP_AUTOCREATED DNS_DP_FOREST_DEFAULT DNS_DP_ENLISTED
  pszDpFqdn                   : ForestDnsZones.endolab.local
[root@alpha4 ~]#


# host -t SRV _ldap._tcp.endolab.local 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

_ldap._tcp.endolab.local has SRV record 0 100 389 alpha4.endolab.local.

# host -t SRV _kerberos._udp.endolab.local 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

_kerberos._udp.endolab.local has SRV record 0 100 88 alpha4.endolab.local.

# host -t A adserver.endolab.local 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

Host adserver.endolab.local not found: 3(NXDOMAIN)


(8)Kerberosの動作確認

# kinit [email protected]
Password for [email protected]: Administratorのパスワード
Warning: Your password will expire in 41 days on ・・・・


ここで,「kinit: Cannot find KDC for realm "ENDOLAB.LOCAL" while getting initial credentials」というエラーが出たら,krb5dkcが正しくアドレスを引けていない. ここまでの作業で何かが間違っている.

(9)フォレストとドメインの機能レベル確認
# samba-tool domain level show
Domain and forest function level for domain 'DC=endolab,DC=local'

Forest function level: (Windows) 2008 R2
Domain function level: (Windows) 2008 R2
Lowest function level of a DC: (Windows) 2008 R2


(10)パスワードポリシーの変更
パスワードの条件設定を解除.デフォルトだと,「英数字記号必須8文字以上」だが,ユーザーによっては,全ての文字の組み合わせを嫌う人もいる.
# samba-tool domain passwordsettings set --complexity=off


最小パスワード長を6に変更(お好みで).
# samba-tool domain passwordsettings set --min-pwd-length=6


パスワード変更禁止期間を0に変更.
# samba-tool domain passwordsettings set --min-pwd-age=0


パスワード履歴保持を0に変更(同じパスワードに変更可能となる).
# samba-tool domain passwordsettings set --history-length=0


パスワード有効期限を無期限に変更.
# samba-tool domain passwordsettings set --max-pwd-age=0


パスワードロックの試行回数を5に変更.
# samba-tool domain passwordsettings set --account-lockout-threshold=5


パスワードロック期間を60分に変更.
# samba-tool domain passwordsettings set --account-lockout-duration=60


パスワード試行回数が0になるまでの時間を5分に変更
# samba-tool domain passwordsettings set --reset-account-lockout-after=5


(11)sambaサービス自動起動設定
参考にしたサイト: Managing the Samba AD DC Service Using Systemd - SambaWiki

systemd service fileは/root/samba-4.17.5/bin/default/packaging/systemd/にsamba.serviceの名前で作られている./etc/systemd/systemにコピー,自動実行される様にセット.
# cp /root/samba-4.17.5/bin/default/packaging/systemd/samba.service /etc/systemd/system
# systemctl enable samba


コピーされたファイルは,そのままでは起動できなかった.以下のように変更する.
# vi /etc/systemd/system/samba.service

[Unit]
Description=Samba AD Daemon
Documentation=man:samba(8) man:samba(7) man:smb.conf(5)
Wants=network-online.target
After=network.target network-online.target

[Service]
Type=forking
PIDFile=/usr/local/samba/var/run/samba.pid
LimitNOFILE=16384
EnvironmentFile=-/usr/local/samba/etc/sysconfig/samba
ExecStart=/usr/local/samba/sbin/samba -D
ExecReload=/bin/kill -HUP $MAINPID


[Install]
WantedBy=multi-user.target



Sambaが自動実行されるかチェック.
# systemctl daemon-reload
# systemctl enable samba
# shutdown -r now

・・・再起動・・・ →ログオン

# systemctl status samba
● samba.service - Samba AD Daemon
Loaded: loaded (/etc/systemd/system/samba.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-03-23 22:11:50 JST; 5min ago
Docs: man:samba(8)
man:samba(7)
man:smb.conf(5)
Process: 1715 ExecStart=/usr/local/samba/sbin/samba -D (code=exited, status=0/SUCCESS)
Main PID: 1909 (samba)
        ・
        ・

statusが「active (running)」なら成功.

(12)ADユーザーの管理
はじめに,AD構築に必要なディレクトリを作る.グループadminsを作り,ADユーザーはadminsのメンバーとして登録.
# mkdir -m 1777 /home/samba
# mkdir -m 1777 /home/samba/profiles
# mkdir -m 1777 /home/samba/netlogon
# groupadd admins


既存のLinuxユーザーをSamba共有でサーバーにアクセスできるようにする.例えば,新たなSambaユーザーapacheをuid48のLinuxユーザーと同期して作成.
# samba-tool user create apache --uid-number=48


新たなLinuxユーザーを作成,AD管理下のクライアントマシンにログインできるようにする.

ユーザー名      yamada
仮パスワード   
password

useradd yamada -g admins -p password -s /bin/false
chmod 1777 /home/yamada
/usr/local/samba/bin/samba-tool user create yamada password 
/usr/local/samba/bin/samba-tool group addmembers "Domain Admins" yamada
/usr/local/samba/bin/pdbedit -u yamada -S "netlogon.js"
/usr/local/samba/bin/pdbedit -u yamada -p "\\\\alpha4\\profiles\\yamada" -h "\\\\alpha4\\yamada" -D "Z:"


Sambaユーザーのリストを表示
# samba-tool user list


特定のグループのメンバーをj表示
# samba-tool group listmembers "Domain Admins" 
# samba-tool group listmembers "Domain Users"


Sambaユーザーの削除
# samba-tool user delete yamashita


Sambaユーザーの詳細情報を表示
# pdbedit -u yamashita -v


(13)Windows10マシンをADへ登録
ここからは,Windows 10 Professioalのクライアントマシンでの作業.まずは,「設定」→「ネットワークとインターネット」→「アダプターのオプションを変更する」とクリックして, クライアントマシンのLANカードのIPv4の設定画面を出す.DNSサーバーを,ADサーバーに変更.


続いて,「設定」→「アカウント」→「職場または学校にアクセスする」と辿り,以下の画面に到達.


「接続」をクリックすると,「職場または学校アカウントのセットアップ」が出る.下の「このデバイスをローカルのActive Directoryドメインに参加させる」をクリックすると,以下のダイアログが出る.


ドメイン名は「endolab.local」.入力すると,Administratorのパスワードを訊かれる.間違えずに入力.次に,「アカウントを追加する」ダイアログが出るが,これはスキップしても大丈夫.


再起動を促されるので,クリックして再起動.以上でマシンの登録は完了.以降はSamaに登録されたユーザ名/パスワードでログイン可能となる.

(14)ログオンスクリプトの有効化
ログオンスクリプトを置こう.スクリプトの場所はデフォルトでは/usr/local/samba/var/locks/sysvol/[ドメイン名]/scripts.場所は,smb.confで自由に変えることができる. 私は趣味で/home/samba/netlogonを指定している.ここにnetlogon.jsを置く.

各ログオンユーザー登録時に
# pdbedit -u [ユーザ名] -S netlogon.js

と入力すれば,サインイン時にnetlogon.jsを実行してくれる.

備忘録:ログオンスクリプトが動かず苦労した.解決に至るまでの道筋.
hostnameがlogalhost.localdomainのままだと,クライアントがnetlogonの場所を見つけられないことを発見.Windowsのイベントビューワーで見た.
smb.confのhostnameを変えると,DCに接続できなくなる.
hostnameも変え,DC登録をやり直したが,endolab.localに接続できなくなった.
仕方ないのでdomain provisionからやり直す.
参考にしたサイト:Samba4 ADDC/HowToメモ@cbreeze
デフォルトでは,ログオンスクリプトが5分間実行されないことを発見.対処.→グリープポリシーエディタ
参考にしたサイト:ログオンスクリプトは 5 分間実行されません - Windows Client | Microsoft Docs

(15)時刻同期の設定
ADにぶら下がっているWindows PCは,システム時刻をADサーバーからもらって同期する.ところが,初期設定のままでは同期がうまくいかず,時刻がどんどんずれていく.しかも,Windows PCの「日付と時刻の調整」からは手動設定ができないようにロックされている.これではまずいので,ADから時刻をもらえるよう設定する.

まずはchronyの設定.
# vi /etc/chrony.conf

# MIRACLE LINUX default NTP servers
pool ntp.miraclelinux.net iburst
        ・
        ・
        ・
# Allow NTP client access from local network.
allow 150.7.xx.xx/16
ntpsigndsocket  /usr/local/samba/var/lib/ntp_signd




# mkdir -p /usr/local/samba/var/lib/ntp_signd
# chown root:chrony /usr/local/samba/var/lib/ntp_signd
# chmod 750 /usr/local/samba/var/lib/ntp_signd
# systemctl restart chronyd


動作確認.
# chronyc sources

S Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ ntp-a3.nict.go.jp             1   6   377    51  -6536ns[-6536ns] +/- 2143us
^* ntp-b2.nict.go.jp             1   7   377   118   +151us[ +129us] +/- 2030us
^+ ntp-a2.nict.go.jp             1   7   377   116    -13us[  -13us] +/- 2155us
^- ntp-k1.nict.jp                1   7   377    46   +115us[ +115us] +/- 6474us


smb.confを編集.
# vi /usr/local/samba/etc/smb.conf
# Global parameters
[global]
	dns forwarder = 150.7.3.5
	netbios name = ALPHA4
	realm = ENDOLAB.LOCAL
	server role = active directory domain controller
	workgroup = ENDOLAB
	idmap_ldb:use rfc2307 = yes
	server services = s3fs, rpc, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate, dns


Samba ADを再起動.
# systemctl restart samba


続いて,ADで接続,サインインしたクライアントPCから時刻同期ができているかをチェックする.スタートメニューを右クリック,[Windows Powershell(管理者)]を起動.まずは,ADサーバーから時刻がもらえるかチェック.
PS C:\WINDOWS\system32> w32tm /monitor /computers:150.7.xx.xx

150.7.xx.xx[150.7.xx.xx:123]:
    ICMP: 0ms 遅延
    NTP: -0.0005915s ローカル コンピューターの時刻からのオフセット
        RefID: ntp-b2.nict.go.jp [133.243.238.163]
        階層: 2

警告:
逆名前解決が最適な方法です。タイム パケット内の
RefID フィールドは NTP 実装間で異なっており、IP
アドレスを使用していない場合があるため、名前が正しくない可能性があります。


上の様に外部ntpからの時刻がもらえていれば設定完了.時刻同期が行われていることを以下のコマンドで確認する.
PS C:\WINDOWS\system32> w32tm /query /status

閏インジケーター: 0 (警告なし)
階層: 3 (二次参照 - (S)NTP で同期)
精度: -23 (ティックごとに 119.209ns)
ルート遅延: 0.0050387s
ルート分散: 1.7721819s
参照 ID: 0x96071A3A (ソース IP:  150.7.xx.xx)
最終正常同期時刻: 2024/03/27 14:40:55
ソース: alpha4.endolab.local
ポーリング間隔: 10 (1024s)


参考にしたサイト:Samba(Active Directoryサーバ)
参考にしたサイト:Windowsネットワーク時刻同期の基礎とノウハウ(改訂版)


10. DHCPとNATの設定
2枚のNICを使い,ルーターと同等の動作をさせる.グローバルipをもつNICはenp5s0(150.7.xx.xx)で,インターネットにアクセスする.もう1枚のNICはOSに認識され,enp7s0という名前がついている.これを"192.168.137.1"の固定IPアドレスで,起動時に有効になるよう設定を変更する.

現状確認
# ifconfig
enp5s0: flags=4163  mtu 1500
        inet 150.7.xx.xx  netmask 255.255.255.0  broadcast 150.7.26.255
        inet6 
        ether txqueuelen 1000  (Ethernet)
        RX packets 5210  bytes 442139 (431.7 KiB)
        RX errors 0  dropped 785  overruns 0  frame 0
        TX packets 531  bytes 95765 (93.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp7s0: flags=4099  mtu 1500
        ether txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 820  bytes 114218 (111.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 820  bytes 114218 (111.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tap0: flags=4163  mtu 1500
        inet 10.8.2.104  netmask 255.255.255.0  broadcast 10.8.2.255
        inet6 prefixlen 64  scopeid 0x20
        ether txqueuelen 100  (Ethernet)
        RX packets 251  bytes 54579 (53.2 KiB)
        RX errors 0  dropped 7  overruns 0  frame 0
        TX packets 67  bytes 12119 (11.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


NIC設定を変更
# vi /etc/sysconfig/network-scripts/ifcfg-enp7s0

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp7s0
UUID=2018c84b-7d23-408e-ac48-811ac645eed5
DEVICE=enp7s0
ONBOOT=yes
IPADDR=192.168.137.1


ネットワーク設定を変更したらサービスを再起動する.
# systemctl restart NetworkManager


変更が反映されていることを確認
# ifconfig
enp5s0: flags=4163  mtu 1500
       ・
       ・
       ・
enp7s0: flags=4099  mtu 1500
        inet 192.168.137.1  netmask 255.255.255.0  broadcast 192.168.137.255
        inet6 fe80::3676:c5ff:fe00:372a  prefixlen 64  scopeid 0x20
       ・
       ・
       ・



続いてipマスカレードの設定.
参考にしたサイト:CentOS 8 : Firewalld : IPマスカレードの設定 : Server World

まずはNICの名前とゾーンを確認.
# firewall-cmd --get-active-zone
public
  interfaces: enp5s0 tap0 enp7s0


enp7s0をinternalに変更.
# nmcli connection modify enp7s0 connection.zone internal

参考にしたサイトでは,1枚のNICをexternal,もう1枚をinternalにする設定となっているが,外向きNIはpublicのままの方が他の設定と干渉しない.


確認.
# firewall-cmd --get-active-zone
internal
  interfaces: enp7s0
public
  interfaces: enp5s0 tap00


public側ゾーンにipマスカレードの設定をする.
# firewall-cmd --zone=public --add-masquerade --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


設定確認.
# firewall-cmd --zone=public --query-masquerade 
yes


続いて,dhcpの設定.
参考にしたサイト:CentOS 8 : DHCPサーバーの設定 : Server World

まずインストール.
# dnf -y install dhcp-server


/etc/dhcp/dhcp.confを作り,以下の内容を記述.
 vi /etc/dhcp/dhcpd.conf

allow unknown-clients;
subnet 192.168.137.0 netmask 255.255.255.0 {
        option domain-name-servers 150.7.3.5;  ←外部DNS
        option broadcast-address 192.168.137.255;
        option subnet-mask 255.255.255.0;
        option routers 192.168.137.1;
        range 192.168.137.2 192.168.137.200;
}


dhcpd.confのエラーチェック.
# dhcpd -t


ファイアーウォールの設定.
# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


続いてdhcpサービスをスタートさせ,起動時自動スタートに登録する.
# systemctl enable dhcpd
# systemctl start dhcpd


導通テスト.下流側NICにハブを接続,適当なwindowsマシンを繋ぎ,以下のコマンドでIPアドレスがリースされていることを確認.
# cat /var/lib/dhcpd/dhcpd.leases 
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.6
        ・
        ・
lease 192.168.137.2 {
  starts 4 2022/03/24 02:47:48;
  ends 4 2022/03/24 14:47:48;
  cltt 4 2022/03/24 02:47:48;
  binding state active;
        ・
        ・
}


続いて,Windowsからインターネットへアクセスできることを確認する.念のためサーバーを再起動して,dhcpdが自動起動していれば成功!


11. Webサーバー(Apache2)の設定
参考にしたサイト:CentOS8にApache(httpd)をインストールする方法 - Qiita

(1)導入から動作チェックまで
インストール
# dnf -y install httpd httpd-tools httpd-devel httpd-manual


Firewallに穴を開ける.
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


起動と動作チェック.
# systemctl start httpd
# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>
Active: active (running) since Fri 2022-03-25 11:17:58 JST; 5s ago
Docs: man:httpd.service(8)
Main PID: 4784 (httpd)
        ・
        ・ 
# systemctl enable httpd


動作を確認したら,サーバーのipアドレスにブラウザからアクセスする.以下のテストページが見えたら,とりあえず基本設定は完了.


(2)設定ファイルhttpd.confの編集
このWebページを表示しているサーバーの設定ファイルがこれ.主な設定項目は,

  • ルートディレクトリは /home/httpd/htdocs
  • cgiを使用可能にする
  • ディレクトリリスティング禁止
など.ただし,Vine Linux時代はapache2.2だったのが,MIRALCE Linuxでは2.4になり,httpd.confもそのままでは移植できなかった.数日とは言わないが,丸一日くらいは格闘した.下記ページにあるように,移行するようりは素直にtemplateから作り直したほうが早い.
参考にしたサイト:Apache2.2の設定ファイルをApache2.4に移植するためにやったことまとめ - Qiita
参考にしたサイト:Apache 2.4のhttpd.confを考えてみた - Qiita

さらに,後述するLet's Encryptによる証明書は発行のため,末尾に以下の記述を追加.
参考にしたサイト: SSL証明書を発行するときに出たエラーの対処法 | ハックノート
# vi /etc/httpd/conf/httpd.conf

NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /home/httpd/htdocs
ServerName alpha4.u-tokai.ac.jp
</VirtualHost>


(3)Let's EncryptによるSSL証明書の導入
最後に,WebサイトをSSLに対応させる.現代においてはhttpsでないサイトを訪れると警告が出る.昔はこんなの無かったのに,地味に面倒くさい.私は,Let's Encryptの証明書を取得して使っている.
参考にしたサイト:Apache httpdで作るHTTPSサーバ - Qiita
参考にしたサイト:CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う - レムシステム エンジニアブログ

certbotパッケージのインストール.
# dnf -y install certbot-apache


証明書を取得.
# certbot --apache


実行すると対話型のウィザードが起動する.いくつかの質問に回答.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security
notices) (Enter 'c' to cancel): [email protected]  ←メールアドレスを入力
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org-----------------------------
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-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A  ←利用規約に了解するかを回答(Aを入力)
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 EFF and
our work to Encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N  ←メーリングリストに入るかの選択(任意)

Successfully deployed certificate for...の表示が出れば証明書が発行されている.場所は/etc/letsencrypt/live/alpha4.u-tokai.ac.jp/.certbotは優秀なので,自動的にhttpd.confも書き換えてくれる.sslに関する記述はhttpd-le-ssl.confにある.

Webサーバーを再起動,httpsで接続できるかテスト.
# systemctl restart httpd


LetsEncryptの証明書は有効期限が3ヶ月なので,自動更新をcronに仕込む.
# crontab -e

00 3 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"

設定の意味は,「毎日午前3時,午前5時の2回,certbotが証明書の更新を確認,更新されたらhttpdとpostfixとdovecotをリスタートする」ということ.postfixとdovecotもssl接続するのでここで ついでに設定しておく.

crontabの内容確認.
# crontab -l




12. メールサーバーの設定
参考にしたサイト:CentOSのPostfixとDovecotで送受信ができるメールサーバーを構築 - レムシステム エンジニアブログ
参考にしたサイト:CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う - レムシステム エンジニアブログ

Let's encryptの設定,および証明書の取得までは11. Webサーバー(Apache2)の設定で終わっている.

(1)cyrus-saslの設定
cyrus-saslは導入済みなので,daemon起動,サービス登録.
# systemctl start saslauthd
# systemctl enable saslauthd


(2)Dovecotの設定
POP3サーバーにはDovecotを使う.既にインストールされているので,設定ファイルの書き換えだけで動く.やたらといろいろなファイルを設定する必要があるが,辛抱強く書き換える.

/etc/dovecot/dovecot.confの編集.
# vi /etc/dovecot/dovecot.conf

listen = *  ←コメント外し::削除
protocols = imap pop3  ←コメント外し書き換え


/etc/dovecot/conf.d/10-auth.confの編集.
# vi /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no  ←コメント外し書き換え

auth_mechanisms = plain login  ←追加


/etc/dovecot/conf.d/10-mail.confの編集.
# vi /etc/dovecot/conf.d/10-mail.conf

   mail_location = maildir:~/Maildir  ←コメント外す


/etc/dovecot/conf.d/10-master.confの編集.
# vi /etc/dovecot/conf.d/10-master.conf

 # Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {  ←コメント外す
  mode = 0666
  user = postfix
  group = postfix
}

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  ←コメント外す
  }
}


/etc/dovecot/conf.d/10-ssl.confの編集.
# vi /etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/letsencrypt/live/alpha4.u-tokai.ac.jp/fullchain.pem
ssl_key =  </etc/letsencrypt/live/alpha4.u-tokai.ac.jp/privkey.pem



設定確認.
# doveconf -n
# 2.3.8 (9df20d2db): /etc/dovecot/dovecot.conf
# OS: Linux 4.18.0-348.20.1.el8_5.x86_64 x86_64 MIRACLE LINUX release 8.4 (Peony)
# Hostname: alpha4.endolab.local
auth_mechanisms = plain login
disable_plaintext_auth = no
first_valid_uid = 1000
listen = *
mail_location = maildir:~/Maildir
mbox_write_locks = fcntl
namespace inbox {
  inbox = yes
  location =
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix =
}
passdb {
  driver = pam
}
protocols = imap pop3
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0666
    user = postfix
  }
}
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
  }
}
ssl = required
ssl_cert = </etc/letsencrypt/live/alpha4.u-tokai.ac.jp/fullchain.pem
ssl_cipher_list = PROFILE=SYSTEM
ssl_key = # hidden, use -P to show it
userdb {
  driver = passwd
}

設定を変更したところが表示される.

Dovecotをdaemon起動,サービス登録.
# systemctl enable dovecot
# systemctl start dovecot


(3)Postfixの設定
SMTPサーバーはPostfixが導入済み.まずはPostfixの設定ファイル,/etc/postfix/main.cfを編集.以下の行のコメントを外す,あるいは内容を変更.
# vi /etc/postfix/main.cf

mydomain = alpha4.u-tokai.ac.jp  ←コメント外し,実在のアドレス記入
myhostname = alpha4   ←コメント外し,ホスト名記入
myorigin = $mydomain   ←コメント外す

inet_interfaces = all  ←コメント外す
#inet_interfaces = localhost   ←コメント

inet_protocols = ipv4  ←ipv4に書き換え

local_recipient_maps = unix:passwd.byname $alias_maps ←コメント外す

#mydestination = $myhostname, localhost.$mydomain, localhost  ←コメント
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain  ←コメント外す

mynetworks = 127.0.0.0/8  ←コメント外し,書き換え

home_mailbox = Maildir/  ←コメント外す

smtpd_tls_cert_file = /etc/letsencrypt/live/alpha4.u-tokai.ac.jp/fullchain.pem  ←書き換え

smtpd_tls_key_file = /etc/letsencrypt/live/alpha4.u-tokai.ac.jp/privkey.pem  ←書き換え

smtpd_banner = $myhostname ESMTP  ←コメント外し,書き換え

### SMTP-AUTH
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

### SSL/TLS Settings
smtp_tls_security_level = may
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1


設定が正しく変更されたかどうかを確認する.「postconf -n」で,デフォルトから変更されたパラメータのみを抽出表示する.
# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
compatibility_level = 2
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = ipv4
local_recipient_maps = unix:passwd.byname $alias_maps
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
meta_directory = /etc/postfix
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = u-tokai.ac.jp
myhostname = alpha4.u-tokai.ac.jp
mynetworks = 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix/README_FILES
sample_directory = /usr/share/doc/postfix/samples
sender_canonical_maps = hash:/etc/postfix/sender_canonical
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
shlib_directory = /usr/lib64/postfix
smtp_host_lookup = native
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_cert_file = /etc/letsencrypt/live/alpha4.u-tokai.ac.jp/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/alpha4.u-tokai.ac.jp/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
unknown_local_recipient_reject_code = 550

中には,編集していないのに表示される内容もある.これはMIRACLE Linuxに標準でインストールされた状態でデフォルトから変更されているためだ.

/etc/postfix/master.cfの編集.
# vi /etc/postfix/master.cf

smtps     inet  n       -       n       -       -       smtpd  ←コメント外す

#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes  ←コメント外す
  -o smtpd_sasl_auth_enable=yes  ←コメント外す
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject  ←コメント外す
#  -o milter_macro_daemon_name=ORIGINATING


Postfixをdaemon起動,サービス登録.
# systemctl enable postfix
# systemctl start postfix


Firewallに穴を開ける.
# firewall-cmd --add-service={smtps,pop3s,imaps} --permanent
# firewall-cmd --reload
# firewall-cmd --list-all --zone=public


これでサーバー側の設定はインストールは終了.続いて,不正中継テストを行う.何だか,不正中継チェックサイトはDoSに使われるのか,すぐ閉鎖されてしまうらしい. 2018年3月現在で利用できたところがここ.適当なWindows PCから,設定中のサーバーのIPを入力してチェックしよう.

(4)クライアントの設定
Thunderbirdを例にとって解説.まずはsmtpの設定.設定例はThunderbird.


続いて,pop3の設定.設定例はThunderbird.


クライアントPCから送受信テストをして,無事メールが開通すれば終了.

(5)おまけ:送信者アドレスの設定
参考にしたサイト:【Postfix】メール送信元アドレス(From)が、[ユーザ@ホスト名]になってしまう原因と対策 - とーますメモ

このサーバーのFQDNは,teamcoil.sp.u-tokai.ac.jpだが,Postfixのデフォルトでは,rootが発信するメールの送信者アドレスは, デフォルトでは[email protected]になっている.要するに,ホスト名とドメイン名が異なる場合に,送信者アドレスを正しく記述できない.この問題は以下の設定で解決.

/etc/positfix/sender_canonicalを作成
# vi /etc/positfix/sender_canonical

root [email protected]
endo [email protected]
    ・
    ・


postmapコマンドで、sender_canonical.dbファイルを作成
# postmap hash:/etc/postfix/sender_canonical


main.cfの編集.以下の行を追加.
# vi /etc/postfix/main.cf

sender_canonical_maps = hash:/etc/postfix/sender_canonical

以上です.


13. メーリングリストサーバーMailmanのインストール
参考にしたサイト:CentOS 8 : Mailman インストール : Server World

研究室サーバーの主要な役割として,MLサーバーがある.Vine Liunxの時代はfmlをPostfixと連携させる方法でMLを運営していたが,流石に古い. OS入れ替えを機会に,MLサーバーを現在主流のMailmanに変える.

インストール作業.パッケージから導入.
# dnf module -y install mailman


/etc/mailman/mm_cfg.py編集.
# vi /etc/mailman/mm_cfg.py

DEFAULT_URL_HOST   = 'alpha4.u-tokai.ac.jp'  ←サーバーのFQDN.シングルクウォートで囲む.
DEFAULT_EMAIL_HOST = 'alpha4.u-tokai.ac.jp'  ←サーバーのFQDN.シングルクウォートで囲む.


/usr/lib/mailman/Mailman/Defaults.py編集.書き換える行のみ表示.
# vi /usr/lib/mailman/Mailman/Defaults.py

 509: MTA = 'Postfix'
 988: DEFAULT_SERVER_LANGUAGE = 'ja'
1313: DEFAULT_REPLY_GOES_TO_LIST = 1


aliasファイル生成.
# /usr/lib/mailman/bin/genaliases


管理者パスワード設定.
# /usr/lib/mailman/bin/mmsitepass


ファイルのパーミッション修正.
# /usr/lib/mailman/bin/check_perms -f


その他のパーミッション修正.
# chown apache /etc/mailman/aliases
# chmod 664 /etc/mailman/aliases*
# chmod 2775 /etc/mailman 


Postfixの設定変更.
# vi /etc/postfix/main.cf
alias_maps = hash:/etc/aliases, hash:/etc/mailman/aliases  ←追記
alias_database = hash:/etc/aliases, hash:/etc/mailman/aliases  ←追記


PostfixとApacheの再起動.
# systemctl restart postfix httpd


管理用リスト[mailman]作成.
# /usr/lib/mailman/bin/newlist mailman
リスト管理者のメールアドレスを入力してください: 管理者用メールアドレス
mailman の初期パスワード:パスワード
Enter を押して mailman の管理者にメール通知する...

これで,管理者用メールアドレスに「新しいメーリングリスト: mailman」というメールが届く.中身は,メーリングリスト「mailman」の使用法.MLへのリンクがあるので,クリックしてアクセス可能であることを確認しよう.

最後に,mailmanサービスをスタートさせ,自動スタートに登録する.
# systemctl enable mailman
# systemctl start mailman



14. swatchによるログ監視
Vine Linux 3.2の時代にサーバーがクラックされ,それをきっかけに導入したログ監視ソフトのswatch.便利に使っているので今回もインストール. 今回はOSも変わっているので,改めてインストール方法を調査した.
参考にしたサイト:[RHEL7/CentOS7] ログ監視ツール swatch を入れてメール通知してみた - Qiita

(1)インストール

さすがは主流のRHEL互換.dnfでいける.
# dnf -y install swatch


(2)テスト

とりあえず動かしてみる.まずは設定ファイルを/rootの下に作る. 監視するのは/var/log/messages.
# vi /root/swatch_messages.conf

watchfor /Started/
    echo
    mail=[メールアドレス],subject="[SWATCH] Alert"

ログファイルに「"Started"」という文字を検出したらコンソールに表示,メールで通知.

手動で起動.
# /usr/bin/perl /bin/swatch -c /root/swatch_messages.conf -t /var/log/messages &
[2] 143552

[2]の次の数字がプロセス番号.

停止.
# kill 143552



(3)設定

どんなメッセージに対してアラートを送るかだが,ネット上にあまり有用な情報はなかった.結局,swatch添付の/examples/swatchrc.personalを元に以下のようなファイルを作成した.
#
# Personal Swatch configuration file
#

# Alert me of bad login attempts and find out who is on that system
watchfor   /INVALID|REPEATED|INCOMPLETE/
	mail=root,subject=Alpha2 swatch report

# Important program errors
watchfor   /LOGIN/
	mail=root,subject=Alpha2 swatch report

watchfor   /passwd/
	mail=root,subject=Alpha2 swatch report

watchfor   /ruserok/
	mail=root,subject=Alpha2 swatch report

# Ignore this stuff
ignore   /sendmail/,/nntp/,/xntp|ntpd/,/faxspooler/

# Report unusual tftp info
ignore   /tftpd.*(ncd|kfps|normal exit)/
watchfor   /tftpd/
	mail=root,subject=Alpha2 swatch report

# Kernel problems
watchfor   /(panic|halt|SunOS Release)/
	mail=root,subject=Alpha2 swatch report

watchfor   /file system full/
	mail=root,subject=Alpha2 swatch report

ignore   /vmunix.*(at|on)/
watchfor   /vmunix/
	mail=root,subject=Alpha2 swatch report

watchfor   /fingerd.*(root|[Tt]ip|guest)/
	mail=root,subject=Alpha2 swatch report

ignore     /refused connect from/
	mail=root,subject=Alpha2 swatch report

watchfor   /sshd:/
	mail=root,subject=Alpha2 swatch report

watchfor   /Unable to find the Domain Master Browser/
	mail=root,subject=Alpha2 swatch report

watchfor   /process_local_master_announce:/
	mail=root,subject=Alpha2 swatch report

# Startup notice
watchfor   /kernel: Command line: BOOT_IMAGE=/
	mail=root,subject=Alpha2 swatch report


自動起動用ユニットファイル作成.
# vi /lib/systemd/system/swatch.service

[Unit]
Description=swatch for messages log
After=syslog.target network.target postfix.service

[Service]
ExecStart=/usr/bin/swatch -c /root/swatch_messages.conf -t /var/log/messages --pid-file /var/run/swatch.pid --daemon > /dev/null 2>&1
Type=forking
PIDFile=/var/run/swatch.pid

[Install]
WantedBy=multi-user.target


自動起動.
# systemctl daemon-reload
# systemctl start swatch
# systemctl enable swatch


(4)メール転送の設定

上の設定では,メールはroot宛に送られるが,これをユーザーendoに転送するように設定する./etc/aliasesを編集.一番末尾にrootのエイリアスのエントリがある.
# vi /etc/aliases

# Person who should get root's mail
root:          endo


aliases更新.
# postalias /etc/aliases
# newaliases
# systemctl restart postfix

これでSwatchによる監視が有効になった.試しに再起動してみよう.メッセージが来るはず.


15. pflogsummによるメールサーバー監視
参考にしたサイト:CentOS 8 : メールログレポート : pflogsumm

去る2013年1月にメールサーバーが不正中継の踏み台にされた事件が発生.それ以降,メールサーバーの動向を毎日報告させるツール「pflogsumm」を利用している.

導入はdnfで楽勝.MIRACLE Linuxに変えて,ソフトの導入が本当に楽になった.学習コストは相変わらずだが.
※「全部入り」を選択した人なら予め入っている.
# dnf -y install postfix-perl-scripts 


起動.pflogsummはperlのスクリプトなので,perlに起動パラメータを渡すだけ.
# perl /usr/sbin/pflogsumm -d yesterday /var/log/maillog


自動起動して,メールで通知するよう設定.crontabに記述すればよい.ただし,MIRACLE Linuxは標準ではmailxが入っていないので予め入れておく.
# dnf -y install mailx


自動起動して,メールで通知するよう設定.crontabに記述すればよい.
# crontab -e

00 01 * * * perl /usr/sbin/pflogsumm -e -d yesterday /var/log/maillog | mail -s 'Logwatch for Postfix' root

毎日午前1時にroot宛にpflogsummの結果をメール送信する設定.


改訂履歴
2022/04/09 メール送受信をSSL/TLSに変更.
2022/05/16 Alpha2のディスクエラー→交換の顛末を記録.
2023/02/22 第9版リリース.Sambaインストール手順が大幅に変わる.
2023/03/06 DHCP設定をコマンドラインベースに変更.
2024/03/27 AD クライアントの時刻同期ができない問題を解決した.