3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

nanacoモバイルのクレジット処理の設計バグにハマった

nanacoモバイルはクレジットカードを登録しておくとアプリから簡単にチャージすることができます。
nanacoを使い始めた時点でクレジットカードを登録しておいたんですが、クレジットだと最低チャージ金額が5000円なんですよね。
今までそんなにセブンで買い物することなかったので、クレジットチャージをせずに現金チャージだけをちょぼちょぼしてきました。

で、初めてクレジットチャージをしようとするとハマったわけです。。。

クレジットチャージするには、クレジットチャージパスワードが必要となります。それを複数回間違えてロックアウトしてしまいました。
ロックアウトを解除するには、クレジットパスワード変更処理が必要となります。その変更処理に現在登録済みのカード情報を必要となります。
nanacoへのカード登録時の後にクレジットカードの有効期限が更新された場合、問題となります。

クレジットパスワード変更処理で、登録時のクレジット更新期限(古い期限)を入力すると、期限が切れてる!というエラーになります。
更新された新しい有効期限を入れると今度は、登録されてるクレジット情報と違う!というエラーになります。

これで詰みです。古い期限も新しい期限も、どっちも入れても先に進めません。

詳しい考察はnanacoモバイルのクレジットカード更新が出来なくなるバグっぽい挙動に遭遇して困った - 記憶は人なりでされています。

対応ですが、nanacoお問合せセンターに電話し現在登録されてるクレジット情報を削除してもらいます。
同じようなケースがよくあるせいか、かなりスムーズに進みました。

カード情報削除後、新たに更新された有効期限のカードを登録すればOKです。

(Linux)CentOS5のApacheでSSL(オレオレ証明書)を利用する&グループポリシーで証明書配布

CentOS5.8のrpmApache(2.2.3-65) でSSLを使う方法です。

まず、opensslとmod_sslが入っているか確認します。

# rpm -aq | grep openssl
openssl-0.9.8e-22.el5_8.4
openssl-devel-0.9.8e-22.el5_8.4
openssl-0.9.8e-22.el5_8.4
openssl-devel-0.9.8e-22.el5_8.4

# rpm -aq | grep mod_ssl

mod_sslが入ってませんでした。以下コマンドでインストールします。

# yum install mod_ssl

一応centosで最初からApacheを入れていると、localhost.localdomainというオレオレ証明書が入っていますが、自身のドメイン用の証明書を作り直すことにします。 (SHA1の証明書は排除されつつあるので、SHA2で作成します)

秘密鍵の作成

opensslを使って、server.keyという秘密鍵を作成します。

# mkdir /etc/httpd/conf/ssl.key
# cd /etc/httpd/conf/ssl.key


# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...........................................................................................................+++
......................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:  パスワード入力
Verifying - Enter pass phrase for server.key:  パスワード入力

# chmod 400 server.key
#ls -la
-r-------- 1 root root   963  621 16:50 server.key

CSRファイルの作成

次に証明書署名要請書(server.csr)を作成します。 (本来はこれをCAに渡して証明書(CRT)を受け取るようです)

住所情報は適当にいいかと思いますが、FQDNは本番環境に即したものを入れて置く必要があります。

# openssl req -new -sha256 -key server.key -out server.csr(秘密鍵ファイルを指定)
Enter pass phrase for server.key:   ←秘密鍵作成時のパスワード指定
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP          ←国
State or Province Name (full name) [Berkshire]:Tokyo  ←県
Locality Name (eg, city) [Newbury]:Chiyodaku      ←市
Organization Name (eg, company) [My Company Ltd]:hoge  ←会社名
Organizational Unit Name (eg, section) []:piyo     ←部署
Common Name (eg, your name or your server's hostname) []:sv01.jehupc.com ←サーバのFQDN
Email Address []:    ←メール(任意)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:    ←オプションパスワード(省略可)
An optional company name []:  ←オプション会社名(省略可)

# chmod 400 server.csr
#ls -la
-rw-r--r-- 1 root root   741  6月 21 17:02 server.csr

自己署名証明書の作成

自己署名証明書、通称オレオレ証明書(server.crt)を作成します。(本来はCAに作成してもらいます)

引数には -in にCSRファイル、-signkeyに秘密鍵ファイル、-daysで有効期限の日数を指定します。

# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650 -sha256
Signature ok
subject=/C=JP/ST=Tokyo/L=Chiyodaku/O=hoge/OU=piyo/CN=sv01.jehupc.com/emailAddress=
Getting Private key
Enter pass phrase for server.key:   ←秘密鍵作成時のパスワード指定

# chmod 400 server.crt
#ls -la
-rw-r--r-- 1 root root  1025  621 17:36 server.crt

これで証明書の作成は終わりました。
次にApacheの設定を行います。

apacheの設定

ssl.confに証明書と秘密鍵を設定します。

# vi /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/tls/certs/localhost.crt
  ↓
SSLCertificateFile /etc/httpd/conf/ssl.key/server.crt

SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
  ↓
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key


# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: Apache/2.2.3 mod_ssl/2.2.3 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server sv01.jehupc.com:443 (RSA)
Enter pass phrase:   ←サーバ再起動時に秘密鍵のパスワードを聞かれるので入力します。

OK: Pass Phrase Dialog successful.
                                                           [  OK  ]

サーバ起動時に毎回パスワードを聞かれるので秘密鍵からパスワードを消去します。 (セキュリティ的にはよろしくないような気がしますが。。。)

 mv server.key server.key.org
# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:   ←秘密鍵作成時のパスワード指定
writing RSA key

# chmod 400 server.key
# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

グループポリシーで証明書配布

さて、これでWebサーバ側の設定は終わったわけですが、なにせオレオレ証明書なためにクライアントのブラウザでは警告が表示されてしまいます。
今回このWebサーバにアクセスするクライアントはWindowsドメイン内のクライアントになるので、グループポリシーでこの自己証明書を配布することにしました。

グループポリシーの コンピュータの構成→Windowsの設定→セキュリティの設定→公開キーのポリシー→信頼されたルート証明機関 を右クリック→インポート で、証明書(server.crt)を選択し、ウィザードに従って登録します。

コンピュータの構成なので、適用は再起動のタイミングかなと思ったんですが、再起動しなくても適用されるっぽいです。
クライアント側で強制的に適用するには、以下のgpupdateコマンドで可能です。

gpupdate /target:computer

注意として、このサーバにアクセするときのURLに関し、証明書作成時に設定したFQDNでアクセスしないといけません。
例えば CN=sv01.jehupc.com で設定した場合、ブラウザのアドレスにも https://sv01.jehupc.com でアクセスしないといけないのです。 IPでアクセスしたり、内部にDNSサーバとか立てて、https://sv01/とかすると、仮に証明書がインストールされていても警告が表示されました。

参考:
apache+mod_sslでSSL server-memo.net こちらのサイトの内容をほぼコピペになってしまいました。
TechNet:グループ ポリシーを使用して証明書をクライアント コンピュータに配布する
ActiveDirectory グループポリシーで 信頼されたルート証明機関を追加する
CentOS7.2 64bit OpenSSLを使用して秘密鍵、CSRを作成し、自己署名のSSLサーバー証明書を作成 | kakiro-web カキローウェブ
CentOS6などで俺俺CAとSHA2証明書を作るときのメモ - Qiita
オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっている

(Linux)pingを継続して実行し結果を日時付けてログに残したい

Linuxを使って、特定の端末へのpingを監視しようと思っています。
(ツール)ネットワーク遅延グラフツールSmokePingを入れてみたで紹介したsmokepingでもいいんですが、あれはどちらかと言うと遅延状態を全体的に見るような感じになります。
細かい情報を取ろうとすると、やはりpingで結果をとりたいものです。

指定間隔で監視対象端末にpingを実行して、その結果を日時付けてログに残すという仕様にしました。 当初cronで考えたんですが、cronだと秒数単位での実行が難しいので、シェルスクリプトを無限ループサせて実行させることとした。

参考にさせてもらったのは、あんみのの備忘録:pingコマンドの結果をログファイルに収集するです。

コンソール上で以下のシェルスクリプトを実行し、止めるときはCtrl+Cで強制終了という形になります。
監視対象端末は3台とします。

#!/bin/sh
#autoping.sh

#監視対象端末のIPを設定
IP1='監視対象IP'
IP2='監視対象IP'
IP3='監視対象IP'

logfile='ping.log'

while :
 do
    #5秒間隔でping実行
    sleep 5
    #日時取得
    daytime="`date +"%b %d %H:%M:%S"` "

    if ping -c 1 $IP1 > /dev/null; then
        #ping応答があった場合
        echo "$daytime  \"$IP1\" alive" >> $logfile
    else
        #ping応答なかった場合
        echo "$daytime PING is NOT UNREACHABLE. \"$IP1\" may NOT BE AVILE." >> $logfile
    fi

    if ping -c 1 $IP2 > /dev/null; then
        echo "$daytime  \"$IP2\" alive" >> $logfile
    else
        echo "$daytime PING is NOT UNREACHABLE. \"$IP2\" may NOT BE AVILE." >> $logfile
    fi

    if ping -c 1 $IP3 > /dev/null; then
        echo "$daytime  \"$IP3\" alive" >> $logfile
    else
        echo "$daytime PING is NOT UNREACHABLE. \"$IP3\" may NOT BE AVILE." >> $logfile
    fi
done

参考:
日付を取得する - UNIX & Linux コマンド・シェルスクリプト リファレンス

(Linux)CentOS5にPostgreSQL9.0をyumインストールする

CentOS5のデフォルトリポジトリでは、PostgreSQL8系(8.1(postgresql)と8.4(postgresql84))しかインストールできません。 ということで、9.0をインストールする方法をメモします。 (今回は9.0ですが、PostgreSQLのサイトでは8.3等、各バージョンのリポジトリが用意されているので、リポジトリが提供されている他のバージョンも基本このやり方でインストール出来ると思います)

PostgreSQLに関しては、PostgreSQLリポジトリが用意されているようなので、まず、postgresql用のリポジトリを利用できるように、postgresqlのサイトからreporpmsをインストールします。 (今回はCentOS5 x64用のRPMですが、http://yum.postgresql.org/reporpms/から各OS用のreporpmsを入手できます)

# wget http://yum.postgresql.org/9.0/redhat/rhel-5-x86_64/pgdg-centos90-9.0-5.noarch.rpm
# rpm -ihv pgdg-centos90-9.0-5.noarch.rpm.

CentOSリポジトリファイルを修正し、postgresql8系のパッケージがインストールされないようにします。

# vi /etc/yum.repos.d/CentOS-Base.repo

[base]
...
exclude=postgresql*  ←追加
...

[updates]
...
exclude=postgresql*  ←追加
...

postgresql9.0用のリポジトリファイルを開き優先度を2にします。

# vi /etc/yum.repos.d/pgdg-90-centos.repo

[pgdg90]
priority=2  ←追加

これでpostgresql9.0リポジトリが利用できるようになったので、yumを使ってインストールします。

# yum search postgresql

# yum install postgresql90.x86_64 postgresql90-server.x86_64 postgresql90-libs.x86_64

自動起動をONにします。

# chkconfig postgresql-9.0 on

まず、データベースの初期化を行います。

# service postgresql-9.0 initdb

サービスを開始します。

#  service postgresql-9.0 start

これで使えるようになったのですが、デフォルトではローカルからのアクセスしか出来ません。 なので、管理者権限をもつユーザを追加して、ネットワーク越しに使えるようにしてみます。

まずユーザの追加ですが、postgresになり、createuser コマンドでユーザを追加します。

# su - postgres
$ createuser ユーザ名
新しいロールをスーパーユーザにしますか? (y/n)y   ←スーパーユーザにするかどうか聞いているので今回はyにします。

新しいユーザのパスワードを決めてやります。

$ psql   ←postgresqlに接続します。
#  alter user ユーザ名 password 'パスワード';

後は、ネットワーク越しにアクセスするように設定します。

# vi /var/lib/pgsql/9.0/data/postgresql.conf

listen_addresses と port のところがコメントアウトになっているので、全ホストから受け入れするように以下のように設定します。

listen_addresses = '*'
port = 5432

これで、クライアントPCのpgAdminIIIを入れてつないでみたんですが、以下のようなエラーになりました。

Error connecting ont the server:FATAL: pg_hba.conf にホスト"xxx.xxx.xxx.xxx"、ユーザ"hoge"、データベース"postgress,SSL無効用のエントリがありません

調べてみると、pg_hba.confにもアクセス許可の設定が必要なようです。
pg_hba.confでは、HBA(host-based authentication)というホストベース認証の設定を書いているようです。

# vi /var/lib/pgsql/9.0/data/pg_hba.conf

簡単に説明すると、接続、ユーザ、アクセス元別にユーザ認証の設定を行います。
TYPEが接続方式(local:Unixソケット,host:TCP/IP等)、DATABASEが接続を許可したいデータベース名、USERが接続を許可するユーザ名、CIDR-ADDRESSが接続を許可するネットワーク、METHODがユーザ認証の方式(ident:Linuxユーザ認証、trust:無条件接続許可、reject:接続拒否、md5:md5を使ったパスワード認証、passwd:平文のパスワード認証)という意味のようです。
今回、hostのIPv4の部分を以下のように修正しました。

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
  ↓
host    all             all             0.0.0.0/0                 md5

これでどの端末からアクセスできるような設定になりました。

後は、サービスを再起動して実際にpgAdminIIIでアクセスをしてみます。

#  service postgresql-9.0 start

いざpgAdminIIIでアクセスしてみると、ログインはできたんですが、データベースを展開しようとすると、以下のようなエラーが。。。

エラーが起こりました:
ERROR:  列"datconfig"は存在しません
LINE 1: ...b.dattablespace AS spcoid, spcname, datallowconn, datconfig,...

頭を悩ました結果、答えがhttp://postgresql.1045698.n5.nabble.com/BUG-5668-initdb-failed-to-create-postgres-database-td2847489.htmlに有りました。
pgAdminIIIのv1.8.4を使っていたんですが、これが古いのでpostgresql9.0に対応してないのです。 なんで、1.8.4を使ってしまったのかというと、pgAdminダウンロードサイトのソート順に引っかかってしまったのです。

改めて最新版のv1.14.3をインストールしたら、正常にデータベースにアクセスできました。

参考:
CentOS5.5へPostgreSQL9.0をyumでインストールする - bose999の試験管の中の話
CentOS 5.6 へ PostgreSQL 9.0 の RPM をインストール - Try and Error and Error
PostgreSQL ユーザー追加 - ORANGE BOX
他ホストから接続するための設定
[Linux] PostgreSQLをリモートからアクセスできるように設定する Web Sytem | AIDREAM
[ PostgreSQL IDENT認証] by へうげもの