Google Play Developer ConsoleでOpenSSLのバージョンエラーが発生したときの対応法

2016年11月9日

Cocos2d-xを使ったアプリをGoogle Playで公開しようとするときに、以下のエラーが表示されてAPKの公開を拒否される場合がある。

このAPKは、セキュリティの脆弱性が含まれている点が悪意のある行為に関するポリシーに違反しているため、非承認となりました。

アプリで使用中のOpenSSLのバージョンにセキュリティの脆弱性があります。

Cocos2d-xには、OpenSSLのライブラリが含まれているため、OpenSSLの機能を使っていない場合でも、含まれているOpenSSLのバージョンによっては上記の警告が出る場合がある。その際は、下のリンクにもあるように、内含されているOpenSSLのバージョンを上げる必要がある。

Tags

XCodeからiTunes Connectへアップロード後に`has change to Invalid Binary`エラー

2016年10月27日

XCodeからiTunes Connectへアーカイブファイルをアップロードした後にhas change to Invalid Binaryエラーが発生した場合は、問題の詳細がメールで送信されてくる。

Missing Push Notification Entitlement

Missing Push Notification Entitlementは、Apple Developer > Certificates, Identifiers & Profiles > App IDsでPush Notificationsが有効化されていないか、もしくは、XCode -> TARGET -> Capability -> Push NotificationsでPush Notificationsが有効化されていないかのいずれかの場合が多いため、これらの設定を見直した上で再度アップロードを行う。

Missing Push Notification Entitlement – Your app includes an API for Apple’s Push Notification service, but the aps-environment entitlement is missing from the app’s signature. To resolve this, make sure your App ID is enabled for push notification in the Provisioning Portal. Then, sign your app with a distribution provisioning profile that includes the aps-environment entitlement. This will create the correct signature, and you can resubmit your app. See “Provisioning and Development” in the Local and Push Notification Programming Guide for more information. If your app does not use the Apple Push Notification service, no action is required. You may remove the API from future submissions to stop this warning. If you use a third-party framework, you may need to contact the developer for information on removing the API.

Certificatesの修正が必要な場合

XCode上で修正が必要な場合

privacy-sensitive data without a usage description

iOS10よりユーザデータにアクセスする場合は、使用目的をInfo.plistに記述する必要がある。

We have discovered one or more issues with your recent delivery for “YOUR APP NAME”. To process your delivery, the following issues must be corrected: This app attempts to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.

Info.plistに記述した文言は、データアクセスの許可を求めるポップアップ上に表示される。NAVITIMEアプリの場合はこんな感じ。

Fluentd + Elastichsearch + Kibana(4)Fluentdでホスト名を追加する

2016年8月12日

Fluentdでログを転送する際、ホスト名も付加したい。そんなときは、標準のfilterプラグインを使って、以下の設定を加える。

sudo vi /etc/td-agent/td-agent.conf

<filter **>
  @type record_transformer
  <record>
    hostname ${hostname}
  </record>
</filter>

このときに、matchタグよりも上位に記述しないと動作しないので注意が必要である。

Fluentd + Elastichsearch + Kibana(3)FluentdからElasticsearchへの転送

2016年8月11日

Fluentdの設定

前回までにFluentd + Elastichsearch + Kibanaの環境設定と、ログの送信元となるMacの設定を行った。

今回は、受信したデータをElasticsearchに転送する処理を扱う。設定は以下の通り。

sudo vi /etc/td-agent/td-agent.conf

<source>
  @type forward
</source>

<match example.app>
  type elasticsearch
  host localhost
  port 9200
  type_name exampleapp
  logstash_format true
</match>

type_nameは、Elasticsearchタイプ名を指定する。識別できる文字列なら好きに指定して良いようだ。logstash_formatは、logstashフォーマットで出力するオプションで、とりあえず今回はtrueにしておく。

Fluentdの再起動

Fluentdを再起動する。

sudo systemctl restart td-agent

Kinabaにアクセス

Kibanaにアクセスすると、データの受信に伴って、インストール直後とは表示が変わっている。ログインすると受信データが確認できる。

http://XXX.XXX.XXX.XXX:5601

Fluentd + Elastichsearch + Kibana(2)MacでFluentdを動かそう

インストールと起動

MacにFluentdをインストールし、Macで動くアプリのログを、Elastichsearchが動くサーバへと転送する。FluentdのダウンロードページにMac用のdmgイメージがあるので、これをダウンロードし実行する。

Mac Fluentd dmg

Macのデーモンは、launchctlと呼ばれるツールで管理される。launchctlは、設定ファイル(plist)のロードによってデーモンを登録し、デーモンの開始や終了など制御する。通常は、デーモンの登録を行った上で、デーモンの開始を行うという流れとなるが、設定ファイル内で「RunAtLoad = true」が設定されている場合は、ロードと同時にデーモンが起動され、OSの起動時にも自動的にデーモンは起動する。

Fluentd(td-agent)の設定ファイルは、「RunAtLoad = true」に設定されているため、設定ファイルをロードするだけで、デーモンは起動され、自動起動に設定される。

launchctl load /Library/LaunchDaemons/td-agent.plist 

元データの設定

Fluentdは、元データの指定と転送先の指定が必要となる。元データは以下のような種類を指定できる。

ログファイルから取得する

転送ログの元データを指定する。設定するパラメータは以下の通り。

パラメータ 意味
type tail
path ログファイルのパス
pos_file 読み込んだ位置を記憶しておくファイル
tag ログの識別子
<source>
  type tail
  format apache
  path /var/log/httpd-access.log
  tag td.apache.access
</source>

httpから取得する

http通信によってデータを取得する。設定するパラメータは以下の通り。

パラメータ 意味
type http
port ポート番号

tagは、URLヘッダで指定する。

<source>
  type http
  port 8888
</source>

実行したコマンドの標準出力から取得する

コマンドの実行によってデータを取得する。設定するパラメータは以下の通り。

パラメータ 意味
type exec
command 実行するコマンド
tag ログの識別子

他のFluentdから取得する

他のFluentdから転送されたデータを受信する。設定するパラメータは以下の通り。

パラメータ 意味
type forward
<source>
  type forward
</source>

設定例

今回は、Macで動作するアプリが出力する以下の形式のログを元データに指定する。

ログファイルの例

2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application is started."
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application is initialized."
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Data is received: apple=3, orange=4"
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application will be terminated."

Fluentdは様々なログをJSON形式に変換した上で転送を行う。ログの変換を行うためには、どのようなフォーマットでログが記述されているかを正規表現でFluentdに教えてあげる必要があり、この設定が最も難しい。今回のログは、スペース区切りで、[日付][プロセス情報][ステータス][メッセージ]の情報が並んでいるので、正規表現で表現すると以下のようになる。

sudo vi /etc/td-agent/td-agent.conf

<source>
  type tail
  path /tmp/exampleApp.log
  pos_file /var/log/td-agent/exampleApp.log.pos
  tag example.app
  format /(?<time>[^\]]*) (?<process>.*) <(?<stat>.*)> "(?<message>.*)"/
  time_format %Y-%m-%d %H:%M:%S.%N
</source>

出力先の設定

Fluentdは、出力先も様々な方法を選択できる。

標準出力に転送

データを標準出力に転送する。設定するパラメータは以下の通り。

パラメータ 意味
type stdout
<match **>
  type stdout
</match>

ファイルに転送

データをファイルに転送する。設定するパラメータは以下の通り。

パラメータ 意味
type file
path 出力ファイルのパス
time_slice_format ファイル名のサフィックス
time_slice_wait ファイルを分割する時間単位
<match **>
  type file
  path /var/log/fluent/exampleApp.export
  time_slice_format %Y%m%d
  time_slice_wait 10m
</match>

他のFluentdに転送

データを他のFluentdに転送する。設定するパラメータは以下の通り。

パラメータ 意味
type forward
server 転送先サーバの情報

今回は、Macアプリのログを、Elasticsearchを導入した他のサーバに転送したいので、以下の設定とした。

<match **>
  type forward
  <server>
    name server_1
    host XXX.XXX.XXX.XXX
  </server>
</match>

設定ファイル

設定ファイルは以下となった。

sudo vi /etc/td-agent/td-agent.conf

<source>
  type tail
  path /tmp/exampleApp.log
  pos_file /var/log/td-agent/exampleApp.log.pos
  tag example.app
  format /(?<time>[^\]]*) (?<process>.*) <(?<stat>.*)> "(?<message>.*)"/
  time_format %Y-%m-%d %H:%M:%S.%N
</source>

<match **>
  type forward
  <server>
    name server_1
    host XXX.XXX.XXX.XXX
  </server>
</match>

Fluentdを再起動して新たな設定ファイルを読み込む。このとき、/var/log/td-agent/td-agent.logに正常なログが吐き出されていたらOK!

launchctl unload /Library/LaunchDaemons/td-agent.plist 
launchctl load /Library/LaunchDaemons/td-agent.plist 

参考になるページ

Fluentd + Elastichsearch + Kibana(1)CentOS7で環境構築する

Fluentdで収集したログをElastichsearch + Kibanaに入れて可視化する。ここを参考にしながら、まずはCentOS7に環境構築してみる。

Elastichsearch

OpenJDKのインストール

Elasticsearchは、インストールにJAVA7以降(Java8 Update 20以降、もしくはJava7 Update 55以降)のJDKを必要とする。Oracle JavaもしくはOpen JDKがサポートされているようなので、今回はOpenJDK8をインストールする。

sudo yum -y install java-1.8.0-openjdk

Elastichsearch のインストール

RPMからElastichsearchをインストールする。

sudo rpm -ivh https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.3.5/elasticsearch-2.3.5.rpm

インストールが終わると以下のように忠告されるので、

### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service

言われた通りにコマンドを実行し、Elastichsearchを起動。

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

Fluentd

Fluentdをインストール

自動インストールスクリプトが用意されているので、これを実行する。現在、Fluentdは2.X系で開発が進められているので、td-agent2を指定してインストールを行う。

sudo curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

FluentdとElastichsearchとの連携

FluentdからElastichsearchへデータを受け渡すためのプラグインをインストールする。

sudo yum -y install gcc libcurl-devel
sudo td-agent-gem install fluent-plugin-elasticsearch

Fluentdを起動

sudo systemctl enable td-agent
sudo systemctl start td-agent

Kibana

Kibanaのインストール

Elastichsearchのリポジトリを追加する。

sudo vi /etc/yum.repos.d/elastic.repo

[kibana-4.4]
name=Kibana repository for 4.4.x packages
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

yumからインストールする。

sudo yum install kibana -y

Kibanaを起動

sudo systemctl enable kibana
sudo systemctl start kibana

Kibanaを起動

これでインストール作業が全て完了。
インストールしたサーバの5601ポートにアクセスするとこんなページが見れるはず。

http://XXX.XXX.XXX.XXX:5601

Kibana

Zabbix(3)SNMP監視

2016年8月8日

SNMPポーリング

Zabbixサーバから、SNMPエージェント(クライアント)に対して、定期的にSNMPの問い合わせを行い、情報を取得する場合の環境構築方法は以下の通り。

パッケージのインストール

sudo yum install net-snmp net-snmp-utils

SNMPインタフェースの追加

設定 > ホストからSNMPインタフェースを追加する。
SNMPインタフェースの追加

監視アイテムの追加

テンプレート > アイテムから監視アイテム(項目)を追加する。Zabbixは、アプリケーションや監視アイテム、トリガーなどを収納するテンプレートを作成することが可能で、監視アイテムやトリガーは、複数のアプリケーションに属すことが可能となっている。アイテムを追加する際には、SNMPコミュニティ名SNMP OIDキーなどが必要となる。

SNMP設定

出力される値は、値のマッピング、もしくは、管理 > 一般設定 > 値のマッピングに設定を加えることで、識別しやすい文字列を登録することが可能である。

値のマッピング
以上の設定で、SNMPエージェントから値を取得し、状態を表示させることが可能となる。

トリガーの設定

登録した監視アイテムは、トリガーを設定することで、エラー判定することが可能となる。エラーの深刻度は、深刻な方から軽度なものから順番に、情報、警告、軽度の障害、重度の障害、致命的な障害と分類される。

以上で、SNMPで定期的に値を取得し、しきい値との比較を行うことで、エラーを検出することができるようになった。

SNMPトラップ

Zabbixサーバで、SNMPエージェント(クライアント)からのトラップを受信するためには、SNMP Trap デーモン(snmptrapd)SMNPTTという2つのパッケージが必要となる。

SNMPエージェント(クライアント)からのSNMP Trapデータは、SNMP Trapデーモンがまず受信する。SNMP Trapデーモンは、この値をSNMP Handler経由で、SNMP Trapデータ整形プログラムであるSNMPTTに転送する。SNMPTTは、あらかじめ定めたフォーマットにしたがってTrapデータを整形し、ファイルに出力する。Zabbixは、このファイルを定期的に参照することで、SNMP TrapデータをZabbixに取り込む。

パッケージのインストール

SNMP関連のパッケージをインストールする。

sudo yum install -y net-snmp-perl perl-Sys-Syslog

SNMPTTのパッケージをインストールする。SNMPTTのパッケージはepelリポジトリから取得することができる。

sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-7.noarch.rpm
sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7

sudo yum install -y snmptt

SNMP Trapデーモン(snmptrapd)の設定を変更

TrapデータをSNMPTTで処理するために、SNMP TrapデーモンからSNMP Handlerにデータ転送する設定とする。このとき、受信するTrapデータをコミュニティ名を指定して限定することもできる。今回は、全てのTrapデータを転送する処理にしている。

sudo vi /etc/snmp/snmptrapd.conf

# 全てのTrapを受信
disableAuthorization yes
# SNMP Handlerに転送する
traphandle default /usr/sbin/snmptthandler

SNMP Trapデーモンの起動オプションに以下を追加する。

sudo vi /etc/sysconfig/snmptrapd

OPTIONS="-m +ALL -On"

SNMPTTの設定を変更

SNMPTTは、SNMP Handler経由で受信したデータをZabbixで解釈できるデータフォーマットに変換する。Zabbixはこの変換後のテキストデータを定期的に取得する。

sudo vi snmptt.ini

# SNMP Handler経由の場合はdaemonを指定
mode = daemon
# NetSNMPでPerlモジュールを使用する
net_snmp_perl_enable = 1
# This sets the best_guess parameter used by the UCD-SNMP / NET-SNMP Perl module for 
# translating symbolic nams to OIDs and vice versa.
# For UCD-SNMP, and Net-SNMP 5.0.8 and previous versions, set this value to 0.
# For Net-SNMP 5.0.9, or any Net-SNMP with patch 722075 applied, set this value to 2.
net_snmp_perl_best_guess = 2
# Syslogへは、snmptrapdがログ書き込みを行う
syslog_enable = 0

また、snmptt.confに変換するフォーマットを記述する。受信データ種別毎にかき分けても良いが、取り敢えず以下の記述にしておけば、Zabbixで全てのデータを読み込めるようになる。

EVENT general .* "General event" Normal 
FORMAT ZBXTRAP $aA $ar $1

サービスの開始

以上で設定は完了なので、SNMP TrapデーモンとSNMPTTを開始する。

sudo systemctl start snmptrapd
sudo systemctl enable snmptrapd
sudo systemctl start snmptt
sudo systemctl enable snmptt

動作テスト

SNMP TrapのテストデータをZabbixサーバ宛に送信し、これがSNMP Trapデーモン、SNMPTT経由で受信できているかを確認する。

sudo snmptrap -v 2c -c public 192.168.0.10 '' .1.2.3.4.5.6.7.0 .1.2.3.4.5.6.7.0 s 'TEST'

正常に受信した場合は、/var/log/snmptt.logに以下のようなテキストが追加されていることが確認できる。Zabbixはこのファイルを定期的に参照する。

01:00:00 2016/08/09 .1.2.3.4.5.6.7.0 Normal "General event" 192.168.0.11 - ZBXTRAP 192.168.0.11 192.168.0.11 4345

Zabbixの設定

SNMP Trapデータの参照先を設定する。

sudo vi /etc/zabbix/zabbix_server.conf

SNMPTrapperFile=/var/log/snmptt/snmptt.log 
StartSNMPTrapper=1

サービスの再起動。

sudo systemctl restart zabbix-server
sudo systemctl enable zabbix-server

以下のようにアイテムを登録することで、受信したTrapデータを取り込むことが可能となる。今回便宜上、Template名やアプリケーション名を、Template SNMP Trap、SNMP Trapなどとし、作成したアイテムはこれらにぶらさげる形とした。

SNMPトラップアイテムの追加

/var/log/snmptt.logから文字列のパターンマッチングを行うことで、任意の事象に対してのトリガーの設定を行うことができる。

SNMPトラップアイテムの追加

Zabbix(2)初期設定

2016年8月3日

前回、Zabbixのインストールと関連する設定を行った。今回はWeb上で行う各種設定を確認する。

ログイン

標準のログインアカウントは、

なので、ログイン後適宜変更する。

Zabbixログイン

エラーメール設定

管理 > ユーザ > メディア からユーザと送信先メールアドレスの紐付けを行う。

送信先メールアドレスの設定

また、送信元アドレスの設定を、管理 > メディア > Email から行う。今回は、ローカルのpostfix経由でメールを送信するので、SMTPサーバをlocalhostとしている。

送信元メールアドレスの設定

最後に、どのタイミングでエラーメールを送信するかを設定するために、設定 > アクションから新たなアクションを作成する。メンテナンス期間外、かつ障害発生時(「情報あり」ステータスも障害に含む)に、Adminユーザにメールを送信する場合は、以下の通りの設定とする。

アラートアクションの設定
アラートアクションの設定
アラートアクションの設定

Zabbix(1)CentOS7にZabbix3.0をインストールする

サーバ

サーバの構築環境は、CentOS7、およびZabbix Server 3.0とする。また、サーバにもエージェントをインストールし、自身を自身で監視する体制とする。Zabbixを設定する際には、FirewallやSElinuxの設定にも変更が必要となる。ただし、今回は閉じたネットワーク内で監視を行うことを想定して設定するため、FirewallもSElinuxも無効にしている。

Zabbixサーバの設定

sudo yum install http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
sudo yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent
sudo yum install mariadb-server

関連するサービスの設定

ログの時刻を正確な値にするため、定期的にNTPによる時刻合わせを行う

sudo yum install -y ntpdate
sudo crontab -e

0 * * * *       /usr/sbin/ntpdate XXX.XXX.XXX.XXX

エラーメールを送信するためのSMTP設定を行う

myhostname = XXX.surbiton.jp
relayhost = [XXX.XXX.XXX.XXX]

メールサーバ起動

sudo systemctl start postfix
sudo systemctl enable postfix

エージェント

監視対象のサーバにはエージェントをインストールする。サーバの構築環境は、CentOS6、およびZabbix Server 2.4とする。

Zabbixエージェントの設定

sudo yum install http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
sudo yum install -y zabbix-agent-2.4.8-1.el6

参考URL

Zabbix 3.0をCentOS 7にインストール

シェル(1)Bashの基本設定

2016年5月26日

Bashとは

シェルは、コマンドライン・インタプリタとも呼ばれ、ユーザが入力したコマンドをカーネルに渡すプログラムである。シェルには、Bashcshzshなど様々な種類が存在するが、LinuxやMac OSでは、Bashが標準シェルとなっている。/bin/shは、Linuxにおける標準シェルを示しており、通常はBashへのシンボリックリンクとなっている。

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4  9月 26 15:52 2014 /bin/sh -> bash

なお、Bashを/bin/shとして実行させるとPOSIX準拠モードで起動するため、厳密にはBashと挙動が異なる。以下のコマンドを実行することで、インストール済みのシェルを確認することができる。

$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

ファイルディスクリプタ

シェルは、実行するプログラムの以下の値を取得することが可能となっている。

ディスクリプタ 略記 内容
<0 < 標準入力
>1 > 標準出力
>2 >2 標準エラー出力

標準出力も標準エラー出力も同時に出力したい場合は、2>&1と記述する。

ショートカット

カーソルの移動や編集を行う際に以下のショートカットを使うと便利。

コマンド 意味 内容
Ctrl + a ahead 行頭に移動
Ctrl + e end 行末へ移動
Alt + b before 一単語左へ
Alt + f foward 一単語右へ
Ctrl + d delete カーソルの文字を消す
Ctrl + h 0x08 (Backspace) カーソルの左の文字を消す
Ctrl + w word カーソルの左の単語を消す
Ctrl + u unix-line-discard カーソルより左の文字を全てカット
Ctrl + k kut カーソルより右の文字を全てカット
Ctrl + y yank ペースト
Ctrl + p previous 前の履歴を表示
Ctrl + n next 次の履歴を表示
Ctrl + r reverse 過去の履歴から検索
OLDPWD 直前にいたディレクトリ

設定ファイルの読み込み順序

bashの設定ファイルはいくつもあるが、以下の順序で読み込まれるらしい。

読み込み順序 読み込み時 対象 ファイル
1 ログイン時 全ユーザ /etc/profile
2 ログイン時 各ユーザ ~/.bash_profile
3 ログイン時 各ユーザ ~/.bash_login
4 bash起動時 各ユーザ ~/.bashrc
5 ログイン時のシェル終了時 各ユーザ ~/.bashrc

PATHを通すときなどに無意識に~/.bashrcにPATHを書いてたけど、~/.bashrcにPATHを書いてbashを複数タブで起動すると、その度に同じPATHが追加されてしまうようだ。というわけで、設定ファイルは、~/.bash_profileに書いておけばいいということか。

設定ファイルの内容

historyコマンド時に時間情報も表示させると便利。
過去のコマンドが消えてしまわないように、historyの上限値も増やしておくと、なお便利。
ちなみに、![履歴番号]で、history内の過去のコマンドを実行できる。

# History
HISTSIZE=50000
HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '

# Path
PATH="$PATH":/usr/local/bin:/bin:/sbin:/usr/bin

コマンドの実行

シェルで実行ファイルを実行する場合、PATH付きで指定しなければいけない。カレントディレクトリの実行ファイルを、

$ ./a.out

などと書くのは上記ルールによる。ただし、シェルにPATHが通っている場合は、PARHを省略できる。実行したファイルのPATHを確認するにはwitchコマンドを使って、

$ witch ls

alias ls='ls --color=auto'
	/bin/ls

とすればよい。また、cd, echo, pwdなどのコマンドは、ビルトインコマンドと呼ばれ、シェル自身に組み込まれたコマンドである。コマンドのタイプを確認するためには、

$ type pwd
pwd is a shell builtin

typeコマンドを使用する。