SWEet

A Software Engineer Is Eating Technologies

情報セキュリティにおける認証

 今年の夏休みは十年来の友人に連絡が取れたりドラクエ夏祭りに参加したりと中々充実していた気がします。

さて、今回は現代のインターネット、情報システムにおいて当たり前のように使われている認証技術についてまとめてみました。

認証って?

認証:「一定の行為や文書の作成が正当な手続きによってなされたことを定められた公の機関が証明すること」(出典:松村明編『大辞林 第2版』三省堂

らしいです。堅苦しいですが、情報セキュリティにおいての認証には二つの要素が含まれています。それが、Authentication と Certificationです。

  • Authentication

    主にユーザーID、パスワード、もしくは生体情報などを用いて人、物、情報を識別し、その正当性や真正性を直接確認することです。通常は何らかの情報資産やシステムリソースなどへのアクセス権を管理し、アクセス制御を行っているシステムや人間と、それらに対するアクセスを要求するものとの間で直接的に認証行為がおこなれます。なのでこのような認証の方式を二者間認証という場合もあるそうです。

  • Certification

    デジタル証明書による認証に代表されるような認証局などの第三者が発行する証明書の保有をもとにその持ち主の正当性を確認すること。つまり、この方式では認証が欲しい人、それを認証する人、そしてそれに介在すいる第三者(登録管理者なんて呼ばれてます)によって認証行為が行われます。こういった場合三者間認証なんて呼ばれるそうです。辞書に載っている方の認証に近い意味を持つのはこちらでしょうか?

    「単位を教授に認めてもらう」なんていうのもCertificationに近いでしょうね(白目)

認証の分類について

先程述べたAuthenticationについて認証の対象を人、物、情報の三つに大別していました。その内容と具体例を調べてみました。

認証の種類 内容 具体例
人の認証 個人の識別を行い、事前に登録されている本人であることを確認すること ユーザーIDとパスワードによる本人認証、指紋認証
物の認証 システムやネットワークへのアクセスを要求している機器などの正当性を確認すること MACアドレスによる端末の認証、発信元電話番号による端末の認証
情報の認証 情報が不正に改変されていないことを確認すること メッセージダイジェストやディジタル署名によってプログラムやデータの改ざんの有無を確認|

所有物(ICカード、磁気カード)や秘密情報(パスワード、暗証番号)などによる認証は導入が容易で誰もが理解できるが単体で用いる場合によっては、実装や運用によってむしろセキュリティの低下につながる恐れがあります。そのため、高度なセキュリティが求められる環境やシステムなどでは二つを併用する、もしくはバイオメトリクスによる認証が用いられることが多いそうです。典型的な例としては、キャッシュカード(所有物)と暗証番号(秘密)によって本人認証を行い、銀行からお金を引き出すといったものがあります。こういった方式を二要素認証もしくは多要素認証と呼びます。

ちなみに、非常に破られにくい生体認証(バイオメトリクス認証)ですが導入のコストが非常に高いのでそこらかしこに導入するというのが出来ないのがデメリットです。

次の記事からは色々な認証方式についてまとめてみようと思います。

それでは今回はこの辺りで筆をおかせていただきます。

インターンに行ってきました。

二週間ほどガッツリ二社のインターンに行っていたので中々記事書く暇ありませんでした

  • IBM

     こちらは五日間ほど、誓約書の関係でどこまで書いていいのかわからないのでふわっと所感を。

    一言でまとめると「すごい」 小学生並の感想ですがまさにこの一言に尽きます。

     さすが100年の歴史を持つ老舗といったところでしょうか。IT分野を利用しての様々な新規分野への開拓はこれからITがエコシステムとして成り立っていく可能性をしっかりと感じました。

    自分はコグニティブやらワトソンやらがいまいちよく分かっていなかったので非常にタメになるお話ばかりでメモばっかとってました(笑)  あと英語、これはできないとダメですね!(TOEIC400点ぐらい)

     社員の方々も知識、技術素晴らしい方々ばかりでお話も大変参考になりました。X-Force,SOC、面白そうです…ジュルリ  自分はセキュリティコースでしたが他のコースも非常に面白そうでした。同じチームの人たちは分野は違えど同じ「セキュリティ」に興味を持つ者同士が集まったという感じですごく良い刺激になりました。docker等の仮想化技術を利用しての新しい知見を得られたのでこれからしっかり勉強していこうと思います。モチベーションをグングン上げさせてもらいました。企業のセキュリティポリシで社内が全て撮影禁止だったので写真が一枚もないので頭の中でしか振り返りができないのが少し残念です。

  • サイボウズ

     IBMインターンは全コース合わせて100人ほど居たので、もしかしたらまたそんなに沢山居るのかな?なんて少しビビりながら日本橋のオシャレなオフィスに行くと自分も含めて8人、遠隔地の方合わせて10人とビックリしました。逆になんで自分が受かったのかは最終日まで甚だ疑問でした。

    同じ参加者の皆さんは凄く気さくな方たちでお話ししていてすごく楽しかったです。初日に武田玲奈さん似ているという社員さんが居ると聞いて同じ参加者の方と即座に社内を物色していました。ただの変人ですね。

    大体のガイダンスが終わるとすぐに業務(とほぼ同じ体験)をさせていただき初日から濃密でした。

    こういう大手のインターンって大体は業務の紹介とか見学でほぼ終わることが多いと聞いていたのですごく新鮮で参考になりました。

    お会いする社員さんも皆さん素晴らしい人達ばかりでお話ししていてすごく楽しかったです。一番びっくりしたのは人事の方との面談で僕がポロット「マーケティングとかも面白そうって感じるんですよね」と漏らしたら次の日にはBPMの偉い方との面談が組まれていました(汗

    ちなみにBPMの方とお話していたら「youtuberの方ですか?笑」って言われました。そんなに胡散臭い喋り方をしていたんでしょうか…

    他にもプログラマーの方でwebアクセシビリティに詳しい方とデザインの方を交えて熱いお話を繰り広げさせていただきました。

    幼いころから障碍者の方と触れ合う機会が多かったので凄く興味をそそられました。実際話してる最中暑かったのか汗かいてました。

    ちなみに最後、5日間のまとめとしてプレゼンがあって、ネタに走っていいよと言われたので普段学校でできないようなプレゼンをしたらドン引きされたり苦笑されたりしました。それでも一部の人は「面白かった」、「予想の斜め上を行ってくれた」と仰っていただき救われましたね

    そんなこんなであっという間の5日間でした。

  • 【総括】

今年のインターンは大手の2社に受かるというラッキーを発揮し、来年の就活が少し不安になってきましたが得るものはこの2、3年で最も大きいと言っても過言ではなかったと思います。

他にも企業見学等はこれからも行う予定ではありますが、たった2社見ただけでも色合いが凄く違う。それはもう面白いぐらいに。友人のインターンの話を聞いていても面白いです。そろそろ自分の志望も固まってきたのでこれからもしっかり勉強、たまに息抜きしてしっかり精進していきたいと思います。

そろそろ木曜から学校も始まるので単位を落とさないようにしないといけませんね。 それでは今日はこの辺りで筆をおかせていただきます。

サイボウズの人事は綺麗な方が沢山でした

SQLインジェクション対策

午後問でSQLインジェクションに対する防御プログラミングの問題が出ていたのでまとめてみました。

  • SQLインジェクションとは何か?

    ユーザーの入力データをもとにSQL文を編集してDBにクエリを発行し、その結果を反映させるというwebページにおいて、不正なSQL文を入力することでDBを操作したり、DBに登録された情報を不正に取得、変更するといった攻撃手法です。XSS同様にユーザーの入力データのチェック不備から成立する可能性がりあます。

今回はjavaのソースを基にSQLインジェクションを成立させてしまうコードとそれを防ぐコードを簡単にまとめました。

      String sqlString = "SELECT * FROM db_user WHERE username = '"
                         + username +
                         "' AND password = '" + pwd + "'";
      Statement stmt = connection.createStatement();
      ResultSet rs = stmt.executeQuery(sqlString);

  if (!rs.next()) {
    throw new SecurityException(
      "User name or password incorrect"
    );
  }

これは脆弱性のあるコードを一部抜粋したものです。このコードは入力された文字列を結合してSQL文としてクエリしています。 例として、入力部分のusername pwd に 次の様な入力を与えたとします。

 username = katsuya , pwd = ' OR 'A' = 'A

メジャーなSQLインジェクションです。上記のような入力の場合実行されるSQL文は以下のようになります。

SELECT * FROM db_user WHERE username = 'katsuya' AND password = '' OR 'A' = 'A'

入力したOR文があります。この入力によってパスワードは特に値を与えていないのですがその後ろにあるOR文の条件は常に真なので db_userのレコードが全て選択されることになります

恐ろしいです。しかし、しっかりと対策をすることで防ぐことはできます。以下が対策を施したソースです。

String sqlString =
        "select * from db_user where username=? and password=?";
      PreparedStatement stmt = connection.prepareStatement(sqlString);
      stmt.setString(1, username);
      stmt.setString(2, pwd);
      ResultSet rs = stmt.executeQuery();
      if (!rs.next()) {
        throw new SecurityException("User name or password incorrect");
      }

これprepareStatementメソッドを使った対策です。これを使用することによってユーザーの入力は特別な文字列( $ ^ ' " 等)が含まれていても自動でエスケープ処理されてただの文字列として扱われます。

他の対策としては、そもそものRDBMSのアクセス権限を最小にするといったものがあります。

似たような攻撃としてはOSコマンドインジェクションやディレクトリバーサル攻撃が挙げられます。どちらもユーザーが悪意のあるスクリプトを送信して本来は権限のない行為を実行しようとするものです。

しかし、最近のwebアプリケーションフレームワークはデフォルトで対策されているものが殆どなので超個人用のアプリでもない限り実現できる攻撃ではないのかなと思っています。

SCの過去問ではセキュアプログラミングの題材として何回か出題実績があったのでまとめてみました。 今回はこのあたりで失礼します。

暇つぶしのプログラミング

今日は暇だったので CodeIQ で解いた問題について書いてみます。

どういう問題かというと…

2つの整数値N, Mが与えられます。

0からNまでの各整数(10進数)について、2進表記したときに1の数がM個になるものを数えてください。

たとえば、9を2進表記すると1001ですので、1の数は2ということになります。

 

 

【入力】

標準入力から、半角スペースで区切られた2つの整数値N(0≦N≦100000)、M(0≦M≦17)が与えられます。

 

 

【出力】

0からNまでの整数の中で、2進表記したときに1の数がM個あるものの個数を出力してください。

例としては、入力に 10 2 と与えたとしましょう。

その場合の出力は5になります なぜなら 0 から 10 までの数を全て2進数に変換してその中で1が二つ含まれるのは 「11, 101, 110, 1001, 1010」の5つだからです。

とまぁこんな感じなんですがこの問題言語に指定はありません。最初はCで書こうかなって思ったんですが2ビットのカウント方法を1から書かなければならなさそうなのでjavaの方がいいかな~と思いjavaにしました。

というわけでソースを張ります

import java.io.*;

import java.util.Scanner;

public class codeIQtest {

public static void main(String args[]){

Scanner scan = new Scanner(System.in);


int N = Integer.valueOf(scan.next());

int M = Integer.valueOf(scan.next());


if(0>N || 100000<N){System.out.println("error"); return;}

if(M<0 || 17<M){System.out.println("error"); return;}


bitCount(N,M);


}


static void bitCount(int N,int M){

int counter;

int Tcounter=0;

for(int i=0;i<=N;i++){

  counter = Integer.bitCount(i);

  if(counter == M) Tcounter = Tcounter+1;

  }

System.out.println(Tcounter);

 }

}

なんでMarkdown上手く表示されないんだろう… コードが見づらい…

これで正解が貰えました。 で、上記のソースの最後らへんに counter = Intger.bitCount(i); という部分があるんですがこのbitCountメソッドがなんとint型の数字を渡すとその数字を2進数に変換し1の数をカウントしてくれるという便利なものです。 これのおかげで後は入力条件の設定とメソッドの定義、出力処理ぐらいだけで済みました。超便利ですね。

ちょっと調べてみた結果、RubyとかCだとbitCountっぽいやつは自作しなきゃなさそう? Cでは一応有名な美しいアルゴリズムとして存在してるっぽいですね 一応載せておきます

int numofbits3(int bits) {

int num = 0;

for( ; bits != 0 ; bits &= bits - 1 ){ 

num++ ;

 }

return num;

}

綺麗ですね… もう少し冗長なものになるのかと思ってましたがここまで簡潔に書けるとは…

では今日はここら辺で

また気が向いたらこういう暇つぶしについても書いてみようかなと思います。

情報セキュリティポリシ

情報セキュリティスペシャリストの過去問を解いていて、午前問題に関しては割と正答できるようになったと感じて6割も不可能ではないなと思っているんですが、午後問の長文問題全般をどう攻略するかが最近の悩みです。

さて、今回は情報セキュリティポリシについてです。

情報セキュリティポリシの概要

組織の情報資産を守るための方針や基準を明文化したものです。組織のリーダーによる明確な方針と、リスクアセスメント(前回記事参照)結果に基づいて対策基準が必要であると記されています。

  • 基本方針

    情報セキュリティに対する組織としての一貫した考え方を示すもので、目的、対象範囲、維持管理体制、義務、罰則などがあります。

  • 情報セキュリティ対策基準

    基本方針を実践し、適切な情報セキュリティレベルを維持・確保するための具体的な遵守事項や基準を記述しています。

セキュリティポリシの位置づけとしては企業の社訓、経営理念、就業規則といった既存の方針や規則などと何らかのかかわりをもつことは必至です。

企業としては有効性を高めるためにはその位置づけや、他の規則や規定との関係を明確にしておかなければならないのです。そうしなければ資産を守るためのポリシが他の規則と衝突してしまう可能性があるからです。

情報セキュリティポリシ策定・運用による効果

1.セキュリティレベルの向上

既にセキュリティ対策が施されていても、それぞれを総合的に管理・運用するための方針、知識がないため、十分な効果が得られていないというケースはよくあるらしいです。セキュリティポリシによって組織の求めるセキュリティレベルを明確にし、それを目指して問題箇所を改善していくことができます。あやふやなまま改善するより圧倒的に有効です。

2.セキュリティ対策の費用対効果の向上

リスクに応じた適切なセキュリティ対策を施すことで、限られた予算で最大限の効果を得ることが可能になります。セキュリティポリシを策定しないままだとどのリスクに対して、どれだけの費用をかけるかもわからずに対策することになるので下手をすれば大きな損益を被ることになりません。

2.対外的な信頼性の向上

セキュリティポリシを策定・実施することでよそから見たときの組織の信頼性を高めることができます。

ひとまずこんな感じでしょうか。最近の社会では企業の資産として 1、人 2、金 3、設備 4、情報 と言われるぐらい情報は価値を持っています。企業としてそれを守るのは当然ですが全部紙におこしてファイルに挟んで金庫で保管!なんてやってたらいつまでたっても終わりませんし引き出すときにも面倒くさいです。ほぼPCに情報を保管する現代において情報を守るための手法、基準、リスクの対応などは確実に必須となるものなんでしょう(働いてないのでわかりませんが…)。技術的な知識だけでなくこういった経営についてや倫理、法律的な知識も必要となるのが情報セキュリティという分野なので面白いですね。まだまだ知らないことが沢山あるのでもっと色々調べていきたいと思います。

逆に一番乏しいのは技術的な知識なのでそこをどうするかが今後の課題です… 誰か先生みたいな人いませんかね…

リスク対応

前回はリスクマネジメントについてかるーく触れたので今回はリスクマネジメントの中で実施するリスクアセスメント、その後に行うリスク対応について調べてみました。

  • リスク対応の概要

リスクアセスメントでリスクを分析、評価しました。けどその後の対応が間違ってたら意味がない。

そのリスク対応については大きく分けて二つ、リスクコントロールリスクファイナンスがあります。

これは潜在的なリスクに対して、物理的対策、技術的対策、運用管理的対策によって、発生を防止したり、損失を低減させてりすることですね。 例としては機密データのあるデータセンターを免震構造にしたり、入退室の履歴をしっかり取ったりすることが挙げられるかも。

こっちはリスクを抑えるのではなく、リスクが顕在化して損失を負うこと前提でその時に備えて損失の補填や対応費用などの確保をしておくことらしい。損失を負うこと前提って考え方はなんとなくフェールセーフやフェールソフトを思い出しますね。

リスクはどれだけしっかりリスクコントロールしても顕在化の可能性を0にすることはできない。そのために資金面での対策を講じておくことも非常に重要らしいです。

具体例としては 保険を利用して不測事態発生時の対応費用を組織外に転嫁 不測事態発生時に備え、準備金・積立金などの名目で組織に対応費用を確保

難しいですね… ここら辺は実務を経験してる人でないと理解しずらいかもしれません。

さて、二つの対応を行いましたがそれでもリスクは残ります。こういったリスクの事を残留リスク、残余リスク」なんて呼ぶそうです

じゃあ残りはどうするのか。難しいところですがその場合はリスクの強度や予算などとの兼ね合いによりあえて対処を行わないことがあります。それがリスクの受容です。リスクの受容については組織としての判断基準を予め明確に決めておかないといけません。

ちなみにこのリスク対応等諸々含むリスクマネジメントに関する規格は ISO 31000:2009/JIS Q 31000:2010 で定義されています。 気になる人は調べてみるといいかもしれません。

では今回はここら辺で失礼します

ドラクエのせいで暫く記事書くテンションにならなかったなんて言えない…

リスクマネジメント

ソフトウェアやサービスの開発、運用をしていく中でリスクというものは切っても切り離せないものだと浅学ながら自分では考えています。

そんなリスクを大きなフローの中で分析し、対応することが昨今では必須となっていますが今回はその中でリスクマネジメントについてまとめてみました。

  • リスクマネジメント

    リスクマネジメントには

    1.リスクアセスメント

    2.リスク対応方法の洗い出し

    3.リスク対応の実施

    4.リスク及びリスク対応の洗い出し

の4つのプロセスがある。これらのプロセスは一過性のものではなく継続的に繰り返していく必要がある

一つ一つ見ていくと、

リスクアセスメント(リスクの分析、評価)

これは実際にその計画(運用や開発)の中にあるリスクが顕在化した場合もたらすものを対象としている。リスクマネジメントの対象となる組織や情報システムのどこに、どのように潜在しているのかを発見・確認し、その大きさを測定・評価する。

リスク対応方法の洗い出し

リスクアセスメントの結果を受け、損失を最小限に抑える適切なリスク対応方法を洗い出す。

リスク対応の実施 洗い出されたリスク対応と、 予算や組織などの兼ね合いによって、実際に実施するリスク対応策(大体セキュリティ対策?)を決定、実施する。ちなみに、この時決定されたリスク対応方法は情報セキュリティポリシにも確実に反映させる必要がある。

リスク及びリスク対応方法の見直し

リスクそのもの及び、実施済みのリスク対応方法を定期的に見直し、必要に応じて改善することで、リスク対応の効果を維持する。

今日は眠いのでここまで。明日リスク対応についてまとめます