2017年8月16日水曜日

Apacheで特定の国からのアクセスを拒否する


for CentOS7.x

GCEの利用料金を抑えるため、1パケット目から料金の発生する中国とオーストラリアからのHTTPリクエストに拒否応答(403)を返すApacheの設定です。

完全に遮断したいのであれば、GCEのFWでブロックしたほうがいいのですが、中国もオーストラリアもとなると対象IPが多すぎるのと一つ一つ登録するのが面倒なので・・・

まずは、mod_geoipをインストールします。
sudo yum install mod_geoip
次にGeoIPのデータベースをmaxmind社からダウンロードして配置しておきます。
Licenseは CC BY-SA 3.0で、下記の文章を製品などに含むことでライセンスを満たすことになるようです。
この製品には MaxMind が作成した GeoLite2 データが含まれており、
<a href="http://www.maxmind.com">http://www.maxmind.com</a> から
入手いただけます。
mkdir geoip
cd geoip/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
sudo mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat.bak
sudo mv GeoIP.dat /usr/share/GeoIP/GeoIP.dat
httpdのconfを変更します。mod_geoipのconfigは/etc/httpd/conf.d/geoip.confに配置されますので、若干の修正を加えます。
sudo vi /etc/httpd/conf.d/geoip.conf

<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat

  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat MemoryCache
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat CheckCache
</IfModule>
あとは、httpd.confでCountry Codeをブラックリストとして登録して拒否します。
sudo vi /etc/httpd/conf/httpd.conf

<Location "/">
  Order allow,deny
  SetEnvIf GEOIP_COUNTRY_CODE CN BLACKLIST_COUNTRY
  SetEnvIf GEOIP_COUNTRY_CODE AU BLACKLIST_COUNTRY

  Allow from all
  Deny from env=BLACKLIST_COUNTRY
</Location> 
ログにCountry Codeを追加したい場合は"%{GEOIP_COUNTRY_CODE}e"を追加すると、下図のようにJPとかUSとかがログに記載されるようになります。
LogFormat "%h %l %u %t  \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{GEOIP_COUNTRY_CODE}e" combined
LogFormat "%h %l %u %t  \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{GEOIP_COUNTRY_CODE}e"
あと、403を返す時に少しでもサイズを減らすため、最小の文字列を返すように設定しておきます。まぁ、1文字でもいいと思いますが、E403とだけ返すように設定してみました・・・。
ErrorDocument 403 "E403"
最後にhttpdを再起動して設定を反映させてください。
sudo systemctl restart httpd
以上ですー。

2017年8月7日月曜日

顔を認識してモザイクをかける@OpenCV3 + Python3

USBカメラなどから画像を取り込んで、顔と認識した部分にモザイクを掛けます。 都度顔認識していますので、物体追跡させて方が効率がいいのかも。

# -*- coding: utf-8 -*-
# for Python 3.4, 3.5
import cv2

def mozaic(cascade, image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = cascade.detectMultiScale(
        gray, scaleFactor=1.11, minNeighbors=4, minSize=(5, 5))

    # 検出した部分を縮小して、拡大(最近傍補間)する
    for [x, y, w, h] in faces:
        face = image[y:(y + h), x:(x + w)]
        face_tmp = cv2.resize(face, (int(w/20),int(h/20)))
        face = cv2.resize(
            face_tmp, (w,h), interpolation=cv2.INTER_NEAREST)
        image[y:(y + h), x:(x + w)] = face
    return image

# デバイスは固定
cap = cv2.VideoCapture(0)
if cap.isOpened() is False:
        raise("IO Error.")

# haarcascade_frontalface_alt.xmlは下記から持ってくる
# https://github.com/opencv/opencv/tree/master/data/haarcascades
cascade_path = "haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)

while True:
    ret, frame = cap.read()
    frame = mozaic(cascade, frame)
    cv2.imshow('image', frame)
    k = cv2.waitKey(1)
    if k == 27:
        break;
        
cap.release()
cv2.destroyAllWindows()

Python3 IPアドレスから国の情報を取得

geolite2とかはPython3では使えなくなっているので注意が必要。

コード:

# -*- coding: utf-8 -*-
# for Python 3.4, 3.5
import geoip2.database as geodb
import geoip2.errors as geoerr

rec_city = geodb.Reader('GeoLite2-City.mmdb')
try:
    rec = rec_city.city("23.44.226.40")
    if rec:
        print(rec.country.iso_code)
        print(rec.country.names["ja"])
        print(rec.country.name)
        print(rec.city.names["ja"])
        print(rec.city.name)

except geoerr.AddressNotFoundError as anfe:
    print (anfe)



実行結果:
 US
 アメリカ合衆国
 United States
 ケンブリッジ
 Cambridge

GeoLite2-City.mmdbは下記のURLからダウンロード
https://dev.maxmind.com/ja/geolite2/
Licenseは CC BY-SA 3.0
下記の文章を製品などに含むことでライセンスを満たすことになるようです。
この製品には MaxMind が作成した GeoLite2 データが含まれており、
<a href="http://www.maxmind.com">http://www.maxmind.com</a> から
入手いただけます。

2017年7月5日水曜日

PostfixLogParser

Postfixのログすごく読みやすいのですが、集計とかしたいときに結構困ります。
pflogsummも使ってみたのですが、いまいち思ったような解析ができません。
できれば、1行1ログにしたいが思ったようなツールがなくて・・・

仕方ないので作ってみましたー

PostfixLogParser
https://github.com/umiushi-zn/PostfixLogParser/

動作確認は 、下記の環境で行ってます。
CentOS6 + Python 3.4
CentOS7 + Python 3.4
Postfixのバージョンは2.6.6です。

GitHubなんて素敵なものを初めて使ってみましたが、こんな感じで良いのでしょうかね。
一応GPLv3にしておきましたので、間違っていたら修正して頂けるとありがたいですー

これで出力したものをFluentdやSplunkで読み出して集計できるといいなぁ


2016年7月12日火曜日

Pythonで大きいファイルのMD5を計算する

Python 2.7, 3

本当はSHAの256がほしかったんだけど、
ダウンロード元のメーカーが提供しているSHA256が間違っていて使えないことが判明したので・・・;;
MD5で我慢してみる。

import hashlib

BUFFER=4096

def md5sum( filepath ):
    hasher = hashlib.md5()
    with open( filepath, "rb" ) as f:
        for chunk in iter( lambda: f.read( BUFFER * hasher.block_size ), b'' ):
            hasher.update( chunk )
    return hasher.hexdigest()

print (md5sum("./md5sum.py"))


md5となっているところをsha256に変更すればSHA256でも動く


SHA1なら下記のような感じで・・・
import hashlib

BUFFER=4096

def sha1sum( filepath ):
    hasher = hashlib.sha1()
    with open( filepath, "rb" ) as f:
        for chunk in iter( lambda: f.read( BUFFER * hasher.block_size ), b'' ):
            hasher.update( chunk )

    return hasher.hexdigest()

print sha1sum("./sha1sum.py")
ファイルサイズが小さいと、本家sha1sumより2桁くらい遅いけど
ファイルが300Mくらいまで大きくなると逆転する。

意外と効率良いのかも?


hashlibが対応している暗号化方式は下記で確認できる。

print hashlib.algorithms


2016年6月25日土曜日

NOOBSでRaspberry PiにRaspbianをインストール(2016/06/25版)

準備編

まず、パソコンなどからRaspberry Pi財団のサイトに行きNoobsをダウンロードします。

Download NOOBS for Raspberry Pi

NOOBS と NOOBS LITEがありますが、
OSのイメージを含んでいるのはNOOBSのほうなのでNOOBSをダウンロードします。
# LITEはインストール中にダウンロードを行うようです。



まぁ、普通に[Download ZIP]を選択すればいいでしょう

ダウンロードしている間にSDカードをフォーマットします。
SDカードはFAT32でフォーマットされていればOKです。
ちなみにSDカードはTOSHIBAの32GBの800円くらいのものを使いました。
若干相性などもあるようですので、購入時は注意したほうがいいです。

ダウンロードが完了したらZIPファイルをまるっと選択してSDカードにコピーします。


これで準備完了。

インストール編

SDカードを取り出して、Raspberry Piに差し込みます。
モニタはあらかじめ繋げておたほうがいいです。

起動後は、[Raspbian]を選択し、[Install]をクリックします。
 

SDカードのデータはすべて上書きされる旨の警告が表示されますが、[Yes]を選択します。


インストールが始まります。30分くらいはかかるので、気長に待ちます。


"OS(es) Installed Successfully"というメッセージが表示されたら、インストール完了です。[OK]をクリックして再起動してください。


再起動すると、Raspbianが起動してきます。

いじょうでーす。

2016年5月25日水曜日

マイナンバーが保存されたPCは修理できないかも

マイナンバーが保存されたPCは修理NG? 富士通の修理規定の一文に注目集まる
http://internet.watch.impress.co.jp/docs/yajiuma/20160524_758709.html


こ、これか・・・
第11条(修理ご依頼時の注意事項)
    (2)  対象機器の記憶装置(ハードディスク等)にマイナンバー(個人番号)が記憶されたデータがある場合には、修理をお受けできません。お客様は、修理をご依頼 される前に、お客様の責任においてマイナンバー(個人番号)を消去していただくものとします。なお、修理および診断作業の過程で記憶装置(ハードディスク 等)にマイナンバー(個人番号)が記憶されたデータが確認された場合には、修理を実施せずに、お預かりした対象機器をお客様に返却いたします。
https://azby.fmworld.net/support/repair/syurikitei/
 うん。HDDが壊れたら修理してもらえないと。
 サーバーとかどうなるんでしょ・・・

[追記]
HP と Epsonもだそうで・・・
 「マイナンバーが記録されているPCの修理はできない」ということで各社の規約が続々と更新中 (GIGGAZINE)

NECとDELLは今のところ大丈夫そう?

2015年12月10日木曜日

vSphere上にActive Directoryを構築する



vSphere上にActive Directoryを構築する際は、一通り目を通しておいたほうがいい。
62ページもあるので面倒だけど。
https://blogs.vmware.com/apps/2014/01/just-published-virtualizing-active-directory-domain-services-on-vmware-vsphere.html
https://www.vmware.com/files/pdf/solutions/Virtualizing-Active-Directory-Domain-Services-on-VMware-vSphere.pdf

2015年12月8日火曜日

WindowsでGrep (Power Shell)

Windows 10だとgrepの書式はそのままに、Select-Stringを使うだけです。

Select-String "pattern" filename

もういっそのこと、Grepって書けばいいのに・・・

パターンに正規表現を使用する場合は
Select-String -Pattern "pattern" filename
だそうです。

やっぱり検索対象をLinuxにコピーしたほうが手っ取り早いかな。
検索速度も、ちょっと遅そうですし。

まぁ、そのうち計ってみます。

rrdtoolで記録したデータを修正する

まずは、xmlファイルに吐き出します。
rrdtool dump traffic.rrd traffic.xml

出来上がったxmlファイルを編集しておかしなデータを削除します。
# これが結構大変・・・
vi traffic.xml
ここで修正

あとは、もともとのデータのバックアップを取って
rrdファイルとして書き戻すだけです。

mv traffic.rrd traffic.rrd.org
rrdtool restore traffic.xml traffic.rrd
chmod a+rw traffic.rrd

最後にchmodなどで権限の戻し忘れがないように・・・

この方法は、動作するプラットフォームが32bitから64bitに変更になった場合にも利用することができます。