トリコロールな猫/セキュリティ

思いついたことをぼちぼち書いてます。

春からセキュリティエンジニアとして働く人たちに伝えたいこと

はじめに

歳をとってきて、若手の人たちにいろいろいい残しておきたいけど直接言うと老害になるのでブログに書く試み第二弾。春からセキュリティエンジニアとして会社で働く学生に向けた言葉です。第一弾はこちら。

security.nekotricolor.com

食わず嫌いせずいろんな分野に挑戦しよう

幼稚園の頃からバイナリコードに夢中で・・とかいう人はいいです。その道を邁進してください。高校・大学からCTFやってますとか、なんとなくペンテストに興味があって、とかいう人は、興味のない分野でもとりあえずやってみることをお勧めします。意外な分野で適性があるかもしれません。社会人人生は五十年くらいあります。なるべくいろんなことをやってみて、自分に合っているものを見つけましょう。

できないことを悩まない

入社してしばらくすると、あの人はあんなにできるのになぜ自分はこんなにできないのかってなるんですよねえ。でもその悩んでいる時間、あなたは止まっていて、周りは前に進んでいます。差はどんどん開いていきます。そもそも、入社時点での差というのはそれまでの人生の差ですので、どうしようもありません。悩むのは三十分くらいで切り上げて手を動かしましょう。何をすればいいのか分からなければ先輩に聞きましょう。

分からないことは分からないと言おう

セキュリティ関係なく、技術者としてこれが一番大事だと私は思っています。自分の知識や技術力については誇張も謙遜もしない。お客さんに聞かれたことが分からないなら、調べて後でお答えします、と言っていいんです。

私は研究機関に勤めていたことがあり、そこでは分からないことを分からないと言わないと大変な目に遭うので普通に言うようになりましたが、意外と言えないって人が多いんですよね。特に若手だと。経験を積んでいくと、それは分からないけどこっちには自信があります、みたいな分野ができてくるので言いやすくなるのかもしれない。私なんかもうマルウェア解析もペンテストもできませんよ。でも調査研究や、初めての案件に道筋をつけるのはまあまあできます。そして得意分野でも、やばいと思えば普通にヘルプを出します。そうしないと、いつまでたっても仕事を任せてもらえません。

とはいえ、SSHが何か分かりません、はさすがにまずいです。新人研修で基本的なことはやるはずですので、そこは押さえておきましょう。一つ一つを深く知る必要はまだないですが、IPAの情報セキュリティマネジメント試験レベルの知識は欲しい。

技術力の貯金をしよう

今はもう休日返上で仕事をするような時代ではなく、勉強も業務時間のみ、プライベートな時間は好きに使う、という風潮のようですが、やはり若いうちに勉強しておいて、技術力の貯金をしておくことを私は勧めたい。

すでに子供がいるとか、重い持病があるとかならなんとか仕事を回すことだけを考えましょう。でも、あなたが健康で、一人暮らしで、ケアする必要のある誰かがいないのであれば、つまり自分の時間を全て自分のために使える状態なのであれば、ほんの少しでいいですから、その時間を勉強にあてて欲しい。そうすれば、転職によるキャリアアップはもちろん、何かあって仕事を辞めることになっても、再就職できる可能性がグッと上がるはずです。私は新人の頃に激務でセキュリティの基礎を叩き込まれたことで、四十代でブランクがあってもセキュリティ業界に戻ってこられました。今ならpwnable.twHack The Boxのようなオンラインサービスや、無料の勉強会やカンファレンスなど、もっと余裕を持って、楽しく勉強できる場がたくさんあります。ちなみに私が一時期講師をやっていたCTF for GIRLSでは、女性限定のワークショップをやっています。男性でも参加できるSECCON Beginnersというのもあります。他に個人的におすすめなのは、体験型演習のMicro Hardening、ガチアナリストが集うJSACです。

コミュニケーションを忌避しない

「コミュ力」という単語を忌避する人がいますが、サラリーマンとしてやっていくにはやはり大事です。別に面白い話をしろとか、人の話に気の利いた返しをしろとかいうことではありません。挨拶する、何か教えてもらったらお礼を言う、ミスしたら謝る、そういう人として基本的なことだけできればいいです。それができなくて許されるのは、リーナス・トーバルズレベルの天才だけです。そのリーナスですら、2018年に自らの行いについて謝罪したことがありますからね。

健康に気をつけよう

急に年寄り臭くなりましたがマジで大事です。学部卒だとしたら二十二歳、すでに体力はピークを過ぎ衰え始めています。あなたはあと四十年以上、衰える一方の体に鞭打って働かなければいけません。ちなみにアラフィフの私はいま腰を痛めていて、座っていられないので昇降デスクで立ちっぱなしで仕事をしています。あと二十年くらいあるのにどうすればいいんですかね?ずっと立ってんの?

特に最近増えているフルリモート(弊社もです)、これはいけません。外に出なくなるので二十代でも簡単に腰をやります。一度やってしまうと、治ってもまたやります。散歩でもラジオ体操でもなんでもいいので、運動を習慣にしましょう。

自分がいま痛めているから腰痛について力説してしまいましたが、関節だけではありません。食事にも気をつけないと、若くても血糖値だ尿酸値だが上がります。食事制限は辛いです。避けられるならそれに越したことはありません。会社の健診は必ず受けましょう。

ま、この辺は何言ってもやらない人は痛い目を見るまでやらないのは分かってるんですけどね。年寄りの勤めとして忠告はしておきます。

おわりに

読み返してみるとセキュリティはあんまり関係なかったですね。とにかく、社会人人生はとてつもなく長いです。健康に気をつけて、頑張るところは頑張りつつ、楽しく乗り切っていきましょう。

トップガンでなくてもセキュリティエンジニアとして長く続けていくには

はじめに

セキュリティ業界は人が少ないので、どこに行っても名前を聞く人とか、バイナリを見ただけでどこ製のマルウェアかわかる人とか、つよつよ人材が身近にいがちです。そんなトップガンを目指すのも一興ですが、ある程度の期間は、起きている時間全てをセキュリティに捧げる覚悟が必要です。私はそこまでできないので、別の戦略で生き延びています。そんな話です。

セキュリティ以外に得意分野を作ろう

私はもはやセキュリティの技術的な能力は干からびてしまっていますが、文書を作成するのがまあまあうまいです。今の会社はこの一点突破で採用されました。セキュリティを知っている人はたくさんいます。文書を作成するのがうまい人は星の数ほどいます。ではその両方は?おそらくとても少ないです。なぜなら大抵のセキュリティエンジニアは報告書などの文書作成が苦手or嫌いだからです。(そのうちchatGPTに駆逐されそうではありますが)

「二つの分野がそこそこできる人」は少ない

隣接分野も良いと思います。機械学習とかプログラミングとか。AWSなんかもいいですね。扱う案件があれば積極的に手をあげて、知識を身につけておくと、後々きっと良いことがあります。

まあぶっちゃけセキュリティ業界は超絶人手不足なので、マルウェア解析なりペンテストなりがある程度できれば引く手数多ではあるんですけどね。ただ、私のように諸々の事情でフルリモートでないと働けないとか長時間勤務が難しいとか譲れない条件がある場合には、強みがあると交渉がしやすくなります。また、歳をとってくるとどうしたってセキュリティの技術だけで若い人とやりあうのは難しくなっていきます。それでも管理職ではなくプレイヤーとしてい続けたい人は、この戦略で生き延びられるかもしれません。

おわりに

歳をとってきて、若手の人たちにいろいろいい残しておきたいけど直接いうと老害になるのでブログに書く試み。もはやセキュリティエンジニアとしての遺言といっても良い。これからもぽつぽつ書いていこうと思います。先日書いた記事もよかったらどうぞ。

security.nekotricolor.com

私のプロフィールはこちら。

www.nekotricolor.com

セキュリティエンジニアとして勉強しておいてよかったこと

はじめに

歳をとってきたからか、「セキュリティエンジニアとしてやっていくには何を勉強すればいいのか」ということを聞かれるようになりました。 正直私は体系だった勉強をしておらず言えることがその場ではあまりなかったため、自分が勉強しておいてよかったことをここで改めて思い返してみようと思います。

シェルコード作成

要はアセンブリ言語の勉強です。シェルコードを作る、という目的があったのが私にはよかったです。

学生時代はCのポインタはさっぱり理解できませんでしたが、アセンブリ言語をやってよく理解できました。メモリの使い方とかもここで学んだ。私はSPARCが好きだったので、Delayed Slotやビッグエンディアン、メモリのウインドウシステムの美しさに感動したのを覚えています。便利なツールなぞない時代だったので、ひたすらgdbでbreakしてsiしてxです。 ちなみに、当時超役に立った本で「Panic!―UNIXシステムクラッシュの追求と対策 」(サンソフトプレスシリーズ)というのがあるんですがもう売ってないみたいですね・・。

今だとARMかx86かしか選択肢がほぼないのかな。ARMは命令が固定長ですし、スマホのようなメモリ容量が限られるマシン用な分シンプルに作ってあるはずなので、やるならARMがいいのかも(実態を知らないので違ったらすいません)。x86はアセンブリ言語を初めて勉強するには複雑すぎますが、環境を準備するのは楽だし情報は多いからx86でもいいのかな。pwnable.twで初心者用の問題を解いたやつがあるのでよかったらどうぞ。

security.nekotricolor.com

netcatもどきの実装

シェルコードを作る過程で、カスタマイズできるバックドアが欲しくなったので作りました。指定したポートをListen状態にし、受信したコマンドを実行してその結果を返すだけのシンプルなプログラムです。言語は、当時唯一まともな開発環境が使えたVisual C++だったと思います。.NETが出る直前でした。こんな感じ↓

実装したPCで:

$ ./myBackdoor -p 8080         ← 8080/tcpをListen状態に

別のPCから:

$ ns 192.168.1.100 8080    ← netcatで8080番ポートにアクセス
>>> cat /etc/passwd  ← /etc/passwdをcatする
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

参考にした本は、学生時代の教科書でもあった「The UNIX Super Text」です。今は改訂増補版が出ているようです・・いやこれも2003年だから相当古いな。 I/Oまわりやプロセス間通信を学ぶのにとてもよかったです。

ファイアウォールの構築

ネットワークの知識はこれでものすごく付きました。NIC三枚挿し・四枚挿しで、それを介してネットワークをつなげるだけでも最初は大変でした。構成としては今ではあり得ないくらいシンプルなものが多かったので、勉強するにはちょうどよかったです。

F/W構築

とりあえずつないでデフォルトゲートウェイを設定するだけだと、社内LANからインターネットは行けても、インターネットからWebサーバにはつなげません。DMZ上のメールサーバから社内のメールサーバにもつなげない。これを、必要な通信のみ通すように設定していきます。もちろんNATもします。余計なブロードキャストが発生しないように、F/Wには各種サーバの静的なARPテーブルも設定します。

こういうのを信じられないほど早い納期で連続してやっていた時期があり、この時にネットワークの知識とともに段取り八分を叩き込まれました。納期があまりに早いと、走りながら考えるというのは通用せず、腰を据えてマニュアルを読み込み、どこをどう設定するのかを事前に決めてスケジュールを立ててから本番機を触るようにしないと間に合いません。他機で設定ファイルを作り込み、分単位の線表を引いて何とかやり切った記憶。

DNSサーバの構築

一番複雑なやつでマスター一台、スレーブ五台とかだったかな。いまはプライマリとセカンダリというそうですが。A、NS、MXレコードに加え、大量のサブドメインがあったので大量のCNAMEを設定。当然ゾーン転送も。今は自前ではあんまりやらないですよねえ。インターネットの仕組みみたいなものを理解するのによかったです。メールサーバもたくさん構築しました。qmailってまだあるのかな。

こんな課題はどうですか

これら自宅でも学べる課題を考えてみました。

たとえばこんな課題
Raspberry Pi Zero アイコン by Icons8

ラズパイを三台とハブを二台用意し、それぞれF/W、DMZ上のWebサーバ、DNSサーバという超シンプルな構成で、ラップトップからWebサーバの名前解決ができるようにする。できれば全部有線がシンプルでいいですがNIC三枚はラズパイでは難しいのかな。であればラップトップは無線接続で。

WebサーバはNXやASLRのような攻撃に邪魔な機能は全てオフ。なんでもいいのでroot権限で動く脆弱なプログラムと、実装したnetcatもどきを置いて、ラップトップからWebサーバ上でバックドアを作って/etc/passwdをcatする。

さすがに静的なARPテーブルやメールサーバはいらない気がしますが、ARPに関してはブロードキャストされているところをパケットキャプチャで見てみてほしいなあ。間違ったARPテーブルを設定してみて、なんも通信できねーっていう経験もしてほしいです(やった)。なお、おすすめする書籍は古典にして名著「マスタリングTCP/IP 入門編」です。一度読んでみて、さっぱり分からんとキレながらこの課題をなんとかこなして、「最初っからこう書いてくれれば分かったのに・・」と思いつつもう一度読んで、「いや書いてあるじゃん」てなってください(なった)。

おわりに

今は全てがリッチすぎて、基礎を学ぶのは逆に難しくなっている気がします。ネットワーク構築はクラウドばかりだし、マルウェア解析もデコンパイルしてソースコードを読むことの方が多いみたいだし。業務では意識することはあまりないかもしれませんが、つまづくことがあるとすれば、この手の基礎を押さえていないことが原因かもしれません。

特にネットワークはもうちょっとやると良くて、たとえばVPNとWifiのAESとTLSの違いとかはぜひパケットを見て実感してほしいし、HTTPとQUICの違いを見てほしいし、IPフラグメンテーションも実際のパケットを見て感動してほしい。課題のARPのブロードキャストもそうですけど、要はパケットを眺めることでOSIの七階層をきちんと理解してほしいというか。元気な人ならイベントのNOCとかやってみるといいかもしれませんね。

2020年下半期に公開されたセキュリティ関連文書まとめ

リアルタイムには情報を追っておらず、お知らせ一覧等から調べているため抜けがあるかもしれません。

ルールは以下。

  • 公共性の高いものを載せています
  • WGや研究会の純粋な活動報告書、個別のインシデント・脆弱性は載せていません

情報源はこの辺。

security.nekotricolor.com

上半期は以下。

security.nekotricolor.com

政府機関

高度情報通信ネットワーク社会推進戦略本部(IT総合戦略本部)

文書タイトル 公開日
デジタル・ガバメント実行計画 2020/12/25

セキュリティ関連団体

JNSA

文書タイトル 公開日
電子署名Q&A 2020/09/16
中小企業において目指すSecurity By Design 2020/11/05

MeCab用のセキュリティ用語辞書を作っています

日本語形態素解析システム「MeCab」を使って楽しく形態素解析をしているわけですが、セキュリティ用語が意外と辞書にないようで、期待通りの結果が出ないことが多いため、自分で作ってみることにしました。

とりあえずアウトプットしないと始まらないので、まだ102単語しか書いていないのですが公開します。

https://github.com/nekotricolor/mecab-it-security-dictionary

以下、苦労話です。読まなくてもいいですが読んだ上で褒めてほしい。

やりたいこと

たとえば「サイドチャネル」を解析してみると:

サイドチャネル
サイド   名詞,一般,*,*,*,*,サイド,サイド,サイド
チャネル    名詞,一般,*,*,*,*,チャネル,チャネル,チャネル
EOS

これを

サイドチャネル   名詞,固有名詞,一般,*,*,*,サイドチャネル,サイドチャネル,サイドチャネル

と一単語として認識するようにします。

MeCab入りのDockerイメージを作る

Ubuntu 18.04にRubyとMeCabを入れた環境を作ります。nattoはbundlerで。

Gemfileは以下の通り。

source "https://rubygems.org"

gem 'mecab'
gem 'natto'

Dockerfileは以下の通り。

FROM ubuntu:18.04
ENV LANG=C.UTF-8
ENV WORK_DIR /work
RUN mkdir -p ${WORK_DIR}
WORKDIR ${WORK_DIR}

RUN apt-get update && apt-get upgrade -y

# basic tools
RUN apt-get install -y git gdb file vim
RUN apt-get install -y curl wget ruby ruby-dev

# install mecab
RUN apt-get install libmecab2 libmecab-dev mecab mecab-ipadic mecab-ipadic-utf8 mecab-utils
RUN apt-get install -y make xz-utils build-essential

ADD Gemfile Gemfile
RUN gem install bundler
RUN bundle install

LANG環境変数の設定をしないと以下のようなMeCabのエラーがでます。すっごくハマりました。

/var/lib/gems/2.5.0/gems/natto-1.2.0/lib/natto/natto.rb:423:in `rescue in block (2 levels) in initialize': MECAB_NBEST request type is not set (Natto::MeCabError)

これでイメージを作ります。

% docker build -t mecab-ruby:basic .

シェルで作業したいのでDocker起動用に以下のようなシェルスクリプトを作りました。/Users/nekotricolor/Documents/mecab-it-security-dictionaryフォルダを/root/shareとしてマウントしています。

docker run --rm -it --name mecab-ruby -v /Users/nekotricolor/Documents/mecab-it-security-dictionary:/root/share mecab-ruby:basic /bin/bash

単語のリスト作り

Googleスプレッドシートで単語のリストを作ります。MeCabの辞書のフォーマットは以下の通り。

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

品詞細分類はIPA品詞体系に基づくものです。定義通りに書いておかないとコンパイルできないので注意。

www.unixuser.org

今回は全て以下に統一しています。

  • 品詞:名詞
  • 品詞細分類1:固有名詞
  • 品詞細分類2:一般

例えば「サイドチャネル」の場合(左/右文脈IDとコストは後述):

サイドチャネル,1288,1288,20,名詞,固有名詞,一般,,,*,サイドチャネル,サイドチャネル,サイドチャネル

左/右文脈IDとコストはあとで入力するとして、とりあえず表層形・品詞・品詞細分類1・原形・読み・発音を埋めます。

単語登録の参考にさせていただいたサイトは以下の通りです。ありがとうございました。

www.atmarkit.co.jp

enterprisezine.jp

左/右文脈IDの決定

以前のバージョンでは左/右文脈IDは空欄にしておくと自動でつけてくれていたのですが、最新バージョンでは自分でつける必要があります。IDは、以下のファイルで定義されています。

  • left-id.def
  • right-id.def

該当部分はここ。左右同じでした。

1288 名詞,固有名詞,一般,,,,

ということで、左/右文脈IDは1288でいいみたいですね。

この記事が大変参考になりました。

kento1109.hatenablog.com

rooter.jp

辞書のコンパイルと追加

辞書のスプレッドシートを「mecab-it-security-dic.csv」という名前でcsv形式でダウンロードし、MeCabのmecab-dict-indexというコマンドを使ってコンパイルします。

システム辞書があるディレクトリを渡す必要があるのでそれを調べます。

$ mecab -D
filename:   /var/lib/mecab/dic/debian/sys.dic
version:    102
charset:    UTF-8
type:   0
size:   392126
left size:  1316
right size: 1316

「/var/lib/mecab/dic/debian/」ですね。

$ /usr/lib/mecab/mecab-dict-index -d /var/lib/mecab/dic/debian -u mecab-it-security-dic.dic -f utf8 -t utf8 mecab-it-security-dic.csv

これで、カレントディレクトリに「mecab-it-security-dic.dic」というファイルができます。/etc/mecabrcに以下を追加。

userdic = /root/share/mecab-it-security-dic.dic

「サイドチャネル」を解析してみると、無事一単語として認識されました。

サイドチャネル
サイドチャネル   名詞,固有名詞,一般,*,*,*,サイドチャネル,サイドチャネル,サイドチャネル
EOS

辞書の作成と、mecabのユーザ辞書への追加は以下の本家の記事を参考にしました。

taku910.github.io

これを使ってやりたいこと

  1. 登録単語数を増やすために、いろいろな記事を形態素解析してみて出てこない単語を拾う
  2. 表記の揺れをなんとかしたい(「水飲み場"型"攻撃」と「水飲み場攻撃」とか)
  3. 4年前から溜め込んでいるセキュリティ系ニュースのフィードを解析して何か面白い結果が出るか見たい
  4. 形態素解析する必要はなくて、今回作った辞書の単語でパターンマッチすればいいだけかも・・・

2020年上半期に公開されたセキュリティ関連文書まとめ

リアルタイムには情報を追っておらず、お知らせ一覧等から調べているため抜けがあるかもしれません。

ルールは以下。

  • 公共性の高いものを載せています
  • WGや研究会の純粋な活動報告書、個別のインシデント・脆弱性は載せていません

情報源はこの辺。

security.nekotricolor.com

セキュリティ関連団体

IPA

文書タイトル 公開日
「制御システム関連のサイバーインシデント事例」シリーズ - Stuxnet:制御システムを標的とする初めてのマルウェア 2020/03/16
「制御システム関連のサイバーインシデント事例」シリーズ - 2019年 ランサムウェアによる操業停止 2020/03/16
「2019年度情報セキュリティの倫理に対する意識調査」報告書 2020/03/17
「2019年度情報セキュリティの脅威に対する意識調査」報告書 2020/03/17
(ドイツBSI) 産業用制御システム(ICS)のセキュリティ -10大脅威と対策 2019- 2020/03/18
「企業のCISO等やセキュリティ対策推進に関する実態調査」報告書(アンケート記入で入手可) 2020/03/25
サイバーセキュリティ経営ガイドライン実践状況の可視化ツールβ版 2020/03/25
情報システム等の脆弱性情報の取扱いに関する研究会 2019年度報告書 2020/03/25
アジャイル開発版「情報システム・モデル取引・契約書」 2020/03/31
「組込み/IoTに関する動向調査」調査報告書 2020/03/31
「組込み/IoTに関する動向調査」調査報告書(データ編) 2020/03/31
情報セキュリティ10大脅威 2020 2020/04
デジタル・トランスフォーメーション(DX)推進に向けた企業とIT人材の実態調査 ~ 詳細編~ 2020/05/14
DX推進指標 自己診断結果 分析レポート 2020/05/28
情報セキュリティ対策支援サイト(刷新版) 2020/05/28
情報セキュリティ診断サイト(刷新版) 2020/05/28
サイバーセキュリティ経営ガイドラインVer 2.0実践のためのプラクティス集 第2版(アンケート記入で入手可) 2020/06/09
AI白書2017(PDF版公開) 2020/06/10
「2019年度 中小企業の情報セキュリティマネジメント指導業務」報告書 2020/06/15
マルチプラットフォームシステムでのセキュリティ対策のPoC(概念実証)報告書 2020/06/23

フィッシング対策協議会

文書タイトル 公開日
フィッシングレポート 2020 2020/06/02
フィッシング対策ガイドライン 2020/06/02
利用者向けフィッシング詐欺対策ガイドライン 2020/06/02

テレワークのセキュリティに関する情報まとめ

【2020/04/21追記】
NTTとIPAによるテレワークサービスシステム。SoftEtherを使い簡単に構築できるリモートデスクトップ環境を無償で開放するそうです。


【2020/04/21追記ここまで】

取り急ぎ、公的機関が公開しているテレワークのセキュリティに関する情報をまとめました。

突然テレワークをすることになった人はまずこの辺を読んでできる対策をしておきましょう。


突然テレワークをさせることになった管理者はまずこれを読むのがいいかと。


以下3つは新型コロナウイルスの流行前に公開されたものです。最終的には、総務省のテレワークセキュリティガイドラインに沿った運用をすべきと思います。


なお、総務省のテレワーク情報サイトでは、テレワークの導入・運用や労働衛生管理に関するガイドラインも公開されています。


その他、公的機関ではありませんが個人的に信頼できる情報も載せておきます。すべて今年公開されたものです。

www.nttdata.com
qiita.com
www.lac.co.jp


セキュリティとは関係ありませんが、公的機関が提供する支援の検索サイトがあったのでそれも載せておきます。


皆さまご自愛ください。