ロード・トゥ・ザ・ホワイトハッカー

ホワイトハッカーはじめました

情報の保護について

仮名化

Pseudonymisationという英単語に出くわし、Google翻訳したら「仮名化」と出てきた。これを「カナ化」と読むと意味が通じなくなる。

Pseudonymisationは、スードニマイゼーション、と発音するらしく、情報を保護する方法で、日本語では「かめい化」になる。

氏名や住所などの個人データのうち、「誰」と特定できる部分を「仮名」にし、データから直接個人を特定できなくすること。

データベースに、氏名の項目があれば、仮のIDに置き換えて、それだけで、個人が特定できないようにする。

別のデータベースに、名前とIDが保存されているので、それと合わせると個人は特定できてしまう。

これより厳しいのが、匿名化。

匿名化

匿名化(anonymization)の場合、情報が完全に取り除かれることになる。誰、ということをデータを保持している人も分からなくなる。プライバシーは保護されるが、実用的でない側面も。

GDPRで要求される個人情報保護では、匿名化されたデータには適用しない、という言い回しで、匿名化を強制している。

 

日本の個人情報と関連法規などについては、以下のブログが詳しい。

www.powerweb.co.jp

トークナイゼーション

トークナイゼーション(Tokenization)とは、機密情報をトークンと呼ばれるランダムに生成された代理データに置き換えて保存・利用する技術。
トークンから機密情報を復元することができないという特徴を生かして、暗号化では対応が困難な業務要件に対応することができる。

カード番号を適当な数字に置き換えることがそれに該当する。

その際、フォーマットを変えないのが仮名化や暗号化と異なる。

12345-6789という数字を55555-5555というトークンで置き換える。それにより既存のデータベースに修正を入れることなく対応できるメリットがある。

ただ、変更前の情報が漏れてしまえば、個人が特定できるのは仮名化と同じリスク。

クレジットカード業界のセキュリティ基準「PCI DSS」でも、トークナイゼーションは、同技術を取り入れた決済システムなどは部分的に監査対象からの除外が認められている。

 

いろんな保護方法がありながらも、大規模な情報漏洩は減らない。

www3.nhk.or.jp

 

CISSP資格について

CISSP資格基本情報

CISSP(Certified Information Systems Security Professional)とは、(ISC)² (International Information Systems Security Certification Consortium)が認定を行っている国際的に認められた情報セキュリティ・プロフェッショナル認定資格です。

引用:https://japan.isc2.org/cissp_about.html

2022年7月現在、全世界のCISSP認定者数は約156,054人とのことです。

そのうち日本人は、3,699人。

 

(ISC)²は、情報セキュリティ専門家が理解すべき知識を国際規模で収集し、分野(ドメイン)別に体系的に、CBK(Common Body of Knowledge:共通知識分野)としてまとめている。最近では、2021年5月に更新が行われた。

CISSP に必要とされるものをまとめたのが CISSP CBK 8 ドメインであり、CISSP 認定試験の範囲として活用されている。

試験としては、以下の通り、なかなかボリューミーです。

試験形式:Computer Based Testing(CBT方式)

出題形式:250問(日本語・英語併記)四者択一マークシート

試験時間:6時間 

合格基準:1000点満点中700点以上(70%以上)の正解率

受験費用:749米ドル

 

日本語のテキストがあるのですが、こちらも、辞典かと思う厚さで、お値段27,500円。

1700ページが4冊に分かれております。

公式問題集もあるのですが、こちらは電子書籍しかないようです。

悩ましいのが、上記は、2018年刊行のため最新の情報が反映されていないのでは?という危惧がある。また、国際資格でよく言われるのが、日本語の翻訳の精度の低さ。

それもあって、CEH資格は英語で勉強して、試験も英語だった。

この分量を英語ですべてやるのは少し大変なので、日本語と英語両方で、ということで、2021年に刊行された英語版の公式ガイドブックと問題集を併用することに。

書籍のWEBサイトで試験問題が実施できるようになっている。

8ドメイン

1.セキュリティとリスクマネジメント
2.資産のセキュリティ
3.セキュリティアーキテクチャとエンジニアリング
4.通信とネットワークのセキュリティ
5.アイデンティティとアクセスの管理(IAM)
6.セキュリティの評価とテスト
7.セキュリティの運用
8.ソフトウェア開発セキュリティ

というドメインの分類がされている。

2018年4月のCBKが改定で、10ドメインから8ドメインに再編された。

ざっと見た限り、IPA系の資格のマネジメント部分とCEH的な技術要素的なものが組み合わさって、網羅性という点では、相当なものだと思う。

アメリカ国内の法律について、など馴染みが薄い部分もあるが、今までの知識を活かせる部分は大きいと感じた。

 

CISSP試験からエンドースメントまで以下にまとめました。

chikuwamarux.hatenablog.com

 

NISTのドキュメント

NISTについて

NIST(National Institute of Standards and Technology:米国国立標準技術研究所)は、科学技術分野における計測と標準に関する研究を行う米国商務省に属する政府機関。

NIST内には、情報技術に関する研究を行っているITL(Information Technology Laboratory)があり、6つの分野の研究をおこなっている。

  1. Security
  2. Information Access
  3. Mathematics and Computational Science
  4. Software Testing
  5. Networking Research
  6. Statistical Engineering

ITLの中でコンピュータセキュリティに関して研究を行い各種文書を発行しているのがCSD(Computer Security Division)と呼ばれる部門で、主に以下の4種類 の文書を発行している。

  1. Special Publications
  2. FIPS(Federal Information Processing Standards)
  3. ITL Security Bulletins
  4. NIST IRs(NIST Interagency Reports)
Special Publications

Special Publicationsは、SPシリーズとして知られており、NISTのサイトに以下の説明がある。

Guidelines, technical specifications, recommendations and reference materials, comprising multiple sub-series:

  • SP 800   Computer security
  • SP 1800   Cybersecurity practice guides
  • SP 500   Information technology (relevant documents)

引用:https://csrc.nist.gov/publications

 

NISTのサイトでSPを検索すると、237件ほどある。

csrc.nist.gov

IPAのサイトでは、一部の文書が翻訳されて掲載されている。

www.ipa.go.jp

 

SP800-53をよく目にする。

こちらのサイトに詳しい説明があった。

www.manageengine.jp

2006年3月に発行されたFIPS Publication 200(連邦政府の情報、および連邦政府の情報システムに対する最低限のセキュリティ要求事項)に準拠するための具体的な指針を示す文書として発行されたのが、NIST SP 800-53。

NIST SP 800-53と関連の深い文書としてNIST SP 800-171があり、NIST SP 800-53から民間企業・組織向けに要件を抽出したもの。

 

NIST SP 800-53は基本的なフレーㇺワークとして、ISO27001と同様の機能を提供している。

引用:https://www.cisa.gov/sites/default/files/publications/4_CRR_4.0_Self_Assessment-NIST_CSF_v1.1_Crosswalk-April_2020.pdf

NIST SP 800-53とISO27001の違いは、その対応範囲にある。

後者は、「特定・防御」に重点が置かれ、

前者は、「特定・防御・検知・対応・復旧」の全段階をカバーしている。

 

具体策について、各フェーズでのSPが用意されており、SP相互に関連している。

引用:https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-37r1.pdf

サイバーレジリエンスの観点から、ISMSとして、NISTを採用するところも増えているようです。

ISAC(Information Sharing and Analysis Center)

ISAC(Information Sharing and Analysis Center)について

ISACは、日本語ではアイザックと読んでいます。

セキュリティに関する情報を共有する概念で、米国で1998 年に大統領令で示された。

日本では、

  • 金融 ISAC(2014年)
  • ICT-ISAC(2016年)
  • 電力 ISAC(2017年)
  • J-AUTO-ISAC(2017年)

等が整備されている。()内は設立年。

日本国内の情報共有

ISACが業界内での情報共有を主眼にしているが、官民の情報共有のための組織がある。

それが、

  • J-CSIP

  • セプター

になる。

J-CSIP

J-CSIP(ジェイシップ)について、IPAのサイトから。

IPAは、サイバー攻撃による被害拡大防止のため、2011年10月25日、経済産業省の協力のもと、重工、重電等、重要インフラで利用される機器の製造業者を中心に、情報共有と早期対応の場として、サイバー情報共有イニシアティブ(J-CSIP:Initiative for Cyber Security Information sharing Partnership of Japan )を発足させました。

その後、全体で13のSIG(Special Interest Group、類似の産業分野同士が集まったグループ)、279の参加組織による情報共有体制と、IPAが特定業界内の情報共有活動を支援する2つの「情報連携体制」をそれぞれ確立し、現在、サイバー攻撃に関する情報共有の実運用を行っています。

J-CSIP体制全体図

引用:https://www.ipa.go.jp/security/J-CSIP/

セプターカウンシル

セプターについて。

セプター(CEPTOAR)は、重要インフラ事業者等の情報共有・分析機能及び当該機能を担う組織であり、Capability for Engineering of Protection, Technical Operation, Analysis and Responseの略称です。

セプターの主要な活動の一つは、重要インフラサービス障害の未然防止、発生時の被害拡大防止・迅速な復旧および再発防止のため、NISC等から提供される情報について、適切に重要インフラ事業者等に提供し、関係者間で情報を共有することです。これによって、各重要インフラ事業者等のサービスの維持・復旧能力の向上に資する活動を目指します。

セプターカウンシルについて。

セプターカウンシルは、各重要インフラ分野で整備されたセプターの代表で構成される協議会です。分野横断的な情報共有の推進を目的として、平成21(2009)年2月に設立されました。

引用:https://www.nisc.go.jp/policy/group/infra/policy.html

引用:https://www.nisc.go.jp/pdf/policy/infra/cc_dai14.pdf

 

J-CSIPとセプターカウンシルの目的の違いが良く分からない。

そして、ISACも含めると、ますます混乱してくる。

 

CIS(Center for Internet Security)

CISとは

CIS(Center for Internet Security)はアメリカにある非営利団体で、インターネット・セキュリティ標準化に取り組んでいる。

米国国家安全保障局NSA)、国防情報システム局(DISA)、米国立標準技術研究所(NIST)などの政府機関、企業、学術機関とも連携している。

www.cisecurity.org

 

いろんなものを無償・有償で提供している。

その中核をなすのが、CIS Controls。

CIS Controls

CIS Controlsは、米国立標準技術研究所(NIST)のSP800-53で定義されている事項のサブセットで、「最初に最低限行わなければならない」ことに着眼してシンプルにまとめられたフレームワーク

2021年5月18日にバージョン8が発表され、18のカテゴリがある。英語版は87ページで、日本語に翻訳されたものもありました。

 

CIS Controlsについて、こちらの記事が有益でした。

www.nri-secure.co.jp

他の規定とのマッピングも考慮されており、それを確認するツールが用意されている。

www.cisecurity.org

この辺りの基本的な対策事項は、種類が多すぎて、食傷気味ではあるものの、より具体的にその対策事項を実施する方法が、CIS Benchmarksにまとめられている。

CIS Benchmarks

CIS Benchmarksは、セキュリティ担当者がサイバーセキュリティ防御を実装および管理するのに役立つ、世界的に認められたコンセンサス主導の一連のベストプラクティス。

引用:https://aws.amazon.com/jp/what-is/cis-benchmarks/

製品・サービス固有のセキュリティ設定が具体的に定義されている。

 

例えば、クラウド事業では、以下のようなBenchmarkが用意されている。

https://www.cisecurity.org/cis-benchmarks/

 

AWSの詳細を見ていくと、Benchmarksがダウンロードでき、その他にも有益なツールが使用できる。

CIS-CATは、Benchmarksの適用状況を確認できるツール。

CIS Hardened Imageは、Benchmarksに基づいたOSイメージ。

CIS Benchmarksについて、以下の記事が分かりやすかったです。

jpn.nec.com

 

情報量が多すぎる感はあるものの、ここまで詳細にセキュリティ設定について説明している文書はなかなかない。

設定のチェックするツールまで準備されており、有益だと感じる。

 

 

ログの解析について

ログ分析に関してのまとめ

・HTTPのログからのSQLインジェクションの検出について以下の2つにまとめた。

chikuwamarux.hatenablog.com

 

chikuwamarux.hatenablog.com

 

SQLインジェクションの検出では以下のデータセットを利用した。

github.com

 

それ以外に使用できそうなデータセットとして、以下の2つがあった。

 

・FWAF

github.com

 

・HTTP DATASET CSIC 2010

www.tic.itefi.csic.es

 

各データセットの概要は以下の通り。

引用:IEEE Xplore Full-Text PDF:

 

データ量としては申し分ないが、若干古い気もする。Kaggleでも、SQL injectionやXSSのデータセットを見つけられるが、多くはない。

ログ自体は、身の回りに大量に存在しているので、教師あり学習ではなく、教師無し学習がしたくなる。

 

以下の記事でIsolation Forestアルゴリズムを使用した、教師無し学習による異常検知について説明があります。

www.scutum.jp

 

ここまで、

異常検知に関して、時系列・教師無し学習による分類、

検出器に関して、教師あり学習による分類、ができることが分かった。

特徴量エンジニアリング

ドメイン知識に基づく場合は、いろんなモノをカウントして、特徴量にしていることが多い。

以下のサイトでは、SQLインジェクションの検出ために、21個の特徴量を用いている。

https://meral.edu.mm/record/4658/file_preview/201640.pdf?allow_aggs=True

1. URI
2. Method identifier
3. Number of arguments
4. Length of the arguments
5. Number of digits in the arguments
6. Number of other char in the arguments
7. Number of letters in the arguments
8. Length of the Host
9. Length of the header “Accept-Encoding”
10. Length of the header “Accept”
11. Length of the header “Accept-Language”
12. Length of the header “Accept-Charset”
13. Length of the header “Referer
14. Length of the header “User-Agent”
15. Number of cookies
16. Length of the header “Cookie
17. Content Length
18. Request Resource Type
19. Received Bytes
20. Possibility
21. Pattern Result

 

先に挙げた、

https://www.scutum.jp/information/waf_tech_blog/2021/01/waf-blog-077.html

では、以下の29個を特徴量としている。

  1. %が最初に出現する場所
  2. :が最初に出現する場所
  3. :の個数(いくつ含まれるか)
  4. (の個数
  5. ;の個数
  6. %の個数
  7. /の個数
  8. 'の個数
  9. <の個数
  10. ?の個数
  11. .の個数
  12. #の個数
  13. %3dの個数
  14. %2fの個数
  15. %5cの個数
  16. %25の個数
  17. %20の個数
  18. メソッドがPOSTかどうか
  19. URLのパス部分に含まれるアルファベットと数値以外の文字の個数
  20. クエリ部分に含まれるアルファベットと数値以外の文字の個数
  21. アルファベットと数値以外の文字が最も連続している部分の長さ
  22. アルファベットと数値以外の文字の個数
  23. /%の個数
  24. //の個数
  25. /.の個数
  26. ..の個数
  27. =/の個数
  28. ./の個数
  29. /?の個数

ドメイン知識に基づかない場合、

1.エントロピーを算出

2.N-gramとtr-idfを用いたベクトル化

3.文字列のインデックス化

4.文字列のアスキーコード化

などで、ログを数値化している。

1と2は、前回と前々回にこのブログで実施している。

 

3.文字列のインデックス化

については、使用する文字列を決めて、その位置番号により文字列化する方法。

コードとしては、以下のようになる。

import tensorflow as tf
import numpy as np

def data2char_index(Xmax_len):
    alphabet = " abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:'\"/\\|_@#$%^&*~`+-=<>(){}"
    result =  
    for data in X:
        mat = 
        for ch in data:
            ch = ch.lower()
            if ch not in alphabet:
                continue
            mat.append(alphabet.index(ch))
        result.append(mat)
    X_char = tf.keras.preprocessing.sequence.pad_sequences(np.array(result, dtype=object),
            padding='post',truncating='post', maxlen=max_len)
    return X_char

 

4.文字列のアスキーコード化

これはPythonのord関数を使用して、文字コードを数値化するもの。

def convert_to_ascii(sentence):
    sentence_ascii=

    for i in sentence:  
        if(ord(i)<8222):      # ” has ASCII of 8221            
            if(ord(i)==8217): # ’  :  8217
                sentence_ascii.append(134)            
            if(ord(i)==8221): # ”  :  8221
                sentence_ascii.append(129)                
            if(ord(i)==8220): # “  :  8220
                sentence_ascii.append(130)   
            if(ord(i)==8216): # ‘  :  8216
                sentence_ascii.append(131)
            if(ord(i)==8217): # ’  :  8217
                sentence_ascii.append(132)
            if(ord(i)==8211): # –  :  8211
                sentence_ascii.append(133)
            if (ord(i)<=128):
                    sentence_ascii.append(ord(i))    
            else:
                pass            

    zer=np.zeros*1

    for i in range(len(sentence_ascii)):
        zer[i]=sentence_ascii[i]

    zer.shape=(100100)
    return zer

正規表現での判断が有効な場面はまだあるようですし、機械学習も万能ではないので、いろんな手法を組み合わせて、総合的に判断することが必要なんだと思う。

 

*1:10000

SQLインジェクションの検出(N-gram編)

ログ情報の数値化

前回は、HTTPのログのエントロピーを算出した。

chikuwamarux.hatenablog.com

今回は、N-gramを使った数値化について、流れとしては、以下になる。

  • ログを1文字つづ区切る(N-gram, uni-gram)
  • 文字ごとのベクトル化(BoW)
  • ベクトルの重みづけ(tf-idf)

こちらの書籍を参考にさせて頂いております。

GitHub - oreilly-japan/ml-security-jp: 『セキュリティエンジニアのための機械学習』のリポジトリ

 

自然言語処理

自然言語処理(しぜんげんごしょり、英語: natural language processing、略称:NLP)は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術

引用:自然言語処理 - Wikipedia

Google翻訳など自然言語処理における成果と言えます。

言語をコンピュータに処理させるためには、数値化する必要があり、その手法がいろいろとあります。そららのN-gram、BoW、tf-idfについて、まとめます。

 

N-gram

n個の単語や文字のまとまりを表します。

I have a pen. という文章があった場合、N=1の場合、それぞれの単語である「I」「have」「a」「pen」「.」となる。

N=2の場合、「I have」「have a」「a pen」「pen.」となる。

N=1の場合をuni-gram(ユニグラム)、

N=2、bi-gram(バイグラム)、

N=3,tri-gram(トライグラム)、

と呼ばれている。

日本語の場合は、英語と違い、単語がつながっているので、それを品詞に分けることを形態素解析と呼ぶ。

今回のSQLインジェクションの解析のためのHTTPログは、単語は考慮せず、文字列を1文字づつ区切る、uni-gramを使用する。

BoW

BoWはBag of Wordsの略。直訳すれば、言葉の入れ物。uni-gramで得られた単語(文字)が、何回使われているかカウントしたもの。

You say yes, I say no.という文章のBoWは、say:2それ以外の単語は、それぞれ1となる。

uni-gramでBowを使えば、前回やったエントロピーは算出できる。

tf-idf

tf-idfは以下の2つの意味。

  • tf(term frequency:単語頻度)
  • idf(inverse document frequency:逆文書頻度)

前者は、BoWから全体の割合を算出したもの

後者は、単語が、どれくらい少ない頻度で存在するかを算出したもの

tfだけでは、よく出てくる単語=重要でない、場合もあり、

逆に、滅多に出ない単語=重要かも?、ということを加味した指標。

計算方法など、こちらが詳しかった。

atmarkit.itmedia.co.jp

Pythonでのコード

ここまでの処理は、TfidfVectorizerが一気にやってくれます。

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
import pandas as pd

# ベクトル化のためのオプションの設定、文字を対象にユニグラムを行う
vec_opts = {
    "ngram_range": (11), 
    "analyzer""char"
    "min_df" : 0.1
}

#HTTPリクエストの内容例
string = [';select (case when (4769=4769) then 4769 else 4769*(select 4769 from mysql.db) end)#']

# TfidfVectorizerの初期化
v = TfidfVectorizer(**vec_opts)
# ベクトル化の実行
X = v.fit_transform(string)

# tf-idfの出力
features = v.get_feature_names()
df = pd.DataFrame(X.toarray())
df.columns = features
df

実行結果は以下の通り。

ブランクについて、0.529238という値など、文字列に含まれる各文字に対するtf-idfの値が算出できた。

以上により、文字列を数値化できたので、あとはお決まりの機械学習の流れに放り込めば、SQLインジェクションの検出器の出来上がり。

補足

自然言語処理で、Skip-gram、CBOWという言葉が出てくる。これらは、Word2Vecと言われる手法で使用されるディープラーニングのモデル。

Word2Vecは、Googleが開発して、自然言語処理の性能を飛躍的に高めたと言われている。

標的型メールを分類させる処理を考える場合、自然言語処理の手法を用いてメールを読ませて、分類できるのかもしれない。