4度目の正直

午後IIの論文は、 用意していたテーマに合っていない問題だったが、 無事合格することが出来た。
論文の構成をその場で組み直ししたものの、文字数の要件を何とか満たすことがやっとだったため、内容に正直自信がなかった。。。
システム監査基準・システム管理基準が改訂された最初の試験で合格できたことは正直にうれしい。
3年前に合格したITサービスマネージャに続き、午前Iの免除がない試験だと、しっかり受験勉強するからなのか合格できるようだ。

受験番号 AU542-0517 の方は, 合格 です
午前Ⅰ得点 85.00点(平成27年度 ***.**点/平成29年度 ***.**点
/平成30年度 ***.**点)
午前Ⅱ得点 76.00点(平成27年度 64.00点/平成29年度 80.00点 /平成30年度 80.00点)
午後Ⅰ得点 74点(平成27年度 75点/平成29年度 49点/
平成30年度 45点)
午後Ⅱ評価ランク A(平成27年度 B/平成29年度 -/
平成30年度 – )

RTX1200をAWS VPCとVPN接続する

AWSのVPCとVPNで接続するためには、Direct Connect接続するか、IPSec接続する方法の2通りがある。
Direct Connectはお手軽にVPNを試すことが出来ないので、IPSec接続を試してみることにした。
フレッツ光からYAMAHA RTX1200を使いAmazon VPCにハードウェアVPN接続する手順
の通りに実施すると後述する問題に突き当たったが、解決することで接続することができた。
紹介サイトでは、RTX1200でのPPPoE接続の方式がとられていたが、PPPoEはONUのルータにて実施しているため、設定しなかった。
また、ONUルータに割り当てされるグローバルIPアドレスはプロバイダより割り当てされる可変アドレスであり、そのアドレスをカスタマゲートウエイのアドレスに指定した。

なお、設定作業において、IPSecのトンネルが確立できなかった点が3つあったので、共有しておきたい。
1.サイト間VPN確立時にASNが重複していて確立に失敗する
→カスタマーゲートウエイ、仮想プライベートゲートウエイの2つにASNを設定するが、同一のASNを誤って設定していた。紹介サイトと同様に、 カスタマーゲートウエイのASNには64512、
仮想プライベートゲートウエイ のASNには10124を設定することで設定に成功した。
2.500/udpポートがフィルタリングされていて接続に失敗する
→ip filter (フィルタ番号) pass * (ルータの内側のIPアドレス) udp * 500
にてフィルタを許可する
3.1分間隔で接続が切れる。
VPN接続後1分でVPNが切断されますが、切断されないようにする方法は?
同一機種の対応方法ではなかったが、事象が同一だったので、試してみたところ、切断されなくなった。
AWSよりサイト間のVPN接続を作成する際にダウンロードできる設定ファイルに記述されている
ipsec ike keepalive use (ipsecトンネル番号) on dpd 10 3

ipsec ike keepalive use (ipsecトンネル番号) off
に変更することで接続できる。

以前PPTP方式によるVPN接続を試したが、この方法であれば、安定してたVPNを確立することが出来るようになる。ただ、サイト間VPNは、1時間あたり約0.05USD(月額約4,000円)が必要となるため、少しでも安くVPNを構築したいという用途であれば、PPTP方式が良いかと思う。

S3へのアクセスを制限する

 S3のバケットに対して、特定のIPアドレスからのみ通信を受け付けるようにするためには、バケットポリシーに定義すればよい。
EC2インスタンスからのS3のアクセスについては、エンドポイントがない場合には、インターネットに一度パケットが出て行ってからS3にアクセスすることになってしまうため、IPアドレスでの制限が出来なくなってしまう。
 解決方法としては、エンドポイントを設置して、通信をエンドポイント経由にすることでエンドポイントを使った制限とすることができる。
 エンドポイントを介することによって、インターネットを経由しない通信にできるので、パケットがインターネットに出て行ってはいけないというセキュリティポリシーに準拠でき、EC2→S3への通信料課金が発生しなくなる。
 下記バケットポリシーは、NNN.NNN.NNN.NNNとvpce-XXXXXXXXXXXXXからのみ通信を受け付ける定義になる。また、Principalには、*を定義しているが、厳密に権限定義が必要な場合には、AWS JSON ポリシーの要素:Principalを参考にして、記述する必要がある。

 テストしている時には、 エンドポイントID(vpce-xxxxxx)ではなく、間違ってVPCID(vpc-xxxxxx)を指定してしまっていてハマってしまった。指定するIDがvpceから始まることを確認するとよい。

{
    "Version": "2012-10-17",
    "Id": "PolicyXXXXXXXXXXXX",
    "Statement": [
        {
            "Sid": "XXXXXXXXXXXXX",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::(バケット名)",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "NNN.NNN.NNN.NNN"
                },
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-XXXXXXXXXXXXX"
                }
            }
        }
    ]

4度目のシステム監査

今年で4回目の受験となるシステム監査試験を受けてきた。
今回は2年前にITサービスマネージャ試験合格によって手にした午前I免除の特典期間中に新たに合格することが出来なかったので、午前Iから受験となった。
午前Iは自己採点で83点、午前IIは76点だった。

昨年度からシステム監査基準が改定になったことに伴い、午前IIはやたらと新基準についての問題が多かった。監査基準を丁寧に見直しておけば、もう少し点数アップが狙えたかもしれない。

午後Iも感覚としては悪くないが、問題は午後IIの論文だ。IoTのテーマと規程見直しに伴う監査となっていて、いずれも用意していたテーマに合っていなかったので、規程見直しの論文を書いたが、文字数の要件を何とか満たすことがやっとで、内容に正直自信がない。。。。

PHPでzipファイルをダウンロードさせる仕様で取得したzipファイルが壊れている原因とは・・・?

ob_end_clean 関数を呼び出力バッファをクリアしないとUTF-8 BOM付きのPHPソースが実行された場合BOM(Byte Order Mark)が付加されてしまい、zipファイルが正しく生成されないことになってしまう。

実証コード

<?php
	$zip = new ZipArchive();
	$temp_dir = sys_get_temp_dir();
	$zip_name = 'test.zip';
	if (!$zip->open($temp_dir . $zip_name, ZIPARCHIVE::CREATE)){
		exit();
	}
	$zip->addFile('test.txt', '/hoge/test.txt');
	$zip->close();
	header('Content-Type: application/zip');
	header('Content-Length: '.filesize($temp_dir . $zip_name));
	header('Content-Disposition: attachment; filename="'.$zip_name.'"');
	readfile($temp_dir . $zip_name);
?>

ダウンロードしたファイルを解凍(Windowsのzip解凍アプリケーションによってはエラーになって書庫が参照できない)
$ unzip test.zip
Archive: test.zip
warning [test.zip]: 3 extra bytes at beginning or within zipfile
(attempting to process anyway)
warning: stripped absolute path spec from /hoge/test.txt
inflating: hoge/test.txt

$ od -tx1z -Ax test.zip
000000 ef bb bf 50 4b 03 04 14 00 00 00 08 00 69 72 48  >...PK........irH<
000010 4e 07 19 91 61 09 00 00 00 09 00 00 00 0e 00 00  >N...a...........<
000020 00 2f 68 6f 67 65 2f 74 65 73 74 2e 74 78 74 cb  >./hoge/test.txt.<
000030 c8 4f 4f cd 00 62 2e 00 50 4b 01 02 00 00 14 00  >.OO..b..PK......<
000040 00 00 08 00 69 72 48 4e 07 19 91 61 09 00 00 00  >....irHN...a....<
000050 09 00 00 00 0e 00 00 00 00 00 00 00 00 00 00 00  >................<
000060 00 00 00 00 00 00 2f 68 6f 67 65 2f 74 65 73 74  >....../hoge/test<
000070 2e 74 78 74 50 4b 05 06 00 00 00 00 01 00 01 00  >.txtPK..........<
000080 3c 00 00 00 35 00 00 00 00 00                    ><...5.....<
00008a

先頭にある ef bb bf がBOMである。この例では、readfileをする前に、 ob_end_clean 関数 を呼ぶことでBOMを出力しなくなる。

<?php
        $zip = new ZipArchive();
        $temp_dir = sys_get_temp_dir();
        $zip_name = 'test.zip';
        if (!$zip->open($temp_dir . '/' . $zip_name, ZIPARCHIVE::CREATE)){
                exit();
        }
        $zip->addFile('test.txt', '/hoge/test.txt');
        $zip->close();
        header('Content-Type: application/zip');
        header('Content-Length: '.filesize($temp_dir . '/' . $zip_name));
        header('Content-Disposition: attachment; filename="'.$zip_name.'"');
        ob_end_clean();
        readfile($temp_dir . '/' . $zip_name);
?>

以下のようにエラーが発生しないようになった。

$ unzip test.zip
Archive: test.zip
warning: stripped absolute path spec from /hoge/test.txt
inflating: hoge/test.txt

関連した話として、RedHatEnterpriseLinuxもしくはCentOSではバージョン7よりSystemdのPrivateTmpという機能が有効になっている。sys_get_temp_dir()ではデフォルトでは、/tmp/以下のディレクトリが取得できるが、実際には/tmp/systemd-private-xxxxx-httpd.service-xxxx/tmp/ に書き出しされる。デバッグする際にファイルを取り出したい場合などにファイルが見当たらないといったことになるので、注意が必要。

MariaDBでBLOBを取扱時の注意事項

BLOBでバイナリデータをPHPから書き込みするときにはまったポイントをいくつか。。。MariaDBでの発生事例だが、MySQLでも同様だと思う。

・BLOBは65535Bytesしか格納できない。BLOBよりも大きなサイズの格納が必要であれば、MEDIUMBLOB、LONGBLOBを利用する必要がある。
・BLOB型にデータをinsertするときにはバイナリデータをストリームのまま登録することはできないので、PHPであればbin2hex関数でいったん16進数に変換してinsertした後、selectするときにhex2bin関数で戻す必要がある。また、BLOB型で65,535byteを超えるデータをinsertすると先頭65,535byteだけが登録されてしまう(insert時にエラーにならない)ので、insert前にデータサイズのチェックが必要。
・パケットサイズを大きくする必要がある。max_allowed_packet という設定値だが、デフォルトでは1MBなので、設定値を超えるデータをinsertしようとするとエラーが発生する。mysqlで大きなファイルを保存するための設定 を参考にログファイルサイズの設定値も変更したほうが良いかもしれない。
・PHPの設定項目値として、php.ini でupload_max_filesize設定値を確認する。この値を超えたデータがPOSTされても、$_FILES[name][name]でファイル名は設定されるが、データは一時ディレクトリに保存されず、
$_FILES[name][tmp_name] は値がセットされない。また、環境によってはset_time_limit関数を使ってタイムアウト時刻を調整したほうが良い。

GAとは

昨年のvForum Tokyo2018に参加した際にGAという表現があったが、GAの意味が理解できなかった。

GoogleでGAを検索してもよくわからず。。。。

つい先日、 Kubernetes完全ガイド を参照する機会があり、本文でGAに触れられており、Generally available(一般ユーザに利用可能な状態になること)であることが分かった。

最近略語が多くて本当に分からないことが多い。。。

Amazon Linux 2にAppiumを導入する

AppeiumはAndoroidやiOSのアプリケーションのシステムテストを行うためのテストツールとして紹介しているサイトもあるが、Windowsアプリケーションのテストにも利用できる。
Linuxbrewに従って、下記を実行。

sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile
sudo yum install jre
yum install **/stdint.h
brew install npm
npm install --global appium appium-doctor wd
appium &

Windows Application DriverでWindowsアプリケーションのテストを自動化しよう を参照してWindows Applicationのシステムテストを行う

IAMユーザで請求画面が表示されない

チュートリアル: 請求コンソールへのアクセス権の委任 に従って登録しても請求画面を表示しようとするとエラーメッセージが表示されてしまって悩んだ件について

なお、上記チュートリアルでは、
[Visual editor (ビジュアルエディタ)] タブで、まず [Choose a service (サービスの選択)] を選択します。次に、[請求] を選択します。
と記載があるが、請求を選択することができない。代わりにBillingを選択しなければならない。単純に翻訳されてしまっているためだろうか。。。。ちなみに、サービスから検索ボックスで「請求」を入力するとBilling Managerが選択できる。(履歴タブにも「請求」が表示されるようになる)

【表示されるエラーメッセージパターン1】
You Need Permissions
You don’t have permission to access billing information for this account. Contact your AWS administrator if you need help. If you are an AWS administrator, you can provide permissions for your users or groups by making sure that (1) this account allows IAM and federated users to access billing information and (2) you have the required IAM permissions.

【表示されるエラーメッセージパターン2】
アクセス権限が必要です。
このアカウントの請求情報にアクセスするためのアクセス権限がありません。サポートが必要な場合は、AWS 管理者に連絡してください。AWS 管理者は、(1) このアカウントが IAM およびフェデレーティッドユーザーに対して請求情報へのアクセスを許可できること]、および (2) 必要な IAM アクセス権限を持っていること]を確認して、ユーザーまたはグループにアクセス権限を付与できます。

原因は、IAM ユーザー/ロールによる請求情報へのアクセスは無効になっているためである。下記手順にてIAMユーザによるアクセスを有効化する必要がある。

1.マスターアカウントにて、右上のアカウント名が表示されているところをクリックして「アカウント」を選択する。

2.IAM ユーザー/ロールによる請求情報へのアクセス の編集をクリックする

3.IAM アクセスのアクティブ化 のチェックを入れて更新ボタンを押下する

“IAMユーザで請求画面が表示されない” の続きを読む