情報セキュリティに関するアンケートの信頼性

CSIRT構築済み企業は4割以上に、ただしセキュリティ人材不足の企業が依然8割以上

そもそも、自社の情報セキュリティの状況についてアンケートに答えるという行為自体が、重大な情報漏洩に繋がりかねない件について・・・

自社の情報セキュリティに関する情報というのはとても重要な機密事項になる。CSIRTを組織しているか否か程度なら組織図や役員構成などの公開情報を見ればわかるのであえて秘密にする意味はないが、社内でセキュリティ問題を抱えているシステムに関する情報などは本来絶対に外に出せないものだ。もし「Windows XPを使ったシステムがあります」などといえば、攻撃者にWindows XPの脆弱性を利用すると成功率をあげられることを教えているようなものになる。人材不足などについても同様のことが言える。

この手のアンケートをどう読み解くかは難しい。解答した660社(22%)は自社のセキュリティ情報を無警戒に流出させた間抜けかもしれない。もちろん相手の信頼性や公開できる情報の範囲を熟慮して回答した企業もあるだろうが・・・。この手のアンケートは著しくサンプルが偏っている可能性が高い。集計結果は眉に唾をつけて読み解くしかないだろう。唯一信じられるのは22%が回答したということだけだ。

実は企業のセキュリティ対策の実態というのは非常にセンシティブな情報で簡単には外に出てこない。他社がどうしているのか気になるのは日本人の性かもしれないが、セキュリティに関しては自身の知識と技術、そして良心を頼って進むしかないのである。

RabbITを使ってAndroidのデータ通信量を削減する

RabbIT ProxyはHTMLから不要な文字やコメントを削除したり、GZIPで圧縮したり、あるいは画像データの品質を下げるような変換をすることでデータ転送量を減らすソフトウェアです。その当りの仕組みはOpera Maxと同様ですが、自分でサーバーを用意するのであれば画像の品質をどの程度まで下げるのかなど、自由にパラメータ調整を行える分だけ、より使い勝手の良い通信料削減システムを構築できます。
RabbITはJavaで開発されておりWindowsでもLinuxでも動作します。今回はLinux上に構築してみます。

Java Runtimeのインストール
詳細は説明しません。最新のJava Runtimeをインストールします。最近のディストリビューションではOpen JDKがデフォルトになっていますが、Open JDKではjpeg画像ファイルを扱えないためRabbIT Proxyが動作しません。

RabbITのインストール
RabbIT Proxyをダウンロードします。http://www.khelekore.org/rabbit/から最新のバイナリをダウンロードします。ダウンロードしたrabbit4.xx-bin.tar.gzを解答すると、rabbit4.xxというフォルダが作成されます。後はrabbit4.xxフォルダに移動して次のコマンドを実行するだけです。

java -jar jars/rabbit4.jar -f conf/rabbit.conf

パソコンのブラウザでプロキシ設定を追加して、サーバーのポート9666に接続されるようにしてみましょう。Proxyとして動作しているはずです。

RabbITの設定
このままではセキュリティ上よろしくないのでいくつか設定を変更します。設定はconf/rabbit.confを変更します。
まずはポート番号を変えておきましょう。デフォルトは9666ですが、サイコロでも振って適当なポートに割り当てます。

# This is the port the proxy listens on.
# Use any port available (over 1024 unless you run as root).
port=9666

次にProxy接続時にユーザIDとパソワードを使うように変更します。
httpinfiltersの末尾に”,rabbit.filter.ProxyAuth”を追加します。

# Here we filter the HTTP header, these filters should have an
# public static HTTPHeader doHTTPInFiltering (Socket, HTTPHeader,
# Connection)
# method that may modify the incomming request. If a HTTPHeader is
# returned it is sent to the client and the request is finished. (this
# is an easy way to block some ads and other bad stuff).
# The list is comma separated and full class names has to be used.
#
# Available filters today are:
# HttpBaseFilter   this is basically needed, use it.
# DontFilterFilter stop the proxy from filtering certain pages.
# DontCacheFilter  stop the proxy from cacheing certain pages.
# BlockFilter      Dont allow access to certain pages.
# HttpSnoop        Print the Http headers out on System.out.
# ProxyAuth        Perform proxy authentication on all users, backend is some type of db
#                  This filter needs to be after HttpBaseFilter to work correctly.
# ReverseProxy     Transform requests to "/some/page" into "http://some.host/some/page"
#                  If you use the reverse proxy option, you probably
#                  want it first in the list
# NoGZipEncoding   A filter that removes "Accept-Encoding: gzip". Not very useful anymore
#                  since rabbit can repack gzip:ed and deflated files.
# RevalidateFilter A filter that makes sure that resources are always re-validated
# SetHeaderFilter  A filter that can add request or response headers.
# SQLBlockFilter   A filter similar to BlockFilter, but that uses a sql database to block
#                  access to a set of hosts
#
# by default we use a few filters,
httpinfilters=rabbit.filter.HttpBaseFilter,rabbit.filter.DontFilterFilter,rabbit.filter.BlockFilter,rabbit.filter.RevalidateFilter,rabbit.filter.ProxyAuth

Proxyに接続するためのユーザーIDとパスワードはconf/allowedに記述します。もともと書かれている”RabbIT:RabbIT”という記述を削除して、”example:password”を追加します。
ここで再びパソコンブラウザにProxyを設定してつないでみましょう。ちゃんとユーザー認証付きでつながりますか?

AndroidのProxyを設定
昔はAndroidのProxyを設定するにはroot権限取得とか脱獄が必要でしたが、今は脱獄せずにProxyを設定するツールも出ています。わたしはDronyを使ってProxyを設定しました。

screenshotshare_20150127_002057SETTING画面を表示して”Settings for not listed networks”をクリックします。これで下の画面が表示されます。

 

 

 

 

 

 

screenshotshare_20150127_002141

NOT LISTED NETWORKS-MANUAL PROXYの項目にProxyサーバーを設定します。Proxy TypeをPlain Http Proxyに、Hostname、Port,Username、Passswordをそれぞれ設定します。

このあとDronyによるフィルタリングを有効にすると、Proxyサーバー経由で通信が行われるようになります。

 

 

 

 

ちなみに、Proxy経由だと動作しなくなるソフトも多数あります。そういうソフトはFILTERのRulesでProxyを経由しないように個別にDirectに指定します。逆にDefault valueをDirect All(Proxyを経由しない)に指定しておいて、圧縮の効くソフトだけをRulesにAllowedで追加しても良いかもしれません。

というわけで、ちょっと技術には詳しいんだという方は試してみてはいかがでしょう?

念のためいくつか注意点も・・・

※自宅で普段使っているWindowsパソコンにProxyを導入してインターネットから接続を受け付けるサーバーとして使うことはお勧めしません。サーバーをインターネットに公開したとたんに、数多くのクラッカーからの接続が始まります。業務やプライベートなデータを取り扱うパソコンをサーバーにするのはやめましょう。

※可能なら接続元IPアドレスも制限しましょう。auやDocomoのスマホや携帯電話が使用するIPアドレスの範囲は公開されていますので、それらのIPアドレスからの接続を禁止すればより安心です。

Windows 10に向けた企業の準備

Windows10が発表され、話題はそれ一色になってますね。私は戦々恐々としてます。社内のITシステムの運用開発体制を刷新する事が求められようとしているからです。

ラピッドリリースという用語を知ってますか?最近はラピッドリリースで開発されてるソフトウェアが非常に増えてます。Google Chromeとか、Facebookとか、数えたらきりがないほど。従来のソフトウェアは何年か事にメジャーバージョンアップが行われ、その時に機能追加などが大きく発表されました。もちろんバージョンアップしない選択肢も用意され、古いバージョンをサポート修了まで古いバージョンを使い続ける事も出来ました。ラピッドリリースではメジャーバージョンアップを待たずに頻繁に機能の追加や変更がなされます。そして、最新のバージョン以外ではアップデートが提供されず、古いバージョンで固定することが出来なくなります。

現在の国内企業の多くは社内のIT部署を縮小し、開発や運用にかかわる機能をアウトソースしてきました。そしてクライアントのバージョンを固定し、特定のバージョンで問題なく動作する事が確認されればアウトソース先の加発チームも解散し、次回の大規模更新まではバージョンを固定してきたわけです。

今回の発表でWindows 10以降はラピッドリリースになることが確実になってきました。となると今後はMicrosoftの発表する新機能や、旧機能との互換性廃止の情報をつねに収集して、社内システムが問題なく動作するか直ちにテストし、動作しなければ直ちに修正を行える開発体制が必要になるということです。今後は頻繁に行われるアップデートに備えて、最低限の開発体制を常時維持することが必要になってくるはずです。

これは容易なことではありません。自社内のIT部門を強化するにしても、すでに失われた開発体制を再構築するというのは、多くの時間とコストがかかります。アウトソースするにしても、アウトソース先が本当に開発体制を維持しているか確認するのは容易ではありませんし、保守のために外部に支払う費用は確実に増大することでしょう。

Androidでデータ通信量を節約する

どこのキャリアもデータ通信量は上限がついてしまって、使いすぎるといざというとき、ブロードバンドを使えずに困ってしまいますよね。Androidに標準でインストーリされているChromeブラウザにはデータを圧縮して通信することで、通信量を削減する機能があるので、有効にしておくとよいですよ。

screenshotshare_20150122_000536
データの圧縮を有効にするにはChromeを起動した後、メニューから設定を開きます。

screenshotshare_20150122_000207
設定画面の下のほうにある「データ使用量を節約」をクリック。

screenshotshare_20150122_000220
データ使用量を節約の画面から右上のスイッチをONに切り替えます。

ただしこのデータ圧縮機能はChrome上で閲覧した分に限られます。Opera MAXのようにすべての通信について圧縮してくれるわけではありません。ただ逆に有効になってほしくないときには、Chrome以外のブラウザから閲覧すればよいので、かえって使い分けもしやすいのでお勧めです。

参考:Chrome モバイル ブラウザでのデータ使用量を節約する

Brandoo WordPressで¥を入力できない。

Brandoo WordPressにてコンテンツに/(半角バックスラッシュ)や¥(半角円マーク)を入力していると、更新ボタンを押しても変更内容が保存されずに、元に戻ってしまう。

暫定的な対策としては、テキスト編集画面で¥と入力すればBlog上は半角の¥マークを表示することが出来る。だが一度ビジュアルエディタの編集画面に戻ってしまうと、¥から¥に変換されてしまうので、あまり現実的な解決方法ではない。

この現象は既に公式にもバグと認識されており、GitHubのCannot add post containing a % characterでも次のリリースにて修正される予定になっている。ただ実は、ちょっと困ったことにGitHubのサイトは放置気味になっている。Text Replacerのプラグインを使ってみたが、プラグインの設定を保存する部分でも¥が失われてしまうため、ちょっと一朝一夕にはいきそうもない。

自作を試みてみるかな・・・

Visual StudioでGroongaを使用するには

groongaのWindows用バイナリに含まれるライブラリは拡張子が….aとなっている事から分かるようにLinux用の環境でビルドされたものです。Visual Studioからgroonga APIを使用するにはソースコードをダウンロードしてWindows上でビルドしなおす必要があります。

次のURL(http://www.cmake.org/)よりダウンロードして、CMakeをインストールします。特に特筆すべき事はありません。

Visual Studio Expressをインストールします。Visual C++ Express 2010は次のURL(http://www.microsoft.com/visualstudio/jpn/downloads)からダウンロードできます。groongaのリファレンスマニュアルではVisual C++ Express 2010を前提に記載されていますが、現行バージョンのVisual Studio 2013 Expressでも問題ありません。

CMAKEのインストール先フォルダをPATHに追加します。

Visual Studioのインストール先フォルダにあるvcvarsall.batを実行して環境変数を設定します。

下記のコマンドを実行してインストールします。Visual Studio 2013を使用する場合には、「Visual Studio 10」を「Visual Studio 12」に置換えます。

cmake . -G "Visual Studio 10 Win64" -DCMAKE_INSTALL_PREFIX=C:\groonga
cmake --build . --config Release
cmake --build . --config Release --target Install

多数のワーニングが表示されますが、気にするのは止めましょう。

二段階認証に使用しているスマホをなくすと・・・

セキュリティ向上のために様々なサービスでスマホなどを活用した二段階認証を利用できるようになっている。セキュリティは向上するが、もちろんスマホが失われればログイン出来なくなるリスクが存在している。特に専用のアプリをインストールする、ワンタイムパスワードなどはロック解除の手続が必須となるため注意が必要だ。スマホの水没によりログイン出来ない経験をした自戒の意味も含めて纏めておこうと思う。

AWS(Amazon Web Service)

ログインID(メールアドレス)とパスワードでログインすると、ワンタイムパスワードを求められる。ここからワンタイムパスワード解除のための、受け付けページに行き理由や連絡先電話番号を入力して申請する。5分ほどでAmazonから先ほど入力した電話番号に電話がかかってくる。もちろんオペレーターは英語しか話すことが出来ない。本人確認のために名前と登録メールアドレスを求められるので回答する。そうすると登録メールアドレスに解除コードが送られてくるので、解除コードをオペレーターに回答する。以上でロックが解除されワンタイムパスワード無しでログインできるようになる。

Windows Live アカウント

ログインIDとパスワードを入力するとスマホからの認証待ちになる。当然認証できないので、エラー画面に移動し、ここから解除のためのリンクへと進む。ロックの解除には氏名、メールアドレス、電話番号等の個人情報を入力する。本人確認の審査が完了するまで最大48時間かかる旨の受付完了メールが送られてくる。私の場合はきっちり二日後にロック解除の認証コードが書かれたメールが送られてきた。Windows Liveアカウントはメールアドレスなどの個人情報が任意入力項目なので、本人確認をどのように進めるかはケースバイケースになる物とおもわれる。

通信プログラムを送信スレッドと受信スレッドに別けては駄目

TCP/IPやシリアル通信において、データの受信と送信を別々のスレッドでおこなえば、アプリケーションを単純化し、パフォーマンスも向上するように感じるかもしれない。これは初級から中級のプログラマがやりがちなことだが、多くの場合は徒労に終わる。

一つ目の問題として、実はOSは送信と受信を同時に実行することが出来ない。アプリケーションからドライバに対する要求はFIFOキューに格納される。デバイスドライバはFIFOキューに格納された命令を順番に処理していく。してがってAスレッドの受信命令と、Bスレッドの送信命令がキューに格納されている場合、Aスレッドの受信命令の処理が終わらない限り、Bスレッドの送信命令も待機することになる。アプリケーション側のスレッドを単純に分けただけでは、送信と受信を非同期におこなう事は出来ない。

送信と受信をほぼ同時に処理するにはノンブロッキングモードを使う必要がある。ノンブロッキングモードなら、ドライバはデータの有無に拘わらず直ちに応答を返して次の処理に進むので、受信と送信をほぼ同時に実行することが出来る。

二つ目の問題として、殆どのプロトコルにおいて、送信が正常に行われたか判断するためには受信データが必要になることにある。送信処理と受信処理は互いに深く関係した密結合となる。そのため送信処理と受信処理との間で情報を交換するためにフラグや排他制御が必要になる。正常処理だけなら良いか、これに異常時のリカバリ処理まで含むと状態遷移が複雑になり、余程慎重に設計しないとスパゲティのように絡み合ったソースコードになってしまうはずだ。

通信プロトコルが送信とその応答を非同期的に処理することを前提に設計されていたり、あるいは非同期的に処理することでパフォーマンスの向上を臨んでいるなら、送信と受信を分離する価値はあるだろう。そうでないなら、止めた方が無難だ。

ではどのような設計なら良いのだろうか。私見だが「他スレッドからFifo Queue等で要求を受付け、コマンドの送信、応答の受信、必要に応じてエラーリカバリ処理を行って、要求元スレッドに応答を返すようなスレッド」を作るのが良いと思う。この方法だと通信に伴って発生する状態遷移を単一スレッドの中に閉じ込めることが出来るので、複雑さが増す事を避けて実装する事が出来る。

Workbooks.Openでマクロの自動実行を防ぐ

Excel VBAからWorkbooks.Openにてファイルを開くときに、WorkBook_Openに書かれたマクロの自動実行を防止するにはファイルを開く前後において、Application.EnableEventsにおいてイベント処理を停止しておくと良い。

Application.EnableEvents = False
WorkBooks.Open(~)
Application.EnableEvents = True