「NAS」カテゴリーアーカイブ

Synology NASとLinux(Debian Buster)を1台のUPSに連動させる その1

自宅のネットワーク環境を10Gbに変更すべく、色々なものを10Gb対応製品に入れ替えました。
NASもASUSTORの2ベイのものからSynologyの6ベイモデルDS1618+へと変更しました。
DS1618+はそのままでは10GbEには対応していませんが、ネットワークカードを追加することで対応します。

以前はPC類を停電から守るためにUPSを使用していましたが、バッテリー交換に結構なお金がかかることや、停電など殆どしないことからUPSの運用をやめていました。
今回はHDDの台数も増えたことからUPS運用を再開することにしました。

以前はAPCのSmart-UPS 750を使用していましたが、NASとWebサーバーであるNUC(小型PC)とネットワークスイッチのみ保護できればいいので、小型のものを採用しました。
メーカーは同じくAPCでBR550S-JPというモデルです。

UPSと機器をネットワーク接続ではなくUSBやシリアルケーブルなどで接続する場合は、UPSと通信できる機器は1台のみです。
安いUPSではネットーワークインターフェースを持っていませんので、基本的にはUSBでの接続になるかと思います。

今回はまずAPCのUPSとSynologyのNASをUSBで接続し、SynologyのNASのネットワークUPSサーバー機能を使用し他の機器を更に接続します。

UPSとNASの接続は簡単でAPCのUPSに付属のUSBケーブルでUPSとNASを接続するだけです。
設定もすごく簡単でSynologyのコントロールパネルを開きハードウェアと電源の項目でチェックボックスをONにしていくだけです。

今回はNASがUPSサーバーにもなりますので、セーフモードになるまでの時間は他の機器をシャットダウンするまでの時間よりも長くしておいてください。
またネットワークUPSサーバーを有効にするにもチェックを入れます。
更に許可されたDiskStationデバイスをクリックして、UPS管理する機器のアクセス許可を行います。

アクセス許可はIPアドレスで行いますので、機器のIPはDHCPではなく固定IPで運用する必要があります。
UPSとNASの設定に関してはこれで終了です。

次回はSynologyのNASとDebia(Buster)のUPS連携の設定を行います。
Synology NASとLinux(Debian Buster)を1台のUPSに連動させる その2に続きます

MiniDLNAデータベース情報変更PHP

MiniDLNAのタイトル変更を行うのに、DBを直接編集するのはあまりにも面倒なので
PHPでタイトル変更が出来るものを作ってみました。
UTF8環境でしかテストしていません。
他の文字コード環境にて正しく動作するかは分かりません。

まず以下のファイルをDLして解凍してください。
MiniMiniDLNAデータベース情報変更PHP

tree.php、list.php、editor.phpの最初にある以下の行を、MiniDLNAのDB保存先に変更してください。
$DB_FILE=’/var/cache/minidlna/files.db’;

あとは解凍した全ファイルを、PHPが動作可能なフォルダにコピーしてください。
index.htmlにアクセスすればページが表示されます。
files.dbやfiles.dbがあるフォルダには適切な権限を与えてください。
また、PHP用のSQLiteライブラリも必要となります。
debianであれば以下のコマンドでパッケージを導入してください。

# apt-get install php5-sqlite
apache2ctlの再起動
# /usr/sbin/apache2ctl restart

MiniDLNA Editor画面
minidlna

左側にフォルダの階層が表示されますので
エクスプローラーと同じようにフォルダを展開し選択してください。

選択したフォルダにファイルが存在すれば、画面右側にファイルの一覧が表示されます。
一覧から編集をクリックすると、ファイルの詳細情報が表示され
同じ画面からタイトル等の変更が可能となります。
一覧からファイル名をクリックすると、ファイルをダウンロードできます。
ファイルの一覧にはページングの機能がありません。
多量のファイルが表示されるフォルダの場合ですと
サーバー、ブラウザ共に負荷が非常に高くなりますのでご注意ください。

2010/03/19 追記
Version1.1にアップデートしました。
ファイル一覧にページング機能を追加しました。
その他のバグを修正しました。

2010/03/20 追記
Version1.2にアップデートしました。
ファイル一覧からファイルをダウンロードできるようにしました。
その他

WoooでDLNA再生する

テレビをRegzaから日立のプラズマWooo(XP03)に買い換えました。

Woooからmediatombが見え、ファイルの一覧までは表示出来るものの
mpeg2すら再生出来ません・・・
色々と調べてみるとmediatombはDLNA規格に準じていないらしく
BraviaやWoooでは正常に動かないらしいです。

Twonkyは有償なので入れたくありませんし、フリーのDNLAサーバーがないか調べてみました。
するとMiniDLNAというソフトがありました。

インストールはコンパイルからやる必要があるようで、以下を参考にインストールしました。
MiniDLNA | KURO-BOXの館 ZQwoonetSNS-CoDE-
※既にリンク先のサイトはなくなっているようです

ますソースの取得です。
# cvs -d:pserver:anonymous@minidlna.cvs.sourceforge.net:/cvsroot/minidlna login

パスワードの入力が求められるので、そのままエンターキーで。
# cvs -z3 -d:pserver:anonymous@minidlna.cvs.sourceforge.net:/cvsroot/minidlna co minidlna

KazHatよりバグ情報がありました。
tagutils/tagutils.cに一行追加することで、タイトル、アーティスト、ALBUMなどが正しく表示されるようです。

#include “../config.h”    ←この1行を追加
#ifdef HAVE_ICONV_H
#include
#endif

参考URL
http://kazhat.at.webry.info/201007/article_5.html

コンパイルを行います。
# cd minidlna
# make

この時に必要なパッケージが足りないと、エラーと共に必要なライブラリが表示されます。
足りないパッケージは、お使いの環境で変わってきます。
殆どのパッケージは出てるライブラリの後ろに「-dev」を付けてapt-getすればいけると思います。
libid3tagは「0-dev」を付けてlibid3tag0-devで取得できました。

コンパイルが終わったらインストールします。
# make install

実行スクリプトを/etc/init.dにコピー
# cd linux
# cp minidlna.init.d.script /etc/init.d/minidlna

コピーした実行スクリプトをrc.dに登録し、OS起動時にデーモンとして起動するようにします。
# update-rc.d minidlna defaults
※OS起動時の自動実行を無効にするには、update-rc.dコマンドに「-f」オプションを付けて実行します。

/etc/minidlna.confにて設定を行い起動します。(OS再起動でもOK)
# /etc/init.d/minidlna start
設定ファイルの設定内容は、下の方に書いています。

MiniDLNAを動かすと無事Woooにてmpeg2を再生可能に!
ただMiniDLNAはmediatombのように使い勝手は良くありません。
※WoooのDLNAクライアント機能は、mpeg2しか再生できません。
confファイルもさわってあげないとDaemonをrestartしてもファイルの更新もしません。
(/tmpにDBファイル「/tmp/minidlna/files.db」があるので、OSをRebootすれば更新されます)

MiniDLNA version 1.0.17では、正常に更新されます。

ちなみにmediatombとの共存も可能なので、Woooで再生する可能性がある動画のみ
MiniDLNA用の動画ディレクトリに保存するようにしました。
通常はmediatombでWoooからのみMiniDLNAという感じで運用しています。

設定ファイルについて
/etc/minidlna.confの内容を少し書いておきます。(MiniDLNA version 1.0.17)

port
minidlnaが使用するポートを設定します。(通常は変更の必要はありません)
HTTPを利用したDLNAの提供時に利用?

network_interface
LANが複数ある場合に使用するLANを指定出来ます。
デフォルトではコメントアウトされているので、必要な場合は設定を行ってください。

media_dir
初期設定では/optとなっています。
ここで指定されているフォルダが、minidlnaが管理するフォルダとなります。
設定は「audio」「video」「images」と、それぞれ個別にフォルダを設定することも可能です。
分ける場合の例です。
media_dir=A,/mnt/disk1/share/minidlna/Music
media_dir=V,/mnt/disk1/share/minidlna/Movie
media_dir=P,/mnt/disk1/share/minidlna/Photo

friendly_name
DLNAクライアントに表示する名称を設定できます。
デフォルトはコメントアウトされていますので、DLNAサーバーを変更したい場合は設定してください。

db_dir
minidlnaはデータベースにSQLLiteを使用しています。
データベースファイルの保存先を変更したい場合は、設定を変更してください。
デフォルトはコメントアウトされており、/tmp/minidlnaに保存されます。
/tmp以下はOSを再起動するとファイルが消えてしまい、サービス起動でデータベースファイルが再作成されます。
当然ながら初期設定ですと、OS起動時の負荷も増えます。
コメントアウトを外し保存先の設定を変更した方が良いと思います。
保存されるDBファイル名は「files.db」です。

inotify
カーネルからのファイル変更通知を受け取り、自動的にデータを更新するかの設定です。
デフォルトはyesになっており、ファイルの更新があると自動的にデータが更新されます。
実際にファイルを更新しfiles.dbを確認したところ、データベース上のデータは更新されていました。
もちろんクライアント上の表示も更新されていました。

strict_dlna
yes指定で、サイズが大きいJPGをサーバー側でダウンスケーリングするみたいです。
特に支障がなければ変更の必要は無いと思います。
コメントを見る限りではSonyのDLNAでは必要?

presentation_url
HTTPを利用したDLNAの提供時に利用?

notify_interval
データの更新間隔ですが、inotify=yesであれば基本的に長間隔で良いと思います。
サービス停止時にファイルが更新されれば、データは更新されませんので
定期的に更新チェックをさせるための機能と思われます。

files.dbについて
files.dbを開いて見てみました。
ALBUM_ART、CAPTIONSというテーブルがありIDとパス項目があるので、このテーブルにイメージのパスをセットすれば、クライアントでのアルバムや動画のイメージ表示に使えるかもしれません。
DETAILSというテーブルに基本的なファイル情報が保存されています。
このテーブルのTITLE項目を変更すれば、クライアント上でのファイル名の表示が変更可能です。

これらの情報を変更するGUIをphpで作ろうかと思いましたが、なんとなく作成意欲が湧かないので作りません(笑)
作っちゃいました(笑)

DoS攻撃対策 Apache mod_antiloris

mod_evasive、mod_limitipconnと攻撃対策のモジュールを導入しましたが
今回は一番厄介なSlowlorisの対策モジュールを導入します。

最初にmod-pacify-slowlorisを入れてみましたが
ページが正常に表示されなかったりしたので、mod_antilorisを入れる事にしました。
(mod-pacify-slowloris、mod_antilorisでも完全に防ぐのは、現状では難しいようです)

まずは、適当なディレクトリにソースをDL。

ディレクトリ移動
#cd /usr/local/src

mod_antiloris-0.4.tar.bz2のDL
#wget ftp://ftp.monshouwer.eu/pub/linux/mod_antiloris/mod_antiloris-0.4.tar.bz2

解凍
#tar -xjvf mod_antiloris-0.4.tar.bz2

解凍したソースディレクトリに移動
#cd mod_antiloris-0.4

APXSを利用してコンパイル&インストール
#/usr/bin/apxs2 -i -a -c mod_antiloris.c
※APXSが未インストールの場合は
#apt-get install apache2-prefork-devで先にインストールしてください。

以下の行をapache2.confに追加
LoadModule antiloris_module /usr/lib/apache2/modules/mod_antiloris.so

設定が終わったらconfが正しく設定されたかを確認。
#apache2ctl -M

上記コマンド実行後にantiloris_moduleとSyntax OKが表示されれば、設定自体は問題ない事になります。

設定が問題なければ、apacheを再起動
#/etc/init.d/apache2 restart

暫くこれで様子を見てみる予定です。
それでもSlowlorisの被害にあうようであればiptablesのrecentで弾く事も検討します。

Slowlorisについて

Apacheに、DoS攻撃に繋がる脆弱性が新たに見つかったそうだ(本家/.記事より)

この脆弱性は、これを利用したHTTP DoSツール「Slowloris」がリリースされたことから明らかになったとのこと。この攻撃ツールはApacheに不完全なリクエストヘッダーを送り続けるもので、Apacheが最後のヘッダが送られてくるのを待つ間、偽のヘッダを送ることで接続をオープンにし続け、Apacheのプロセスを一杯にさせるものだという。

脆弱性はApache 1.x、 2.x、 dhttpd、 GoAhead WebServer、そしてSquidにて確認されているが、IIS6.0、 IIS7.0、およびlighttpdでは確認されていないとのこと。

SANSでは詳細のレポートが挙がっており、TimeOutディレクティブでタイムアウト値の設定を変えることでこの攻撃を軽減することが可能とのことで、今のところ対策はこれくらいしかないそうだ。

DoS攻撃対策 Apache mod_limitipconn

前回DoS攻撃対策としてmod_evasiveを導入しました。
今までは攻撃をあまり気にしていませんでしたが
そこそこmod_evasiveが働いているようなので、更に攻撃対策を強化することに。

今回導入するのは、同時接続数を制限してくれるmod_limitipconnというモジュールです。
このモジュールは同一IPからの同時接続数を制限してくれます。

まずは、適当なディレクトリにmod_limitipconnのページからソースをDLしてインストール。

ディレクトリ移動
#cd /usr/local/src

mod_limitipconn-0.23のDL
#wget http://dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2

解凍
#tar xjvf mod_limitipconn-0.23.tar.bz2

解凍したソースディレクトリに移動
#cd mod_limitipconn-0.23

Apache2用にMakefileを変更
#vi Makefile

7行目のAPXSコマンドをApache2用に変更
※APXSが未インストールの場合は
#apt-get install apache2-prefork-devで先にインストールしてください。

#   the used tools
APXS=apxs
APACHECTL=apachectl

↓ のように書き換え

#   the used tools
APXS=/usr/bin/apxs2
APACHECTL=apachectl

コンパイル&インストール
#make install

Apacheの設定にモジュールの記述を追加
#vi /etc/apache2/apache2.conf

LoadModule limitipconn_module /usr/lib/apache2/modules/mod_limitipconn.so

ExtendedStatus On



MaxConnPerIP 3
NoIPLimit image/*


※Locationの設定は複数記述することが出来ます。
また、.httaccessに記述することも可能です。
複数の設定を行うことで、より細かく制限を行う事が出来ます。

上記の設定の意味は、/(httpルート)以下のディレクトリで
同一IPからの同時接続数を3に制限する。
但し、MIMEタイプ image/* は除く、という設定になります。
MaxConnPerIPが3だとサイトによっては少ないかもしれません。
ZIPや大きなファイルなど、回線負荷に関わるものを、MIMEで少なめに指定するのは有効だと思います。
しかし通常のページを3に制限してしまうと、JavaScriptファイルを裏で読んでくれなかったりしますので
ページとして問題が出る場合があります。
その場合は数字を少し大きくしてあげるか、特定のファイルタイプのみカウントの対象(または非対象)にするか
MIMEタイプでカウントの対象外になるようにしましょう。

設定が終わったらconfが正しく設定されたかを確認。
#apache2ctl -M

上記コマンド実行後にlimitipconn_moduleとSyntax OKが表示されれば、設定自体は問題ない事になります。

設定が問題なければ、apacheを再起動
#/etc/init.d/apache2 restart

最後にうまく動作するかテストを行うといいと思います。
※ページによってはうまく読み込めなかったりしますので、テストされる事をお勧めします。
ブラウザを複数開いて、一気にアクセスしてみると簡単にテスト出来ます。

DoS攻撃対策 Apache mod_evasive

最近、稀にサーバー負荷が非常に高い時があります。
その時でも完全にフリーズしているわけではないが、ログインして再起動するのがやっとな状況で
サーバーとしては機能しておらず、何かの対策を行う必要が出て来ました。

まずはKernelを最新の2.6.32.2にアップ。
これだけでは解決しないと考えているので、一番疑わしいhttpdにも対策を。
既にiptablesにてヤバそうな国からのアクセス自体をブロックしているが
DoS攻撃などは、ウィルス感染により足場サーバーから行われるので
DoS攻撃をブロックすることにしました。

今回はDoS攻撃に有効なアパッチ用のモジュールmod_evasiveを使用することにました。

まずは、適当なディレクトリにzdziarski.comのmod_evasiveページからソースをDLしてインストール。
※既にリンク先のサイトはなくなっているようです

ディレクトリ移動
#cd /usr/local/src

mod_evasive v1.10.1のDL
#wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz

解凍
#tar xzf mod_evasive_1.10.1.tar.gz

解凍したソースディレクトリに移動
#cd mod_evasive

このモジュールはAPXSを使用してコンパイル&インストールを行うのですが
デフォルトではAPXSが入っていなかったので、パッケージをインストール。
#apt-get install apache2-prefork-dev

APXSを利用してコンパイル&インストール
#/usr/bin/apxs2 -i -a -c mod_evasive20.c

※ブラックリスト追加時にメールを送信したい場合は
mod_evasive20.cの中にメールコマンドがハードコーディングされているので
コマンドを書き換える必要があります。

45行目の以下の行がメール送信コマンド部分です。
#define MAILER “/bin/mail %s”

/* BEGIN DoS Evasive Maneuvers Definitions */

#define MAILER	"/bin/mail %s"
#define  LOG( A, ... ) { openlog("mod_evasive", LOG_PID, LOG_DAEMON); syslog( A, __VA_ARGS__ ); closelog(); }

Exim4の場合は ↓ のように書き換えることで送信出来ます

/* BEGIN DoS Evasive Maneuvers Definitions */

#define MAILER	"mail -t %s"
#define  LOG( A, ... ) { openlog("mod_evasive", LOG_PID, LOG_DAEMON); syslog( A, __VA_ARGS__ ); closelog(); }

件名も付けたい場合は ↓ のように書き換えることで件名付きで送信出来ます

/* BEGIN DoS Evasive Maneuvers Definitions */

#define MAILER	"mail -s 'ここに件名を入れます' -t %s"
#define  LOG( A, ... ) { openlog("mod_evasive", LOG_PID, LOG_DAEMON); syslog( A, __VA_ARGS__ ); closelog(); }

当然ならがApacheの設定ファイルのDOSEmailNotifyに(後述の設定部分参照)
送信先のメールアドレスを書いて有効にする必要があります。

コンパイルとインストールに成功したようですが
なんかモジュールのデフォルト設定書き込みに失敗したみたいなので、手動で書きこみます。

confファイルに追記(追記はhttpd.confで良いと思いますが、私はファイル分けが面倒な人なので・・・)
#vi /etc/apache2/apache2.conf

以下の行をapache2.confに追加

LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so


DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSLogDir "/var/log/apache2/mod_evasive/logs"
#DOSEmailNotify info@domain
#DOSSystemCommand   ""
#DOSWhitelist       127.0.0.1

これらの設定の意味は、「mod_evasive 設定」などで検索すると沢山出て来ますので、省略させて頂きます。
ちなみにこの設定では、1秒間に同じページに2回アクセスがあるか
1秒間にサイトに50回以上アクセスがあった場合に、60秒間 403Eroorを返すような動作となります。
ブロックの記録は、DOSLogDirで設定した場所へブロックしたIPが保存されます。

設定が終わったらconfが正しく設定されたかを確認。
#apache2ctl -M

上記コマンド実行後にevasive20_moduleとSyntax OKが表示されれば、設定自体は問題ない事になります。

設定が問題なければ、apacheを再起動
#/etc/init.d/apache2 restart

ちゃんとブロック出来るかmod_evasiveのソースに付属していた、テストスクリプトを実行
#perl test.pl

テストのレスポンスが、途中からHTTP/1.1 403 Forbiddenを返すようになれば
うまくブロックが出来ている事になります。

mod_evasive自体は設定通りの振る舞いをするだけで
決して万能なブロックツールというわけではありません。
他のブロック方法との併用や、環境にあった適切な設定を行うことが大切だと思います。