2017年8月29日火曜日

LinuxのOSユーザーパスワードに有効期限を設定する


CentOSなんかでOSユーザーのパスワードに有効期限を設定し、
有効期限が近づいてきたらメール通知するような感じにしたい。
認証サーバを立てずに!


パスワード有効期限の設定

前回パスワード設定から指定日数過ぎたアカウントのパスワードを無効化
という事は出来る様なので、そのとおりに。

今回はアカウントロックまでは行わないけど、ロックもできるみたい。
例)パスワード有効期限を90日に設定
# chage -M 90 user_name

パスワード有効期限が切れた後にSSHアクセスすると以下のような文言が表示され
変更を促されます。
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user user.
Changing password for user.
(current) UNIX password: <古いパスワード>
New password: <新しいパスワード>
Retype new password: <新しいパスワード>

パスワード有効期限切れ通知

既存の機能では期限切れの通知を出すような機能はないそうなので、
/etc/shadowファイルから計算するようにする。

shadowファイルの3項目目に設定日からの時刻が記載されているので、
dateコマンドから取得した値で引くことで初期パスワード設定日から何日経過しているかを計算できる。
# expr `date +%s` / 60 / 60 / 24

これを利用してバッチを作って1日一回cronで実行するようにすればいい。
#!/bin/bash
DAY=$(expr `date +%s` / 60 / 60 / 24)
USER_LIST="$1"
THRESHOLD="76"
PASSWD=$(getent shadow |grep -f $USER_LIST)

for line in ${PASSWD[@]}
do
USERS=$(echo $line |awk -F\: '{print $1}')
PASS_TIME=$(echo $line |awk -F\: '{print $3}')
PASS_DAYS=$(expr $DAY - $PASS_TIME)
if [ "$PASS_DAYS" -ge $THRESHOLD ]; then
echo "$USERS : $PASS_DAYS"
{
echo "ユーザー名:$USERS"
echo "      パスワード変更後 $PASS_DAYS 日経過"
echo ""
} >> $BODY
HANTEI=NG
else
echo "パスワード期限間近のユーザーはいません"
fi
done

if [ "$HANTEI" = NG ]; then
{
echo "■パスワードの変更方法"
echo " 対象サーバへログインしパスワードコマンドを実行して変更します"
echo "-------"
echo "$ passwd"
echo "-------"
echo ""
echo "■パスワード有効期限が切れた場合"
echo " サーバログイン時にパスワード変更を求められるので、任意のパスワードへ変更してください。"
echo " サーバへSSH接続しパスワードを設定します。"
echo "-------"
echo "You are required to change your password immediately (root enforced)"
echo "WARNING: Your password has expired."
echo "You must change your password now and login again!"
echo "Changing password for user user."
echo "Changing password for user."
echo "(current) UNIX password: <古いパスワード>"
echo "New password: <新しいパスワード>"
echo "Retype new password: <新しいパスワード>"
echo "-------"


標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド
有限会社ナレッジデザイン 大竹 龍史 市来 秀男 山本 道子 山崎 佳子
SBクリエイティブ
売り上げランキング: 9,975

2017年8月26日土曜日

LINKIN PARK


もう一度思い出したい。


Hybrid Theory

Hybrid Theory
Hybrid Theory
posted with amazlet at 17.08.26
Linkin Park
Warner Bros / Wea (2000-12-27)
売り上げランキング: 756

多分先にMeteoraから入った人が多いのかもしれないですね。
聞き始めた当時はそこまでこのアルバムは好きじゃなかった。
でもバンド像当を知ってくるとこのアルバム始まりというヤバさがわかってくせになる。

●In The End

Meteora

Meteora
Meteora
posted with amazlet at 17.08.26
Linkin Park
Imports (2010-09-22)
売り上げランキング: 694


多分洋楽ロックの入り口このアルバムの曲だった人はかなりいるんじゃないでしょうか。
彼らの音楽がどれくらい凄いか、音楽的貢献がどうだかは知らない。
けどNumbやFaint曲を知らない男はいないだろ?

●Numb


MINUTES TO MIDNIGHT

ミニッツ・トゥ・ミッドナイト
リンキン・パーク
ワーナーミュージック・ジャパン (2012-06-20)
売り上げランキング: 5,967

当時はMeteoraの次がこれ?って少し落胆してたのは覚えてる(笑)
こうやって振り返ってみると全くブレていないことは明白だけど、
意外と大人になってから一番聞きてる気がする。。。

●Bleed It Out


A Thousand Suns

A Thousand Suns
A Thousand Suns
posted with amazlet at 17.08.26
Linkin Park
Warner Bros / Wea (2010-09-14)
売り上げランキング: 35,631


アルバムとしての完成度がすごい高い、個人的には好きなアルバム。
この曲が!というのは少ないんだけど、アルバムとして好きな感じ。
映画を見ているようにドキドキしたり壮大な世界観に浸ったり感動したりできる作品。

●The Catalyst


Living Things

Living Things
Living Things
posted with amazlet at 17.08.26
Linkin Park
Warner Bros / Wea (2012-06-19)
売り上げランキング: 9,832

この辺から今のリンキンのベースができてきたのかなという気がする。
初期衝動の曲たちから、大人の曲というかより深い暗闇が近いというか。。
多分このへんかなぁライブに行ったのは。

●Burn It Down


The Hunging Party

The Hunting Party
The Hunting Party
posted with amazlet at 17.08.26
Linkin Park
Warner Bros / Wea (2014-06-18)
売り上げランキング: 2,440

これもアルバムのテーマが強い作品。
昔のロック感と近年のオルタナ感がいい具合に混ざっていて好きです。
ただ今一つパンチが足らない気がする。

●Until It's Gone


One More Light

One More Light
One More Light
posted with amazlet at 17.08.26
Linkin Park
Warner Bros / Wea (2017-05-19)
売り上げランキング: 231

チェスターがいるリンキンとしては最後となってしまったアルバム。
そうなると曲やアルバムタイトルを深読みしちゃうけど、
まだ色々受け入れられない。

●Heavy

CDは残酷だな。
こんなに耳元でクリアに声が、音楽が聞こえるのに
その歌も音楽ももう一度リアルに体感できる日が失われてしまったなんて。

まだいまいち現実味を感じていないんだけど。
やっぱりニュースや動きをみているとどうやら本当のことのようだ。
解散はまぁ経験あるが、
死別はブンサテとフジファブがあったけれど、やっぱりしっくりこないもんだな。

イヤホンからは今までと同じように音楽は流れているんだもの。
オアシスが解散したときもファンは似たような気持ちだったんだろうか
あるいはNIRVANA?
俺はそんなに熱を持って好きだったわけじゃないかもしれない
ライブもサマソニとワンマンを1回くらいでそこまで多いわけじゃない。
でも毎回新曲、アルバムには胸を躍らせてCD買いに行き、しょっちゅう来日してくれていることが普通だと思っていた。

それが急にもうないと言われてもそんなにすぐには受け入れられないよ。

CDは残酷だ。

メンバーからの声明もアナウンスされた。
https://www.barks.jp/news/?id=1000144980
とりあえず、解散とかの単語が無くて安心したけれど
メンバーの不安や混乱が伝わってくる。

今年の来日公演のチケットはどうなるんだろう。そこまでには気持ちの整理もできているのかな。
https://www.hipjpn.co.jp/live/lp/
特設サイトも公開されていて集まるメッセージに改めて偉大さを再認識する。
http://chester.linkinpark.com/
チェスター・ベニントンに愛をもってご冥福をお祈りします。 #RIPCHESTER

2017年8月21日月曜日

SUMMER SONIC 2017 20日


関東3第フェスの3つ目!
そして今年最後のフェス。夏休みの終わりが聞こえてくる。。。
今年はついにFOO FIGHTERSがくる!ということなので
行かないわけにはいかない!20日に参加してきました~


感想


正直今年のラインナップは微妙だと思ってます。
メイン級のアーティストはまぁ充実していますが、それ以外が微妙。。
午前中は色んなステージをブラブラしていることが多かったですw
(毎年だんだんマリンステージにしかいない気がする。。)

でもやっぱりメイン級は凄い。
今年も参加できて、見ることが出来て、呼んでくれて感謝です。
以下メモ

●年々強くなる色物アーティスト枠
別に嫌いじゃないバンドもいるので悪く言いたいわけではないですが、
年々色物アーティスト、今年は「amazarashi」や「mili」や「ミオヤマザキ」といったアーティストの出演者が増えている気がする。今年はRAINBOWステージが午前中そんな感じで、
もう少しロックフェス感が欲しいなぁと正直に思った。

●減るバンド枠
これはもうどのフェスもそうなってきているけど、
ザ・ロックバンドという感じのアーティストはどんどん減っている。
今年はむしろISLANDSTAGEが個人的には一番楽しかった。
午後の大物アーティストになってくるとそんな事も無いけれどね。

●小さいステージが増えてる!
メッセ側に小さいステージが増えていて、
これが意外とよかった。移動中やご飯食べながら気軽にライブを見ることができる。
後はマリンとの移動がなければなぁ。。これはしょうがないけれど。

●グッズ完売
今年はグッズデザインを一新してんな~と思ったら2日目にはほぼ売り切れていたw
毎年確かにそんなに売れてなかったけど、少なく作りすぎやろー!
FOO FIGHTERS Tシャツ欲しかった。。。

参加アクト・セットリスト

Newspeark
通りかかったらなにやら好みの感じだった初見バンド。
なんとまだ結成して数ヶ月だって!?
凄いすきそうなのでCD欲しい。
...

ALL TIME LOW
今年2回も見れた!ニューアルバムバージョンのAL TIME LOW!
ちょっと前のサマソニではあんまり客入ってなかったのに成長したなぁ。
01.Last Young Renegade
02.Damned If I Do Ya
03.Backseat serenade
04.Dirty Laundry
05.Nice2KnoU
06.Cinderblock Garden
07.Something's Gotta Give
08.Weightless
09.Lost In Stereo
10.Dear Maria, Count Me In

ROYAL BLOOD
今年俺の中で一番ヒットしたかもしれない。最高にクールなバンド!
CD絶対買いにいく。
01.Where Are You Know?
02.Lights Out
03.Come On Over
04.I Only Lie When I Love You
05.Little Monster
06.Hook, Line & Sinker
07.Figure It Out
08.Ten Tonne Skeleton
09.Out of the Black

MAN WITH A MISSION
もはや決まり文句のような強炭酸なセットリスト。
多分一番ステージの金かかってた気がするw
01.database
02.Hey Now
03.take what you want
04.Emotions
05.Get Off of My Way
06.Dog Days
07.Dead in end Tokyo
08.Raise your flag
09.FLY AGAIN

BABY METAL
メタル好きやラウド好きが一番盛り上がって受け入れてるのがウケルw
みんな一緒になってサークル回ったり歌にあわせて叫んでるのはなんか凄かった。
俺は相変わらず曲に乗っていいのか歌に乗るべきなのかが良くわからんw
01.BABYMETAL DEATH
02.ギミチョコ!!
03.メギツネ
04.Catch me if you can
05.Road of Resistance
06.KARATE
07.ヘドバンギャー!!
08.イジメ、ダメ、ゼッタイ

FOO FIGHTERS
ほんと圧巻とはこのこと。
本人たちが一番楽しそうにライブしていて素敵だった。
アンコール無かったのが残念やが。。。
01.All My Life
02.Learn to Fly
03.The Pretender
04.My Hero
05.Big Me
06.Run
07.Rope
08.Walk
09.Times Like These
10.Under Pressure (Queen cover) (Dave on drums and Taylor on vocals)
11.Never Gonna Give You Up (with Rick Astley)(Rick Astley song)
12.Best of You
13.Everlong

毎年サマソニは体調、または天気が良くないというジンクスがあるんですがw
今年は雨も何とか降らなかったし良かったです。
面子はだんだん微妙になってきている気がするけど、毎年楽しみにしている洋楽フェスのひとつだしなんだかんだ毎年いっているので来年も期待しています。

リンキンの件もあるけど、海外勢に合える数少ない機会のひとつなので
とりあえず行っとけ!というフェスであり続けて欲しいな。

2017年8月17日木曜日

簡単なコマンドでのApacheアクセス解析


ツールや仕組みを入れるほどじゃないけど、
Apacheのアクセスログ解析をちょろっとやるときのコマンドメモ。



前提のログフォーマット
"%h [%{X-Forwarded-For}i] %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D"
※ユーザーアクセスがNATされる環境で実施しているため「X-Forwarded-For」ヘッダーを見ています。
不要な場合は読み替える。
※末尾に%Dで応答マイクロ秒が出力されるようにしている。

アクセス数と平均応答時間、ステータスコード毎のアクセス数


1日のログを1時間毎にPV数、ステータスコード毎のPV数、アクセスの平均応答秒を集計。
#!/bin/bash
EXCLUDE_URL01=".css\|.jpg\|.js\|.gif\|.png\|.ico\|HTTP/1.1\" 30\|HTTP/1.1\" 40\|HTTP/1.1\" 50"
EXCLUDE_URL02=".css\|.jpg\|.js\|.gif\|.png\|.ico"

echo "-DATE- -PV- -300- -400- -500- -平均応答時間[ms]-"
COUNT=0
MAX_COUNT=10
while [ $COUNT -lt $MAX_COUNT ]
do
COUNT_PV=$(grep "$DATE_YEAR:0$COUNT:" "$APACHE_LOG" |grep -vc "$EXCLUDE_URL01")
COUNT_300=$(grep "$DATE_YEAR:0$COUNT:" "$APACHE_LOG" |grep -v "$EXCLUDE_URL02" |grep -c "HTTP/1.1\" 30")
COUNT_400=$(grep "$DATE_YEAR:0$COUNT:" "$APACHE_LOG" |grep -v "$EXCLUDE_URL02" |grep -c "HTTP/1.1\" 40")
COUNT_500=$(grep "$DATE_YEAR:0$COUNT:" "$APACHE_LOG" |grep -v "$EXCLUDE_URL02" |grep -c "HTTP/1.1\" 50")
AVARAGE_SPEED=$(grep "$DATE_YEAR:0$COUNT:" "$APACHE_LOG" |awk '{m+=$NF} END{print m/'"$COUNT_PV"'}')

echo "$DATE_DAY:0$COUNT $COUNT_PV $COUNT_300 $COUNT_400 $COUNT_500 $AVARAGE_SPEED"

COUNT=$(( COUNT + 1 ))
done

COUNT=10
MAX_COUNT=24
while [ $COUNT -lt $MAX_COUNT ]
do
COUNT_PV=$(grep "$DATE_YEAR:$COUNT:" "$APACHE_LOG" |grep -vc "$EXCLUDE_URL01")
COUNT_300=$(grep "$DATE_YEAR:$COUNT:" "$APACHE_LOG" |grep -v "$EXCLUDE_URL02" |grep -c "HTTP/1.1\" 30")
COUNT_400=$(grep "$DATE_YEAR:$COUNT:" "$APACHE_LOG" |grep -v "$EXCLUDE_URL02" |grep -c "HTTP/1.1\" 40")
COUNT_500=$(grep "$DATE_YEAR:$COUNT:" "$APACHE_LOG" |grep -v "$EXCLUDE_URL02" |grep -c "HTTP/1.1\" 50")
AVARAGE_SPEED=$(grep "$DATE_YEAR:$COUNT:" "$APACHE_LOG" |awk '{m+=$NF} END{print m/'"$COUNT_PV"'}')

echo "$DATE_DAY:$COUNT $COUNT_PV $COUNT_300 $COUNT_400 $COUNT_500 $AVARAGE_SPEED"

COUNT=$(( COUNT + 1 ))
done

アクセスIPの統計情報


アクセスログのクライアントIPを集計してTOP10を表示。可能なら逆引きもする。
#!/bin/bash
EXCLUDE_URL01=".css\|.jpg\|.js\|.gif\|.png\|.ico\|HTTP/1.1\" 30\|HTTP/1.1\" 40\|HTTP/1.1\" 50"
EXCLUDE_URL02=".css\|.jpg\|.js\|.gif\|.png\|.ico"

COUNT_IP=$(grep -v "$EXCLUDE_URL02" "$APACHE_LOG" |awk '{print $1}' |sort |uniq -c |sort -nr |head -n"$COUNT_TOP")
{
echo "-count- -FromIP- -PTR-"
echo "$COUNT_IP" | while read -r line
do
FROM_COUNT=$(echo "$line" |awk '{print $1}')
FROM_IP=$(echo "$line" |awk '{print $2}')
LOOCKUP_IP=$(nslookup "$FROM_IP" |awk '/name \=/{ print $NF}'|head -n1 )
echo "$FROM_COUNT $FROM_IP $LOOCKUP_IP"
done
※クライアントIPをX-Forwarded-Forヘッダーから取得しているため、多少不恰好。

アクセスの多いURLを集計


アクセスの多いURL TOP10を集計。エラーアクセスを除く。
#!/bin/bash
EXCLUDE_URL01=".css\|.jpg\|.js\|.gif\|.png\|.ico\|HTTP/1.1\" 30\|HTTP/1.1\" 40\|HTTP/1.1\" 50"
EXCLUDE_URL02=".css\|.jpg\|.js\|.gif\|.png\|.ico"

grep -v "$EXCLUDE_URL01" "$APACHE_LOG" |awk '{print $7}' |sort |uniq -c |sort -nr |head -n"$COUNT_TOP"

遅延URLの集計


応答時間が遅いURL TOP10を集計。
#!/bin/bash
awk '{print $NF,$1,$4,$7}' "$APACHE_LOG" |sort -nr |head -n"$COUNT_TOP"

クライアントUserAgentを集計


クライアントUserAgent Top10を集計。エラー含まない。
#!/bin/bash
#!/bin/bash
EXCLUDE_URL01=".css\|.jpg\|.js\|.gif\|.png\|.ico\|HTTP/1.1\" 30\|HTTP/1.1\" 40\|HTTP/1.1\" 50"
EXCLUDE_URL02=".css\|.jpg\|.js\|.gif\|.png\|.ico"

grep -v "$EXCLUDE_URL01" "$APACHE_LOG" |awk -F\" '{print $6}' |sort |uniq -c |sort -nr |head -n"$COUNT_TOP"

なぜシェルでやってるかって?それしか出来ないからさ!

2017年8月14日月曜日

ROCK IN JAPAN FES 2017


今年もROCK IN JAPNA FESに行ってきました~
参加日は8月11日(金)、今年で7年連続7回目。



感想


気がついたら4日開催になってて、年々拡大、拡充しているロッキン。
夏の邦楽フェスの顔になってきてるなー感(関東だけ?)
金曜は天気は曇りだったけど雨は降らずに凄く過しやすかったです!

酒も旨いし今年の夏も最高でした~

以下メモ。
●ステージが1つ増える。
たしか今年からだと思いますが、「HILLSIDE STAGE」が追加されています。
去年追加された「まつかぜルート」に新しくできたステージ。

去年はちょろっとした飲食店があっただけな気がしたけど、今年はステージに。
去年は本当にただ移動するためだけの道だったのでこれはいいですね。
飲食店も少しだけならある。

「GRASS STAGE」と近いため、GRASSの転換時間だけ演奏がある短いステージ、
スペースはそこそこあるので、もう少し演奏を長く聴けたらいいなぁ。

●飲食スペースが気持ち拡充
GRASS側の飲食スペースが「ハングリーフィールド」となり、飲食店が増えた気がする。
以前からだったらすみません。

また「こもれびスタンド」側の飲食もちょろっと増えてた気がする。
それでも毎年飲食は昼になると1時間~待ちがザラになるため、もう少しなんとかならんかんぁ

●事前予約グッズ受け取り口の移動
今まで「中央芝生広場」のクロークと一緒に併設されていたのが、今年は「テントの森」奥に移動。
今までグッズを受け取ってそのままクロークという流れで便利だったのが。。。
多分事前予約組みとかが増えたのが理由かなと思うけど、ちょっと不便に。

●シャトルバスラッシュ
毎年開場までの行き帰りがネックなんですが、毎年シャトルバスは進化してる気がする、
4日開催になったあたりからバスが途切れる事が無くなって、ものすごくスムーズ。
それでも1時間くらいは並ぶんだけど、シャトルバスが途切れないって他では考えられないw

参加アクト

the HIATUS
01.Clone
02.Geranium
03.The Flare
04.Thirst
05.Bonfire
06.Unhurt
07.Lone Train Running
08.Radio
09.Shimmer
10.Insomnia
11.紺碧の夜に

HIATUSは富士ロックとほとんど同じセトリ。
今のHIATUSは「Radio」押しなのかな、胸に来るいい曲。好きです。

Lamp In Terren
01.涙星群の夜
02.キャラバン
03.ランデヴー
04.緑閃光
05.地球儀

初!Lamp In Terren。好きな曲ばかりやってくれて最高だった。
もっと人気出ろ。

ポルカドットスティングレイ
01.シンクロニシカ
02.テレキャスター・ストライプ
03.顔も覚えてない
04.人魚
05.エレクトリックパブリック

初ポルカー! 椎名りんごというよりおっさんだった(笑)
まだライブが上手い感じじゃなかったけど楽しくてよかった。期待通り!

BIG MAMA
01.CRYSTAL CLEAR
02.秘密
03.かくれんぼ
04.ファビュラ・フィビュラ
05.荒狂曲 "シンセカイ"
06.BLINKSTONEの真実を
07.the cookie crumbles
08.MUTOPIA

今年はホントにMAMAイヤーだなぁ
何の曲やっても最強な気がしてきたライブだった。

04 Limited Sazabys
01.swim
02.Warp
03.climb
04.monolith
05.fiction
06.escape
07.midnight cruising
08.Letter
09.Squall
10.Terminal
11.Remember

今の04リミはやばい、熱が渦巻いてる。
リハで「未来の破片」やってくれてるなんてニクい!

サカナクション
01.新宝島
02.M
03.Aoi
04.『バッハの旋律を夜に聴いたせいです。』
05.三日月サンセット
06.SORATO
07.ミュージック
08.アイデンティティ
09.多分、風。
10.目が明く藍色

多分、風。初視聴。
相変わらず大きいステージが板についてきたなぁ。
でもネイティブダンサーとか昔の曲も聞きたい~


他にもちょろっと「KICK THE CAN CREW」をみて懐かしんだり。(中学生時代全盛期)
MY FIRST STORYをはじめてみたり。(悪気は無いけど思った以上にワンオクだった)

エメもサンボもフラワーも見たかったなぁ。
また来年リベンジです!!


2017年8月12日土曜日

SOPHOS Antivars for Linuxを使ってみる

個人利用に限りフリーでSOPHOS Antivars for Linuxが利用できる。
ClamAVには飽きていたので、試しに使ってみる。

インストール

ダウンロード
アカウント登録が必要。
https://www.sophos.com/ja-jp/products/free-tools/sophos-antivirus-for-linux.aspx
ソースをサーバにアップして展開。
# ./install.sh



Sophos Anti-Virus
=================
Copyright (c) 1989-2016 Sophos Limited. All rights reserved.

Sophos Anti-Virus インストーラへようこそ。Sophos Anti-Virus には、オンアクセススキャナ、オンデマンドコマンドラインスキャナ、Sophos Anti-Virus デーモン、および Sophos Anti-Virus GUI があります。

オンアクセススキャナ         ファイルがアクセスされると検索し、未感染の場合のみアクセスを許可
オンデマンドスキャナ         コンピュータの全体または一部を直ちに検索
Sophos Anti-Virus デーモン  Sophos Anti-Virus にコントロール、ログ、メール警告機能を提供するバックグラウンドプロセス
Sophos Anti-Virus GUI        Web ブラウザ経由でアクセスするユーザーインターフェース


「Enter」キーを押して、使用許諾契約書を表示してください。そして、<spc> を押してスクロールダウンしてください。

ライセンス内容に同意しますか? はい(Y)/いいえ(N) [N]
> Y

Sophos Anti-Virus のインストール先を指定してください。 [/opt/sophos-av]
>

オンアクセス検索を有効にしますか? はい(Y)/いいえ(N) [Y]
> N

オンアクセス検索が無効になっています。オンデマンド検索には、savscan を使ってください。
ソフォスは、Sophos Anti-Virus での自動アップデートの設定をお勧めします。

ソフォスから直接アップデートしたり(要アカウント情報)、自社サーバー(ディレクトリや Web サイト(アカウント情報 が必要な場合もあります))からアップデートすることができます。

オートアップデートの種類を選択してください: ソフォス(s)/自社サーバー(o)/なし(n) [s]
>

ソフォスから直接アップデートしています。
SAV for Linux の無償バージョン (f) と サポート対応付きバージョン (s) のどちらをインストールしますか? [s]
> f

Sophos Anti-Virus for Linux の無償バージョンに対して、サポート対応は提供されていません。
無償ツールのフォーラムは次のサイトを参照してください。http://openforum.sophos.com/
ソフォスからアップデートを行うためにプロキシが必要ですか? はい(Y)/いいえ(N) [N]
> N

無償のアップデート用アカウント情報を取得しています。
Sophos Anti-Virus をインストールしています....
Starting Sophos Anti-Virus daemon:                         [  OK  ]

インストールが完了しました。
オンアクセスまでは今回はやらない。

マニュアル関係

インストールやら設定、コマンド利用方法のマニュアル
https://www.sophos.com/ja-jp/medialibrary/PDFs/documentation/savl_9_sgeng.pdf
https://www.sophos.com/ja-jp/medialibrary/pdfs/documentation/savl_9_cgeng.pdf

スキャン方法

# savscan / -all --quarantine
シグネチャの更新はデーモンで定期的に更新している模様
# chkconfig --list
sav-protect     0:off   1:off   2:on    3:on    4:on    5:on    6:off

2017年8月10日木曜日

S3の利用量を監視するMuninプラグイン



MuninでAWS S3のバケットの利用量を監視するスクリプトを作る。



プラグインのリンクを張るときに末に監視したいバケット名を追加してリンク張ってください。
# ln -s aws_s3_ /etc/munin/plugins/aws_s3_backetname
そーす。
リージョンだけべた書きしてるけど
#!/bin/bash
#
# README
# ===========================================
#
# Set export JAVA Options
# ---
# REGION : AWS region
# BUCKET_TARGET : AWS S3 bucket name
#
# Plugin config
# ---
#
# ```
# # vim plugin-conf.d/munin-node
# [jstat_*]
# env.REGION ap-northeast-1
# ```
#
# Export
# -------------------------------------------
REGION=${REGION:-ap-northeast-1}
BUCKET_TARGET=$(/bin/basename "$0" |/bin/awk -F '_' '{print $NF}')

# Graph Setting
# -------------------------------------------
. "$MUNIN_LIBDIR"/plugins/plugin.sh

if [ "$1" = "autoconf" ]; then
echo yes
exit 0
fi

if [ "$1" = "config" ]; then

# Graph set
echo "graph_title S3 $BUCKET_TARGET Bucket"
echo 'graph_args --base 1024 -l 0'
echo 'graph_vlabel S3 Bucket Size'
echo 'graph_info This graph S3 Bucket Size.'
echo 'graph_category s3'

# Lavel set
echo 'objects.label bucket objects'
echo 'objects.draw LINE1'
echo 'objects.min 0'
echo 'objects.type GAUGE'
echo "objects.info bucket objects count."

echo 'size.label bucket size'
echo 'size.draw LINE1'
echo 'size.min 0'
echo 'size.type GAUGE'
echo "size.info bucket size byte."

exit 0
fi

# Get parameter
# -------------------------------------------
TOTAL_OBJECT=$(aws s3 ls s3://$BUCKET_TARGET --recursive --summarize |awk '/Total Objects/{print $3}')
TOTAL_SIZE=$(aws s3 ls s3://$BUCKET_TARGET --recursive --summarize |awk '/Total Size/{print $3}' )

if [ ! -z "$TOTAL_OBJECT" ]; then
echo "objects.value $TOTAL_OBJECT"
else
echo "objects.value "
exit 0
fi

if [ ! -z "$TOTAL_SIZE" ]; then
echo "size.value $TOTAL_SIZE"
else
echo ""size.value ""
exit 0
fi

S3ってコマンド等で簡単にサイズを取得するAPIとかが今のところ無いのね。
なのでバケットのlsオプションからサマリサイズで取得しています。

Amazon Web Services企業導入ガイドブック -企業担当者が知っておくべきAWSサービスの全貌から、セキュリティ概要、システム設計、導入プロセス、運用まで-
荒木 靖宏 大谷 晋平 小林 正人 酒徳 知明 高田 智己 瀧澤 与一 山本 教仁 吉羽 龍太郎
マイナビ出版 (2016-06-10)
売り上げランキング: 2,369

2017年8月4日金曜日

firewalld を使う!

CentOS/Redaht 7系から標準のOSファイヤーウォールがfirewalldになっています。
iptablesも今までどおり使えるけど、カスタマイズあされて色々セキュアになっている。。。らいし。
ベースはiptablesなのですが使い方が全く変わっている。
使ってみて、色々わかったのでメモ書き

インストール


インストールされていない場合はインストールして起動してみる。

# yum install firewalld
# systemctl start firewalld
# systemctl enable firewalld

NetworkManagerを利用している環境で後からfirewalldをインストールした場合、
NetworkManagerとの連携が上手く動かないことがあるため再起動しておく。

# systemctl restart NetworkManager

起動状態の確認

# firewall-cmd --state
running

firewalldはzoneというポリシーグループみたいな考え方があり、
それぞれのゾーンに役割や意味があります。
それぞれのゾーンについてはRedhatのマニュアルを読んでおきましょう。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html

現在、どのゾーンに所属しているのか確認

# firewall-cmd --get-active-zones
public
interfaces: eth0

現在publicというゾーンにeth0のNICインターフェースが登録されていることが分かります。
publicゾーンにどのようなポリシーがデフォルトで登録されているかというと、

# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:

デフォルトでipv6のdhcp通信とssh通信が許可されていることが分かります。

ゾーンの変更


サーバを配置している環境によってはdmzやtrustにゾーンを変更したい場合があるでしょう。
その場合は下記のようにして変更します。

# nmcli c modify "eth0" connection.zone public
# nmcli c up eth0
# nmcli -p con show "eth0"

ちなみにfirewalldコマンドからでもゾーンを変更できるのですが、
NetworkManager経由でNICを管理している場合エラーが出て怒られます。

# firewall-cmd --permanent --zone=public --change-interface=eth0
The interface is under control of NetworkManager, setting zone to 'public'.
success

ポリシーの登録方法


ポリシーの登録方法には大きく3つの方法があります。

・サービス、ポート単位でのアクセス制御定義
・リッチルールによるアクセス制御定義
・ダイレクトルールによるアクセス制御定義

サービス、ポート単位
サービス、ポート単位でのアクセス制御は簡単なのですが細かい制御はできません。
サービス、ポート単位でINの通信を許可するかしないかだけです。

リッチルール
リッチルールはiptablesの定義方法のようにアクセス制御を定義することができます。しかしINの通信のみです。

ダイレクトルール
リッチルール同様にiptablesの定義方法のようにアクセス制御定義をするこことができ、IN/OUT両方の通信を制御することができます。
しかしfirewalldのiptables定義を直接アタッチするため、コマンド実行時にポリリーが即時定義、反映される、ポリシーを壊すリスクがあります。
ここでは細かい制御を行えるダイレクトルールの設定を行います。

ダイレクトルールでの設定


まず前提でfirewalldはiptablesベースです。
firewalldをインストールし、起動した時点でデフォルトの定義が設定されています。

# iptables -nL
INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_direct all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_IN_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_IN_ZONES all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_OUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_OUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
OUTPUT_direct all -- 0.0.0.0/0 0.0.0.0/0

Chain FORWARD_IN_ZONES (1 references)
target prot opt source destination
FWDI_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]
FWDI_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]

Chain FORWARD_IN_ZONES_SOURCE (1 references)
target prot opt source destination

Chain FORWARD_OUT_ZONES (1 references)
target prot opt source destination
FWDO_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]
FWDO_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]

Chain FORWARD_OUT_ZONES_SOURCE (1 references)
target prot opt source destination

Chain FORWARD_direct (1 references)
target prot opt source destination

Chain FWDI_public (2 references)
target prot opt source destination
FWDI_public_log all -- 0.0.0.0/0 0.0.0.0/0
FWDI_public_deny all -- 0.0.0.0/0 0.0.0.0/0
FWDI_public_allow all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0

Chain FWDI_public_allow (1 references)
target prot opt source destination

Chain FWDI_public_deny (1 references)
target prot opt source destination

Chain FWDI_public_log (1 references)
target prot opt source destination

Chain FWDO_public (2 references)
target prot opt source destination
FWDO_public_log all -- 0.0.0.0/0 0.0.0.0/0
FWDO_public_deny all -- 0.0.0.0/0 0.0.0.0/0
FWDO_public_allow all -- 0.0.0.0/0 0.0.0.0/0

Chain FWDO_public_allow (1 references)
target prot opt source destination

Chain FWDO_public_deny (1 references)
target prot opt source destination

Chain FWDO_public_log (1 references)
target prot opt source destination

Chain INPUT_ZONES (1 references)
target prot opt source destination
IN_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]
IN_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]

Chain INPUT_ZONES_SOURCE (1 references)
target prot opt source destination

Chain INPUT_direct (1 references)
target prot opt source destination

Chain IN_public (2 references)
target prot opt source destination
IN_public_log all -- 0.0.0.0/0 0.0.0.0/0
IN_public_deny all -- 0.0.0.0/0 0.0.0.0/0
IN_public_allow all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0

Chain IN_public_allow (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW

Chain IN_public_deny (1 references)
target prot opt source destination

Chain IN_public_log (1 references)
target prot opt source destination

Chain OUTPUT_direct (1 references)
target prot opt source destination

大分細かくチェインが切られ管理されていることが分かります。
定義されているルールはデフォルトとゾーンに基づくルールでしょう。

細かくは見ていきませんが、
「***_public」がサービス、ポート単位の操作で設定するチェイン。
_public_」の内容をインクルードしてルールを構築しています。

さらにそれらのゾーンチェインに定義されたルールを
「***_IN_ZONE」でインクルードし、「INPUT」「FORWARD」チェインにインクルードしている。
これを見るとOUTが制御できない理由が分かります。

ダイレクトルールは「***_direct」チェインに設定されます。
ダイレクト用のチェインは多層的ではなくすぐ「INPUT」「OUTPUT」にインクルードされ、定義がダイレクトに反映されているのが分かります。
※ダイレクトルールの場合、チェインを自分で定義することもできます。

ダイレクトルールの定義は下記コマンド構文で定義することができます。

# 追加
# firewall-cmd [--permanent] --direct --add-rule {ipv4|ipv6|eb} <テーブル> <チェイン> <優先順位> <引数>

# 削除
# firewall-cmd [--permanent] --direct --remove-rule {ipv4|ipv6|eb} <テーブル> <チェイン> <優先順位> <引数>

が、ハッキリ言って分かりにくいし、
昔のiptables定義のようにスクリプトで管理したいです。

実はダイレクトルールは他の定義方法と違い、XML形式で定義ファイルを作成し、それをfirewalldに読み込ませて反映させることができます。

今までのiptables定義スクリプト同様間違ったら即アウトの方法ですが、
管理上も管理しやすく、定義の仕方もコマンドよりは分かりやすいです。

XMLでのダイレクトルール定義


XMLファイルは「direct.xml」というファイル名で定義します。
定義を記載した「direct.xml」を「/etc/firewalld」ディレクトリ配下に配置し、firewalldコマンドで反映させることができます。

XMLは下記構文で記載していきます。
例えば特定のFROM IPからSSH許可を定義したい場合。

<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="1" table="filter" ipv="ipv4" chain="INPUT_direct">-s 192.168.1.1 -p tcp -m state --state NEW --dport 22 -j ACCEPT</rule>
</direct>

「priority」は定義が処理される優先順位となり、数字が若いものが先に処理されます。
「chain」は利用するチェインを定義します。ここは任意のチェインを作成、指定することもできますが、せっかくデフォルトで構成されているものがあるのでそちらを利用。
後はiptablesの定義同様にタグ内にポリシーを定義します。

例えばpriorityを利用して、ポリシーにマッチしない通信はログに出す、という事も今までどおり設定できます。
下記ではOUTの通信は全てDROPし、ポリシーにマッチしないものがあった場合はログに出力されます(多分)。

<?xml version="1.0" encoding="utf-8"?>
<direct>
<!-- SSH -->
<rule priority="1" table="filter" ipv="ipv4" chain="INPUT_direct">-s 192.168.1.1 -p tcp -m state --state NEW --dport 22 -j ACCEPT</rule>
<rule priority="2" table="filter" ipv="ipv4" chain="OUTPUT_direct">-j DROP</rule>
<!-- log -->
<rule priority="1" table="filter" ipv="ipv4" chain="INPUT_direct">-j LOG --log-prefix 'INPUT : ' --log-level=warning</rule>
<rule priority="1" table="filter" ipv="ipv4" chain="OUTPUT_direct">-j LOG --log-prefix 'OUTPUT : ' --log-level=warning</rule>
</direct>

またXML形式なのでコメントも書けるのがいいところ!

上記のようなポリシー定義を書いたXMLを作成し、配置。
firewakkdコマンドで反映させます。

# firewall-cmd --reload
sucsess

上手く設定できれば下記コマンドで確認できます。

# firewall-cmd --direct --get-all-rules

最後に、ダイレクトルールを設定し通信、ポリシー上問題ないことが分かったら
デフォルトでゾーンポリシーに定義されている通信ポリシーを削除しておきましょう。
iptablesコマンドで確認してわかるように、各ポリシーの定義はそれぞれ両方有効です。
管理が煩雑にならないよう、デフォルトのポリシーは削除しておきます。

# firewall-cmd --remove-service=ssh --permanent

最後に


ダイレクトルールで管理しようとすれば下記のような感じでスクリプトで管理できた。

#!/bin/bash
CONFIG_FILE=/opt/scripts/conf/direct.xml
ROOT_DIR=/etc/firewalld/
if [ ! -f "$CONFIG_FILE" ]; then
log_messages "file not found"
exit
fi

log_messages "WARNING: change firewalld rule"
firewall-cmd --lockdown-off
if [ -f "$ROOT_DIR/direct.xml" ]; then
cp -p "$ROOT_DIR/direct.xml" "$ROOT_DIR/direct.xml.$DATE"
cp "$CONFIG_FILE" "$ROOT_DIR"
else
cp "$CONFIG_FILE" "$ROOT_DIR"
fi

firewall-cmd --reload
iHANTEI="$?"
if [ "$iHANTEI" = 0 ]; then
log_messages "complete change firewalld"
firewall-cmd --reload
firewall-cmd --direct --get-all-rules
firewall-cmd --lockdown-on
echo "more checke messages!!"
else
log_messages "ERROR firewalld change"
cp -p "$ROOT_DIR/direct.xml.$DATE_TIME03" "$ROOT_DIR/direct.xml"
firewall-cmd --reload
firewall-cmd --direct --get-all-rules
firewall-cmd --lockdown-on
echo "more checke messages!!"
fi