SPAM対応メモ 2026/06/24

メールサーバに新しいメールが入ってこない、というので調査したら、特定ユーザのメールパスワードがばれていてSPAM送信に使われていたという時のメモ

(1) 落ちてるデーモンはいなかった

systemctl --failed

を実行した際に止まっているものはいなかった

(2) メールのキューに異常

postfixのメールキューの状態を確認

# postqueue -p

数万通のメールが滞留していた

差出人はほぼ1ユーザで、宛先は方々にわたる

(3) メール配送停止

ひとまず、postfixのメール配送処理を止める

# postfix abort

(4) ログ確認

/var/log/messagesと/var/log/maillog に対して そのユーザ名でgrepをかけて確認

roudcubeのログにて、roundcube内から多数のメールアドレスを指定してメール送信していることを確認

(5) アクセス者IPアドレス確認

ログから該当する操作のIPアドレスを確認し、そのアドレスがどこなのかを確認

今回は3IPアドレスからきており、どれも海外

(6) あからさまにSPAMを削除

今回特定の時間帯の送信は全部SPAMっぽかったので以下のコマンドで該当ユーザのメールをpostsuper -d queueIDで削除

# for queid in `postqueue -p|grep "Jun 24 04"  |grep ユーザ名|awk '{ print $1 }' | sed s/\*//ig`; do postsuper -d $queid; done

あと、MAILER-DAEMON関連の返送処理も削除

# for queid in `postqueue -p|grep MAILER|awk '{ print $1 }' | sed s/\*//ig`; do postsuper -d $queid; done

(7) とりあえず再開

ONTAPシミュレータのaggregateが見えなくなった

ESXi上に構築したONTAP シミュレータで データ用のaggregateにあるvolumeが見えなくなった

確認したところ、aggregateの状態が「restricted」となっていた

netapp::> storage aggregate show


Aggregate     Size Available Used% State   #Vols  Nodes            RAID Status
--------- -------- --------- ----- ------- ------ ---------------- ------------
aggr0_netapp_01
           30.06GB    9.46GB   69% online       1 netapp-01        raid_dp,
                                                                   normal
netappSSD       0B        0B    0% restricted   0 netapp-01        raid_dp,
                                                                   normal
2 entries were displayed.

netapp::>

とりあえずonlineできるか確認してみる

netapp::> storage aggregate online -aggregate netappSSD

Error: command failed: Failed to bring aggregate "netappSSD" online. Reason: Neither fsinfo block of aggregate
       'netappSSD' is valid.

netapp::>

オンラインにできない状態であった

エラーの事例を調べると、wafliron で処理をしてみて、ダメだったら、WAFLで問題おきてて、解決方法がないので、バックアップからリストアしろ、とのこと

storage aggregate wafliron のコマンドを使えるように diagモードとして、状態を確認

netapp::> set diag

Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y

netapp::*> storage aggregate wafliron show
This table is currently empty.

netapp::*>

wafliron startを実行

netapp::*> storage aggregate wafliron start -aggregate netappSSD

Warning: Aggregate netappSSD is in state "restricted". This aggregate might contain one or more SnapMirror
         destination volumes. You have chosen to skip wafliron on the SnapMirror destination volumes. Do you still
         want to continue? {y|n}: y
Initiated wafliron-start on aggregate "netappSSD".
Monitor the status with the "storage aggregate wafliron show" command.


netapp::*>

開始はされるが、すぐにエラー終了していた

netapp::*> storage aggregate wafliron show
                                                Percent
                                        Percent Summary  Last Last Start
                                         Blocks  Blocks Start Related
Aggregate      State   Current Status   Scanned Scanned Errno Information
-------------- ------- ---------------- ------- ------- ----- ----------------
netappSSD      restricted
                       not_running            -       -   138 Neither fsinfo
                                                              block of
                                                              aggregate
                                                              'netappSSD' is
                                                              valid.

netapp::*>

aggregate showで状態を確認

netapp::*> storage aggregate show


Aggregate     Size Available Used% State   #Vols  Nodes            RAID Status
--------- -------- --------- ----- ------- ------ ---------------- ------------
aggr0_netapp_01
           30.06GB    9.95GB   67% online       1 netapp-01        raid_dp,
                                                                   normal
netappSSD       0B        0B    0% restricted   0 netapp-01        raid_dp,
                                                                   normal
2 entries were displayed.

netapp::*>

onlineを実行したが、状況に変化はなし

netapp::*> storage aggregate online -aggregate netappSSD

Error: command failed: Failed to bring aggregate "netappSSD" online. Reason: Neither fsinfo block of aggregate
       'netappSSD' is valid.

netapp::*>

ということで、対処はできませんでした

Windows OS上でユーザ権限でファイルシステムをマウントできるようにするDokany

バックアップソフトのCommvaultの 取得したバックアップデータを実際にはリストアしないでユーザ側に直接ファイルシステムとしてアクセスできるようにする3DFSについてドキュメントを見ていたところ、下記の記述があった。

Windowsバックアップデータを、Windowsサーバ上でファイルシステムとして見れるようにする場合、Dokany というオープンソースのコールバックファイルシステムが必要だという。

dokany を調べると github にあった

https://github.com/dokan-dev/dokany

Dokany is a fork of Dokan 0.6.0 with bug fixes, clean change history and updated to build with latest tools.

dokan !? 「Opendedupという重複排除機能搭載のLinux/Windows向けファイルシステム」で使われていたやつだ

2021年にdokan公式Webが消滅したので、forkしたってことですね

https://dokan-dev.github.io/ を見ると、Dokan FUSEを利用して、いろんなものをファイルシステムとしてマウントできるようにするものが作られているようです

Proxmox VE 9.1でのパッチ適用は「apt dist-upgrade」で行う

Proxmox VE 9.1環境で、sshログインして「apt upgrade -y」でアップデートしたんだけど、GUIでみると下記の様にパッケージが残っていた

sshログインして「apt upgrade」を実行した場合は以下の結果

root@proxmox1:~# apt upgrade
Not upgrading:
  zfs-initramfs  zfs-zed  zfsutils-linux

Summary:
  Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 3
root@proxmox1:~#

しかし、Web GUI上の「アップグレード」をクリックすると、

上記の様な表示が出る・・・実行しているコマンドが「apt-get dist-upgrade」となっている

おや?と思って、マニュアルを再確認してみる

3.2. System Software Updates」によると・・・

「apt-get update」を実行したあと「apt-get dist-upgrade」を実行しろ、とあった

というわけで「apt dist-upgrade」コマンドを実行

root@proxmox1:~# apt dist-upgrade
Upgrading:
  zfs-initramfs  zfs-zed  zfsutils-linux

Installing dependencies:
  libzfs7linux  libzpool7linux

REMOVING:
  libzfs6linux

Summary:
  Upgrading: 3, Installing: 2, Removing: 1, Not Upgrading: 0
  Download size: 2,308 kB
  Space needed: 4,470 kB / 31.8 GB available

Continue? [Y/n] y
Get:1 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 zfs-initramfs all 2.4.1-pve1 [26.8 kB]
Get:2 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 zfsutils-linux amd64 2.4.1-pve1 [596 kB]
Get:3 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 zfs-zed amd64 2.4.1-pve1 [71.0 kB]
Get:4 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 libzfs7linux amd64 2.4.1-pve1 [226 kB]
Get:5 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 libzpool7linux amd64 2.4.1-pve1 [1,388 kB]
Fetched 2,308 kB in 2s (935 kB/s)
Reading changelogs... Done
(Reading database ... 76859 files and directories currently installed.)
Preparing to unpack .../zfs-initramfs_2.4.1-pve1_all.deb ...
Unpacking zfs-initramfs (2.4.1-pve1) over (2.3.4-pve1) ...
Preparing to unpack .../zfsutils-linux_2.4.1-pve1_amd64.deb ...
Unpacking zfsutils-linux (2.4.1-pve1) over (2.3.4-pve1) ...
Preparing to unpack .../zfs-zed_2.4.1-pve1_amd64.deb ...
Unpacking zfs-zed (2.4.1-pve1) over (2.3.4-pve1) ...
(Reading database ... 76862 files and directories currently installed.)
Removing libzfs6linux:amd64 (2.3.4-pve1) ...
Removing 'diversion of /lib/x86_64-linux-gnu/libzfs_core.so.3 to /lib/x86_64-linux-gnu/libzfs_core.so.3.usr-is-merged by libzfs6linux'
Removing 'diversion of /lib/x86_64-linux-gnu/libzfs_core.so.3.0.0 to /lib/x86_64-linux-gnu/libzfs_core.so.3.0.0.usr-is-merged by libzfs6linux'
Selecting previously unselected package libzfs7linux:amd64.
(Reading database ... 76850 files and directories currently installed.)
Preparing to unpack .../libzfs7linux_2.4.1-pve1_amd64.deb ...
Unpacking libzfs7linux:amd64 (2.4.1-pve1) ...
Selecting previously unselected package libzpool7linux:amd64.
Preparing to unpack .../libzpool7linux_2.4.1-pve1_amd64.deb ...
Unpacking libzpool7linux:amd64 (2.4.1-pve1) ...
Setting up libzpool7linux:amd64 (2.4.1-pve1) ...
Setting up libzfs7linux:amd64 (2.4.1-pve1) ...
No diversion 'diversion of /lib/x86_64-linux-gnu/libzfs_core.so.3 to /lib/x86_64-linux-gnu/libzfs_core.so.3.usr-is-merged by libzfs6linux', none removed.
No diversion 'diversion of /lib/x86_64-linux-gnu/libzfs_core.so.3.0.0 to /lib/x86_64-linux-gnu/libzfs_core.so.3.0.0.usr-is-merged by libzfs6linux', none removed.
Setting up zfsutils-linux (2.4.1-pve1) ...
Installing new version of config file /etc/default/zfs ...
Installing new version of config file /etc/zfs/zfs-functions ...
zfs-import-scan.service is a disabled or a static unit, not starting it.
Setting up zfs-initramfs (2.4.1-pve1) ...
Setting up zfs-zed (2.4.1-pve1) ...
Processing triggers for libc-bin (2.41-12+deb13u2) ...
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for initramfs-tools (0.148.3) ...
update-initramfs: Generating /boot/initrd.img-7.0.2-2-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
root@proxmox1:~#

これで、アップデートしていないパッケージはなくなった

root@proxmox1:~# apt update
Hit:1 http://security.debian.org/debian-security trixie-security InRelease
Hit:2 http://deb.debian.org/debian trixie InRelease
Hit:3 http://deb.debian.org/debian trixie-updates InRelease
Hit:4 http://download.proxmox.com/debian/ceph-squid trixie InRelease
Hit:5 http://download.proxmox.com/debian/pve trixie InRelease
All packages are up to date.
root@proxmox1:~#

postfixのvirtual_transport=dovecot指定時にもvirtual_mailbox_mapsを指定したほうが良い件

postfix/dovecotのメールサーバで、実ドメイン以外のドメインのメールも受け取るようpostfix側にvirtual mailbox domainsの設定を行うことがある

その際、dovecotによるquota制御を行いたい。

その場合の手法は2種類ある。
 ・dovecotドキュメント「Dovecot LDA with Postfix」の「virtual_transport = dovecot」を設定して”Virtual users”にある設定を行う手法
 ・dovecotドキュメント「Postfix and Dovecot LMTP」の「virtual_transport = lmtp:unix:private/dovecot-lmtp」を設定してLMTPを使う手法

LMTPの方は「Dovecot LDAのdeliverでは動作しません」と書いてあるため、dovecot のquotaを使うためにdovecot ldaを使用する場合には使えなさそう。

このため、まずは「virtual_transport = dovecot」の手法を実装

postfixの/etc/postfix/main.cf には以下の設定

dovecot_destination_recipient_limit = 1
virtual_mailbox_domains = your.domain.here
virtual_transport = dovecot

postfixの/etc/postfix/master.cf には以下の設定

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient}

しかし、この設定を行った場合、存在しないメールアドレス宛に来たメールを拒否する、という動作をしてくれない

検証方法はこんな感じ

$ telnet メールサーバホスト名 25
Trying 192.168.x.x...
Connected to 192.168.x.x.
Escape character is '^]'
220 メールサーバホスト名 ESMTP Postfix
ehlo testhost
250-メールサーバホスト名
250-<以下省略>
mail from: <>
250 2.1.0 Ok
rcpt to: nothing@your.domain.here
250 2.1.5 Ok

存在しないアドレスを指定した「rcpt to: nothing@your.domain.here」に対する応答として「550 5.1.1 ~」が返ってくることを期待したものの、「250 2.1.5 Ok」という、メールアドレスが存在する場合と同じ応答となっている。

これをなんとか出来ないかを調べてみると、プラグインを独自開発しろ、とかいう話が出てきたものの、意外な解決方法の糸口を発見・・・

/etc/postfix/master.cf の smtpdの起動を「smtpd -v」と詳細ログ出力モードに変えて、上記操作をしてみたところ、rcpt to入力後の動作に気になるところが・・・

「CHECKING Recipient address VALIDATION MAPS」の処理を見てみると以下の順番でメールアドレスの存在確認を行っている模様
 1) recipient_canonical_maps
 2) canonical_maps
 3) virtual_alias_maps

検証環境ではvirtual_mailbox_domains とは別に virtual_alias_domains も設定され、virtual_alias_mapsはhashファイルが指定されている。これにより、virtual_alias_mapsの検索が行われていると判断される

じゃあ、ここにvirtual_mailbox_mapsを設定したら、virtual_mailbox_mapsに対してメールアドレスの存在確認を行ってくれるんじゃないかな?と期待

main.cfに「virtual_mailbox_maps = ldap:/etc/postfix/ldap-mailbox.cf」を追加して、LDAP検索のqueryは「query_filter = (&(objectClass=user)(mail=%s))」で設定した

設定後、「dnf install postfix-ldap」でpostfixのldapサポートを追加し、「systemctl restart postfix」でpostfixを再起動して見ると以下の結果となった

$ telnet メールサーバホスト名 25
Trying 192.168.x.x...
Connected to 192.168.x.x.
Escape character is '^]'
220 メールサーバホスト名 ESMTP Postfix
ehlo testhost
250-メールサーバホスト名
250-<以下省略>
mail from: <>
250 2.1.0 Ok
rcpt to: nothing@your.domain.here
550 5.1.1 <nothing@your.domain.here>: Recipient address rejected: User unknown in virtual mailbox table

期待通りに「550 5.1.1」による拒否を行ってくれるようになった

postfixのdebugログを確認すると、virtual_alias_maps 処理の次に virtual_mailbox_maps処理が追加されていた。
 1) recipient_canonical_maps
 2) canonical_maps
 3) virtual_alias_maps
 4) virtual_mailbox_maps

このことから、postfixで「virtual_transport=dovecot」を設定した場合であっても、virtual_mailbox_maps設定を行い、postfix側でメールアドレスの存在確認を行った方がよい、ということになる