2018年1月30日火曜日

Postfixで"unable to create lock file"でファイル送信が失敗する

Postfixでメールサーバー構築を行っていた際に、以下のようなメッセージが表示されて、メール配送に失敗する事象が発生した。

# postqueue -p
------------------------------
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
E632018BD679      429 Sat Jan 13 20:36:21  ex-1@example.com
(delivery failed to mailbox /var/spool/virtual/example1.com/ex1-1/Maildir: unable to create lock file /var/spool/virtual/example1.com/ex1-1/Maildir.lock: No such file or directory)
                                         ex1-1@example1.com

-- 0 Kbytes in 1 Request.
------------------------------

上記エラーをWebで調べても、なかなか同一事象が記載されたサイトがなく、解決に苦労したため、本記事にてエラーの原因と解決方法について記載する。

原因と解決方法

1つのメールサーバーで複数ドメインを扱う必要があったため、バーチャルメールボックスにてPostfixを設定していた。ユーザーとメールボックス紐づけは、/etc/postfix/vmailboxのファイルに以下のように記載をしていた。

# cat /etc/postfix/vmailbox
------------------------------
ex-1@example.com      example.com/ex-1/Maildir
ex-2@example.com      example.com/ex-2/Maildir
ex1-1@example1.com    example1.com/ex1-1/Maildir
ex2-1@example2.com    example2.com/ex2-1/Maildir
------------------------------

当初、上記記載に誤りはないものと考えていたが、結果としては前述したメール配送の失敗が発生した。

いろいろ切り分けた結果、以下のように記載を修正することで解決した。ユーザーのメールボックスの指定する際には、最後に「/」が必要だった。解決した後だから言えるが、たいしたことのない問題だった。

------------------------------
ex-1@example.com      example.com/ex-1/Maildir/
ex-2@example.com      example.com/ex-2/Maildir/
ex1-1@example1.com    example1.com/ex1-1/Maildir/
ex2-1@example2.com    example2.com/ex2-1/Maildir/
------------------------------

2018年1月16日火曜日

Windows Server 2012以降で.Net Framework 3.5をインストールする方法 (代替ソースパスの設定)

Windows Server 2012以降のOSでは、「サーバーマネージャー」の「役割と機能の追加」にて、.Net Framework 3.5を単純にインストールしようとすると失敗する。


この場合、「代替ソースパス」を指定することで解消するが、代替ソースパスを知らないと、どこを指定してよいものかわからないので、本手順にて代替ソースパスの設定手順について記載する。

手順

1. 予め、Windows Serverのインストールメディアをマウントしておく。今回はDドライブにマウントした想定で手順を記載する。

2. 「サーバーマネージャー」の「役割と機能の追加」を開き、「機能」の項目にて、「.Net Framework 3.5 Features」にチェックを付ける。


3. 確認画面で、「代替ソースパスを指定する必要がありますか?」という警告が表示されることを確認する。


4. ダイアログボックス下部の「代替ソースパスの指定」の文字をクリックする。


5. 代替ソースパスの指定にて、以下を指定する。今回はDドライブにWindows Serverのインストールメディアがマウントされている想定なので、環境に合わせてドライブレターは変更すること。また、この指定パスは、Windows Server 2012以降のインストールメディアで、すべて共通となっている。

 D:\sources\sxs


6. 「インストール」ボタンを押してしばらくすると、インストールが正常に完了するはずである。



2018年1月11日木曜日

Windows Server 2016で定期的にAdvapiがログイン失敗 (イベントID 4625)する問題

Windows Server 2016の評価版をインストールし使い始めたのだが、ログオンプロセスがAdvapiという名前のログイン失敗(イベントID 4625)が、1日に1、2回程度の間隔で定期的に発生するということがわかった。

この事象には、以下記事で述べたログイン失敗検知をZabbixで実装しているため気付くことができた。

・Zabbixを使ってWindowsとLinuxのログイン失敗を監視する
https://tech-mmmm.blogspot.jp/2017/06/zabbixwindowslinux.html

特にログイン失敗を監視していないような環境では特に気にしなくてもよいかもしれないが、発生条件と対策について調べてみた。しかし、本件に関する対策は、2018年1月時点では存在しないようである。本記事では、本事象の発生条件と、実施した対策について記載する。

事象

以下がイベントログ セキュリティの失敗の監査のメッセージとして表示される。セキュリティIDが「NULL SID」でログオンプロセスが「Advapi」となっており、通常ユーザーのログイン失敗ではないと想定される。

------------------------------
ログの名前:         Security
ソース:           Microsoft-Windows-Security-Auditing
日付:            2018/01/06 7:48:39
イベント ID:       4625
タスクのカテゴリ:      ログオン
レベル:           情報
キーワード:         失敗の監査
ユーザー:          N/A
コンピューター:       t1082w216.intrat.local
説明:
アカウントがログオンに失敗しました。

サブジェクト:
セキュリティ ID: SYSTEM
アカウント名: T1082W216$
アカウント ドメイン: INTRAT
ログオン ID: 0x3E7

ログオン タイプ: 5

ログオンを失敗したアカウント:
セキュリティ ID: NULL SID
アカウント名: -
アカウント ドメイン: -

エラー情報:
失敗の原因: ログオン中にエラーが発生しました。
状態: 0xC0000073
サブ ステータス: 0xC0000073

プロセス情報:
呼び出し側プロセス ID: 0x138
呼び出し側プロセス名: C:\Windows\System32\svchost.exe

ネットワーク情報:
ワークステーション名: -
ソース ネットワーク アドレス: -
ソース ポート: -

詳細な認証情報:
ログオン プロセス: Advapi  
認証パッケージ: Negotiate
移行されたサービス: -
パッケージ名 (NTLM のみ): -
キーの長さ: 0

~(以下略)~
------------------------------

発生条件

以下URLに同様の事象について記載されていた。

・KB3213986 Causes Logon Failures When Starting BITS Service - Please fix
https://windowsserver.uservoice.com/forums/304618-installation-and-patching/suggestions/18475483-kb3213986-causes-logon-failures-when-starting-bits

発生条件は、以下2つであることが記載されている。
  1. KB3213986がインストールされている
  2. BITS (Background Intelligent Transfer Service)が起動時
実際にイベントログを見ると、BITS起動のログとログイン失敗のタイミングは、秒数まで含めて、同一タイミングとなっていた。



また、先ほど記載したURLでは、この問題を修正するようMicrosoftに提言する内容となっているが、コメント欄を見る限りでは、残念ながら修正したという内容は記載されていない。

実施した対策 (効果なし)

①パッチのアンインストールを試みる

原因となっているOSパッチ「KB321396」は、Windows Server 2016に最初からインストールされており、アンインストールも不可となっていた。
※アンインストール可能な場合は、以下画面の「整理」の欄に「アンインストール」が表示される。


②OSパッチを最新化する

Windows Updateを行い、OSパッチを最新化してみたが、事象は改善しなかった。

③BITSを停止させる

BITSを停止することで解消するか確認してみた。「サービス」を開き、「Background Intelligent Transfer Service」を確認すると、「スタートアップの種類」が「手動」になっているはず。こちらを「無効」変更した。


しかし、無効にしてもOSが定期的に手動に変更してしまうようで、BITSを停止しても事象は改善しなかった。

上記3点の対応を実施しても事象は改善しないことがわかった。特に影響はなさそうな事象ではあるので、監視で検知しないよう監視マネージャー側で抑止するしかなさそうだ。

(2018/5/1追記)
Zabbixで抑止する手順については以下記事に記載した。

★関連記事はこちら↓

Zabbixで「Advapi」のログイン失敗イベントを無視する設定
https://tech-mmmm.blogspot.jp/2018/05/zabbixadvapi.html

2017年12月11日月曜日

タスクスケジューラーを使って1分間隔で実行するタスクを作成する方法

とあるPowerShellのスクリプトを1分間隔で実行したかったので、タスクスケジューラーで繰り返し実行のタスクを作ることにした。しかし、「トリガー」タブの「繰り返し間隔」の選択項目を見ると、5分間より短い間隔の指定ができないように見える。


Linuxのcronであれば簡単に設定できることが、タスクスケジューラーではできないのかと困っていたのだが、実はこの「繰り返し間隔」は直接入力が可能である。

というわけで、試しに「5 分間」→「1 分間」に編集して保存してみる。


「詳細」欄を確認すると、「00:01:00 ごとに繰り返し」となっている。


実際にタスクを作成して、「次回の実行時刻」を確認すると、1分後が指定されていることが確認できた。


ちなみに、1分以下を指定できるか確認したところ、「繰り返し間隔は、1 分以上 31 日以下の値を指定する必要があります」というエラーメッセージではじかれた。Windowsのタスクスケジューラーの最少実行間隔は、1分のようだ。



2017年12月9日土曜日

rsyslog + logrotateでログ保管サーバーを構築する

ネットワーク機器などの障害調査を目的として、Syslogでログ転送を行いログを保管しておくという設計はよくある話ではある。有名な製品としては、Spulnk社のSplunk、インフォサイエンス社のLogstorage、OSSではGraylogやLogtashなど多数のソフトウェアが存在している。

とはいえ小規模な環境で有償のソフトウェアを導入することは、費用面や構築負荷といった面で割に合わないこともあるため、とりあえずログを保管するだけで詳細な分析は不要であれば、OSの標準機能で実装してしまう方が手っ取り早い。

今回はLinuxの標準機能であるrsyslogとlogrotateを組み合わせて、ログ保管サーバーの構築を行う。

環境

今回は仮想スイッチVyOSのログをSyslogにて受信し、5日分のログを保管できるように設定することにする。


参考までに、VyOSのSyslog設定を以下に記載する。

# show system syslog
------------------------------
 global {
     facility all {
         level notice
     }
     facility protocols {
         level debug
     }
 }
 host 192.168.33.22 {
     facility all {
         level debug
     }
 }
------------------------------

rsyslogの設定

UDP/514ポートを使ったSyslog受信設定を行ったうえで、送信元のIPアドレスをもとに出力ファイルを指定する。

設定は以下の通りとなる。

# cat /etc/rsyslog.conf | grep -v -e "^#" -e "^$"
------------------------------
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
$ModLoad imudp     ←UDPによるSyslogメッセージ入力を許可
$UDPServerRun 514   ←UDPの待ち受けポートを514に設定
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
:fromhost-ip, isequal, "192.168.33.31" -/var/log/t3031vy11.log
& ~
↑送信元IPアドレスに対して、出力先のログを指定。"& ~"を付けることで、直前の条件に一致したログを破棄する
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 *
uucp,news.crit                                          /var/log/spooler
local7.*
------------------------------

:fromhost-ipの行はプロパティベースのフィルターと呼ばれる。構文は以下の通りとなる。

:PROPERTY, [!]COMPARE_OPERATION, "STRING" LOGFILE

左から順に見ていこう。

①PROPERTY

今回はIPアドレスでフィルターするため、「fromhost-ip」で指定する。利用できるPROPERTYの値は以下を参照。

・rsyslog Properties
http://www.rsyslog.com/doc/master/configuration/properties.html

②[!]COMPARE_OPERATION, "STRING"

今回はIPアドレスで「一致」を条件とするため、「isequal, "192.168.33.31"」とする。isequalの前に!を付ければ否定となり「一致しないこと」が条件となる。その他比較処理については、以下表を参照すること。

  • contains:テキストを含む。大文字小文字を区別する
  • contains_i:テキストを含む。大文字小文字を区別しない
  • isequal:テキストと一致
  • regex: POSIX BRE (Basic Regular Expression)による比較
  • ereregex: POSIX ERE (Extended Regular Expression) 正規表現による比較
  • isempty:空かどうかを比較 (この際の”STRING"の記載方法が不明)

③LOGFILE

出力先のログファイルを指定する。ログファイル名の前に「-」を指定すると書き込みが非同期で行われ、パフォーマンスが向上するが、サーバー停止時に一部ログの欠損が発生する可能性がある。

logrotateの設定

以下の内容でファイルを新規作成する。今回は日次5世代のローテーション設定を行う。

# cat /etc/logrotate.d/remotelog
------------------------------
/var/log/t3031vy11.log {
    missingok      ←ログファイルが存在しない場合でもエラーとしない
    notifempty     ←ログファイルが空ならローテーションしない
    daily        ←日次で実行
    compress      ←圧縮。デフォルトではgzを圧縮コマンドとして利用
    rotate 5      ←5世代の過去ファイルを保管
    postrotate     ←ローテーション後コマンド(次行~endscriptまで)を実行
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript      ←コマンドの終わり
}
------------------------------

このファイルの作成ディレクトリである/etc/logrotate.dは、/etc/logrotate.confでインクルードされているため、ファイルを置くだけで設定を反映することができる。

なお、logrotateはただのコマンドとして提供されており、サービス化されていない。そのため、設定反映の際に、サービス再起動や設定ファイルの再読み込み作業は不要となる。

設定確認コマンドは以下の通りとなる。

# logrotate -d /etc/logrotate.conf
------------------------------
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file ConsoleKit
reading config info for /var/log/ConsoleKit/history

~(中略)~

reading config info for /var/log/t3031vy11.log

~(中略)~

rotating pattern: /var/log/t3031vy11.log  after 1 days (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/t3031vy11.log
  log does not need rotating
not running postrotate script, since no logs were rotated

~(以下略)~
------------------------------

logrotateの実行時間について

ここでlogrotateの実行時間についても記載しておく。logrotateはanacronで制御されており、日次、週次、月次の実行処理があらかじめ設定されている。

実際にanacronの実行制御の設定を見てみる。

# cat /etc/anacrontab
------------------------------
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45       ←各ジョブのdelay in minutes + 最大45分の遅延
START_HOURS_RANGE=3-22   ←3時-22時の間でジョブを実行(サーバー停止等がなければ3時開始)

#period in days delay in minutes job-identifier command
1       5       cron.daily       nice run-parts /etc/cron.daily  ←日次処理
7       25      cron.weekly      nice run-parts /etc/cron.weekly  ←週次処理
@monthly 45     cron.monthly     nice run-parts /etc/cron.monthly  ←月次処理
------------------------------

上記より、日次処理の場合、3:05~3:50の間でlogrotateが実行されることがわかる。

次に、日次処理の設定ファイルが配置されている/etc/cron.dailyディレクトリ内のlogrotateファイルの設定を確認する。logrotateコマンドを実行し、終了コードが0以外の際にloggerコマンドでエラーを吐くという、シンプルなスクリプトとなっている。

# cat /etc/cron.daily/logrotate
------------------------------
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf   ←logrotateコマンドを実行
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
------------------------------

実際に作成されたログファイルを確認してみると、3:05~3:50の間でgz形式で圧縮されたファイルが5つ生成されていることがわかる。

# cd /var/log/
# ls -l t3031vy11.log*
------------------------------
-rw------- 1 root root 1233016 12月  4 10:06 2017 t3031vy11.log
-rw------- 1 root root  305117 11月 30 03:48 2017 t3031vy11.log-20171130.gz
-rw------- 1 root root  229191 12月  1 03:44 2017 t3031vy11.log-20171201.gz
-rw------- 1 root root  262123 12月  2 03:29 2017 t3031vy11.log-20171202.gz
-rw------- 1 root root  373297 12月  3 03:49 2017 t3031vy11.log-20171203.gz
-rw------- 1 root root  294881 12月  4 03:25 2017 t3031vy11.log-20171204.gz
------------------------------

参考

・rsyslog
http://www.rsyslog.com/

・20.2. RSYSLOG の基本設定
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-basic_configuration_of_rsyslog

・第21章 システムタスクの自動化
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/ch-automating_system_tasks

人気の投稿