docker-compose.yml の変更が反映されない

コンテナ内の/etc/hostsに定義を追加したかったので、extra_hostsを定義して
docker-compose restart

docker-compose stop
docker-compose start
としてもうまくいかない。

切り分けするために別のコンテナ定義を作成して
docker-compose build
としても
(コンテナ名) uses an image, skipping
となってイメージをpullしてくれない。

原因は、
docker-compose up -d
としていなかったから。

docker-compose `up` とか `build` とか `start` とかの違いを理解できていなかったのでまとめてみた。 で紹介されているようにstartオプションではイメージの更新が行われない。
buildオプションはイメージがなければpullしてくれそうな気がするが、もう少し調べてみることにしたい。

テレワークではじめる働き方改革

https://work-holiday.mhlw.go.jp/material/pdf/category7/01_01.pdf
81ページ目
DELL バーチャルオープンオフィスで講演されている「中堅企業の働き方改革を本気で考える」のスライド内にテレワークではじめる働き方改革 テレワークの導入・運用ガイドブックが引用されていた。
このガイドブックの存在を初めて知ったけれど、テレワークに関するセキュリティの言及が経済産業省ではなく厚生労働省というところが面白い。

WordPressで投稿ができない

投稿しようとすると添付資料のように
更新に失敗しました。エラーメッセージ:返答が正しいJSONレスポンスではありません。
と表示されて投稿に失敗する。

もともと自宅サーバで運用していたデータをAWSに移行した際に権限が正しく付与されていないことによって発生したと考えられる。
コンテナ版のWordpressでRDSに接続して作成したところ無事投稿が出来た。(本記事はコンテナ版のWordpressにて書き込みしている)

FPフォーラム2019inいしかわ

お二組各50分ずつメインの相談者のCFPの方とともにご相談にのりました。

前日まで相談時に提示が必要なライセンスカードをしまい込んでいて見当たらずかなり焦ったが、なんとか見つかって当日を迎えられた。

相談会にこられる方は多くのリスクに不安を感じていらっしゃる方が多い一方で、しっかりとした考え方をお持ちの方が多く、ファイナンシャル・プランニング技能士としてできることは後押しとご相談者の方の知識の周辺の部分に新たな気づきを感じて頂くことくらいでした。

今日足を運んで頂いた方に少しでも来てよかったと思ってもらえれば幸いです。

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/ に書き出しされる。デバッグする際にファイルを取り出したい場合などにファイルが見当たらないといったことになるので、注意が必要。