2017年9月29日金曜日

QNAPで"Not all files/folders and their attributes are copied!"のバックアップ警告を解消する

自宅のQNAPでは、USBの外付けハードディスクにバックアップを取得するよう構成している。当初は問題なくバックアップ取得に成功していたが、ある日から以下のような警告が表示されるようになった。

------------------------------
[Hybrid Backup Sync(External Drive)] (Sync) Job Public-->backup-1 finished with warning. Not all files/folders and their attributes are copied!
------------------------------


詳細なバックアップログを取得し確認すると、以下のようなメッセージが表示されていた。

------------------------------
[2017/09/26 03:09:50] # WARNING: Skip the "USBDisk1/backup/.streams/19/3C/00FC000000000000C2000C0200000000/:Zone.Identifier:$DATA" file which has an unsupported filename!
[2017/09/26 03:09:51] # WARNING: Skip the "USBDisk1/backup/.streams/D1/E7/00FC0000000000008E0C760100000000/:Zone.Identifier:$DATA" file which has an unsupported filename!
[2017/09/26 03:09:51] # WARNING: Skip the "USBDisk1/backup/.streams/D1/E7/00FC0000000000008D0C760100000000/:Zone.Identifier:$DATA" file which has an unsupported filename!
[2017/09/26 03:09:51] # WARNING: Skip the "USBDisk1/backup/.streams/D1/E7/00FC0000000000008C0C760100000000/:Zone.Identifier:$DATA" file which has an unsupported filename!
[2017/09/26 03:09:51] # WARNING: Skip the "USBDisk1/backup/.streams/D1/E7/00FC0000000000008B0C760100000000/:Zone.Identifier:$DATA" file which has an unsupported filename!

~(中略)~

[2017/09/26 03:09:54] The synchronization is finished.
[2017/09/26 03:09:54] Sync statistic: Total number of the folders: 5534. Total number of the files: 190407. Total updated size: 29.85 MB. Average updating speed: 51.92 (KB/sec). Time elapsed: 9 minutes 48 seconds
[2017/09/26 03:09:54] Not all files/folders and their attributes are synchronized!
[2017/09/26 03:09:54] 187 file(s) and 0 folder(s) are skipped because of their unsupported filename (or unsupported file size), and 46 symbolic link(s) is skipped because symbolic link is not supported.

[2017/09/26 03:09:54] Job finished with warning. (Not all files/folders and their attributes are copied!)
------------------------------

/.streamsフォルダ配下のファイル名がサポートされていないことが原因のようだ。おそらく$か:の記号が使えないのだろう。

このファイルが何に使用されているものかはよくわかっていないが、特に必要ではないファイルであるため、バックアップ対象から除外することで警告を表示させないようにした。

環境

今回の環境情報は以下の通り。

・QNAP TS-231P
・QTS 4.3.3.0299 (2017/09/01)

対応手順

「Hybrid Backup Sync」→「External Backup」の画面を開き、警告メッセージを出力するバックアップジョブを選択し、「編集」ボタンを押下する。


「同期化ジョブプロパティ」の画面が開くので、「フィルター」タブを開き以下設定を行う。なお、この設定は/.streamsフォルダだけではなく、ドットから始まるファイル名はすべてバックアップ対象から除外されるので、影響がある場合は注意。

・「ファイルタイプを除外する」をチェック
・「その他」をチェック
・入力欄に「/.*」


「OK」を選択すると、何やら長文で確認画面が表示される。すぐにバックアップを再取得するなら「はい」、スケジュール通りに取得する場合は「いいえ」を選べばよい。


しばらく待つと、以下の通り正常に完了する。もし警告がある場合は、ステータス欄に「詳細についてはログを確認してください」というメッセージが表示される。


念のためバックアップログを確認したところ、特に警告メッセージもなくバックアップジョブが終了していることが確認できた。

------------------------------
[2017/09/26 18:18:13] The synchronization is finished.
[2017/09/26 18:18:13] Sync statistic: Total number of the folders: 5128. Total number of the files: 157453. Total updated size: 88.75 MB. Average updating speed: 566.96 (KB/sec). Time elapsed: 2 minutes 40 seconds
[2017/09/26 18:18:13] Job finished.
------------------------------

参考

・Hyride Backup Sync - Beta create hidden folder

2017年9月21日木曜日

Zabbixでログに記載されている数値を抽出して監視する

自宅ではsquid + squidGuardを組み合わせたプロキシサーバを使ってWebフィルタリングの機能を実装している。squidGuardではスクリプトを使ってフィルタリング対象のURL情報を更新しているが、いつ更新がされたかわからいので、更新が発生した際にZabbixにて検知できるようにすることにした。

squidGuardで利用しているURL更新スクリプトは、更新されたURL数をログに出力するので、そのURL数の情報を抽出して、Zabbixにてログ監視を行う。当然、squidGuard以外でも、ログに数値が出されるもの(例えばウイルススキャンの結果など)であれば、同様の方法で監視ができるようになる。

環境

今回の環境は以下の通りとなる。

------------------------------
・Zabbix: 2.2.19
・Squid Cache: Version 3.5.20
・SquidGuard: 1.4 Berkeley DB 5.3.21: (May 11, 2012)
------------------------------

アイテムを作成

まずは、監視対象のホストにアイテムを追加する。監視対象のログは以下のような内容となる。

2017-09-18 14:24:14 [1402] update: added 35 entries, deleted 0 entries

update: added XX entriesのXXの値を取り出して監視をすることにする。今回は以下のように設定した。

------------------------------
・名前:squidGuard
・タイプ:Zabbixエージェント (アクティブ)
・キー:
 log[/var/log/squidGuard/squidGuard.log,"update: added ([0-9]+)",,,skip,\1]
・データ型:ログ ※「数値」でも問題ないと思われる
・更新間隔(秒):30
・ヒストリ保存期間(日):7
・アプリケーション:OS
------------------------------


「保存」ボタンを押して、想定通りアイテムが作成されていることを確認する。


「キー」の設定について、もう少し詳しく説明する。logの構文は以下の通りとなる。

log[/path/to/file/file_name,<regexp>,<encoding>,<maxlines>,<mode>,<output>]

第1引数には監視対象をログのフルパスを指定する。

第2引数<regexp>にはログに含まれる取得対象の文字列を記載する。ここで、数値として取り出したい箇所に「([0-9]+)」を記載する。これは正規表現で「1桁以上の連続する数字」を表している。()で囲んでいる意味は後述する。

第5引数<mode>はall (デフォルト)とskipが選べる。allの場合は、監視対象ログの過去のログも遡って取得する。skipを指定すると、過去のログは取得しない。Zabbixサーバが停止している時間の監視漏れを防止したいのであればallとした方がよいのだが、過去のログが大量にある場合は、多数のログ取得・トリガーの実行が発生してZabbixが高負荷になる恐れがあるので注意する。

第6引数<output>に「\1」を指定する。これは第2引数で()で囲んだ箇所をアイテムの値として抽出するという設定となる。

トリガーを作成

次に、先ほど作成したアイテムに対するトリガーを作成する。

------------------------------
・名前:squidGuard
・条件式:
 {t3023ce72:log[/var/log/squidGuard/squidGuard.log,
  "update: added ([0-9]+)",,,skip,\1].last()}#0
・障害イベントを継続して生成:チェック
・深刻度:軽度の障害
------------------------------


条件式ビルダーで条件式を作成する場合は、以下のように設定する。


これでZabbix側の設定は完了となる。

監視テスト

試しに監視対象ログに文字列を書き込んで監視テストをしてみる。さくっとechoでログに文字列を書き込んでみる。

# echo "2017-09-18 14:24:14 [1402] update: added 35 entries, deleted 0 entries" >> /var/log/squidGuard/squidGuard.log

ログを確認する。下線部の情報がZabbixにアイテムとして取り込まれる想定となる、

# tail /var/log/squidGuard/squidGuard.log
------------------------------
2017-09-18 14:24:14 [1402] update: added 35 entries, deleted 0 entries
------------------------------

Zabbix側で「監視データ」→「最新データ」を表示し、先ほど設定した「squidGuard」のアイテムのヒストリを確認する。

以下の通り、値のみが取得できている。


「監視データ」→「トリガー」を確認すると、こちらも想定通りsquidGuardのトリガーが動作していることが確認できる。


以上で、設定は完了となる。

参考

・Zabbix Documentation 2.2 - 6 ログファイル監視
https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/log_items

2017年9月8日金曜日

DFSレプリケーションを使ってデータを差分同期するファイルサーバを構築する

Windowsのファイルを別のWindowsに同期する機能として、「DFSレプリケーション (以下、DFS-R)」の機能がある。DFS-Rはファイル単位ではなくブロック単位での差分を検出して同期するため、差分転送のデータ量が少ないといったメリットがある。

今回はWindows Server 2012を利用して、DFS-Rによるファイル同期を試してみることにする。

構成

構成は以下の通り。以下2台のサーバーは同一ドメインに属している必要がある。

 ・コピー元:ホスト名 t1202w212 / Windows Server 2012 Standard
 ・コピー先:ホスト名 t1201w212 / Windows Server 2012 Standard

DFS-Rは、コピー元からコピー先への一方行のレプリケーションを構成することとする。

手順

1. 役割の追加

2台のサーバーで以下役割の追加を行う。「DFSレプリケーション」を選択すると自動で表示される役割管理ツールも合わせてインストールしておく。

 ------------------------------
 ファイルサービスおよび記憶域サービス
  →ファイルサービスおよびiSCSIサービス
   →DFSレプリケーション
 ------------------------------

なお、以下画面では、DFSレプリケーション以外にも、ファイルサーバーの機能を追加しているが、レプリケーションするだけであれば必須ではない。


2. レプリケーショングループの作成

「サーバーマネージャー」→「ツール」から「DFSの管理」を選択する。DFSの管理の左ペインの「レプリケーション」を右クリックし、「新しいレプリケーション グループの作成」を選択する。

新しいレプリケーション グループ ウィザードが立ち上がるので、以下のように設定する。なお、一番最初に選ぶレプリケーション グループは、「汎用」と「データ収集用」とあるが、単純な2台のレプリケーションであれば、「データ収集用」を選べばよいらしい。
※「汎用」でできることは、今回は検証しておらず不明

 ------------------------------
 ・レプリケーション グループの種類:データ収集用
 ・レプリケーション グループの名前:任意
 ・ドメイン            :所属しているドメイン
 ・ブランチ サーバー       :コピー元のサーバーホスト名
 ・レプリケート フォルダー    :コピー元のフォルダーのパス
 ・ハブ サーバー         :コピー先のサーバーホスト名
 ・ターゲット フォルダー     :コピー先のフォルダーのパス
 ・スケジュール          :継続的にレプリケートする
 ・帯域幅             :最大
 ------------------------------


以上を適切に設定すると、レプリケーション グループの作成に成功する画面が表示される。


3. コピー先を読み取り専用にする

今回は一方行のレプリケーションとしたいのだが、DFS-Rは厳密には一方行の同期という設定は存在しないようだ。その代わりに、コピー先を読み取り専用とすることで、同等の機能を実現することが可能となる。

作成したレプリケーション グループを選択し、「メンバーシップ」タブにて、コピー先のフォルダーを右クリックし、「読み取り専用にする」を選択するだけでよい。



読み取り専用にした後、試しにコピー先のフォルダーに新しいフォルダーを作成しようとすると、以下の通りアクセス拒否されることがわかる。当たり前だが、「続行」ボタンを押してもアクセス拒否がされ、コピー先のフォルダーの変更ができないようになっている。


なお、読み取り専用の動作は、結局NTFSのアクセス権と同様の設定で制御しているようで、もし設定時にアクセスできるユーザーでログインしている場合は、一度ログオフしないと設定が反映されないので注意しよう。

2017年9月2日土曜日

iptables入門

Linuxで長らくパーソナルファイアーウォールとして利用されているiptablesではあるが、設定が面倒ですぐにサービスを止めてしまいがちである。とはいえ、セキュリティ上、無効化するのはよくないので、設定方法を簡単にまとめてみた。

設定概要

ファイアーウォールを設定する場合、基本的には以下の通りに設定する。

 INPUT方向 (外部 → サーバー) : デフォルト拒否。必要なポートのみ許可
 OUTPUT方向 (サーバー → 外部) : デフォルト許可

今回設定する内容を図示したものが以下となる。



設定手順

それではiptablesを設定していく。iptablesでは、一つ一つのルールをコマンドで設定していく。

1. ルールを全部削除する

既存のiptablesの設定が残っていると設定が綺麗にならないので、すべての設定を削除する。ただし、いきなり削除してしまうと、SSHといったリモート接続用の通信もできなくなってしまうので、デフォルトのポリシーをACCEPTに変えてから実施するようにする。

# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -F

なお、FORWARDは利用しないので、DROPにしておく。

# iptables -P FORWARD DROP

ルールを確認するコマンドは以下の通り。すべてのルールがない状態となっている。

# iptables -L
------------------------------
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
------------------------------

2. 共通のルールを追加する

まずは共通のルールとして2つのルールを設定する。1行目はサーバー側から外部に通信した際の確立した通信を許可するルールで、2行目はループバックアドレスの通信を許可するルールとなる。

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT

「ESTABLISHED」は接続が確立してACKフラグの付いたパケットのことであり、TCPの3-WAYハンドシェイクで通信確立後のすべての通信を許可する。「RELATED」はFTP DATAなどの通信を許可するための設定らしいので、一応許可しておく。

また、pingの応答を許可するために、Echo Reply (Type 0)とEcho Request (Type 8)を許可するルールを追加する。

# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

3. 個別のルールを追加する

後は要件に応じて必要なポートを開ける。コマンドは以下を定型文として覚えてしまえばよい。-mオプションと-pオプションのプロトコルはそろえること。

 iptables -A INPUT -m state --state NEW -m <tcp/udp> -p <tcp/udp> --dport <port> -j ACCEPT

「NEW」は接続開始要求時のSYNフラグのみが付いたパケットを許可する設定となる。接続確立後は、「ESTABLISHED」の状態(ACKフラグ)が付いたパケットとなるので、先に設定した「確立した通信を許可」のルールにて通信が許可される。

例として、私の環境では以下のように設定した。

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 161 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 162 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 123 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 10051 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 514 -j ACCEPT

4. INPUTのデフォルトのポリシーをDROPに変更する

設定が完了したところで、デフォルトのポリシーをDROPに変更する。

# iptables -P INPUT DROP

最終的な設定を確認すると、以下の通りになる。

# iptables -L
------------------------------
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            icmp echo-reply
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:snmp
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:snmptrap
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:zabbix-trapper
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:syslog

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
------------------------------

5. 問題なければ設定を保存

通信に問題がなさそうであれば、設定を保存する。

# service iptables save
------------------------------
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[  OK  ]中:
------------------------------

設定が以下のファイルに反映されていることを確認する。

# cat /etc/sysconfig/iptables
------------------------------
# Generated by iptables-save v1.4.7 on Sat Sep  2 09:11:41 2017
*filter
:INPUT DROP [220:23012]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1692:292692]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 161 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 162 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 123 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10051 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 514 -j ACCEPT
COMMIT
# Completed on Sat Sep  2 09:11:41 2017
------------------------------

以上で設定は完了となる。

人気の投稿