bokusui について

ソフトウェアハウスでのPG・SEから始まり、10年近く勤めた金融系企業の社内SEを数年前にやめ、フリーランス時代を経たのち法人成りしました。システム開発の全工程をこじんまりとやり続けています。

情報処理安全確保支援士の実践講習を受けてみた

 何となく更新を続けていた情報処理安全確保支援士ですが、3年目となったので実践講習を先月受けてみました。

 このご時勢なので、今はオンラインでのリモート講習になってます。それまでは両国とかに集まって実施していたそうです。

 講習はWebexを使って30人程が参加し、5人づつチームを組んで課題について討議し発表を纏めるという進め方で、課題は事前に資料が配布されており、とある企業で発生したセキュリティインシデントの初期対応や、事後予防策を検討するというものです。

 チームでは予め、進行、書記、発表と3つの役割をローテーションで担当するよう決められており、中でもWebで共有されたドキュメントに、意見を聴きながら発表に向けて書き込んでいく書記役は結構疲れます。

 講習自体は、主に社内CSIRTの責任者という立場を意識した形なので、どちらかといえば社内SE向けの内容でした。筆者としては現状の実務とは関係がないし、受講費用も高いですが、まあ受講して良かったかなという印象です。ただ、講習の内容が1つなので、セキュリティ人材を増やしたいという国の目論みにあっているように思えません。役割に応じて複数から選択出来ればよいのですが。

 とりあえず3年経って1回目の更新をしてみましたが、正直なところ、相変わらず知名度が低すぎて更新するメリットが見いだせない資格です。特に毎年のオンライン講習は内容に対して受講費用が高すぎるので、何とかして欲しいものです。支援士という名称も含め制度として見直して欲しい所は沢山ありそうですが。。

 講習後、更新資料を書留で送って3週間くらい経ってから受理した旨のメールが来てましたが、そのあとは更新期限の10月になってからなのか、何の音沙汰もありません。

Java mail で Unknown encoding 発生

Javaで書いた、いろんなメールを受信して業務の一部を自動化するツールを何年も運用しているのですが、見慣れないエラーが出ていたので確認すると、

java.io.IOException: Unknown encoding: 8-bit
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:116) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:83) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795) ~[?:1.8.0_275]
at javax.activation.DataHandler.getContent(DataHandler.java:542) ~[?:1.8.0_275]
at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:683) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]

Caused by: javax.mail.MessagingException: Unknown encoding: 8-bit
at javax.mail.internet.MimeUtility.decode(MimeUtility.java:405) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:109) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
... 13 more

とログに吐き出されています。

String body = (String) mailpart.getContent();

と、コンテンツタイプがtextのメールパートを本文として文字列にキャストしたタイミングで例外に飛んでます。

該当のメールをEMLファイルでメールの中身を確認すると
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: 8-bit

となっています。

通常は
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit

だったり、

Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit

のようです。

Javamailでは、8bitでなく8-bitだと例外になるのか。。。
仕方ないので、キャストに失敗した後に強制的に8bitに置き換えて本文を読み取るようにしました。

part.setHeader( "Content-Transfer-Encoding", "8bit");
String body = (String) p.getContent();

メールの受信処理は、送信側次第でイレギュラーなメールが発生するので面倒です。。

VBScriptをエンコードしたVBEをHTAに使用する

 数年前にHTA+VBScriptで簡単に作った画面ツールに、メールを送信する機能を追加する事になりましたが、送信に使用するSMTPが認証を必要とするので、パスワードは暗号化しなくてはなりません。

 VBScriptだと、暗号仕様やIV、キーがスクリプトなので読めてしまうという事。どうしたものかと、下記を発見。スクリプトをエンコードし、読めない形に出来る模様。知らなかった。。

 やろうと思えばデコードも出来てしまうようですが、基本的に要員専用の業務端末なので、まあそこまでは気にしないという事にしときます。

 下記のようにHTA側には難読化していないこれまでのVBSとエンコードしたVBEの2つのスクリプトを指定して使用します。

<script language=”VBScript” src=”easytool.vbs”>
</script>
<script language=”VBScript.Encode” src=”crypt.vbe”>
</script>

 

 IEサポート終了のアナウンスがあり、そろそろHTAも終了かと思いきや、まだ大丈夫そうです。。

apache.commons.csvでinvalid char between encapsulated token and delimiter

 だいぶ前に作ったapache.commons.csvとapache.poiを使ったCSVファイルからエクセル出力処理で、

java.io.IOException: (line 3) invalid char between encapsulated token and delimiter

 が発生していました。原因は、ダブルクォーテーションで括っているデータ項目の中にダブルクォーテーションが混ざっていたからなのですが、データを出力する側で対処するのが出来そうにないので、CSVファイルを読み込む所で何とかならんものかと検討。
 
 CSVファイルを読む箇所は下記のようにInputStreamが渡され、CSVRecordリストを取得して色々やるという内容です。

 殆どの場合で問題は発生しないので、出来れば失敗した場合のみリトライ出来ればいいかなと、データ内に混ざりこんだダブルクォーテーションをエスケープするようにしてみます。正規表現での変換を3段階かますことで、一部ケース(データ内にカンマとダブルクォーテーションが連続した場合)は問題ですが、今回はまあこの位で。。

 次に失敗した後のフォローとなるので、読込が進んでしまっているInputStreamを何とかしなければなりません。結局、IOUtilsでテンポラリファイルにコピーしてから読み込むようにしました。

オンライン選挙はいつ?

 日曜に県知事選挙があったので荒天の中、所有する傘の中で一番頑丈そうなのを選択して投票所へ行ったのですが、圧倒的な瞬間風速にあっさりと傘が損壊、無理して行かなくてもよかったような・・と思ってしまいましたが、そもそも今の時代になんでオンラインで投票できないのかと考えました。

 メリットやデメリットの話ではなく、現行法の制約等は考えず、純粋にただ実現させる為には何を決めるべきなのでしょうか。

 まず、最初にオンライン投票への移行方法です。従来の方法を廃止してオンラインのみにするというのをいきなりやる事はあり得ないとして、オンライン投票の併用期間をどの程度の長さで設定するかという事があるかと思います。選挙自体が年数回あるかないかなので、運用に慣れるには当面は期限を設けず併用し続けるか、または数十年レベルの期間を経た後、コスト削減の為に従来方法を廃止しオンラインのみに移行させた方がよさそうです。
 併用期間では、従来方式とオンラインの整合性をいかにとるかという課題がでてきますが、オンラインは期日前投票のみとした方が仕組み上簡単そうですね。エストニアはそうしているようです。

 次に認証方法です。
 現時点ではマイナンバーカードが有力ですが、筆者のように毎年e-Taxで使っているような人は少ないと思いますので、これでは当面普及しないでしょう。他に、投票券にQRコードを印刷してスマフォで投票とかもありそうですが、マイナンバーのX桁目とX桁目とかを入力させるといった他の認証と組み合わせた方がよいですね。

 あと、既存の投票券発送データを使うでしょうから、自治体とオンライン選挙システム間でどう連携するかという箇所は何等かの調整が必要そうですが、それ以外は、合意形成が必要そうな箇所はあまりないのでなるようになるでしょう。やると決まってしまえばあまり時間を掛けずに出来そうなのですがどうですかね。

JavaMailメール送信でSMTPサーバを指定するもlocalhostへ接続

 メール送受信をする処理が動いているサーバを別のインフラに移動したいという事で、移行作業し稼働させたところ、メール送信が出来なくなっている事が判明。

 正確には、メール送信処理は複数あり、単純なJavaアプリとして稼働しているプロセスでは問題が無く、SpringbootでWebサービスとして稼働している処理のみが問題となっています。どちらも元のサーバ上では何ら問題なく動作していました。新環境ではJavaアプリのテストはしてましたが、問題無かったのでSpringboot側は割愛してしまいました。なお、Javaアプリと比べて、Springboot側はjavamailのバージョンがSpringbootのバージョンに引きずられて微妙に古い状況(1.6.1)。

 アプリ的には正常終了扱いとなっており、どこでメールが止まっているのかと調べてみると、mail.smtp.hostで指定しているSMTPサーバにはメール送信ログは無く、なぜか移行先サーバー内の/var/log/maillogにログが、、
Network is unreachable で終わっています。

 どうやら指定しているSMTPサーバでなく、localhostに対しメール送信要求をしているようです。

 とりあえず、移行先のサーバでpostfixを稼働させる必要は無いので止めてもらい、メール送信テストを行うと、今度は接続出来ないとアプリ側でエラーになりました。

 どうも、、デフォルト設定がlocalhostで、そちらが優先されているようですね。。

アプリ側が
session = Session.getDefaultInstance(props);
だったので、
session = Session.getInstance(props);
に変えて問題は解消しましたが、どこでデフォルト設定されているのかは不明なままでした。。

こちらが参考になりました。影響は軽微で、ちょっと痛い目にあったという感じです。

カテゴリー: Java

slatedocsを試してみた

 APIのドキュメントってどうしようか?
 という話の中で、メンバーからslateがいい感じらしいという推しがあり試してみました。

 とりあえず動きを確認するという事で、DockerHubにあったslateを手っ取り早くdocker pullして動かします。
 
 動きは確認出来たので、swagger-to-slateを使ってswaggerで作成してあったAPI仕様を変換し、作成されたmdファイルをindex.html.mdにリネームしてdocker-composeでボリューム指定します。

 各言語向けの説明は別途書き込む必要がありますが、いい感じで表示されています。

 index.html.md内のincludes部分にファイルを追加指定すれば、複数のファイルに分割する事が出来そう(初期インストールでは_errors.mdが配置されています)なので、index.html.md内はイントロや認証関連のみ記載し、includesで複数ファイル構成にするのがよさそうですね。
 

VS Code+Docker php開発環境構築でxdebugバージョンにハマる

 phpで作られた既存システムの開発環境を、VS Code+Dockerで再構築していました。
 情報はたくさんWebで見つかるので、構築はそれ程困りませんでしたが、最後のVS Codeからのデバッグ実行でちっとも止まってくれません。

 phpはたまにしか触らないレベルなので、こうなると一気にハマって先に進みません。

 暫く試行錯誤しながら何となくphpinfoを確認していると、どうもxdebugのバージョンが3になっているようです。
 で、xdebug3でWebを探すと案の定、php.iniの記述がこれまで参考にしていたサイトと違う内容になってました。

 ハマった時は落ち着いて状況を確認しないと、無駄な時間が増えてしまいますね。

wordpressのチェックボックスが表示されない

 何時からか忘れましたが、wordpressでチェックボックスを押しても反応が無くなりました。これではチェックされているかが解りません。

 かなり不便なので、いい加減治したいと、何気なくブラウザの開発ツールを見ていたら、チェックボックスを押したタイミングで下記のようなエラーが出ているのを発見。

 あ、以前にセキュリティ対策としてnginxの設定を弄ってましたねえ。それが問題になっているようです。

 nginx.confを見直ししてadd_header Content-Security-Policyのimg-srcにdata:を追加。

 治りましたが、Mozillaのページでは非推奨だって書かれてますね。。

push.jsでWindows10端末に通知してみた

 システム障害時のアラートといった、イベント発生をトリガーに業務対応するようなシーンで、これまでメール受信で対応していましたが、多種のメールに埋もれて気が付けないケースが出てきたという事で、メールに変わる何らかの通知機能は無いかと検討。

 要件としては、対象はWindows10端末のみ、内部的な仕組みな為、外部サービスの使用は不可、イベントはチケットシステムに登録されるので、チケットシステム上に、イベント一覧画面を作成して定期的に画面をリロード、push.jsで通知する形なら、まあ気が付くだろうと試してみました。

 push.js自体の実装自体は簡単で、適当にググってサクッと完成。通知を出したら同じ通知を次は出さないとかは個別に工夫します。

 基本的に通知設定は端末・デバイス側の設定に依存しており、Windows端末ならシステム設定から通知設定をするんですが、それ以外にもブラウザ毎に通知仕様が微妙に異なるようです。FireFoxは通知を複数表示できるが、Chromeは1件だけとか。

 Push.Createコール時にrequireInteraction: trueにした場合、Chromeの通知は閉じるボタンが付き、かなり長時間通知が表示された状態になるようでしたが、Edge(Chromium前?)はそうでもなかったりとか。また、Push.Createのコール時のtimeout設定は、特に効いていないようでした。

 あと、基本的にブラウザが通知を許可してくれるのはlocalhostかhttpsのサイトだけという縛りがありますが、Edgeならhttpサイトでも通知が可能だったのでテストに便利です。

 でも、イベント発生トリガーをメール受信からおきかえられるかは業務利用次第ですね。