TORIPIYO DIARY

recent events, IoT, programming, security topics

中国やロシアなど特定の国からのアクセスを拒否するiptablesの設定方法

中国やロシアからのアクセスを弾く設定を、
ファイアウォール構築(iptables) - CentOSで自宅サーバー構築
を参考にして自宅のraspberry pi 3 に設定してみました。

1. country_iptables.shとupdate_country_iptables.sh をgistから取得する
block ip address by country unit · GitHub

2. ファイルにrootユーザでの実行権限を付与する
chmod 755 country_iptables.sh update_country_iptables.sh

3. country_iptables.shをrootユーザで実行する

sh country_iptables.sh
  • 問題なく実行されると、iptables -nL でiptablesのruleがたくさん設定されていることが確認出来ると思います。
  • country_iptables.sh は、http://nami.jp/ipv4bycc/cidr.txt.gzを利用して、日本のグローバルIPアドレスからのアクセスを許可して、悪いことをすることが多い国からのアクセスを拒否します。
  • raspberry pi 3向けに、最期にiptablesの設定読み込みと設定ファイルの更新を行っています。この最期の処理はCentOSなどではおそらくうまく動きません。

4. cron jobを設定してupdate_country_iptables.shを定期的に実行するようにする

00 03 * * * sh /home/pi/script/update_country_iptables.sh
  • 国ごとのグローバルIPアドレスは定期的に変わるようなので、http://nami.jp/ipv4bycc/cidr.txt.gz の更新をチェックしてiptablesの設定を修正しています。ただ、差分が大きいと自動実行は怖いので50行以上の差分の場合は自動更新はされないようになっています
  • IPTABLES_SCRIPTにはcountry_iptables.shファイルのパスを指定
  • WEBHOOK_URLには通知したいslack channelのurlを設定
  • このスクリプトを毎日実行していると、http://nami.jp/ipv4bycc/cidr.txt.gz に悪意あるコンテンツが埋め込まれたときに勝手に実行されてしまうので、クリティカルなシステムの場合はcron jobに登録せずに手動での実行のほうがいいかもしれないです

sshログインされたことをslackに通知する方法

追記 2017/08/21:このページに記載した設定の実施後、自分の環境ではサーバに対してscpが正常に動作しなくなりました。scpを利用する場合は、設定後正しく動作するかどうか確認してください。


外出先からssh接続出来るようにraspberrypiのsshポートを公開するようにしました。
念のため、不正ログインをすぐに検知出来るように、sshログインされるとslackのalerts channelに通知される設定をいれました。

slack側の設定

1. alertsというchannelを作成する

2. Incoming WebHooksの設定をする

  • いろんなサイトに設定方法はあるので細かいやりかたは省略。
  • この記事では、Incoming WebHooksの設定では、customize nameにalertsを指定しています。
サーバ側の設定

3. /etc/ssh/sshrcファイルを配置する

  • WEBHOOK_URLには正しいwebhookのurlを記載する

gist.github.com

4. sshrcのパーミッションを変更する
chmod 755 /etc/ssh/sshrc

これで、sshログインするとslackのalerts channel に通知されるようになります。


参考
http://qiita.com/futoase/items/3e57b10adbff04290342

Raspberry Pi 3が自宅ネットワーク内の他デバイスと通信出来ないようにiptableを設定

外部に公開しているraspberry piを踏み台にして、自宅ネットワーク内のデバイスが攻撃を受けないように、iptablesに以下設定をいれました。

実行順序(もちろん、rootユーザで)
1. iptablesの設定を追加(もしかしたら、この前にiptables関連のパッケージインストールが必要だったかも。。。)

# 自宅のホームネットワークのIP
localnetwork='192.168.0.0/24'
router='192.168.0.1'
pi='192.168.0.12'

# raspberry pi とルーターは通信できるようにする
/sbin/iptables -A OUTPUT -s $pi -d $router -j ACCEPT

# 自宅ネットワークの機器から、raspberry piに対してsshは出来るようにしておく
/sbin/iptables -A OUTPUT -p tcp -s $pi --sport 22 -d $localnetwork -j ACCEPT

# 自宅ネットワークの機器から、raspberry pi上の80port, 81portで動いているプロセスに接続出来るようにしておく
/sbin/iptables -A OUTPUT -p tcp -s $pi --sport 80 -d $localnetwork -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -s $pi --sport 81 -d $localnetwork -j ACCEPT

# raspberry pi から自宅ネットワークの機器へ許可していない通信をしようとするとログが出力されるようにする
/sbin/iptables -N LOGGING
/sbin/iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
/sbin/iptables -A OUTPUT -s $pi -d $localnetwork -j LOGGING

# 上記のssh, http以外で、自宅ネットワークの機器に通信しようとするとパケットがドロップされるようにしておく
/sbin/iptables -A OUTPUT -s $pi -d $localnetwork -j DROP

2. 上記のiptablesの設定をサーバが再起動されても反映されるように、/etc/iptables/rules.v4 ファイルに書き出す

iptables-save >> /etc/iptables/rules.v4

3. iptablesによってドロップされたパケットのログが/var/log/messagesではなくて、/var/log/iptables.logに出力されるように修正

  • 1行目は、DROP: というプレフィックスであれば、/var/log/iptables.logに書き出す意味
  • 2行目は、/var/log/messagesへの二重の書き出しを防ぐ
vi /etc/rsyslog.d/iptables.conf
--------------------------------
:msg, contains, "DROP:" -/var/log/iptables.log
& ~
--------------------------------

rsyslogデーモンをrestart

service rsyslog restart

4. logが出力されるか確認

# 適当な自宅ネットワークのipにping
ping 192.168.0.5
# ログが出力されたか見る
cat /var/log/iptables.log


参考にしたページ
iptablesテンプレート集 改訂版(1):スタティックなパケットフィルタリング (3/4) - @IT
Change the IPTables log file « Networking How To's

フランス旅行でFreeのシムフリーを利用したのでその感想と注意点

夏休みにフランスに旅行に行ってきました。
旅行中はFreeのシムフリーを利用したので、その体験を共有したいと思います。

f:id:ha107chan:20160910225802j:plain

利用端末

シムフリーiPhone6 16GB (2014年の後半にオンラインのアップルストアで購入)


事前準備でフランスのシムフリーを調べると、Freeという新興の通信キャリアが
Free mobile : forfaits mobiles 4G sans engagement

  • 通信容量30GB
  • 1ヶ月29.99ユーロ

で人気があるそうで、事前にお店の場所を調べて初日のリヨンで購入しました。
f:id:ha107chan:20160911001542p:plain

いままでいろいろな国のシムフリーを利用しましたが、他の国と比べて気を遣う点が多かったので注意点を挙げていきたいと思います。

ホテルの住所・シムのサイズをメモに控える

自動販売機でシムフリーを購入する際には住所の入力を求められます。ホテルの住所をすぐに引き出せないと結構焦ります。また、シムのサイズを間違えて購入すると払い戻しがきかないかもしれないので、事前に端末のシムのサイズは確認しておきましょう。対面販売だと店員さんが適切なシムのサイズを選んでくれますが、自動販売機では自分でシムのサイズを決めないといけません。

購入方法を印刷した紙を持参する

英語はある程度わかるので、フランス語もなんとなく似たような単語でわかるだろうと思っていましたが、全然わかりませんでしたw
weekly.ascii.jp
このページを印刷した紙を持参していたので購入出来ましたが、印刷物がなかったら相当苦労していたと思います。

通信できない時はプロファイルの削除を試す

実は、リヨンで購入したシムは他のwebサイトで紹介されている手順で設定したのにも関わらず通信が出来ませんでした。旅行中にトゥールーズに立ち寄った際に、トゥールーズのFreeの店を調べて店員さんに動かない理由を聞いたところ、iPhoneにプロファイルが設定されていると動かない!ということがわかりました。
自分のiPhoneにはMVNOIIJのプロファイルなど入っており、すべて削除すると通信できるようになりました。(再起動も必要だったかも。)シムフリーの端末でMVNOを利用している人は多いと思うので、ハマる人は結構多そうな気がします。
プロファイルの設定は、
「設定」ー>「一般」ー>「プロファイル」
で見ることができます。

レシートは絶対に捨てない

シムを購入した時に一緒に出てくるレシートは絶対に捨ててはいけません。このレシートにユーザページにログインするためのログインIDとパスワードが記載されています。ユーザページから契約内容など確認したり変更できるようなので、大事にとっておきましょう。また、ユーザページはフランス語のみなので、chromeなどのtranslate機能を利用して英語に翻訳するのがおすすめです。フランス語から日本語の翻訳は精度が良くないですが、フランス語から英語の翻訳は綺麗なので内容がよくわかります。

契約は1ヶ月の期間を指定する

自動販売機でのシムフリーの購入は1ヶ月と期間指定なしの両方が選べるようになっています。クレジットカードを登録して購入するので期間指定なしの契約で購入すると日本に帰ってからも支払い続けることになりかねません。ユーザページで契約内容を確認できるので、購入後には必ず契約内容を確認しておきましょう。



Freeのシムフリーの品質ですが、4G対応とあったのですが都市部以外では結構3Gになりました。日本のようにどこでも4Gにはなりません。それでも、インターネットがあるとレストラン・観光地・地図情報を調べられて非常に便利です。

あと、日本に帰国してから教えてもらったのですが、Google 翻訳のアプリのword lensという機能はぜひ旅行中に利用したほうがいいと思います。
news.mynavi.jp
フランスのレストランは思った以上に英語のメニューのないところが多いです。このword lensという機能を旅行に行く前に知っていたら、もっと楽に注文出来ていたでしょう。。。

atom 1.9で期待する機能

自分はgithubatom editorを昨年の4月ぐらいからずっと利用しています。
最初の頃はバグが多かったりしたのですが、機能が追加されてたりパッケージを追加できるのが面白くて利用を続けています。
最近は動作のほうも以前よりはだいぶ安定してきています。(それでも、まだ突然crashはする。。。)

atomはタブの操作方法が貧弱で、タブの操作には結構不満があります。

ただ、タブ操作について待ち望んでいた機能がついに1.9で追加されるようです。

blog.atom.io

Drag and Drop Layout Management
タブのレイアウトを1.9から簡単に変更できそうです。
http://blog.atom.io/img/posts/drag-drop-layout.gif


もう1個、個人的に待ち望んでいた改修が1.9ではあります。

Cygwin and Msys Compatibility On Windows
Ensure atom command works on Cygwin + MSYS bash shells by damieng · Pull Request #11762 · atom/atom · GitHub
Ensure Cygwin + Msys compatibility on Windows by damieng · Pull Request #11833 · atom/atom · GitHub

自分のwindows機のcygwin環境ではatomCUIから起動できなかったのですが、
ついに起動できるようになるかもしれません。。。!


いままでatomを利用していて、不満に思っていた点が1.9では一気に改修されそうでいまからリリースが楽しみです。

Raspberry Pi 3で自宅git serverを構築してみた

f:id:ha107chan:20160627223817p:plain

この前、soracom主催のIOTの勉強会に参加して、Raspberry Piを初めて触りました。

ラズパイxソラコム キャンペーン 家でもRaspberry Piを扱いたくなり、Rasberry Pi 3で自宅git serverを構築してみました。

まず、Raspberry Piを購入

手元にRasberry Piがなかったので、まずはRasberry Piの購入からです。

Rasberry Piには種類がたくさんありRaspberry Pi - Wikipedia 、どれを購入したらよいかで迷います。大体いまだとRaspberry Pi 2 Model BRaspberry Pi 3 Model Bのどちらかを利用することが主流のようです。最初はRaspberry Pi 2 Model Bのほうがインターネット上に情報がたくさんありそうで、消費電力も低いのでこちらを購入しようと思いましたが、

Raspberry Pi 3 Model Bは、

  • 無線LANを内部に搭載しているので家のいろんな場所に配置できる
  • Raspberry Pi 2 Model Bと値段がそんなに変わらない
  • いまは情報が少ないけど、長くつかえるのはRaspberry Pi 3 Model Bだろう

ということで、Raspberry Pi 3 Model Bを購入しました。

楽天Amazonで値段など比較すると、こちらの商品が一番安くてケースなどもつくのでRaspberry Pi 3の本体と一緒に電源ケーブルmicroSDカードなどを購入しました。お値段、合計で9000円ほど。Raspberry Pi 3には、Element 14版とRS components版があるのですが、インターネットで調べるとどちらもほとんど仕様は変わらないということなのでElement 14版にしています。

Raspberry Pi 3は、Raspberry Pi 2よりも消費電力が大きく、Raspberry Pi 2用の電源では動作が不安定になるそうです。

 

 

Raspberry Piスターターパック (Standard) - Pi3検証済

Raspberry Piスターターパック (Standard) - Pi3検証済

 

Raspberry Piを組み立てる

組み立てると言っても大したことをする必要がありません。 

f:id:ha107chan:20160626154334j:plain

 

付属の説明書に記載の通りにUSB端子にキーボードとマウスのUSBを差し込み、Raspbian OS (Jessie)の入ったmicro SDをRaspberry Pi本体に挿入。(少し挿入口を探すのに迷った。)電源ケーブルを差し込めば勝手にOSが起動します。(電源オンオフのスイッチはないみたい。)

www.raspberrypi.org

電源ケーブルを差し込んでからOS起動するのがすごく早いです。30秒ぐらいでマウスで操作できるようになります。

Raspbian OSの設定

設定を進めます。

ssh 設定

OSを起動すると今回購入したmicroSDのRaspbian OSでは最初からSSH接続できるように設定されていました。パスワードは付属の説明書に記載済み。piユーザというユーザでログインするのですが、すでにsudoで実行する権限が付与されていました。一応、鍵認証でsshできるようにしたかったので、SSHの鍵認証設定 - Qiita このあたりをみて鍵認証に設定変更しました。

無線LABインターフェースのpower managemnetをオフ

sshでRasbian OSにログインしてしばらくすると応答が非常に遅くなります。また、クライアントからpingをRasbian OSに向けて打っても帰ってこない現象が頻発しました。最初は、家のルーターの調子が良くないのかと思っていたのですが、原因は無線LANのUSBアダプタのパワーマネジメント機能がONになっていることでした。

Raspberry Piで無線LANの反応が悪い時の対処法 | ものづくりエクスペリメント

こちらのブログを参考にして、

 

# 変更前のpower managementの状態を見る

sudo iwconfig

# interfaces ファイルを編集する
sudo vim /etc/network/interfaces

# 以下の行を追加する。
wireless-power off

# networkを再起動
sudo /etc/init.d/networking restart

# 変更後のpower managementの状態を見る
sudo iwconfig

 

とすると、安定してSSH接続できるようになりました。

diskサイズの確保

自分が購入したmicroSDに入っていたRaspbian OSは、ルートパーティションに4GBがあてられていて、すでに98%近く使用されていました。このままだと、gitlabがインストール出来ないので

sudo apt-get purge wolfram-engine libreoffice-core libreoffice-common

でwolfram engineやlibre officeなど不要そうなパッケージを削除しましたが、それでもまだ十分な容量を確保出来ません。

microSDは16GBのはずなのに、なんで4GBしかないのかと思い調べるとパーティションを拡張している人がいました。

Raspberry Piの設定【SDカード使用容量の変更(リサイズ)】 - Aldebaranな人のブログ

raspi-configというコマンドがあるらしく、ブログ記載のとおりに実行すると内部でパーティション拡張のスクリプトが走るらしく再起動で無事に拡張できました。

GUIのオフ

Raspberry PiGUIを利用しないのであれば、GUIをオフにしたほうが(気持ち)少しメモリの使用量が減りました。

How to disable desktop GUI on Raspberry Pi - Ask Xmodulo

こちらの記事に書いてあるように、

 

sudo raspi-config

 

のコマンドを実行して、"Boot Options"を選択。さらに、"Console"(Console Autologinではない。)を選択してokすればCUI環境がreboot後に設定されます。

 

rsyslogd-2007: action 'action 19' suspended, next retry is

というメッセージのログが/var/log/syslogに頻繁に出力される場合は、

Raspberry Pi で syslog に rsyslogd-2007: action 'action 17' suspended が出た時の対策 - Qiita

こちらの記事にあるようにrsyslog.confの設定ファイルを修正してrsyslogを再起動すると直るようです。

 

gitlabのインストール

gitlabのページで、Raspbian OS向けのパッケージが配布されています。(Raspberry Pi 2向けのようだけど、いまのところRaspberry Pi 3でも特に問題なく動いている。)

Download GitLab Community Edition (CE) | GitLab

下記のとおりに実行するとgitlabをインストールできます。

 

# 事前に必要なパッケージをインストール

sudo apt-get install curl openssh-server ca-certificates postfix apt-transport-https

# gitlabのkeyを登録
sudo curl https://packages.gitlab.com/gpg.key | sudo apt-key add -

# istall gitlab (結構容量が大きいのでディスクに1GB以上の空きが必要そう)
sudo apt-get install gitlab-ce

 

Rasberry PiのIPアドレスにブラウザからアクセスすると、gitlabの画面が表示されます。

f:id:ha107chan:20160627223817p:plain

 

とりあえず、個人で進めているプロジェクトをここに置いていこうと思います。