Tuesday, February 7, 2017

iOS Objective-C SSL証明書エラーを回避する方法

NSURLRequestを使っているとき、SSLで自己証明書(オレオレ証明書)をつかっているサーバのURLにアクセスするとエラーになります。
これを回避する方法です。
開発時などに役に立つTIPSだと思います。

エラーの例
2017-02-07 10:49:25.250 App[46178:1264401] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
2017-02-07 10:49:25.253 App[46178:1264332] FADHttp failed -1200: https://mydomain/ An SSL error has occurred and a secure connection to the server cannot be made.

Info.plistにAppTransportSecurityを設定して、NSURLRequestをオーバーライドするコードを追加します。

参考資料
[iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/
Working with Apple’s App Transport Security
http://www.neglectedpotential.com/2015/06/working-with-apples-application-transport-security/
Aplle / Cocoa Keys / Information Property List Key Reference
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40016240

Monday, October 3, 2016

nginx で ngx_http_geoip_module を利用して国別アクセス制御を行う

nginx Module ngx_http_geoip_module
http://nginx.org/en/docs/http/ngx_http_geoip_module.html

nginxのngx_http_geoip_moduleモジュールを利用して、国を指定してアクセス制御をします。
フィルタリング用のデータは、MaxMindのGeoIPオープンソースデータを利用します。
日本だけにコンテンツを配信したい、もしくは、特定の国からのアクセスを拒否したい、といったときに使えるとおもいます。
環境は、CentOS 6です。

以下、セットアップ方法です。

GeoIPデータベースを準備

GeoIPデータベースと更新コマンドをインストール。
# rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install GeoIP geoipupdate
GeoIPデータベースファイルが設置されたことを確認。
# stat /usr/share/GeoIP/GeoIP.dat

nginxを準備

nginxをインストール。
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum install nginx nginx-module-geoip
# nginx -v
nginx version: nginx/1.10.1
nginx設定パラメータにhttp_geoip_moduleが入っているか確認。GeoIPは、動的モジュールとして有効化できるようになっています。
# nginx -V
--with-http_geoip_module=dynamic
nginx動的モジュールの共有オブジェクトファイルが設置されているか確認。
# ls /etc/nginx/modules/
ngx_http_geoip_module-debug.so  ngx_http_geoip_module.so

nginx設定

カントリーコードはこちらのURLを参考にします。
http://dev.maxmind.com/geoip/legacy/codes/iso3166/

load_moduleを追記。modules/ngx_http_geoip_module.soを指定します。
events {} ブロックより上に記述するのがポイントです。
# emacs /etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

load_module modules/ngx_http_geoip_module.so;

events {
    worker_connections  1024;
}

http {} ブロックを編集。
includeより上に記述します。
アメリカ(US)と日本(JP)からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        US no;
        JP no;
    }
日本(JP)と韓国(KR)からのアクセスを許可、他の国からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        JP yes;
        TW yes;
    }

server {} ブロックを編集。
allowed_countryがnoだったらステータスコード403を返します。
# emacs /etc/nginx/conf.d/default.conf
    if ($allowed_country = no) {
        return 403;
    }


nginx再起動

nginxをリスタート、またはリロード。
# /etc/init.d/nginx restart
ブラウザなどでアクセスして確認しましょう。思い通りにアクセスコントロールできたでしょうか?

GeoIPデータベースを更新するには?

GeoIPデータベースをアップデートをするには、以下のコマンドを叩きます。定期実行するようにしましょう。
# geoipupdate -v

ELBの場合は?

AWSを使っている場合、ELBを前段に置く場合がほとんどだとおもいます。
ELBからのヘルスチェックでサーバに来るアクセスは、内部IPアドレスのため、国で判別することができません。そのため、VPC内のIPアドレスからアクセスが来た時には、制限をスルーするようにnginxを設定します。

以下の設定では、ELB経由のアクセスから、アクセス元IPアドレスを取得。ELBのヘルスチェックのアクセスを許可、日本からのアクセスを許可、ほかの国は拒否としています。
ついでに、アクセスログにGeo情報を出力するようにしています。



Top image from いらすとや

Wednesday, September 7, 2016

Rundeckをインストールして立ち上げる

http://rundeck.org/
高機能ジョブスケジューラの『Rundeck』を立ち上げるまでの記録です。
使い方は説明しません。
cronに飽きた。つらい。ジョブフローをうまく設定したい。もしくは、もっと高機能なことがしたい、といった欲求があるときに使われていようです。
ただ単に、時間通りバッチを動かしたい、ブラウザで操作できるGUIが欲しいときにはJenkinisで十分こと足りるとおもいます。なれている道具を使いましょう。
インストール環境は、CentOS 6です。

yumでJAVA OpenJDK 8と、Rundeckをインストール
# yum install java-1.8.0
# rpm -Uvh http://repo.rundeck.org/latest.rpm 
# yum install rundeck 
バージョンを確認
# java -version
openjdk version "1.8.0_101"
# yum list installed | grep rundeck
rundeck.noarch        2.6.9-1.21.GA     @rundeck-release-bintray
rundeck-config.noarch 2.6.9-1.21.GA     @rundeck-release-bintray
rundeck-repo.noarch   4-0               installed
Rundeckの設定ファイルを編集
ホスト名を設定。デフォルトではloaclhostとなる。
loaclhost -> myhost
# emacs /etc/rundeck/rundeck-config.properties
grails.serverURL=http://localhost:4440
->
grails.serverURL=http://myhost:4440
Rundeckのデーモンをスタート
# service rundeckd start
ログを確認
# tail -f /var/log/rundeck/rundeck.log /var/log/rundeck/service.log
しばらく待つと、アクセスできるようになります。
# curl -v 127.0.0.1:4440/user/login

ブラウザで開いてみましょう。
http://myhost:4440/
Username: admin
Password: admin
ログインできたら成功です。

参考資料

バックアップ

Backup and Recovery
http://rundeck.org/docs/administration/backup-and-recovery.html

データベース変更

デフォルトのデータベースだと、ジョブの数が多くなると負荷が上がるそうなので、MySQLを使ったりして解決できるそうです。

Setting up a RDB Datasource
http://rundeck.org/docs/administration/setting-up-an-rdb-datasource.html
Rundeckインストールと設定メモ - Qiita
http://qiita.com/nagase/items/70070d79454ac96aa5a5
Rundeck との闘争 - 日々是ウケ狙い
http://ndx.hatenablog.jp/entry/2016/02/12/225753

Slack連携

higanworks/rundeck-slack-incoming-webhook-plugin: A Rundeck Plugin for Slack Incoming-WebHook
https://github.com/higanworks/rundeck-slack-incoming-webhook-plugin
Rundeck Config・ジョブ通知・Mysql の設定編 - 僕とコードとブルーハワイ
http://equal-001.hatenablog.com/entry/2016/03/26/223000

その他

Rundeck - Google スライド
https://docs.google.com/presentation/d/1PKJ0iT-eS0oT4ILwJNvPkLFHWcqnRPsMY07kCb72tdk/edit#slide=id.p
cronからRundeckに移行するためのモチベーションが書かれています。

サーバが増えた時にインフラ担当者がやってきたこと - Qiita
http://qiita.com/hiracy/items/c8bfb69ff624d4b711e4
デプロイ集約サーバとしてRundeckを使っていて面白い。


Top image from http://rundeck.org/ by SimplifyOps